Replace some deprecate done()s in frontend tests

Replace 20% of all done() usages in frontend tests. Replaces all usages
in elements/shared/... showcasing that there is no instance where the
usage of done() is justified.

Change-Id: I24b5644cd96c68097429583c44ae58301df374d6
This commit is contained in:
Ben Rohlfs
2020-09-25 12:46:02 +02:00
parent c7ea9c3dbe
commit d450fb237e
25 changed files with 626 additions and 681 deletions

View File

@@ -38,10 +38,8 @@ suite('gr-account-entry tests', () => {
some_other_property: 'other value', some_other_property: 'other value',
}; };
setup(done => { setup(() => {
element = basicFixture.instantiate(); element = basicFixture.instantiate();
return flush(done);
}); });
suite('stubbed values for querySuggestions', () => { suite('stubbed values for querySuggestions', () => {

View File

@@ -156,7 +156,7 @@ suite('gr-account-list tests', () => {
assert.isFalse(chips[0].classList.contains('pendingAdd')); assert.isFalse(chips[0].classList.contains('pendingAdd'));
}); });
test('_getSuggestions uses filter correctly', done => { test('_getSuggestions uses filter correctly', () => {
const originalSuggestions = [ const originalSuggestions = [
{ {
email: 'abc@example.com', email: 'abc@example.com',
@@ -184,7 +184,7 @@ suite('gr-account-list tests', () => {
}; };
}); });
element._getSuggestions().then(suggestions => { return element._getSuggestions().then(suggestions => {
// Default is no filtering. // Default is no filtering.
assert.equal(suggestions.length, 3); assert.equal(suggestions.length, 3);
@@ -194,13 +194,12 @@ suite('gr-account-list tests', () => {
return suggestion._account_id === accountId; return suggestion._account_id === accountId;
}; };
element._getSuggestions() return element._getSuggestions();
})
.then(suggestions => { .then(suggestions => {
assert.deepEqual(suggestions, assert.deepEqual(suggestions,
[{name: originalSuggestions[0].email, [{name: originalSuggestions[0].email,
value: originalSuggestions[0]._account_id}]); value: originalSuggestions[0]._account_id}]);
})
.then(done);
}); });
}); });

View File

@@ -39,11 +39,13 @@ suite('gr-alert tests', () => {
assert.isNull(element.parentNode); assert.isNull(element.parentNode);
}); });
test('action event', done => { test('action event', () => {
const spy = sinon.spy();
element.show(); element.show();
element._actionCallback = done; element._actionCallback = spy;
MockInteractions.tap(element.shadowRoot assert.isFalse(spy.called);
.querySelector('.action')); MockInteractions.tap(element.shadowRoot.querySelector('.action'));
assert.isTrue(spy.called);
}); });
}); });

View File

@@ -42,12 +42,11 @@ suite('gr-autocomplete-dropdown', () => {
assert.equal(els[1].innerText.trim(), '2'); assert.equal(els[1].innerText.trim(), '2');
}); });
test('escape key', done => { test('escape key', () => {
const closeSpy = sinon.spy(element, 'close'); const closeSpy = sinon.spy(element, 'close');
MockInteractions.pressAndReleaseKeyOn(element, 27); MockInteractions.pressAndReleaseKeyOn(element, 27);
flush(); flush();
assert.isTrue(closeSpy.called); assert.isTrue(closeSpy.called);
done();
}); });
test('tab key', () => { test('tab key', () => {

View File

@@ -81,7 +81,7 @@ suite('gr-autocomplete tests', () => {
assert.isTrue(selectionStub.called); assert.isTrue(selectionStub.called);
}); });
test('esc key behavior', done => { test('esc key behavior', () => {
let promise; let promise;
const queryStub = sinon.spy(() => promise = Promise.resolve([ const queryStub = sinon.spy(() => promise = Promise.resolve([
{name: 'blah', value: 123}, {name: 'blah', value: 123},
@@ -93,7 +93,7 @@ suite('gr-autocomplete tests', () => {
element._focused = true; element._focused = true;
element.text = 'blah'; element.text = 'blah';
promise.then(() => { return promise.then(() => {
assert.isFalse(element.$.suggestions.isHidden); assert.isFalse(element.$.suggestions.isHidden);
const cancelHandler = sinon.spy(); const cancelHandler = sinon.spy();
@@ -106,11 +106,10 @@ suite('gr-autocomplete tests', () => {
MockInteractions.pressAndReleaseKeyOn(element.$.input, 27, null, 'esc'); MockInteractions.pressAndReleaseKeyOn(element.$.input, 27, null, 'esc');
assert.isTrue(cancelHandler.called); assert.isTrue(cancelHandler.called);
done();
}); });
}); });
test('emits commit and handles cursor movement', done => { test('emits commit and handles cursor movement', () => {
let promise; let promise;
const queryStub = sinon.spy(input => promise = Promise.resolve([ const queryStub = sinon.spy(input => promise = Promise.resolve([
{name: input + ' 0', value: 0}, {name: input + ' 0', value: 0},
@@ -126,7 +125,7 @@ suite('gr-autocomplete tests', () => {
element._focused = true; element._focused = true;
element.text = 'blah'; element.text = 'blah';
promise.then(() => { return promise.then(() => {
assert.isFalse(element.$.suggestions.isHidden); assert.isFalse(element.$.suggestions.isHidden);
const commitHandler = sinon.spy(); const commitHandler = sinon.spy();
@@ -156,11 +155,10 @@ suite('gr-autocomplete tests', () => {
assert.equal(commitHandler.getCall(0).args[0].detail.value, 1); assert.equal(commitHandler.getCall(0).args[0].detail.value, 1);
assert.isTrue(element.$.suggestions.isHidden); assert.isTrue(element.$.suggestions.isHidden);
assert.isTrue(element._focused); assert.isTrue(element._focused);
done();
}); });
}); });
test('clear-on-commit behavior (off)', done => { test('clear-on-commit behavior (off)', () => {
let promise; let promise;
const queryStub = sinon.spy(() => { const queryStub = sinon.spy(() => {
promise = Promise.resolve([{name: 'suggestion', value: 0}]); promise = Promise.resolve([{name: 'suggestion', value: 0}]);
@@ -170,7 +168,7 @@ suite('gr-autocomplete tests', () => {
focusOnInput(element); focusOnInput(element);
element.text = 'blah'; element.text = 'blah';
promise.then(() => { return promise.then(() => {
const commitHandler = sinon.spy(); const commitHandler = sinon.spy();
element.addEventListener('commit', commitHandler); element.addEventListener('commit', commitHandler);
@@ -179,11 +177,10 @@ suite('gr-autocomplete tests', () => {
assert.isTrue(commitHandler.called); assert.isTrue(commitHandler.called);
assert.equal(element.text, 'suggestion'); assert.equal(element.text, 'suggestion');
done();
}); });
}); });
test('clear-on-commit behavior (on)', done => { test('clear-on-commit behavior (on)', () => {
let promise; let promise;
const queryStub = sinon.spy(() => { const queryStub = sinon.spy(() => {
promise = Promise.resolve([{name: 'suggestion', value: 0}]); promise = Promise.resolve([{name: 'suggestion', value: 0}]);
@@ -194,7 +191,7 @@ suite('gr-autocomplete tests', () => {
element.text = 'blah'; element.text = 'blah';
element.clearOnCommit = true; element.clearOnCommit = true;
promise.then(() => { return promise.then(() => {
const commitHandler = sinon.spy(); const commitHandler = sinon.spy();
element.addEventListener('commit', commitHandler); element.addEventListener('commit', commitHandler);
@@ -203,7 +200,6 @@ suite('gr-autocomplete tests', () => {
assert.isTrue(commitHandler.called); assert.isTrue(commitHandler.called);
assert.equal(element.text, ''); assert.equal(element.text, '');
done();
}); });
}); });
@@ -246,7 +242,7 @@ suite('gr-autocomplete tests', () => {
assert.equal(element._suggestions.length, 0); assert.equal(element._suggestions.length, 0);
}); });
test('when focused', done => { test('when focused', () => {
let promise; let promise;
const queryStub = sinon.stub() const queryStub = sinon.stub()
.returns(promise = Promise.resolve([ .returns(promise = Promise.resolve([
@@ -258,14 +254,13 @@ suite('gr-autocomplete tests', () => {
element.text = 'bla'; element.text = 'bla';
assert.equal(element._focused, true); assert.equal(element._focused, true);
flush(); flush();
promise.then(() => { return promise.then(() => {
assert.equal(element._suggestions.length, 1); assert.equal(element._suggestions.length, 1);
assert.equal(queryStub.notCalled, false); assert.equal(queryStub.notCalled, false);
done();
}); });
}); });
test('when not focused', done => { test('when not focused', () => {
let promise; let promise;
const queryStub = sinon.stub() const queryStub = sinon.stub()
.returns(promise = Promise.resolve([ .returns(promise = Promise.resolve([
@@ -276,13 +271,12 @@ suite('gr-autocomplete tests', () => {
element.text = 'bla'; element.text = 'bla';
assert.equal(element._focused, false); assert.equal(element._focused, false);
flush(); flush();
promise.then(() => { return promise.then(() => {
assert.equal(element._suggestions.length, 0); assert.equal(element._suggestions.length, 0);
done();
}); });
}); });
test('suggestions should not carry over', done => { test('suggestions should not carry over', () => {
let promise; let promise;
const queryStub = sinon.stub() const queryStub = sinon.stub()
.returns(promise = Promise.resolve([ .returns(promise = Promise.resolve([
@@ -292,15 +286,14 @@ suite('gr-autocomplete tests', () => {
focusOnInput(element); focusOnInput(element);
element.text = 'bla'; element.text = 'bla';
flush(); flush();
promise.then(() => { return promise.then(() => {
assert.equal(element._suggestions.length, 1); assert.equal(element._suggestions.length, 1);
element._updateSuggestions('', 0, false); element._updateSuggestions('', 0, false);
assert.equal(element._suggestions.length, 0); assert.equal(element._suggestions.length, 0);
done();
}); });
}); });
test('multi completes only the last part of the query', done => { test('multi completes only the last part of the query', () => {
let promise; let promise;
const queryStub = sinon.stub() const queryStub = sinon.stub()
.returns(promise = Promise.resolve([ .returns(promise = Promise.resolve([
@@ -311,7 +304,7 @@ suite('gr-autocomplete tests', () => {
element.text = 'blah blah'; element.text = 'blah blah';
element.multi = true; element.multi = true;
promise.then(() => { return promise.then(() => {
const commitHandler = sinon.spy(); const commitHandler = sinon.spy();
element.addEventListener('commit', commitHandler); element.addEventListener('commit', commitHandler);
@@ -320,7 +313,6 @@ suite('gr-autocomplete tests', () => {
assert.isTrue(commitHandler.called); assert.isTrue(commitHandler.called);
assert.equal(element.text, 'blah 0'); assert.equal(element.text, 'blah 0');
done();
}); });
}); });

View File

@@ -59,7 +59,7 @@ suite('gr-button tests', () => {
assert.isFalse(paperBtn.disabled); assert.isFalse(paperBtn.disabled);
}); });
test('loading set from listener', done => { test('loading set from listener', () => {
let resolve; let resolve;
element.addEventListener('click', e => { element.addEventListener('click', e => {
e.target.loading = true; e.target.loading = true;
@@ -71,11 +71,9 @@ suite('gr-button tests', () => {
assert.isTrue(paperBtn.disabled); assert.isTrue(paperBtn.disabled);
assert.isTrue(element.hasAttribute('loading')); assert.isTrue(element.hasAttribute('loading'));
resolve(); resolve();
flush(() => { flush();
assert.isFalse(paperBtn.disabled); assert.isFalse(paperBtn.disabled);
assert.isFalse(element.hasAttribute('loading')); assert.isFalse(element.hasAttribute('loading'));
done();
});
}); });
test('tabindex should be -1 if disabled', () => { test('tabindex should be -1 if disabled', () => {

View File

@@ -45,24 +45,28 @@ suite('gr-change-star tests', () => {
assert.equal(icon.icon, 'gr-icons:star-border'); assert.equal(icon.icon, 'gr-icons:star-border');
}); });
test('starring', done => { test('starring', async () => {
element.addEventListener('toggle-star', () => { let resolve;
assert.equal(element.change.starred, true); const promise = new Promise(r => resolve = r);
done(); element.addEventListener('toggle-star', resolve);
});
element.set('change.starred', false); element.set('change.starred', false);
MockInteractions.tap(element.shadowRoot MockInteractions.tap(element.shadowRoot
.querySelector('button')); .querySelector('button'));
await promise;
assert.equal(element.change.starred, true);
}); });
test('unstarring', done => { test('unstarring', async () => {
element.addEventListener('toggle-star', () => { let resolve;
assert.equal(element.change.starred, false); const promise = new Promise(r => resolve = r);
done(); element.addEventListener('toggle-star', resolve);
});
element.set('change.starred', true); element.set('change.starred', true);
MockInteractions.tap(element.shadowRoot MockInteractions.tap(element.shadowRoot
.querySelector('button')); .querySelector('button'));
await promise;
assert.equal(element.change.starred, false);
}); });
}); });

View File

@@ -24,12 +24,11 @@ const basicFixture = fixtureFromElement('gr-copy-clipboard');
suite('gr-copy-clipboard tests', () => { suite('gr-copy-clipboard tests', () => {
let element; let element;
setup(done => { setup(async () => {
element = basicFixture.instantiate(); element = basicFixture.instantiate();
element.text = `git fetch http://gerrit@localhost:8080/a/test-project element.text = `git fetch http://gerrit@localhost:8080/a/test-project
refs/changes/05/5/1 && git checkout FETCH_HEAD`; refs/changes/05/5/1 && git checkout FETCH_HEAD`;
flush(); await flush();
flush(done);
}); });
test('copy to clipboard', () => { test('copy to clipboard', () => {

View File

@@ -41,7 +41,7 @@ suite('gr-date-formatter tests', () => {
} }
function testDates(nowStr, dateStr, expected, expectedWithDateAndTime, function testDates(nowStr, dateStr, expected, expectedWithDateAndTime,
expectedTooltip, done) { expectedTooltip) {
// Normalize and convert the date to mimic server response. // Normalize and convert the date to mimic server response.
dateStr = normalizedDate(dateStr) dateStr = normalizedDate(dateStr)
.toJSON() .toJSON()
@@ -49,7 +49,7 @@ suite('gr-date-formatter tests', () => {
.slice(0, -1); .slice(0, -1);
sinon.useFakeTimers(normalizedDate(nowStr).getTime()); sinon.useFakeTimers(normalizedDate(nowStr).getTime());
element.dateStr = dateStr; element.dateStr = dateStr;
flush(() => { flush();
const span = element.shadowRoot const span = element.shadowRoot
.querySelector('span'); .querySelector('span');
assert.equal(span.textContent.trim(), expected); assert.equal(span.textContent.trim(), expected);
@@ -57,8 +57,6 @@ suite('gr-date-formatter tests', () => {
element.showDateAndTime = true; element.showDateAndTime = true;
flush(); flush();
assert.equal(span.textContent.trim(), expectedWithDateAndTime); assert.equal(span.textContent.trim(), expectedWithDateAndTime);
done();
});
} }
function stubRestAPI(preferences) { function stubRestAPI(preferences) {
@@ -87,36 +85,36 @@ suite('gr-date-formatter tests', () => {
assert.equal(element._computeDateStr('foo', 'h:mm A'), ''); assert.equal(element._computeDateStr('foo', 'h:mm A'), '');
}); });
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'15:34', '15:34',
'15:34', '15:34',
'Jul 29, 2015, 15:34:14', done); 'Jul 29, 2015, 15:34:14');
}); });
test('Within 24 hours on different days', done => { test('Within 24 hours on different days', () => {
testDates('2015-07-29 03:34:14.985000000', testDates('2015-07-29 03:34:14.985000000',
'2015-07-28 20:25:14.985000000', '2015-07-28 20:25:14.985000000',
'Jul 28', 'Jul 28',
'Jul 28 20:25', 'Jul 28 20:25',
'Jul 28, 2015, 20:25:14', done); 'Jul 28, 2015, 20:25:14');
}); });
test('More than 24 hours but less than six months', done => { test('More than 24 hours but less than six months', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-06-15 03:25:14.985000000', '2015-06-15 03:25:14.985000000',
'Jun 15', 'Jun 15',
'Jun 15 03:25', 'Jun 15 03:25',
'Jun 15, 2015, 03:25:14', done); 'Jun 15, 2015, 03:25:14');
}); });
test('More than six months', done => { test('More than six months', () => {
testDates('2015-09-15 20:34:00.000000000', testDates('2015-09-15 20:34:00.000000000',
'2015-01-15 03:25:00.000000000', '2015-01-15 03:25:00.000000000',
'Jan 15, 2015', 'Jan 15, 2015',
'Jan 15, 2015 03:25', 'Jan 15, 2015 03:25',
'Jan 15, 2015, 03:25:00', done); 'Jan 15, 2015, 03:25:00');
}); });
}); });
@@ -131,28 +129,28 @@ suite('gr-date-formatter tests', () => {
return element._loadPreferences(); return element._loadPreferences();
})); }));
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'15:34', '15:34',
'15:34', '15:34',
'07/29/15, 15:34:14', done); '07/29/15, 15:34:14');
}); });
test('Within 24 hours on different days', done => { test('Within 24 hours on different days', () => {
testDates('2015-07-29 03:34:14.985000000', testDates('2015-07-29 03:34:14.985000000',
'2015-07-28 20:25:14.985000000', '2015-07-28 20:25:14.985000000',
'07/28', '07/28',
'07/28 20:25', '07/28 20:25',
'07/28/15, 20:25:14', done); '07/28/15, 20:25:14');
}); });
test('More than 24 hours but less than six months', done => { test('More than 24 hours but less than six months', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-06-15 03:25:14.985000000', '2015-06-15 03:25:14.985000000',
'06/15', '06/15',
'06/15 03:25', '06/15 03:25',
'06/15/15, 03:25:14', done); '06/15/15, 03:25:14');
}); });
}); });
@@ -167,28 +165,28 @@ suite('gr-date-formatter tests', () => {
return element._loadPreferences(); return element._loadPreferences();
})); }));
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'15:34', '15:34',
'15:34', '15:34',
'2015-07-29, 15:34:14', done); '2015-07-29, 15:34:14');
}); });
test('Within 24 hours on different days', done => { test('Within 24 hours on different days', () => {
testDates('2015-07-29 03:34:14.985000000', testDates('2015-07-29 03:34:14.985000000',
'2015-07-28 20:25:14.985000000', '2015-07-28 20:25:14.985000000',
'07-28', '07-28',
'07-28 20:25', '07-28 20:25',
'2015-07-28, 20:25:14', done); '2015-07-28, 20:25:14');
}); });
test('More than 24 hours but less than six months', done => { test('More than 24 hours but less than six months', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-06-15 03:25:14.985000000', '2015-06-15 03:25:14.985000000',
'06-15', '06-15',
'06-15 03:25', '06-15 03:25',
'2015-06-15, 03:25:14', done); '2015-06-15, 03:25:14');
}); });
}); });
@@ -203,28 +201,28 @@ suite('gr-date-formatter tests', () => {
return element._loadPreferences(); return element._loadPreferences();
})); }));
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'15:34', '15:34',
'15:34', '15:34',
'29.07.2015, 15:34:14', done); '29.07.2015, 15:34:14');
}); });
test('Within 24 hours on different days', done => { test('Within 24 hours on different days', () => {
testDates('2015-07-29 03:34:14.985000000', testDates('2015-07-29 03:34:14.985000000',
'2015-07-28 20:25:14.985000000', '2015-07-28 20:25:14.985000000',
'28. Jul', '28. Jul',
'28. Jul 20:25', '28. Jul 20:25',
'28.07.2015, 20:25:14', done); '28.07.2015, 20:25:14');
}); });
test('More than 24 hours but less than six months', done => { test('More than 24 hours but less than six months', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-06-15 03:25:14.985000000', '2015-06-15 03:25:14.985000000',
'15. Jun', '15. Jun',
'15. Jun 03:25', '15. Jun 03:25',
'15.06.2015, 03:25:14', done); '15.06.2015, 03:25:14');
}); });
}); });
@@ -239,28 +237,28 @@ suite('gr-date-formatter tests', () => {
return element._loadPreferences(); return element._loadPreferences();
})); }));
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'15:34', '15:34',
'15:34', '15:34',
'29/07/2015, 15:34:14', done); '29/07/2015, 15:34:14');
}); });
test('Within 24 hours on different days', done => { test('Within 24 hours on different days', () => {
testDates('2015-07-29 03:34:14.985000000', testDates('2015-07-29 03:34:14.985000000',
'2015-07-28 20:25:14.985000000', '2015-07-28 20:25:14.985000000',
'28/07', '28/07',
'28/07 20:25', '28/07 20:25',
'28/07/2015, 20:25:14', done); '28/07/2015, 20:25:14');
}); });
test('More than 24 hours but less than six months', done => { test('More than 24 hours but less than six months', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-06-15 03:25:14.985000000', '2015-06-15 03:25:14.985000000',
'15/06', '15/06',
'15/06 03:25', '15/06 03:25',
'15/06/2015, 03:25:14', done); '15/06/2015, 03:25:14');
}); });
}); });
@@ -276,12 +274,12 @@ suite('gr-date-formatter tests', () => {
}) })
); );
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'3:34 PM', '3:34 PM',
'3:34 PM', '3:34 PM',
'Jul 29, 2015, 3:34:14 PM', done); 'Jul 29, 2015, 3:34:14 PM');
}); });
}); });
@@ -297,12 +295,12 @@ suite('gr-date-formatter tests', () => {
}) })
); );
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'3:34 PM', '3:34 PM',
'3:34 PM', '3:34 PM',
'07/29/15, 3:34:14 PM', done); '07/29/15, 3:34:14 PM');
}); });
}); });
@@ -318,12 +316,12 @@ suite('gr-date-formatter tests', () => {
}) })
); );
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'3:34 PM', '3:34 PM',
'3:34 PM', '3:34 PM',
'2015-07-29, 3:34:14 PM', done); '2015-07-29, 3:34:14 PM');
}); });
}); });
@@ -339,12 +337,12 @@ suite('gr-date-formatter tests', () => {
}) })
); );
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'3:34 PM', '3:34 PM',
'3:34 PM', '3:34 PM',
'29.07.2015, 3:34:14 PM', done); '29.07.2015, 3:34:14 PM');
}); });
}); });
@@ -360,12 +358,12 @@ suite('gr-date-formatter tests', () => {
}) })
); );
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'3:34 PM', '3:34 PM',
'3:34 PM', '3:34 PM',
'29/07/2015, 3:34:14 PM', done); '29/07/2015, 3:34:14 PM');
}); });
}); });
@@ -380,20 +378,20 @@ suite('gr-date-formatter tests', () => {
return element._loadPreferences(); return element._loadPreferences();
})); }));
test('Within 24 hours on same day', done => { test('Within 24 hours on same day', () => {
testDates('2015-07-29 20:34:14.985000000', testDates('2015-07-29 20:34:14.985000000',
'2015-07-29 15:34:14.985000000', '2015-07-29 15:34:14.985000000',
'5 hours ago', '5 hours ago',
'5 hours ago', '5 hours ago',
'Jul 29, 2015, 3:34:14 PM', done); 'Jul 29, 2015, 3:34:14 PM');
}); });
test('More than six months', done => { test('More than six months', () => {
testDates('2015-09-15 20:34:00.000000000', testDates('2015-09-15 20:34:00.000000000',
'2015-01-15 03:25:00.000000000', '2015-01-15 03:25:00.000000000',
'8 months ago', '8 months ago',
'8 months ago', '8 months ago',
'Jan 15, 2015, 3:25:00 AM', done); 'Jan 15, 2015, 3:25:00 AM');
}); });
}); });

View File

@@ -28,35 +28,35 @@ suite('gr-dialog tests', () => {
element = basicFixture.instantiate(); element = basicFixture.instantiate();
}); });
test('events', done => { test('events', () => {
let numEvents = 0; const confirm = sinon.stub();
function handler() { if (++numEvents == 2) { done(); } } const cancel = sinon.stub();
element.addEventListener('confirm', confirm);
element.addEventListener('cancel', cancel);
element.addEventListener('confirm', handler); MockInteractions.tap(
element.addEventListener('cancel', handler); element.shadowRoot.querySelector('gr-button[primary]'));
assert.equal(confirm.callCount, 1);
MockInteractions.tap(element.shadowRoot MockInteractions.tap(
.querySelector('gr-button[primary]')); element.shadowRoot.querySelector('gr-button:not([primary])'));
MockInteractions.tap(element.shadowRoot assert.equal(cancel.callCount, 1);
.querySelector('gr-button:not([primary])'));
}); });
test('confirmOnEnter', () => { test('confirmOnEnter', () => {
element.confirmOnEnter = false; element.confirmOnEnter = false;
const handleConfirmStub = sinon.stub(element, '_handleConfirm'); const handleConfirmStub = sinon.stub(element, '_handleConfirm');
const handleKeydownSpy = sinon.spy(element, '_handleKeydown'); const handleKeydownSpy = sinon.spy(element, '_handleKeydown');
MockInteractions.pressAndReleaseKeyOn(element.shadowRoot MockInteractions.pressAndReleaseKeyOn(
.querySelector('main'), element.shadowRoot.querySelector('main'), 13, null, 'enter');
13, null, 'enter');
flush(); flush();
assert.isTrue(handleKeydownSpy.called); assert.isTrue(handleKeydownSpy.called);
assert.isFalse(handleConfirmStub.called); assert.isFalse(handleConfirmStub.called);
element.confirmOnEnter = true; element.confirmOnEnter = true;
MockInteractions.pressAndReleaseKeyOn(element.shadowRoot MockInteractions.pressAndReleaseKeyOn(
.querySelector('main'), element.shadowRoot.querySelector('main'), 13, null, 'enter');
13, null, 'enter');
flush(); flush();
assert.isTrue(handleConfirmStub.called); assert.isTrue(handleConfirmStub.called);

View File

@@ -49,13 +49,12 @@ suite('gr-download-commands', () => {
}); });
suite('unauthenticated', () => { suite('unauthenticated', () => {
setup(done => { setup(async () => {
element = basicFixture.instantiate(); element = basicFixture.instantiate();
element.schemes = SCHEMES; element.schemes = SCHEMES;
element.commands = COMMANDS; element.commands = COMMANDS;
element.selectedScheme = SELECTED_SCHEME; element.selectedScheme = SELECTED_SCHEME;
flush(); await flush();
flush(done);
}); });
test('focusOnCopy', () => { test('focusOnCopy', () => {
@@ -79,17 +78,16 @@ suite('gr-download-commands', () => {
.querySelector('.commands'))); .querySelector('.commands')));
}); });
test('tab selection', done => { test('tab selection', () => {
assert.equal(element.$.downloadTabs.selected, '0'); assert.equal(element.$.downloadTabs.selected, '0');
MockInteractions.tap(element.shadowRoot MockInteractions.tap(element.shadowRoot
.querySelector('[data-scheme="ssh"]')); .querySelector('[data-scheme="ssh"]'));
flush(); flush();
assert.equal(element.selectedScheme, 'ssh'); assert.equal(element.selectedScheme, 'ssh');
assert.equal(element.$.downloadTabs.selected, '2'); assert.equal(element.$.downloadTabs.selected, '2');
done();
}); });
test('loads scheme from preferences', done => { test('loads scheme from preferences', () => {
stub('gr-rest-api-interface', { stub('gr-rest-api-interface', {
getPreferences() { getPreferences() {
return Promise.resolve({download_scheme: 'repo'}); return Promise.resolve({download_scheme: 'repo'});
@@ -97,22 +95,20 @@ suite('gr-download-commands', () => {
}); });
element._loggedIn = true; element._loggedIn = true;
assert.isTrue(element.$.restAPI.getPreferences.called); assert.isTrue(element.$.restAPI.getPreferences.called);
element.$.restAPI.getPreferences.lastCall.returnValue.then(() => { return element.$.restAPI.getPreferences.lastCall.returnValue.then(() => {
assert.equal(element.selectedScheme, 'repo'); assert.equal(element.selectedScheme, 'repo');
done();
}); });
}); });
test('normalize scheme from preferences', done => { test('normalize scheme from preferences', () => {
stub('gr-rest-api-interface', { stub('gr-rest-api-interface', {
getPreferences() { getPreferences() {
return Promise.resolve({download_scheme: 'REPO'}); return Promise.resolve({download_scheme: 'REPO'});
}, },
}); });
element._loggedIn = true; element._loggedIn = true;
element.$.restAPI.getPreferences.lastCall.returnValue.then(() => { return element.$.restAPI.getPreferences.lastCall.returnValue.then(() => {
assert.equal(element.selectedScheme, 'repo'); assert.equal(element.selectedScheme, 'repo');
done();
}); });
}); });

View File

@@ -37,15 +37,13 @@ suite('gr-dropdown-list tests', () => {
assert.isTrue(copyEl.hidden); assert.isTrue(copyEl.hidden);
}); });
test('show copy if enabled', done => { test('show copy if enabled', () => {
element.showCopyForTriggerText = true; element.showCopyForTriggerText = true;
flush(() => { flush();
const copyEl = element.shadowRoot const copyEl = element.shadowRoot.querySelector(
.querySelector('#triggerText + gr-copy-clipboard'); '#triggerText + gr-copy-clipboard');
assert.isTrue(!!copyEl); assert.isTrue(!!copyEl);
assert.isFalse(copyEl.hidden); assert.isFalse(copyEl.hidden);
done();
});
}); });
test('tap on trigger opens menu', () => { test('tap on trigger opens menu', () => {
@@ -66,7 +64,7 @@ suite('gr-dropdown-list tests', () => {
assert.equal(element._computeMobileText(item), item.mobileText); assert.equal(element._computeMobileText(item), item.mobileText);
}); });
test('options are selected and laid out correctly', done => { test('options are selected and laid out correctly', async () => {
element.value = 2; element.value = 2;
element.items = [ element.items = [
{ {
@@ -93,7 +91,8 @@ suite('gr-dropdown-list tests', () => {
assert.equal(element.shadowRoot assert.equal(element.shadowRoot
.querySelector('paper-listbox').selected, element.value); .querySelector('paper-listbox').selected, element.value);
assert.equal(element.text, 'Button Text 2'); assert.equal(element.text, 'Button Text 2');
flush(() => { await flush();
const items = element.root.querySelectorAll('paper-item'); const items = element.root.querySelectorAll('paper-item');
const mobileItems = element.root.querySelectorAll('option'); const mobileItems = element.root.querySelectorAll('option');
assert.equal(items.length, 3); assert.equal(items.length, 3);
@@ -163,8 +162,6 @@ suite('gr-dropdown-list tests', () => {
// Since no triggerText, the fallback is used. // Since no triggerText, the fallback is used.
assert.equal(element.text, element.items[0].text); assert.equal(element.text, element.items[0].text);
done();
});
}); });
}); });

View File

@@ -27,23 +27,27 @@ suite('gr-editable-content tests', () => {
element = basicFixture.instantiate(); element = basicFixture.instantiate();
}); });
test('save event', done => { test('save event', () => {
element.content = ''; element.content = '';
element._newContent = 'foo'; element._newContent = 'foo';
element.addEventListener('editable-content-save', e => { const handler = sinon.spy();
assert.equal(e.detail.content, 'foo'); element.addEventListener('editable-content-save', handler);
done();
});
MockInteractions.tap(element.shadowRoot MockInteractions.tap(element.shadowRoot
.querySelector('gr-button[primary]')); .querySelector('gr-button[primary]'));
assert.isTrue(handler.called);
assert.equal(handler.lastCall.args[0].detail.content, 'foo');
}); });
test('cancel event', done => { test('cancel event', () => {
element.addEventListener('editable-content-cancel', () => { const handler = sinon.spy();
done(); element.addEventListener('editable-content-cancel', handler);
});
MockInteractions.tap(element.shadowRoot MockInteractions.tap(element.shadowRoot
.querySelector('gr-button:not([primary])')); .querySelector('gr-button:not([primary])'));
assert.isTrue(handler.called);
}); });
test('enabling editing keeps old content', () => { test('enabling editing keeps old content', () => {

View File

@@ -17,7 +17,6 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-editable-label.js'; import './gr-editable-label.js';
import {flush as flush$0} from '@polymer/polymer/lib/legacy/polymer.dom.js';
import {html} from '@polymer/polymer/lib/utils/html-tag.js'; import {html} from '@polymer/polymer/lib/utils/html-tag.js';
const basicFixture = fixtureFromTemplate(html` const basicFixture = fixtureFromTemplate(html`
@@ -71,126 +70,106 @@ suite('gr-editable-label tests', () => {
}); });
}); });
test('title with placeholder', done => { test('title with placeholder', () => {
assert.equal(element.title, 'value text'); assert.equal(element.title, 'value text');
element.value = ''; element.value = '';
element.async(() => { flush();
assert.equal(element.title, 'label text'); assert.equal(element.title, 'label text');
done();
});
}); });
test('title without placeholder', done => { test('title without placeholder', () => {
assert.equal(elementNoPlaceholder.title, ''); assert.equal(elementNoPlaceholder.title, '');
element.value = 'value text'; element.value = 'value text';
element.async(() => { flush();
assert.equal(element.title, 'value text'); assert.equal(element.title, 'value text');
done();
});
}); });
test('edit value', done => { test('edit value', async () => {
const editedStub = sinon.stub(); const editedSpy = sinon.spy();
element.addEventListener('changed', editedStub); element.addEventListener('changed', editedSpy);
assert.isFalse(element.editing); assert.isFalse(element.editing);
MockInteractions.tap(label); MockInteractions.tap(label);
flush();
flush$0();
assert.isTrue(element.editing); assert.isTrue(element.editing);
assert.isFalse(editedSpy.called);
element._inputText = 'new text'; element._inputText = 'new text';
assert.isFalse(editedStub.called);
element.async(() => {
assert.isTrue(editedStub.called);
assert.equal(input.value, 'new text');
assert.isFalse(element.editing);
done();
});
// Press enter: // Press enter:
MockInteractions.keyDownOn(input, 13); MockInteractions.keyDownOn(input, 13);
}); flush();
test('save button', done => { assert.isTrue(editedSpy.called);
const editedStub = sinon.stub();
element.addEventListener('changed', editedStub);
assert.isFalse(element.editing);
MockInteractions.tap(label);
flush$0();
assert.isTrue(element.editing);
element._inputText = 'new text';
assert.isFalse(editedStub.called);
element.async(() => {
assert.isTrue(editedStub.called);
assert.equal(input.value, 'new text'); assert.equal(input.value, 'new text');
assert.isFalse(element.editing); assert.isFalse(element.editing);
done();
}); });
test('save button', () => {
const editedSpy = sinon.spy();
element.addEventListener('changed', editedSpy);
assert.isFalse(element.editing);
MockInteractions.tap(label);
flush();
assert.isTrue(element.editing);
assert.isFalse(editedSpy.called);
element._inputText = 'new text';
// Press enter: // Press enter:
MockInteractions.tap(element.$.saveBtn, 13); MockInteractions.tap(element.$.saveBtn, 13);
flush();
assert.isTrue(editedSpy.called);
assert.equal(input.value, 'new text');
assert.isFalse(element.editing);
}); });
test('edit and then escape key', done => { test('edit and then escape key', () => {
const editedStub = sinon.stub(); const editedSpy = sinon.spy();
element.addEventListener('changed', editedStub); element.addEventListener('changed', editedSpy);
assert.isFalse(element.editing); assert.isFalse(element.editing);
MockInteractions.tap(label); MockInteractions.tap(label);
flush();
flush$0();
assert.isTrue(element.editing); assert.isTrue(element.editing);
assert.isFalse(editedSpy.called);
element._inputText = 'new text'; element._inputText = 'new text';
assert.isFalse(editedStub.called);
element.async(() => {
assert.isFalse(editedStub.called);
// Text changes should be discarded.
assert.equal(input.value, 'value text');
assert.isFalse(element.editing);
done();
});
// Press escape: // Press escape:
MockInteractions.keyDownOn(input, 27); MockInteractions.keyDownOn(input, 27);
}); flush();
test('cancel button', done => { assert.isFalse(editedSpy.called);
const editedStub = sinon.stub();
element.addEventListener('changed', editedStub);
assert.isFalse(element.editing);
MockInteractions.tap(label);
flush$0();
assert.isTrue(element.editing);
element._inputText = 'new text';
assert.isFalse(editedStub.called);
element.async(() => {
assert.isFalse(editedStub.called);
// Text changes should be discarded. // Text changes should be discarded.
assert.equal(input.value, 'value text'); assert.equal(input.value, 'value text');
assert.isFalse(element.editing); assert.isFalse(element.editing);
done();
}); });
test('cancel button', () => {
const editedSpy = sinon.spy();
element.addEventListener('changed', editedSpy);
assert.isFalse(element.editing);
MockInteractions.tap(label);
flush();
assert.isTrue(element.editing);
assert.isFalse(editedSpy.called);
element._inputText = 'new text';
// Press escape: // Press escape:
MockInteractions.tap(element.$.cancelBtn); MockInteractions.tap(element.$.cancelBtn);
flush();
assert.isFalse(editedSpy.called);
// Text changes should be discarded.
assert.equal(input.value, 'value text');
assert.isFalse(element.editing);
}); });
suite('gr-editable-label read-only tests', () => { suite('gr-editable-label read-only tests', () => {
@@ -208,7 +187,7 @@ suite('gr-editable-label tests', () => {
assert.isFalse(element.$.dropdown.opened); assert.isFalse(element.$.dropdown.opened);
MockInteractions.tap(label); MockInteractions.tap(label);
flush$0(); flush();
// The dropdown is still closed. // The dropdown is still closed.
assert.isFalse(element.$.dropdown.opened); assert.isFalse(element.$.dropdown.opened);

View File

@@ -112,7 +112,7 @@ suite('gr-hovercard-account tests', () => {
element.voteableText); element.voteableText);
}); });
test('add to attention set', done => { test('add to attention set', async () => {
let apiResolve; let apiResolve;
const apiPromise = new Promise(r => { const apiPromise = new Promise(r => {
apiResolve = r; apiResolve = r;
@@ -140,13 +140,12 @@ suite('gr-hovercard-account tests', () => {
assert.isFalse(element._isShowing, 'hovercard is hidden'); assert.isFalse(element._isShowing, 'hovercard is hidden');
apiResolve({}); apiResolve({});
flush(() => { await flush();
assert.isTrue(hideAlertListener.called, 'hideAlertListener was called'); assert.isTrue(hideAlertListener.called, 'hideAlertListener was called');
done();
});
}); });
test('remove from attention set', done => { test('remove from attention set', async () => {
let apiResolve; let apiResolve;
const apiPromise = new Promise(r => { const apiPromise = new Promise(r => {
apiResolve = r; apiResolve = r;
@@ -175,10 +174,9 @@ suite('gr-hovercard-account tests', () => {
assert.isFalse(element._isShowing, 'hovercard is hidden'); assert.isFalse(element._isShowing, 'hovercard is hidden');
apiResolve({}); apiResolve({});
flush(() => { await flush();
assert.isTrue(hideAlertListener.called, 'hideAlertListener was called'); assert.isTrue(hideAlertListener.called, 'hideAlertListener was called');
done();
});
}); });
}); });

View File

@@ -27,8 +27,12 @@ suite('gr-hovercard tests', () => {
let element; let element;
let button; let button;
let testResolve;
let testPromise;
setup(() => { setup(() => {
testResolve = undefined;
testPromise = new Promise(r => testResolve = r);
button = document.createElement('button'); button = document.createElement('button');
button.innerHTML = 'Hello'; button.innerHTML = 'Hello';
button.setAttribute('id', 'foo'); button.setAttribute('id', 'foo');
@@ -89,66 +93,74 @@ suite('gr-hovercard tests', () => {
assert.equal(style.visibility, 'visible'); assert.equal(style.visibility, 'visible');
}); });
test('debounceShow does not show immediately', done => { test('debounceShow does not show immediately', async () => {
element.debounceShowBy(100); element.debounceShowBy(100);
setTimeout(() => { setTimeout(testResolve, 0);
await testPromise;
assert.isFalse(element._isShowing); assert.isFalse(element._isShowing);
done();
}, 0);
}); });
test('debounceShow shows after delay', done => { test('debounceShow shows after delay', async () => {
element.debounceShowBy(1); element.debounceShowBy(1);
setTimeout(() => { setTimeout(testResolve, 10);
await testPromise;
assert.isTrue(element._isShowing); assert.isTrue(element._isShowing);
done();
}, 10);
}); });
test('card is scheduled to show on enter and hides on leave', done => { test('card is scheduled to show on enter and hides on leave', async () => {
const button = document.querySelector('button'); const button = document.querySelector('button');
let enterResolve = undefined;
const enterPromise = new Promise(r => enterResolve = r);
button.addEventListener('mouseenter', enterResolve);
let leaveResolve = undefined;
const leavePromise = new Promise(r => leaveResolve = r);
button.addEventListener('mouseleave', leaveResolve);
assert.isFalse(element._isShowing); assert.isFalse(element._isShowing);
const enterHandler = event => { button.dispatchEvent(new CustomEvent('mouseenter'));
await enterPromise;
assert.isTrue(element._isScheduledToShow); assert.isTrue(element._isScheduledToShow);
element._showDebouncer.flush(); element._showDebouncer.flush();
assert.isTrue(element._isShowing); assert.isTrue(element._isShowing);
assert.isFalse(element._isScheduledToShow); assert.isFalse(element._isScheduledToShow);
button.dispatchEvent(new CustomEvent('mouseleave')); button.dispatchEvent(new CustomEvent('mouseleave'));
};
const leaveHandler = event => { await leavePromise;
assert.isTrue(element._isScheduledToHide); assert.isTrue(element._isScheduledToHide);
assert.isTrue(element._isShowing); assert.isTrue(element._isShowing);
element._hideDebouncer.flush(); element._hideDebouncer.flush();
assert.isFalse(element._isScheduledToShow); assert.isFalse(element._isScheduledToShow);
assert.isFalse(element._isShowing); assert.isFalse(element._isShowing);
button.removeEventListener('mouseenter', enterHandler);
button.removeEventListener('mouseleave', leaveHandler); button.removeEventListener('mouseenter', enterResolve);
done(); button.removeEventListener('mouseleave', leaveResolve);
};
button.addEventListener('mouseenter', enterHandler);
button.addEventListener('mouseleave', leaveHandler);
button.dispatchEvent(new CustomEvent('mouseenter'));
}); });
test('card should disappear on click', done => { test('card should disappear on click', async () => {
const button = document.querySelector('button'); const button = document.querySelector('button');
let enterResolve = undefined;
const enterPromise = new Promise(r => enterResolve = r);
button.addEventListener('mouseenter', enterResolve);
let clickResolve = undefined;
const clickPromise = new Promise(r => clickResolve = r);
button.addEventListener('click', clickResolve);
assert.isFalse(element._isShowing); assert.isFalse(element._isShowing);
const enterHandler = event => {
button.dispatchEvent(new CustomEvent('mouseenter'));
await enterPromise;
assert.isTrue(element._isScheduledToShow); assert.isTrue(element._isScheduledToShow);
// click to hide
MockInteractions.tap(button); MockInteractions.tap(button);
};
const leaveHandler = event => { await clickPromise;
// no flush needed as hide will be called immediately
assert.isFalse(element._isScheduledToShow); assert.isFalse(element._isScheduledToShow);
assert.isFalse(element._isShowing); assert.isFalse(element._isShowing);
button.removeEventListener('mouseenter', enterHandler);
button.removeEventListener('click', leaveHandler); button.removeEventListener('mouseenter', enterResolve);
done(); button.removeEventListener('click', clickResolve);
};
button.addEventListener('mouseenter', enterHandler);
button.addEventListener('click', leaveHandler);
button.dispatchEvent(new CustomEvent('mouseenter'));
}); });
}); });

View File

@@ -107,11 +107,11 @@ suite('gr-change-actions-js-api-interface tests', () => {
assertArraysEqual(element.primaryActionKeys, []); assertArraysEqual(element.primaryActionKeys, []);
}); });
test('action buttons', done => { test('action buttons', () => {
const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!'); const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
const handler = sinon.spy(); const handler = sinon.spy();
changeActions.addTapListener(key, handler); changeActions.addTapListener(key, handler);
flush(() => { flush();
MockInteractions.tap(element.shadowRoot MockInteractions.tap(element.shadowRoot
.querySelector('[data-action-key="' + key + '"]')); .querySelector('[data-action-key="' + key + '"]'));
assert(handler.calledOnce); assert(handler.calledOnce);
@@ -120,17 +120,14 @@ suite('gr-change-actions-js-api-interface tests', () => {
.querySelector('[data-action-key="' + key + '"]')); .querySelector('[data-action-key="' + key + '"]'));
assert(handler.calledOnce); assert(handler.calledOnce);
changeActions.remove(key); changeActions.remove(key);
flush(() => { flush();
assert.isNull(element.shadowRoot assert.isNull(element.shadowRoot
.querySelector('[data-action-key="' + key + '"]')); .querySelector('[data-action-key="' + key + '"]'));
done();
});
});
}); });
test('action button properties', done => { test('action button properties', () => {
const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!'); const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
flush(() => { flush();
const button = element.shadowRoot const button = element.shadowRoot
.querySelector('[data-action-key="' + key + '"]'); .querySelector('[data-action-key="' + key + '"]');
assert.isOk(button); assert.isOk(button);
@@ -140,73 +137,61 @@ suite('gr-change-actions-js-api-interface tests', () => {
changeActions.setTitle(key, 'Yo hint'); changeActions.setTitle(key, 'Yo hint');
changeActions.setEnabled(key, false); changeActions.setEnabled(key, false);
changeActions.setIcon(key, 'pupper'); changeActions.setIcon(key, 'pupper');
flush(() => { flush();
assert.equal(button.getAttribute('data-label'), 'Yo'); assert.equal(button.getAttribute('data-label'), 'Yo');
assert.equal(button.getAttribute('title'), 'Yo hint'); assert.equal(button.getAttribute('title'), 'Yo hint');
assert.isTrue(button.disabled); assert.isTrue(button.disabled);
assert.equal(button.querySelector('iron-icon').icon, assert.equal(button.querySelector('iron-icon').icon,
'gr-icons:pupper'); 'gr-icons:pupper');
done();
});
});
}); });
test('hide action buttons', done => { test('hide action buttons', () => {
const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!'); const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
flush(() => { flush();
const button = element.shadowRoot let button = element.shadowRoot
.querySelector('[data-action-key="' + key + '"]'); .querySelector('[data-action-key="' + key + '"]');
assert.isOk(button); assert.isOk(button);
assert.isFalse(button.hasAttribute('hidden')); assert.isFalse(button.hasAttribute('hidden'));
changeActions.setActionHidden( changeActions.setActionHidden(
changeActions.ActionType.REVISION, key, true); changeActions.ActionType.REVISION, key, true);
flush(() => { flush();
const button = element.shadowRoot button = element.shadowRoot
.querySelector('[data-action-key="' + key + '"]'); .querySelector('[data-action-key="' + key + '"]');
assert.isNotOk(button); assert.isNotOk(button);
done();
});
});
}); });
test('move action button to overflow', done => { test('move action button to overflow', async () => {
const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!'); const key = changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
flush(() => { await flush();
assert.isTrue(element.$.moreActions.hidden); assert.isTrue(element.$.moreActions.hidden);
assert.isOk(element.shadowRoot assert.isOk(element.shadowRoot
.querySelector('[data-action-key="' + key + '"]')); .querySelector('[data-action-key="' + key + '"]'));
changeActions.setActionOverflow( changeActions.setActionOverflow(
changeActions.ActionType.REVISION, key, true); changeActions.ActionType.REVISION, key, true);
flush(() => { flush();
assert.isNotOk(element.shadowRoot assert.isNotOk(element.shadowRoot
.querySelector('[data-action-key="' + key + '"]')); .querySelector('[data-action-key="' + key + '"]'));
assert.isFalse(element.$.moreActions.hidden); assert.isFalse(element.$.moreActions.hidden);
assert.strictEqual(element.$.moreActions.items[0].name, 'Bork!'); assert.strictEqual(element.$.moreActions.items[0].name, 'Bork!');
done();
});
});
}); });
test('change actions priority', done => { test('change actions priority', () => {
const key1 = const key1 =
changeActions.add(changeActions.ActionType.REVISION, 'Bork!'); changeActions.add(changeActions.ActionType.REVISION, 'Bork!');
const key2 = const key2 =
changeActions.add(changeActions.ActionType.CHANGE, 'Squanch?'); changeActions.add(changeActions.ActionType.CHANGE, 'Squanch?');
flush(() => { flush();
let buttons = let buttons =
element.root.querySelectorAll('[data-action-key]'); element.root.querySelectorAll('[data-action-key]');
assert.equal(buttons[0].getAttribute('data-action-key'), key1); assert.equal(buttons[0].getAttribute('data-action-key'), key1);
assert.equal(buttons[1].getAttribute('data-action-key'), key2); assert.equal(buttons[1].getAttribute('data-action-key'), key2);
changeActions.setActionPriority( changeActions.setActionPriority(
changeActions.ActionType.REVISION, key1, 10); changeActions.ActionType.REVISION, key1, 10);
flush(() => { flush();
buttons = buttons =
element.root.querySelectorAll('[data-action-key]'); element.root.querySelectorAll('[data-action-key]');
assert.equal(buttons[0].getAttribute('data-action-key'), key2); assert.equal(buttons[0].getAttribute('data-action-key'), key2);
assert.equal(buttons[1].getAttribute('data-action-key'), key1); assert.equal(buttons[1].getAttribute('data-action-key'), key1);
done();
});
});
}); });
}); });
}); });

View File

@@ -182,18 +182,20 @@ suite('gr-js-api-interface tests', () => {
}); });
}); });
test('history event', done => { test('history event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
plugin.on(EventType.HISTORY, throwErrFn); plugin.on(EventType.HISTORY, throwErrFn);
plugin.on(EventType.HISTORY, path => { plugin.on(EventType.HISTORY, resolve);
element.handleEvent(EventType.HISTORY, {path: '/path/to/awesomesauce'});
const path = await promise;
assert.equal(path, '/path/to/awesomesauce'); assert.equal(path, '/path/to/awesomesauce');
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);
done();
});
element.handleEvent(EventType.HISTORY,
{path: '/path/to/awesomesauce'});
}); });
test('showchange event', done => { test('showchange event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
const testChange = { const testChange = {
_number: 42, _number: 42,
revisions: {def: {_number: 2}, abc: {_number: 1}}, revisions: {def: {_number: 2}, abc: {_number: 1}},
@@ -201,33 +203,39 @@ suite('gr-js-api-interface tests', () => {
const expectedChange = {mergeable: false, ...testChange}; const expectedChange = {mergeable: false, ...testChange};
plugin.on(EventType.SHOW_CHANGE, throwErrFn); plugin.on(EventType.SHOW_CHANGE, throwErrFn);
plugin.on(EventType.SHOW_CHANGE, (change, revision, info) => { plugin.on(EventType.SHOW_CHANGE, (change, revision, info) => {
resolve({change, revision, info});
});
element.handleEvent(EventType.SHOW_CHANGE,
{change: testChange, patchNum: 1, info: {mergeable: false}});
const {change, revision, info} = await promise;
assert.deepEqual(change, expectedChange); assert.deepEqual(change, expectedChange);
assert.deepEqual(revision, testChange.revisions.abc); assert.deepEqual(revision, testChange.revisions.abc);
assert.deepEqual(info, {mergeable: false}); assert.deepEqual(info, {mergeable: false});
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);
done();
});
element.handleEvent(EventType.SHOW_CHANGE,
{change: testChange, patchNum: 1, info: {mergeable: false}});
}); });
test('show-revision-actions event', done => { test('show-revision-actions event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
const testChange = { const testChange = {
_number: 42, _number: 42,
revisions: {def: {_number: 2}, abc: {_number: 1}}, revisions: {def: {_number: 2}, abc: {_number: 1}},
}; };
plugin.on(EventType.SHOW_REVISION_ACTIONS, throwErrFn); plugin.on(EventType.SHOW_REVISION_ACTIONS, throwErrFn);
plugin.on(EventType.SHOW_REVISION_ACTIONS, (actions, change) => { plugin.on(EventType.SHOW_REVISION_ACTIONS, (actions, change) => {
assert.deepEqual(change, testChange); resolve({change, actions});
assert.deepEqual(actions, {test: {}});
assert.isTrue(errorStub.calledOnce);
done();
}); });
element.handleEvent(EventType.SHOW_REVISION_ACTIONS, element.handleEvent(EventType.SHOW_REVISION_ACTIONS,
{change: testChange, revisionActions: {test: {}}}); {change: testChange, revisionActions: {test: {}}});
const {change, actions} = await promise;
assert.deepEqual(change, testChange);
assert.deepEqual(actions, {test: {}});
assert.isTrue(errorStub.calledOnce);
}); });
test('handleEvent awaits plugins load', done => { test('handleEvent awaits plugins load', async () => {
const testChange = { const testChange = {
_number: 42, _number: 42,
revisions: {def: {_number: 2}, abc: {_number: 1}}, revisions: {def: {_number: 2}, abc: {_number: 1}},
@@ -242,21 +250,21 @@ suite('gr-js-api-interface tests', () => {
// Timeout on loading plugins // Timeout on loading plugins
window.clock.tick(PLUGIN_LOADING_TIMEOUT_MS * 2); window.clock.tick(PLUGIN_LOADING_TIMEOUT_MS * 2);
flush(() => { await flush();
assert.isTrue(spy.called); assert.isTrue(spy.called);
done();
});
}); });
test('comment event', done => { test('comment event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
const testCommentNode = {foo: 'bar'}; const testCommentNode = {foo: 'bar'};
plugin.on(EventType.COMMENT, throwErrFn); plugin.on(EventType.COMMENT, throwErrFn);
plugin.on(EventType.COMMENT, commentNode => { plugin.on(EventType.COMMENT, resolve);
element.handleEvent(EventType.COMMENT, {node: testCommentNode});
const commentNode = await promise;
assert.deepEqual(commentNode, testCommentNode); assert.deepEqual(commentNode, testCommentNode);
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);
done();
});
element.handleEvent(EventType.COMMENT, {node: testCommentNode});
}); });
test('revert event', () => { test('revert event', () => {
@@ -294,26 +302,32 @@ suite('gr-js-api-interface tests', () => {
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);
}); });
test('commitmsgedit event', done => { test('commitmsgedit event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
const testMsg = 'Test CL commit message'; const testMsg = 'Test CL commit message';
plugin.on(EventType.COMMIT_MSG_EDIT, throwErrFn); plugin.on(EventType.COMMIT_MSG_EDIT, throwErrFn);
plugin.on(EventType.COMMIT_MSG_EDIT, (change, msg) => { plugin.on(EventType.COMMIT_MSG_EDIT, (change, msg) => {
assert.deepEqual(msg, testMsg); resolve(msg);
assert.isTrue(errorStub.calledOnce);
done();
}); });
element.handleCommitMessage(null, testMsg); element.handleCommitMessage(null, testMsg);
const msg = await promise;
assert.deepEqual(msg, testMsg);
assert.isTrue(errorStub.calledOnce);
}); });
test('labelchange event', done => { test('labelchange event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
const testChange = {_number: 42}; const testChange = {_number: 42};
plugin.on(EventType.LABEL_CHANGE, throwErrFn); plugin.on(EventType.LABEL_CHANGE, throwErrFn);
plugin.on(EventType.LABEL_CHANGE, change => { plugin.on(EventType.LABEL_CHANGE, resolve);
element.handleEvent(EventType.LABEL_CHANGE, {change: testChange});
const change = await promise;
assert.deepEqual(change, testChange); assert.deepEqual(change, testChange);
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);
done();
});
element.handleEvent(EventType.LABEL_CHANGE, {change: testChange});
}); });
test('submitchange', () => { test('submitchange', () => {
@@ -327,24 +341,25 @@ suite('gr-js-api-interface tests', () => {
assert.isTrue(errorStub.calledTwice); assert.isTrue(errorStub.calledTwice);
}); });
test('highlightjs-loaded event', done => { test('highlightjs-loaded event', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
const testHljs = {_number: 42}; const testHljs = {_number: 42};
plugin.on(EventType.HIGHLIGHTJS_LOADED, throwErrFn); plugin.on(EventType.HIGHLIGHTJS_LOADED, throwErrFn);
plugin.on(EventType.HIGHLIGHTJS_LOADED, hljs => { plugin.on(EventType.HIGHLIGHTJS_LOADED, resolve);
element.handleEvent(EventType.HIGHLIGHTJS_LOADED, {hljs: testHljs});
const hljs = await promise;
assert.deepEqual(hljs, testHljs); assert.deepEqual(hljs, testHljs);
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);
done();
});
element.handleEvent(EventType.HIGHLIGHTJS_LOADED, {hljs: testHljs});
}); });
test('getLoggedIn', done => { test('getLoggedIn', () => {
// fake fetch for authCheck // fake fetch for authCheck
sinon.stub(window, 'fetch').callsFake(() => Promise.resolve({status: 204})); sinon.stub(window, 'fetch').callsFake(() => Promise.resolve({status: 204}));
plugin.restApi().getLoggedIn() return plugin.restApi().getLoggedIn()
.then(loggedIn => { .then(loggedIn => {
assert.isTrue(loggedIn); assert.isTrue(loggedIn);
done();
}); });
}); });

View File

@@ -438,7 +438,7 @@ suite('gr-plugin-loader tests', () => {
assert.isTrue(document.body.appendChild.calledTwice); assert.isTrue(document.body.appendChild.calledTwice);
}); });
test('can call awaitPluginsLoaded multiple times', done => { test('can call awaitPluginsLoaded multiple times', async () => {
const plugins = [ const plugins = [
'http://e.com/foo/bar.js', 'http://e.com/foo/bar.js',
'http://e.com/bar/foo.js', 'http://e.com/bar/foo.js',
@@ -456,13 +456,9 @@ suite('gr-plugin-loader tests', () => {
pluginLoader.loadPlugins(plugins); pluginLoader.loadPlugins(plugins);
pluginLoader.awaitPluginsLoaded().then(() => { await pluginLoader.awaitPluginsLoaded();
assert.isTrue(installed); assert.isTrue(installed);
await pluginLoader.awaitPluginsLoaded();
pluginLoader.awaitPluginsLoaded().then(() => {
done();
});
});
}); });
suite('preloaded plugins', () => { suite('preloaded plugins', () => {

View File

@@ -47,7 +47,7 @@ suite('gr-lib-loader tests', () => {
element._hljsState.callbacks = []; element._hljsState.callbacks = [];
}); });
test('only load once', done => { test('only load once', async () => {
sinon.stub(element, '_getHLJSUrl').returns(''); sinon.stub(element, '_getHLJSUrl').returns('');
const firstCallHandler = sinon.stub(); const firstCallHandler = sinon.stub();
element.getHLJS().then(firstCallHandler); element.getHLJS().then(firstCallHandler);
@@ -67,13 +67,11 @@ suite('gr-lib-loader tests', () => {
// Now load the library. // Now load the library.
resolveLoad(); resolveLoad();
flush(() => { await flush();
// The state should be loaded and both handlers called. // The state should be loaded and both handlers called.
assert.isFalse(element._hljsState.loading); assert.isFalse(element._hljsState.loading);
assert.isTrue(firstCallHandler.called); assert.isTrue(firstCallHandler.called);
assert.isTrue(secondCallHandler.called); assert.isTrue(secondCallHandler.called);
done();
});
}); });
suite('preloaded', () => { suite('preloaded', () => {
@@ -90,22 +88,17 @@ suite('gr-lib-loader tests', () => {
delete window.hljs; delete window.hljs;
}); });
test('returns hljs', done => { test('returns hljs', async () => {
const firstCallHandler = sinon.stub(); const firstCallHandler = sinon.stub();
element.getHLJS().then(firstCallHandler); element.getHLJS().then(firstCallHandler);
flush(() => { await flush();
assert.isTrue(firstCallHandler.called); assert.isTrue(firstCallHandler.called);
assert.isTrue(firstCallHandler.calledWith(hljsStub)); assert.isTrue(firstCallHandler.calledWith(hljsStub));
done();
});
}); });
test('configures hljs', done => { test('configures hljs', () => element.getHLJS().then(() => {
element.getHLJS().then(() => {
assert.isTrue(window.hljs.configure.calledOnce); assert.isTrue(window.hljs.configure.calledOnce);
done(); }));
});
});
}); });
suite('_getHLJSUrl', () => { suite('_getHLJSUrl', () => {

View File

@@ -59,13 +59,16 @@ suite('gr-list-view tests', () => {
'/admin/projects/q/filter:plugins%252F,50'); '/admin/projects/q/filter:plugins%252F,50');
}); });
test('_onValueChange', done => { test('_onValueChange', async () => {
let resolve;
const promise = new Promise(r => resolve = r);
element.path = '/admin/projects'; element.path = '/admin/projects';
sinon.stub(page, 'show').callsFake( url => { sinon.stub(page, 'show').callsFake(resolve);
assert.equal(url, '/admin/projects/q/filter:test');
done();
});
element.filter = 'test'; element.filter = 'test';
const url = await promise;
assert.equal(url, '/admin/projects/q/filter:test');
}); });
test('_filterChanged not reload when swap between falsy values', () => { test('_filterChanged not reload when swap between falsy values', () => {
@@ -76,11 +79,11 @@ suite('gr-list-view tests', () => {
assert.isFalse(element._debounceReload.called); assert.isFalse(element._debounceReload.called);
}); });
test('next button', done => { test('next button', () => {
element.itemsPerPage = 25; element.itemsPerPage = 25;
let projects = new Array(26); let projects = new Array(26);
flush();
flush(() => {
let loading; let loading;
assert.isFalse(element._hideNextArrow(loading, projects)); assert.isFalse(element._hideNextArrow(loading, projects));
loading = true; loading = true;
@@ -91,8 +94,6 @@ suite('gr-list-view tests', () => {
assert.isTrue(element._hideNextArrow(loading, element._projects)); assert.isTrue(element._hideNextArrow(loading, element._projects));
projects = new Array(4); projects = new Array(4);
assert.isTrue(element._hideNextArrow(loading, projects)); assert.isTrue(element._hideNextArrow(loading, projects));
done();
});
}); });
test('prev button', () => { test('prev button', () => {

View File

@@ -47,14 +47,15 @@ suite('gr-overlay tests', () => {
element._boundHandleClose); element._boundHandleClose);
}); });
test('events are fired on fullscreen view', done => { test('events are fired on fullscreen view', async () => {
sinon.stub(element, '_isMobile').returns(true); sinon.stub(element, '_isMobile').returns(true);
const openHandler = sinon.stub(); const openHandler = sinon.stub();
const closeHandler = sinon.stub(); const closeHandler = sinon.stub();
element.addEventListener('fullscreen-overlay-opened', openHandler); element.addEventListener('fullscreen-overlay-opened', openHandler);
element.addEventListener('fullscreen-overlay-closed', closeHandler); element.addEventListener('fullscreen-overlay-closed', closeHandler);
element.open().then(() => { await element.open();
assert.isTrue(element._isMobile.called); assert.isTrue(element._isMobile.called);
assert.isTrue(element._fullScreenOpen); assert.isTrue(element._fullScreenOpen);
assert.isTrue(openHandler.called); assert.isTrue(openHandler.called);
@@ -62,18 +63,17 @@ suite('gr-overlay tests', () => {
element._overlayClosed(); element._overlayClosed();
assert.isFalse(element._fullScreenOpen); assert.isFalse(element._fullScreenOpen);
assert.isTrue(closeHandler.called); assert.isTrue(closeHandler.called);
done();
});
}); });
test('events are not fired on desktop view', done => { test('events are not fired on desktop view', async () => {
sinon.stub(element, '_isMobile').returns(false); sinon.stub(element, '_isMobile').returns(false);
const openHandler = sinon.stub(); const openHandler = sinon.stub();
const closeHandler = sinon.stub(); const closeHandler = sinon.stub();
element.addEventListener('fullscreen-overlay-opened', openHandler); element.addEventListener('fullscreen-overlay-opened', openHandler);
element.addEventListener('fullscreen-overlay-closed', closeHandler); element.addEventListener('fullscreen-overlay-closed', closeHandler);
element.open().then(() => { await element.open();
assert.isTrue(element._isMobile.called); assert.isTrue(element._isMobile.called);
assert.isFalse(element._fullScreenOpen); assert.isFalse(element._fullScreenOpen);
assert.isFalse(openHandler.called); assert.isFalse(openHandler.called);
@@ -81,8 +81,6 @@ suite('gr-overlay tests', () => {
element._overlayClosed(); element._overlayClosed();
assert.isFalse(element._fullScreenOpen); assert.isFalse(element._fullScreenOpen);
assert.isFalse(closeHandler.called); assert.isFalse(closeHandler.called);
done();
});
}); });
}); });

View File

@@ -108,8 +108,7 @@ suite('gr-repo-branch-picker tests', () => {
}); });
}); });
test('does not query when repo is unset', done => { test('does not query when repo is unset', () => element
element
._getRepoBranchesSuggestions('') ._getRepoBranchesSuggestions('')
.then(() => { .then(() => {
assert.isFalse(element.$.restAPI.getRepoBranches.called); assert.isFalse(element.$.restAPI.getRepoBranches.called);
@@ -118,9 +117,7 @@ suite('gr-repo-branch-picker tests', () => {
}) })
.then(() => { .then(() => {
assert.isTrue(element.$.restAPI.getRepoBranches.called); assert.isTrue(element.$.restAPI.getRepoBranches.called);
done(); }));
});
});
}); });
}); });

View File

@@ -54,7 +54,7 @@ suite('gr-rest-api-interface tests', () => {
window.CANONICAL_PATH = originalCanonicalPath; window.CANONICAL_PATH = originalCanonicalPath;
}); });
test('parent diff comments are properly grouped', done => { test('parent diff comments are properly grouped', () => {
sinon.stub(element._restApiHelper, 'fetchJSON') sinon.stub(element._restApiHelper, 'fetchJSON')
.callsFake(() => Promise.resolve({ .callsFake(() => Promise.resolve({
'/COMMIT_MSG': [], '/COMMIT_MSG': [],
@@ -70,7 +70,7 @@ suite('gr-rest-api-interface tests', () => {
}, },
], ],
})); }));
element._getDiffComments('42', '', 'PARENT', 1, 'sieve.go').then( return element._getDiffComments('42', '', 'PARENT', 1, 'sieve.go').then(
obj => { obj => {
assert.equal(obj.baseComments.length, 1); assert.equal(obj.baseComments.length, 1);
assert.deepEqual(obj.baseComments[0], { assert.deepEqual(obj.baseComments[0], {
@@ -85,7 +85,6 @@ suite('gr-rest-api-interface tests', () => {
path: 'sieve.go', path: 'sieve.go',
updated: '2017-02-03 22:32:28.000000000', updated: '2017-02-03 22:32:28.000000000',
}); });
done();
}); });
}); });
@@ -194,10 +193,10 @@ suite('gr-rest-api-interface tests', () => {
assert.deepEqual(element._setRanges(comments), expectedResult); assert.deepEqual(element._setRanges(comments), expectedResult);
}); });
test('differing patch diff comments are properly grouped', done => { test('differing patch diff comments are properly grouped', () => {
sinon.stub(element, 'getFromProjectLookup') sinon.stub(element, 'getFromProjectLookup')
.returns(Promise.resolve('test')); .returns(Promise.resolve('test'));
sinon.stub(element._restApiHelper, 'fetchJSON').callsFake( request => { sinon.stub(element._restApiHelper, 'fetchJSON').callsFake(request => {
const url = request.url; const url = request.url;
if (url === '/changes/test~42/revisions/1') { if (url === '/changes/test~42/revisions/1') {
return Promise.resolve({ return Promise.resolve({
@@ -235,7 +234,7 @@ suite('gr-rest-api-interface tests', () => {
}); });
} }
}); });
element._getDiffComments('42', '', 1, 2, 'sieve.go').then( return element._getDiffComments('42', '', 1, 2, 'sieve.go').then(
obj => { obj => {
assert.equal(obj.baseComments.length, 1); assert.equal(obj.baseComments.length, 1);
assert.deepEqual(obj.baseComments[0], { assert.deepEqual(obj.baseComments[0], {
@@ -254,26 +253,26 @@ suite('gr-rest-api-interface tests', () => {
path: 'sieve.go', path: 'sieve.go',
updated: '2017-02-04 22:33:28.000000000', updated: '2017-02-04 22:33:28.000000000',
}); });
done();
}); });
}); });
test('server error', done => { test('server error', () => {
const getResponseObjectStub = sinon.stub(element, 'getResponseObject'); const getResponseObjectStub = sinon.stub(element, 'getResponseObject');
window.fetch.returns(Promise.resolve({ok: false})); window.fetch.returns(Promise.resolve({ok: false}));
const serverErrorEventPromise = new Promise(resolve => { const serverErrorEventPromise = new Promise(resolve => {
element.addEventListener('server-error', resolve); element.addEventListener('server-error', resolve);
}); });
element._restApiHelper.fetchJSON({}).then(response => { return Promise.all([element._restApiHelper.fetchJSON({}).then(response => {
assert.isUndefined(response); assert.isUndefined(response);
assert.isTrue(getResponseObjectStub.notCalled); assert.isTrue(getResponseObjectStub.notCalled);
serverErrorEventPromise.then(() => done()); }), serverErrorEventPromise]);
});
}); });
test('legacy n,z key in change url is replaced', async () => { test('legacy n,z key in change url is replaced', async () => {
sinon.stub(element, 'getConfig').callsFake( async () => { return {}; }); sinon.stub(element, 'getConfig').callsFake(async () => {
return {};
});
const stub = sinon.stub(element._restApiHelper, 'fetchJSON') const stub = sinon.stub(element._restApiHelper, 'fetchJSON')
.returns(Promise.resolve([])); .returns(Promise.resolve([]));
await element.getChanges(1, null, 'n,z'); await element.getChanges(1, null, 'n,z');
@@ -289,49 +288,42 @@ suite('gr-rest-api-interface tests', () => {
assert.isFalse(element._restApiHelper._cache.has(cacheKey)); assert.isFalse(element._restApiHelper._cache.has(cacheKey));
}); });
test('getAccount when resp is null does not add anything to the cache', test('getAccount when resp is null does not add to cache', async () => {
done => {
const cacheKey = '/accounts/self/detail'; const cacheKey = '/accounts/self/detail';
const stub = sinon.stub(element._restApiHelper, 'fetchCacheURL') const stub = sinon.stub(element._restApiHelper, 'fetchCacheURL')
.callsFake(() => Promise.resolve()); .callsFake(() => Promise.resolve());
element.getAccount().then(() => { await element.getAccount();
assert.isTrue(stub.called); assert.isTrue(stub.called);
assert.isFalse(element._restApiHelper._cache.has(cacheKey)); assert.isFalse(element._restApiHelper._cache.has(cacheKey));
done();
});
element._restApiHelper._cache.set(cacheKey, 'fake cache'); element._restApiHelper._cache.set(cacheKey, 'fake cache');
stub.lastCall.args[0].errFn(); stub.lastCall.args[0].errFn();
}); });
test('getAccount does not add to the cache when resp.status is 403', test('getAccount does not add to cache when status is 403', async () => {
done => {
const cacheKey = '/accounts/self/detail'; const cacheKey = '/accounts/self/detail';
const stub = sinon.stub(element._restApiHelper, 'fetchCacheURL') const stub = sinon.stub(element._restApiHelper, 'fetchCacheURL')
.callsFake(() => Promise.resolve()); .callsFake(() => Promise.resolve());
element.getAccount().then(() => { await element.getAccount();
assert.isTrue(stub.called); assert.isTrue(stub.called);
assert.isFalse(element._restApiHelper._cache.has(cacheKey)); assert.isFalse(element._restApiHelper._cache.has(cacheKey));
done();
});
element._cache.set(cacheKey, 'fake cache'); element._cache.set(cacheKey, 'fake cache');
stub.lastCall.args[0].errFn({status: 403}); stub.lastCall.args[0].errFn({status: 403});
}); });
test('getAccount when resp is successful', done => { test('getAccount when resp is successful', async () => {
const cacheKey = '/accounts/self/detail'; const cacheKey = '/accounts/self/detail';
const stub = sinon.stub(element._restApiHelper, 'fetchCacheURL').callsFake( const stub = sinon.stub(element._restApiHelper, 'fetchCacheURL').callsFake(
() => Promise.resolve()); () => Promise.resolve());
element.getAccount().then(response => { await element.getAccount();
element._restApiHelper._cache.set(cacheKey, 'fake cache');
assert.isTrue(stub.called); assert.isTrue(stub.called);
assert.equal(element._restApiHelper._cache.get(cacheKey), 'fake cache'); assert.equal(element._restApiHelper._cache.get(cacheKey), 'fake cache');
done();
});
element._restApiHelper._cache.set(cacheKey, 'fake cache');
stub.lastCall.args[0].errFn({}); stub.lastCall.args[0].errFn({});
}); });
@@ -346,61 +338,57 @@ suite('gr-rest-api-interface tests', () => {
}; };
test('getPreferences returns correctly on small screens logged in', test('getPreferences returns correctly on small screens logged in',
done => { () => {
const testJSON = {diff_view: 'SIDE_BY_SIDE'}; const testJSON = {diff_view: 'SIDE_BY_SIDE'};
const loggedIn = true; const loggedIn = true;
const smallScreen = true; const smallScreen = true;
preferenceSetup(testJSON, loggedIn, smallScreen); preferenceSetup(testJSON, loggedIn, smallScreen);
element.getPreferences().then(obj => { return element.getPreferences().then(obj => {
assert.equal(obj.default_diff_view, 'UNIFIED_DIFF'); assert.equal(obj.default_diff_view, 'UNIFIED_DIFF');
assert.equal(obj.diff_view, 'SIDE_BY_SIDE'); assert.equal(obj.diff_view, 'SIDE_BY_SIDE');
done();
}); });
}); });
test('getPreferences returns correctly on small screens not logged in', test('getPreferences returns correctly on small screens not logged in',
done => { () => {
const testJSON = {diff_view: 'SIDE_BY_SIDE'}; const testJSON = {diff_view: 'SIDE_BY_SIDE'};
const loggedIn = false; const loggedIn = false;
const smallScreen = true; const smallScreen = true;
preferenceSetup(testJSON, loggedIn, smallScreen); preferenceSetup(testJSON, loggedIn, smallScreen);
element.getPreferences().then(obj => { return element.getPreferences().then(obj => {
assert.equal(obj.default_diff_view, 'UNIFIED_DIFF'); assert.equal(obj.default_diff_view, 'UNIFIED_DIFF');
assert.equal(obj.diff_view, 'SIDE_BY_SIDE'); assert.equal(obj.diff_view, 'SIDE_BY_SIDE');
done();
}); });
}); });
test('getPreferences returns correctly on larger screens logged in', test('getPreferences returns correctly on larger screens logged in',
done => { () => {
const testJSON = {diff_view: 'UNIFIED_DIFF'}; const testJSON = {diff_view: 'UNIFIED_DIFF'};
const loggedIn = true; const loggedIn = true;
const smallScreen = false; const smallScreen = false;
preferenceSetup(testJSON, loggedIn, smallScreen); preferenceSetup(testJSON, loggedIn, smallScreen);
element.getPreferences().then(obj => { return element.getPreferences().then(obj => {
assert.equal(obj.default_diff_view, 'UNIFIED_DIFF'); assert.equal(obj.default_diff_view, 'UNIFIED_DIFF');
assert.equal(obj.diff_view, 'UNIFIED_DIFF'); assert.equal(obj.diff_view, 'UNIFIED_DIFF');
done();
}); });
}); });
test('getPreferences returns correctly on larger screens not logged in', test('getPreferences returns correctly on larger screens not logged in',
done => { () => {
const testJSON = {diff_view: 'UNIFIED_DIFF'}; const testJSON = {diff_view: 'UNIFIED_DIFF'};
const loggedIn = false; const loggedIn = false;
const smallScreen = false; const smallScreen = false;
preferenceSetup(testJSON, loggedIn, smallScreen); preferenceSetup(testJSON, loggedIn, smallScreen);
element.getPreferences().then(obj => { return element.getPreferences().then(obj => {
assert.equal(obj.default_diff_view, 'SIDE_BY_SIDE'); assert.equal(obj.default_diff_view, 'SIDE_BY_SIDE');
assert.equal(obj.diff_view, 'SIDE_BY_SIDE'); assert.equal(obj.diff_view, 'SIDE_BY_SIDE');
done();
}); });
}); });
@@ -411,10 +399,10 @@ suite('gr-rest-api-interface tests', () => {
assert.equal(sendStub.lastCall.args[0].body.download_scheme, 'http'); assert.equal(sendStub.lastCall.args[0].body.download_scheme, 'http');
}); });
test('getDiffPreferences returns correct defaults', done => { test('getDiffPreferences returns correct defaults', () => {
sinon.stub(element, 'getLoggedIn').callsFake(() => Promise.resolve(false)); sinon.stub(element, 'getLoggedIn').callsFake(() => Promise.resolve(false));
element.getDiffPreferences().then(obj => { return element.getDiffPreferences().then(obj => {
assert.equal(obj.auto_hide_diff_table_header, true); assert.equal(obj.auto_hide_diff_table_header, true);
assert.equal(obj.context, 10); assert.equal(obj.context, 10);
assert.equal(obj.cursor_blink_rate, 0); assert.equal(obj.cursor_blink_rate, 0);
@@ -429,7 +417,6 @@ suite('gr-rest-api-interface tests', () => {
assert.equal(obj.syntax_highlighting, true); assert.equal(obj.syntax_highlighting, true);
assert.equal(obj.tab_size, 8); assert.equal(obj.tab_size, 8);
assert.equal(obj.theme, 'DEFAULT'); assert.equal(obj.theme, 'DEFAULT');
done();
}); });
}); });
@@ -440,10 +427,10 @@ suite('gr-rest-api-interface tests', () => {
assert.equal(sendStub.lastCall.args[0].body.show_tabs, false); assert.equal(sendStub.lastCall.args[0].body.show_tabs, false);
}); });
test('getEditPreferences returns correct defaults', done => { test('getEditPreferences returns correct defaults', () => {
sinon.stub(element, 'getLoggedIn').callsFake(() => Promise.resolve(false)); sinon.stub(element, 'getLoggedIn').callsFake(() => Promise.resolve(false));
element.getEditPreferences().then(obj => { return element.getEditPreferences().then(obj => {
assert.equal(obj.auto_close_brackets, false); assert.equal(obj.auto_close_brackets, false);
assert.equal(obj.cursor_blink_rate, 0); assert.equal(obj.cursor_blink_rate, 0);
assert.equal(obj.hide_line_numbers, false); assert.equal(obj.hide_line_numbers, false);
@@ -460,7 +447,6 @@ suite('gr-rest-api-interface tests', () => {
assert.equal(obj.syntax_highlighting, true); assert.equal(obj.syntax_highlighting, true);
assert.equal(obj.tab_size, 8); assert.equal(obj.tab_size, 8);
assert.equal(obj.theme, 'DEFAULT'); assert.equal(obj.theme, 'DEFAULT');
done();
}); });
}); });
@@ -492,8 +478,8 @@ suite('gr-rest-api-interface tests', () => {
'/accounts/self/status'); '/accounts/self/status');
assert.deepEqual(sendStub.lastCall.args[0].body, assert.deepEqual(sendStub.lastCall.args[0].body,
{status: 'OOO'}); {status: 'OOO'});
assert.deepEqual(element._restApiHelper assert.deepEqual(
._cache.get('/accounts/self/detail'), element._restApiHelper._cache.get('/accounts/self/detail'),
{status: 'OOO'}); {status: 'OOO'});
}); });
}); });
@@ -513,7 +499,9 @@ suite('gr-rest-api-interface tests', () => {
assert.equal(obj.sendDiffDraft.length, 2); assert.equal(obj.sendDiffDraft.length, 2);
assert.isTrue(!!element.hasPendingDiffDrafts()); assert.isTrue(!!element.hasPendingDiffDrafts());
for (const promise of obj.sendDiffDraft) { promise.resolve(); } for (const promise of obj.sendDiffDraft) {
promise.resolve();
}
return element.awaitPendingDiffDrafts().then(() => { return element.awaitPendingDiffDrafts().then(() => {
assert.equal(obj.sendDiffDraft.length, 0); assert.equal(obj.sendDiffDraft.length, 0);
@@ -544,41 +532,36 @@ suite('gr-rest-api-interface tests', () => {
}); });
}); });
test('_failForCreate200 fails on 200', done => { test('_failForCreate200 fails on 200', () => {
const result = { const result = {
ok: true, ok: true,
status: 200, status: 200,
headers: {entries: () => [ headers: {
entries: () => [
['Set-CoOkiE', 'secret'], ['Set-CoOkiE', 'secret'],
['Innocuous', 'hello'], ['Innocuous', 'hello'],
]}, ],
},
}; };
element._failForCreate200(Promise.resolve(result)) return element._failForCreate200(Promise.resolve(result))
.then(() => { .then(() => {
assert.isTrue(false, 'Promise should not resolve'); assert.fail('Error expected.');
}) })
.catch(e => { .catch(e => {
assert.isOk(e); assert.isOk(e);
assert.include(e.message, 'Saving draft resulted in HTTP 200'); assert.include(e.message, 'Saving draft resulted in HTTP 200');
assert.include(e.message, 'hello'); assert.include(e.message, 'hello');
assert.notInclude(e.message, 'secret'); assert.notInclude(e.message, 'secret');
done();
}); });
}); });
test('_failForCreate200 does not fail on 201', done => { test('_failForCreate200 does not fail on 201', () => {
const result = { const result = {
ok: true, ok: true,
status: 201, status: 201,
headers: {entries: () => []}, headers: {entries: () => []},
}; };
element._failForCreate200(Promise.resolve(result)) return element._failForCreate200(Promise.resolve(result));
.then(() => {
done();
})
.catch(e => {
assert.isTrue(false, 'Promise should not fail');
});
}); });
}); });
}); });
@@ -900,11 +883,15 @@ suite('gr-rest-api-interface tests', () => {
suite('change detail options', () => { suite('change detail options', () => {
setup(() => { setup(() => {
sinon.stub(element, '_getChangeDetail').callsFake( sinon.stub(element, '_getChangeDetail').callsFake(
async (changeNum, options) => { return {changeNum, options}; }); async (changeNum, options) => {
return {changeNum, options};
});
}); });
test('signed pushes disabled', async () => { test('signed pushes disabled', async () => {
sinon.stub(element, 'getConfig').callsFake( async () => { return {}; }); sinon.stub(element, 'getConfig').callsFake(async () => {
return {};
});
const {changeNum, options} = await element.getChangeDetail(123); const {changeNum, options} = await element.getChangeDetail(123);
assert.strictEqual(123, changeNum); assert.strictEqual(123, changeNum);
assert.isNotOk( assert.isNotOk(
@@ -912,7 +899,7 @@ suite('gr-rest-api-interface tests', () => {
}); });
test('signed pushes enabled', async () => { test('signed pushes enabled', async () => {
sinon.stub(element, 'getConfig').callsFake( async () => { sinon.stub(element, 'getConfig').callsFake(async () => {
return {receive: {enable_signed_push: true}}; return {receive: {enable_signed_push: true}};
}); });
const {changeNum, options} = await element.getChangeDetail(123); const {changeNum, options} = await element.getChangeDetail(123);
@@ -1289,20 +1276,23 @@ suite('gr-rest-api-interface tests', () => {
return Promise.all([edit, normal]); return Promise.all([edit, normal]);
}); });
test('getFileContent suppresses 404s', done => { test('getFileContent suppresses 404s', () => {
const res = {status: 404}; const res = {status: 404};
const handler = e => { const spy = sinon.spy();
assert.isFalse(e.detail.res.status === 404); element.addEventListener('server-error', spy);
done();
};
element.addEventListener('server-error', handler);
sinon.stub(appContext.authService, 'fetch').returns(Promise.resolve(res)); sinon.stub(appContext.authService, 'fetch').returns(Promise.resolve(res));
sinon.stub(element, '_changeBaseURL').returns(Promise.resolve('')); sinon.stub(element, '_changeBaseURL').returns(Promise.resolve(''));
element.getFileContent('1', 'tst/path', '1').then(() => { return element.getFileContent('1', 'tst/path', '1')
.then(() => {
flush(); flush();
assert.isFalse(spy.called);
res.status = 500; res.status = 500;
element.getFileContent('1', 'tst/path', '1'); return element.getFileContent('1', 'tst/path', '1');
})
.then(() => {
assert.isTrue(spy.called);
assert.notEqual(spy.lastCall.args[0].detail.res.status, 404);
}); });
}); });

View File

@@ -77,14 +77,13 @@ suite('gr-rest-api-helper tests', () => {
}); });
}); });
test('JSON prefix is properly removed', done => { test('JSON prefix is properly removed',
helper.fetchJSON({url: '/dummy/url'}).then(obj => { () => helper.fetchJSON({url: '/dummy/url'}).then(obj => {
assert.deepEqual(obj, {hello: 'bonjour'}); assert.deepEqual(obj, {hello: 'bonjour'});
done(); })
}); );
});
test('cached results', done => { test('cached results', () => {
let n = 0; let n = 0;
sinon.stub(helper, 'fetchJSON').callsFake(() => Promise.resolve(++n)); sinon.stub(helper, 'fetchJSON').callsFake(() => Promise.resolve(++n));
const promises = []; const promises = [];
@@ -92,21 +91,19 @@ suite('gr-rest-api-helper tests', () => {
promises.push(helper.fetchCacheURL('/foo')); promises.push(helper.fetchCacheURL('/foo'));
promises.push(helper.fetchCacheURL('/foo')); promises.push(helper.fetchCacheURL('/foo'));
Promise.all(promises).then(results => { return Promise.all(promises).then(results => {
assert.deepEqual(results, [1, 1, 1]); assert.deepEqual(results, [1, 1, 1]);
helper.fetchCacheURL('/foo').then(foo => { return helper.fetchCacheURL('/foo').then(foo => {
assert.equal(foo, 1); assert.equal(foo, 1);
done();
}); });
}); });
}); });
test('cached promise', done => { test('cached promise', () => {
const promise = Promise.reject(new Error('foo')); const promise = Promise.reject(new Error('foo'));
cache.set('/foo', promise); cache.set('/foo', promise);
helper.fetchCacheURL({url: '/foo'}).catch(p => { return helper.fetchCacheURL({url: '/foo'}).catch(p => {
assert.equal(p.message, 'foo'); assert.equal(p.message, 'foo');
done();
}); });
}); });
@@ -144,7 +141,7 @@ suite('gr-rest-api-helper tests', () => {
assert.equal(url, window.CANONICAL_PATH + '/path/?l=c&l=b&l=a'); assert.equal(url, window.CANONICAL_PATH + '/path/?l=c&l=b&l=a');
}); });
test('request callbacks can be canceled', done => { test('request callbacks can be canceled', () => {
let cancelCalled = false; let cancelCalled = false;
window.fetch.returns(Promise.resolve({ window.fetch.returns(Promise.resolve({
body: { body: {
@@ -152,11 +149,9 @@ suite('gr-rest-api-helper tests', () => {
}, },
})); }));
const cancelCondition = () => true; const cancelCondition = () => true;
helper.fetchJSON({url: '/dummy/url', cancelCondition}).then( return helper.fetchJSON({url: '/dummy/url', cancelCondition}).then(obj => {
obj => {
assert.isUndefined(obj); assert.isUndefined(obj);
assert.isTrue(cancelCalled); assert.isTrue(cancelCalled);
done();
}); });
}); });
}); });