blob: 7e77a998df698b54aaa3e12b1f641e1922664297 [file] [log] [blame]
describe('CustomizableTestGroupFormTests', () => {
const scripts = ['instrumentation.js', '../shared/common-component-base.js', 'components/base.js',
'models/data-model.js', 'models/commit-log.js', 'models/commit-set.js', 'models/repository.js',
'components/test-group-form.js', 'components/customizable-test-group-form.js',
'components/repetition-type-selection.js', 'models/data-model.js', 'models/triggerable.js', 'models/test.js',
'models/platform.js', 'lazily-evaluated-function.js'];
async function createCustomizableTestGroupFormWithContext(context)
{
await context.importScripts(scripts, 'ComponentBase', 'DataModelObject', 'LabeledObject', 'Test',
'Platform', 'Repository', 'CommitLog', 'CommitSet', 'CustomizableTestGroupForm', 'MockRemoteAPI',
'LazilyEvaluatedFunction', 'RepetitionTypeSelection', 'TriggerableConfiguration');
const platform = new context.symbols.Platform(5, {name: 'SomePlatform', metrics: []});
const test = new context.symbols.Test(10, {name: 'SomeTest'});
new context.symbols.TriggerableConfiguration(1,
{platform, test, supportedRepetitionTypes: ['alternating', 'sequential']});
const customizableTestGroupForm = new context.symbols.CustomizableTestGroupForm;
context.document.body.appendChild(customizableTestGroupForm.element());
return customizableTestGroupForm;
}
const commitObjectA = {
"id": "185326",
"revision": "210948",
"repository": 1,
"previousCommit": null,
"ownsCommits": false,
"time": 1541494949681,
"authorName": "Zalan Bujtas",
"authorEmail": "zalan@apple.com",
"message": "a message",
};
const commitObjectB = {
"id": "185334",
"revision": "210949",
"repository": 1,
"previousCommit": null,
"ownsCommits": false,
"time": 1541494949682,
"authorName": "Chris Dumez",
"authorEmail": "cdumez@apple.com",
"message": "some message",
};
const commitObjectC = {
"id": "185336",
"revision": "210950",
"repository": 1,
"previousCommit": null,
"ownsCommits": false,
"time": 1541494949682,
"authorName": "Chris Dumez",
"authorEmail": "cdumez@apple.com",
"message": "some message",
};
function cloneObject(object)
{
const clone = {};
for (const [key, value] of Object.entries(object))
clone[key] = value;
return clone;
}
it('Changing the value in revision editor should update corresponding commitSet as long as the repository of that row does not have owner', async () => {
const context = new BrowsingContext();
const customizableTestGroupForm = await createCustomizableTestGroupFormWithContext(context);
const repository = context.symbols.Repository.ensureSingleton(1, {name: 'WebKit'});
const commitA = cloneObject(commitObjectA);
const commitB = cloneObject(commitObjectB);
commitA.repository = repository;
commitB.repository = repository;
const webkitCommitA = context.symbols.CommitLog.ensureSingleton(185326, commitA);
const webkitCommitB = context.symbols.CommitLog.ensureSingleton(185334, commitB);
const commitSetA = context.symbols.CommitSet.ensureSingleton(1, {revisionItems: [{commit: webkitCommitA}]});
const commitSetB = context.symbols.CommitSet.ensureSingleton(2, {revisionItems: [{commit: webkitCommitB}]});
customizableTestGroupForm.setCommitSetMap({A: commitSetA, B: commitSetB});
customizableTestGroupForm.content('customize-link').click();
const requests = context.symbols.MockRemoteAPI.requests;
expect(requests.length).to.be(2);
expect(requests[0].url).to.be('/api/commits/1/210948?prefix-match=true');
expect(requests[1].url).to.be('/api/commits/1/210949?prefix-match=true');
requests[0].resolve({commits: [commitObjectA]});
requests[1].resolve({commits: [commitObjectB]});
await requests[0].promise;
await requests[1].promise;
await waitForComponentsToRender(context);
const radioButton = customizableTestGroupForm.content('custom-table').querySelector('input[type="radio"][name="A-1-radio"]:not(:checked)');
radioButton.click();
expect(radioButton.checked).to.be(true);
let revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
expect(revisionEditors.length).to.be(2);
let revisionEditor = revisionEditors[0];
expect(revisionEditor.value).to.be('210949');
await waitForComponentsToRender(context);
revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
revisionEditor = revisionEditors[0];
revisionEditor.value = '210948';
revisionEditor.dispatchEvent(new Event('change'));
customizableTestGroupForm.content('name').value = 'a/b test';
customizableTestGroupForm.content('name').dispatchEvent(new Event('input'));
await waitForComponentsToRender(context);
// This is a hack by accessing the private member
// customizableTestGroupForm will use commitSet.updateRevisionForOwnerRepository to update the revision, need to await this to see the input value gets updated to 210948
await customizableTestGroupForm._commitSetMap.get('A')._fetchCommitLogAndOwnedCommits(repository, '210948');
// It will enqueue to render, draw a new input with right revision
await waitForComponentsToRender(context);
revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
revisionEditor = revisionEditors[0];
expect(revisionEditor.value).to.be('210948');
});
it('should allow user to only provide prefix of a commit as long as the commit is unique in the repository', async () => {
const context = new BrowsingContext();
const customizableTestGroupForm = await createCustomizableTestGroupFormWithContext(context);
const repository = context.symbols.Repository.ensureSingleton(1, {name: 'WebKit'});
const commitA = cloneObject(commitObjectA);
const commitB = cloneObject(commitObjectB);
const commitC = cloneObject(commitObjectC);
commitA.repository = repository;
commitB.repository = repository;
commitC.repository = repository;
const webkitCommitA = context.symbols.CommitLog.ensureSingleton(185326, commitA);
const webkitCommitB = context.symbols.CommitLog.ensureSingleton(185334, commitB);
const commitSetA = context.symbols.CommitSet.ensureSingleton(1, {revisionItems: [{commit: webkitCommitA}]});
const commitSetB = context.symbols.CommitSet.ensureSingleton(2, {revisionItems: [{commit: webkitCommitB}]});
customizableTestGroupForm.setCommitSetMap({A: commitSetA, B: commitSetB});
customizableTestGroupForm.content('customize-link').click();
const requests = context.symbols.MockRemoteAPI.requests;
expect(requests.length).to.be(2);
expect(requests[0].url).to.be('/api/commits/1/210948?prefix-match=true');
expect(requests[1].url).to.be('/api/commits/1/210949?prefix-match=true');
requests[0].resolve({commits: [commitObjectA]});
requests[1].resolve({commits: [commitObjectB]});
await requests[0].promise;
await requests[1].promise;
await waitForComponentsToRender(context);
const radioButton = customizableTestGroupForm.content('custom-table').querySelector('input[type="radio"][name="A-1-radio"]:not(:checked)');
radioButton.click();
expect(radioButton.checked).to.be(true);
let revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
expect(revisionEditors.length).to.be(2);
let revisionEditor = revisionEditors[0];
expect(revisionEditor.value).to.be('210949');
revisionEditor.value = '21095';
revisionEditor.dispatchEvent(new Event('change'));
customizableTestGroupForm.content('name').value = 'a/b test';
customizableTestGroupForm.content('name').dispatchEvent(new Event('input'));
expect(requests.length).to.be(3);
expect(requests[2].url).to.be('/api/commits/1/21095?prefix-match=true');
requests[2].resolve({commits: [commitObjectC]});
await requests[2].promise;
await waitForComponentsToRender(context);
revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
revisionEditor = revisionEditors[0];
expect(revisionEditor.value).to.be('210950');
});
it('should use the commit set map when customize button is clicked as the behavior of radio buttons', async () => {
const context = new BrowsingContext();
const customizableTestGroupForm = await createCustomizableTestGroupFormWithContext(context);
const repository = context.symbols.Repository.ensureSingleton(1, {name: 'WebKit'});
const commitA = cloneObject(commitObjectA);
const commitB = cloneObject(commitObjectB);
commitA.repository = repository;
commitB.repository = repository;
const webkitCommitA = context.symbols.CommitLog.ensureSingleton(185326, commitA);
const webkitCommitB = context.symbols.CommitLog.ensureSingleton(185334, commitB);
const commitSetA = context.symbols.CommitSet.ensureSingleton(1, {revisionItems: [{commit: webkitCommitA}]});
const commitSetB = context.symbols.CommitSet.ensureSingleton(2, {revisionItems: [{commit: webkitCommitB}]});
customizableTestGroupForm.setCommitSetMap({A: commitSetA, B: commitSetB});
customizableTestGroupForm.content('customize-link').click();
const requests = context.symbols.MockRemoteAPI.requests;
expect(requests.length).to.be(2);
expect(requests[0].url).to.be('/api/commits/1/210948?prefix-match=true');
expect(requests[1].url).to.be('/api/commits/1/210949?prefix-match=true');
requests[0].resolve({commits: [commitObjectA]});
requests[1].resolve({commits: [commitObjectB]});
await requests[0].promise;
await requests[1].promise;
await waitForComponentsToRender(context);
let revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
expect(revisionEditors.length).to.be(2);
let revisionEditor = revisionEditors[0];
expect(revisionEditor.value).to.be('210948');
revisionEditor.value = '210949';
revisionEditor.dispatchEvent(new Event('change'));
customizableTestGroupForm.content('name').value = 'a/b test';
customizableTestGroupForm.content('name').dispatchEvent(new Event('input'));
await waitForComponentsToRender(context);
let radioButton = customizableTestGroupForm.content('custom-table').querySelector('input[type="radio"][name="A-1-radio"]:not(:checked)');
radioButton.click();
expect(radioButton.checked).to.be(true);
radioButton = customizableTestGroupForm.content('custom-table').querySelector('input[type="radio"][name="A-1-radio"]:not(:checked)');
radioButton.click();
expect(radioButton.checked).to.be(true);
revisionEditors = customizableTestGroupForm.content('custom-table').querySelectorAll('input:not([type="radio"])');
revisionEditor = revisionEditors[0];
expect(revisionEditor.value).to.be('210948');
});
});