blob: 7fbe99d277a3ba895a284ed0f1276d4ea095fbb7 [file] [log] [blame]
import { toParamSet } from '../../../infra-sk/modules/query';
import {
AutoRollService,
AutoRollStatus,
CreateManualRollRequest,
CreateManualRollResponse,
GetMiniStatusRequest,
GetMiniStatusResponse,
GetModeHistoryRequest,
GetModeHistoryResponse,
GetRollersRequest,
GetRollersResponse,
GetStatusRequest,
GetStatusResponse,
GetStrategyHistoryRequest,
GetStrategyHistoryResponse,
ManualRoll_Result,
ManualRoll_Status,
ManualRoll,
MockRPCsForTesting,
Mode,
ModeChange,
SetModeRequest,
SetModeResponse,
SetStrategyRequest,
SetStrategyResponse,
Strategy,
StrategyChange,
UnthrottleRequest,
UnthrottleResponse,
} from '../rpc';
import {
GetFakeRolls,
GetFakeStatus,
GetModeHistory,
GetStrategyHistory,
} from './fake-status';
import { GetFakeMiniStatuses } from './fake-ministatuses';
import { GetRollsRequest, GetRollsResponse } from '../rpc/rpc';
export * from './fake-status';
/**
* SetupMocks changes the rpc module to use the mocked client from this module.
*/
export function SetupMocks() {
MockRPCsForTesting(new FakeAutoRollService());
}
const manualRollResults = Object.keys(ManualRoll_Result);
/**
* FakeAutoRollService provides a mocked implementation of AutoRollService.
*/
class FakeAutoRollService implements AutoRollService {
private manualRollResult: number = 0;
private manualRequestId: number = 0;
private status: AutoRollStatus = GetFakeStatus();
getRollers(_: GetRollersRequest): Promise<GetRollersResponse> {
return Promise.resolve({
rollers: GetFakeMiniStatuses(),
});
}
getRolls(_: GetRollsRequest): Promise<GetRollsResponse> {
return Promise.resolve({
rolls: GetFakeRolls(),
cursor: "",
})
}
getMiniStatus(_: GetMiniStatusRequest): Promise<GetMiniStatusResponse> {
return Promise.resolve({
status: this.status.miniStatus,
});
}
getStatus(_: GetStatusRequest): Promise<GetStatusResponse> {
const params = toParamSet(window.location.search.substring(1));
if (params.status?.indexOf('error') >= 0) {
this.status.status = 'error';
this.status.error = 'Error message goes here!';
}
return Promise.resolve({
status: this.status,
});
}
setMode(req: SetModeRequest): Promise<SetModeResponse> {
return new Promise((resolve, reject) => {
const validModes = Object.keys(Mode);
const validMode = validModes.indexOf(req.mode);
if (validMode < 0) {
reject(`Invalid mode: ${req.mode}; valid modes: ${validModes}`);
return;
}
const mc: ModeChange = {
rollerId: req.rollerId,
mode: req.mode,
user: 'you@google.com',
time: new Date().toString(), // TODO(borenet): Is this the right format?
message: req.message,
};
this.status.mode = mc;
resolve({
status: this.status,
});
});
}
getModeHistory(req: GetModeHistoryRequest): Promise<GetModeHistoryResponse> {
const entriesPerRequest = 2;
return new Promise((resolve, reject) => {
const history = GetModeHistory()
if (req.offset >= history.length) {
resolve({
history: [],
nextOffset: 0,
});
}
let start = req.offset;
let end = req.offset + entriesPerRequest;
if (end > history.length) {
end = history.length;
}
let nextOffset = end;
if (nextOffset >= history.length) {
nextOffset = 0;
}
resolve({
history: history.slice(start, end),
nextOffset: nextOffset,
});
});
}
setStrategy(req: SetStrategyRequest): Promise<SetStrategyResponse> {
return new Promise((resolve, reject) => {
const validStrategies = Object.keys(Strategy);
const validStrategy = validStrategies.indexOf(req.strategy);
if (validStrategy < 0) {
reject(`Invalid strategy: ${req.strategy}; valid strategies: ${validStrategies}`);
return;
}
const sc: StrategyChange = {
rollerId: req.rollerId,
strategy: req.strategy,
user: 'you@google.com',
time: new Date().toString(), // TODO(borenet): Is this the right format?
message: req.message,
};
this.status.strategy = sc;
resolve({
status: this.status,
});
});
}
getStrategyHistory(req: GetStrategyHistoryRequest): Promise<GetStrategyHistoryResponse> {
return new Promise((resolve, reject) => {
resolve({
history: GetStrategyHistory(),
nextOffset: 0,
});
});
}
createManualRoll(req: CreateManualRollRequest): Promise<CreateManualRollResponse> {
const result = manualRollResults[this.manualRollResult++ % manualRollResults.length];
const id: string = `manualRequest${this.manualRequestId}`;
this.manualRequestId++;
const rv: ManualRoll = {
id: id,
dryRun: false,
canary: false,
noEmail: false,
noResolveRevision: false,
rollerId: req.rollerId,
revision: req.revision,
requester: 'you@google.com',
result: ManualRoll_Result[<keyof typeof ManualRoll_Result>result],
status: ManualRoll_Status.PENDING,
timestamp: new Date('2017-08-28T03:51:10Z').toString(), // TODO(borenet): Is this the right format?
url: result == '' ? '' : 'https://fake.google.com',
};
if (!this.status.manualRolls) {
this.status.manualRolls = [];
}
this.status.manualRolls.push(rv);
return Promise.resolve({
roll: rv,
});
}
unthrottle(_: UnthrottleRequest): Promise<UnthrottleResponse> {
return Promise.resolve({});
}
}