blob: ebb92b2fd3d4c0756e226a287ffa950e72d8ebcd [file]
import {assert} from '@open-wc/testing';
import './test-setup';
import {BuildStatus} from '../buildbucket-client';
import {Build} from '../checks-fetcher';
import {ResultDbV1Client, TestVariantStatus} from '../resultdb-client';
suite('ResultDbV1Client tests', () => {
let sandbox: sinon.SinonSandbox;
let client: ResultDbV1Client;
setup(() => {
sandbox = sinon.createSandbox();
client = new ResultDbV1Client('resultdb.example.com', '123456');
client.getAuthorizationHeader = async () => {
return {authorization: 'access_token'};
};
});
teardown(() => {
sandbox.restore();
});
test('fetchTestVariants caches both additional and non-additional variants', async () => {
const build: Build = {
id: '123',
endTime: '2017-12-15T01:30:15.05Z',
infra: {
resultdb: {
hostname: '',
invocation: 'foo',
},
},
builder: {},
status: BuildStatus.SCHEDULED,
createTime: '',
startTime: '',
};
const fetch = sandbox.stub(window, 'fetch');
fetch.onCall(0).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify({testVariants: []})}`,
} as Response)
);
fetch.onCall(1).returns(
Promise.resolve({
ok: true,
text: async () =>
`)]}'${JSON.stringify({
testVariants: [
{status: 'FLAKY', variant: '', results: [], exonerations: []},
],
})}`,
} as Response)
);
// inclAdditional is false.
assert.deepEqual(await client.fetchTestVariants(build, 1, false), []);
// inclAdditional is true.
assert.deepEqual(await client.fetchTestVariants(build, 1, true), [
{
status: TestVariantStatus.FLAKY,
variant: '',
results: [],
exonerations: [],
},
]);
sinon.assert.calledTwice(fetch);
// Results should be cached.
assert.deepEqual(await client.fetchTestVariants(build, 1, false), []);
assert.deepEqual(await client.fetchTestVariants(build, 1, true), [
{
status: TestVariantStatus.FLAKY,
variant: '',
results: [],
exonerations: [],
},
]);
sinon.assert.calledTwice(fetch);
});
test('fetchArtifacts fetches and sorts artifacts', async () => {
const firstPage = {
artifacts: Array.from({length: 10}, () => {
return {
name: 'invocations/123/result/artifacts/foo',
fetchUrlExpiration: '2017-12-15T01:30:15.05Z',
artifactId: '',
fetchUrl: '',
sizeBytes: 0,
};
}),
};
const secondPage = {
artifacts: [
{
name: 'invocations/123/artifacts/foo',
fetchUrlExpiration: '2017-12-15T01:30:15.05Z',
artifactId: '',
fetchUrl: '',
sizeBytes: 0,
},
],
};
const fetch = sandbox.stub(window, 'fetch');
fetch.onCall(0).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify(firstPage)}`,
} as Response)
);
fetch.onCall(1).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify(secondPage)}`,
} as Response)
);
assert.deepEqual(
await client.fetchArtifacts('invocations/123/result', true),
{
fromCache: false,
resArtifacts: firstPage.artifacts,
invArtifacts: secondPage.artifacts,
}
);
sinon.assert.calledTwice(fetch);
});
test('fetchArtifacts caches artifacts', async () => {
const fooArtifacts = [
{
name: 'invocations/123/artifacts/foo',
fetchUrlExpiration: '2999-12-15T01:30:15.05Z',
artifactId: '',
fetchUrl: '',
sizeBytes: 0,
},
];
const barArtifacts = [
{
name: 'invocations/123/artifacts/bar',
fetchUrlExpiration: '2999-12-15T01:30:15.05Z',
artifactId: '',
fetchUrl: '',
sizeBytes: 0,
},
];
const fetch = sandbox.stub(window, 'fetch');
fetch.onCall(0).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify({artifacts: fooArtifacts})}`,
} as Response)
);
fetch.onCall(1).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify([])}`,
} as Response)
);
fetch.onCall(2).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify({artifacts: barArtifacts})}`,
} as Response)
);
fetch.onCall(3).returns(
Promise.resolve({
ok: true,
text: async () => `)]}'${JSON.stringify([])}`,
} as Response)
);
assert.deepEqual(await client.fetchArtifacts('invocations/123/foo', true), {
fromCache: false,
resArtifacts: fooArtifacts,
invArtifacts: [],
});
assert.deepEqual(await client.fetchArtifacts('invocations/123/bar', true), {
fromCache: false,
resArtifacts: barArtifacts,
invArtifacts: [],
});
});
});