summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html')
-rw-r--r--polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html323
1 files changed, 289 insertions, 34 deletions
diff --git a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
index 2edf26fb8e..3a3454d362 100644
--- a/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
+++ b/polygerrit-ui/app/elements/change-list/gr-dashboard-view/gr-dashboard-view_test.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<!--
+@license
Copyright (C) 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,66 +36,320 @@ limitations under the License.
suite('gr-dashboard-view tests', () => {
let element;
let sandbox;
+ let paramsChangedPromise;
setup(() => {
+ stub('gr-rest-api-interface', {
+ getLoggedIn() { return Promise.resolve(false); },
+ getAccountDetails() { return Promise.resolve({}); },
+ getAccountStatus() { return Promise.resolve(false); },
+ });
element = fixture('basic');
sandbox = sinon.sandbox.create();
getChangesStub = sandbox.stub(element.$.restAPI, 'getChanges',
- () => Promise.resolve());
+ (_, qs) => Promise.resolve(qs.map(() => [])));
+
+ let resolver;
+ paramsChangedPromise = new Promise(resolve => {
+ resolver = resolve;
+ });
+ const paramsChanged = element._paramsChanged.bind(element);
+ sandbox.stub(element, '_paramsChanged', params => {
+ paramsChanged(params).then(() => resolver());
+ });
});
teardown(() => {
sandbox.restore();
});
- test('nothing happens when user param is falsy', () => {
- element.params = {};
- flushAsynchronousOperations();
- assert.equal(getChangesStub.callCount, 0);
+ suite('drafts banner functionality', () => {
+ suite('_maybeShowDraftsBanner', () => {
+ test('not dashboard/self', () => {
+ element.params = {user: 'notself'};
+ element._maybeShowDraftsBanner();
+ assert.isFalse(element._showDraftsBanner);
+ });
- element.params = {user: ''};
- flushAsynchronousOperations();
- assert.equal(getChangesStub.callCount, 0);
+ test('no drafts at all', () => {
+ element.params = {user: 'self'};
+ element._results = [];
+ element._maybeShowDraftsBanner();
+ assert.isFalse(element._showDraftsBanner);
+ });
+
+ test('no drafts on open changes', () => {
+ element.params = {user: 'self'};
+ element._results = [{query: 'has:draft', results: [{status: '_'}]}];
+ sandbox.stub(element, 'changeIsOpen').returns(true);
+ element._maybeShowDraftsBanner();
+ assert.isFalse(element._showDraftsBanner);
+ });
+
+ test('no drafts on open changes', () => {
+ element.params = {user: 'self'};
+ element._results = [{query: 'has:draft', results: [{status: '_'}]}];
+ sandbox.stub(element, 'changeIsOpen').returns(false);
+ element._maybeShowDraftsBanner();
+ assert.isTrue(element._showDraftsBanner);
+ });
+ });
+
+ test('_showDraftsBanner', () => {
+ element._showDraftsBanner = false;
+ flushAsynchronousOperations();
+ assert.isTrue(isHidden(element.$$('.banner')));
+
+ element._showDraftsBanner = true;
+ flushAsynchronousOperations();
+ assert.isFalse(isHidden(element.$$('.banner')));
+ });
+
+ test('delete tap opens dialog', () => {
+ sandbox.stub(element, '_handleOpenDeleteDialog');
+ element._showDraftsBanner = true;
+ flushAsynchronousOperations();
+
+ MockInteractions.tap(element.$$('.banner .delete'));
+ assert.isTrue(element._handleOpenDeleteDialog.called);
+ });
+
+ test('delete comments flow', async () => {
+ sandbox.spy(element, '_handleConfirmDelete');
+ sandbox.stub(element, '_reload');
+
+ // Set up control over timing of when RPC resolves.
+ let deleteDraftCommentsPromiseResolver;
+ const deleteDraftCommentsPromise = new Promise(resolve => {
+ deleteDraftCommentsPromiseResolver = resolve;
+ });
+ sandbox.stub(element.$.restAPI, 'deleteDraftComments')
+ .returns(deleteDraftCommentsPromise);
+
+ // Open confirmation dialog and tap confirm button.
+ await element.$.confirmDeleteOverlay.open();
+ MockInteractions.tap(element.$.confirmDeleteDialog.$.confirm);
+ flushAsynchronousOperations();
+ assert.isTrue(element.$.restAPI.deleteDraftComments
+ .calledWithExactly('-is:open'));
+ assert.isTrue(element.$.confirmDeleteDialog.disabled);
+ assert.equal(element._reload.callCount, 0);
+
+ // Verify state after RPC resolves.
+ deleteDraftCommentsPromiseResolver([]);
+ await deleteDraftCommentsPromise;
+ assert.equal(element._reload.callCount, 1);
+ });
});
- test('content is refreshed when user param is updated', () => {
- element.params = {user: 'self'};
- flushAsynchronousOperations();
- assert.equal(getChangesStub.callCount, 1);
+ test('_computeTitle', () => {
+ assert.equal(element._computeTitle('self'), 'My Reviews');
+ assert.equal(element._computeTitle('not self'), 'Dashboard for not self');
+ });
+
+ suite('_isViewActive', () => {
+ test('nothing happens when user param is falsy', () => {
+ element.params = {};
+ flushAsynchronousOperations();
+ assert.equal(getChangesStub.callCount, 0);
+
+ element.params = {user: ''};
+ flushAsynchronousOperations();
+ assert.equal(getChangesStub.callCount, 0);
+ });
+
+ test('content is refreshed when user param is updated', () => {
+ element.params = {
+ view: Gerrit.Nav.View.DASHBOARD,
+ user: 'self',
+ };
+ return paramsChangedPromise.then(() => {
+ assert.equal(getChangesStub.callCount, 1);
+ });
+ });
});
- test('viewing another user\'s dashboard omits selfOnly sections', () => {
- element._sectionMetadata = [
- {query: '1'},
- {query: '2', selfOnly: true},
+ suite('selfOnly sections', () => {
+ test('viewing self dashboard includes selfOnly sections', () => {
+ element.params = {
+ view: Gerrit.Nav.View.DASHBOARD,
+ sections: [
+ {query: '1'},
+ {query: '2', selfOnly: true},
+ ],
+ user: 'self',
+ };
+ return paramsChangedPromise.then(() => {
+ assert.isTrue(
+ getChangesStub.calledWith(
+ null, ['1', '2', 'owner:self'], null, element.options));
+ });
+ });
+
+ test('viewing another user\'s dashboard omits selfOnly sections', () => {
+ element.params = {
+ view: Gerrit.Nav.View.DASHBOARD,
+ sections: [
+ {query: '1'},
+ {query: '2', selfOnly: true},
+ ],
+ user: 'user',
+ };
+ return paramsChangedPromise.then(() => {
+ assert.isTrue(
+ getChangesStub.calledWith(
+ null, ['1'], null, element.options));
+ });
+ });
+ });
+
+ test('suffixForDashboard is included in getChanges query', () => {
+ element.params = {
+ view: Gerrit.Nav.View.DASHBOARD,
+ sections: [
+ {query: '1'},
+ {query: '2', suffixForDashboard: 'suffix'},
+ ],
+ };
+ return paramsChangedPromise.then(() => {
+ assert.isTrue(getChangesStub.calledOnce);
+ assert.deepEqual(
+ getChangesStub.firstCall.args,
+ [null, ['1', '2 suffix'], null, element.options]);
+ });
+ });
+
+ suite('_getProjectDashboard', () => {
+ test('dashboard with foreach', () => {
+ sandbox.stub(element.$.restAPI, 'getDashboard', () => Promise.resolve({
+ title: 'title',
+ // Note: ${project} should not be resolved in foreach!
+ foreach: 'foreach for ${project}',
+ sections: [
+ {name: 'section 1', query: 'query 1'},
+ {name: 'section 2', query: '${project} query 2'},
+ ],
+ }));
+ return element._getProjectDashboard('project', '').then(dashboard => {
+ assert.deepEqual(
+ dashboard,
+ {
+ title: 'title',
+ sections: [
+ {name: 'section 1', query: 'query 1 foreach for ${project}'},
+ {
+ name: 'section 2',
+ query: 'project query 2 foreach for ${project}',
+ },
+ ],
+ });
+ });
+ });
+
+ test('dashboard without foreach', () => {
+ sandbox.stub(element.$.restAPI, 'getDashboard', () => Promise.resolve({
+ title: 'title',
+ sections: [
+ {name: 'section 1', query: 'query 1'},
+ {name: 'section 2', query: '${project} query 2'},
+ ],
+ }));
+ return element._getProjectDashboard('project', '').then(dashboard => {
+ assert.deepEqual(
+ dashboard,
+ {
+ title: 'title',
+ sections: [
+ {name: 'section 1', query: 'query 1'},
+ {name: 'section 2', query: 'project query 2'},
+ ],
+ });
+ });
+ });
+ });
+
+ test('hideIfEmpty sections', () => {
+ const sections = [
+ {name: 'test1', query: 'test1', hideIfEmpty: true},
+ {name: 'test2', query: 'test2', hideIfEmpty: true},
];
+ getChangesStub.restore();
+ sandbox.stub(element.$.restAPI, 'getChanges')
+ .returns(Promise.resolve([[], ['nonempty']]));
- element.params = {user: 'self'};
+ return element._fetchDashboardChanges({sections}, false).then(() => {
+ assert.equal(element._results.length, 1);
+ assert.equal(element._results[0].sectionName, 'test2');
+ });
+ });
+
+ test('preserve isOutgoing sections', () => {
+ const sections = [
+ {name: 'test1', query: 'test1', isOutgoing: true},
+ {name: 'test2', query: 'test2'},
+ ];
+ getChangesStub.restore();
+ sandbox.stub(element.$.restAPI, 'getChanges')
+ .returns(Promise.resolve([[], []]));
+
+ return element._fetchDashboardChanges({sections}, false).then(() => {
+ assert.equal(element._results.length, 2);
+ assert.isTrue(element._results[0].isOutgoing);
+ assert.isNotOk(element._results[1].isOutgoing);
+ });
+ });
+
+ test('_showNewUserHelp', () => {
+ element._loading = false;
+ element._showNewUserHelp = false;
flushAsynchronousOperations();
- assert.isTrue(
- getChangesStub.calledWith(null, ['1', '2'], null, element.options));
- element.params = {user: 'user'};
+ assert.equal(element.$.emptyOutgoing.textContent.trim(), 'No changes');
+ assert.isNotOk(element.$$('gr-create-change-help'));
+ element._showNewUserHelp = true;
flushAsynchronousOperations();
- assert.isTrue(
- getChangesStub.calledWith(null, ['1'], null, element.options));
+
+ assert.notEqual(element.$.emptyOutgoing.textContent.trim(), 'No changes');
+ assert.isOk(element.$$('gr-create-change-help'));
});
- test('_dashboardQueryForSection', () => {
- const query = 'query for ${user}';
- const suffixForDashboard = 'suffix for ${user}';
- assert.equal(
- element._dashboardQueryForSection({query}, 'user'),
- 'query for user');
+ test('_computeUserHeaderClass', () => {
+ assert.equal(element._computeUserHeaderClass(undefined), 'hide');
+ assert.equal(element._computeUserHeaderClass({}), 'hide');
+ assert.equal(element._computeUserHeaderClass({user: 'self'}), 'hide');
+ assert.equal(element._computeUserHeaderClass({user: 'user'}), '');
assert.equal(
- element._dashboardQueryForSection(
- {query, suffixForDashboard}, 'user'),
- 'query for user suffix for user');
+ element._computeUserHeaderClass({project: 'p', user: 'user'}),
+ 'hide');
});
- test('_computeTitle', () => {
- assert.equal(element._computeTitle('self'), 'My Reviews');
- assert.equal(element._computeTitle('not self'), 'Dashboard for not self');
+ test('404 page', done => {
+ const response = {status: 404};
+ sandbox.stub(element.$.restAPI, 'getDashboard',
+ async (project, dashboard, errFn) => {
+ errFn(response);
+ });
+ element.addEventListener('page-error', e => {
+ assert.strictEqual(e.detail.response, response);
+ done();
+ });
+ element.params = {
+ view: Gerrit.Nav.View.DASHBOARD,
+ project: 'project',
+ dashboard: 'dashboard',
+ };
+ });
+
+ test('params change triggers dashboardDisplayed()', () => {
+ sandbox.stub(element.$.reporting, 'dashboardDisplayed');
+ element.params = {
+ view: Gerrit.Nav.View.DASHBOARD,
+ project: 'project',
+ dashboard: 'dashboard',
+ };
+ return paramsChangedPromise.then(() => {
+ assert.isTrue(element.$.reporting.dashboardDisplayed.calledOnce);
+ });
});
});
</script>