diff options
Diffstat (limited to 'polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html')
-rw-r--r-- | polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html | 487 |
1 files changed, 454 insertions, 33 deletions
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html index 117940a3b8..56079e3a42 100644 --- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.html +++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-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"); @@ -36,7 +37,7 @@ limitations under the License. let element; let sandbox; - setup(() => { + setup(done => { sandbox = sinon.sandbox.create(); element = fixture('basic'); stub('gr-rest-api-interface', { @@ -44,6 +45,9 @@ limitations under the License. return Promise.resolve({}); }, }); + const pluginsLoaded = Promise.resolve(); + sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(pluginsLoaded); + pluginsLoaded.then(() => flush(done)); }); teardown(() => { @@ -59,8 +63,14 @@ limitations under the License. test('link URLs', () => { assert.equal( - element._computeLinkURL({url: '/test'}), + element._computeLinkURL({url: '/test', noBaseUrl: true}), '//' + window.location.host + '/test'); + + sandbox.stub(element, 'getBaseUrl').returns('/foo'); + assert.equal( + element._computeLinkURL({url: '/test', noBaseUrl: true}), + '//' + window.location.host + '/foo/test'); + assert.equal(element._computeLinkURL({url: '/test'}), '/test'); assert.equal( element._computeLinkURL({url: '/test', target: '_blank'}), '/test'); @@ -68,24 +78,27 @@ limitations under the License. test('current page gets selected and is displayed', () => { element._filteredLinks = [{ - name: 'Projects', - url: '/admin/projects', - view: 'gr-project-list', - children: [], + name: 'Repositories', + url: '/admin/repos', + view: 'gr-repo-list', }]; element.params = { - adminView: 'gr-project-list', + view: 'admin', + adminView: 'gr-repo-list', }; flushAsynchronousOperations(); assert.equal(Polymer.dom(element.root).querySelectorAll( '.selected').length, 1); - assert.ok(element.$$('gr-project-list')); - assert.isNotOk(element.$$('gr-admin-create-project')); + assert.ok(element.$$('gr-repo-list')); + assert.isNotOk(element.$$('gr-admin-create-repo')); }); test('_filteredLinks admin', done => { + sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({ + name: 'test-user', + })); sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { return Promise.resolve({ createGroup: true, @@ -93,35 +106,36 @@ limitations under the License. viewPlugins: true, }); }); - element._loadAccountCapabilities().then(() => { + element.reload().then(() => { assert.equal(element._filteredLinks.length, 3); - // Projects - assert.equal(element._filteredLinks[0].children.length, 0); + // Repos assert.isNotOk(element._filteredLinks[0].subsection); // Groups - assert.equal(element._filteredLinks[1].children.length, 0); + assert.isNotOk(element._filteredLinks[0].subsection); // Plugins - assert.equal(element._filteredLinks[2].children.length, 0); + assert.isNotOk(element._filteredLinks[0].subsection); done(); }); }); test('_filteredLinks non admin authenticated', done => { + sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({ + name: 'test-user', + })); sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { return Promise.resolve({}); }); - element._loadAccountCapabilities().then(() => { + element.reload().then(() => { assert.equal(element._filteredLinks.length, 2); - // Projects - assert.equal(element._filteredLinks[0].children.length, 0); + // Repos assert.isNotOk(element._filteredLinks[0].subsection); // Groups - assert.equal(element._filteredLinks[1].children.length, 0); + assert.isNotOk(element._filteredLinks[0].subsection); done(); }); }); @@ -130,15 +144,69 @@ limitations under the License. element.reload().then(() => { assert.equal(element._filteredLinks.length, 1); - // Projects - assert.equal(element._filteredLinks[0].children.length, 0); + // Repos assert.isNotOk(element._filteredLinks[0].subsection); done(); }); }); - test('Project shows up in nav', done => { - element._projectName = 'Test Project'; + test('_filteredLinks from plugin', () => { + sandbox.stub(element.$.jsAPI, 'getAdminMenuLinks').returns([ + {text: 'internal link text', url: '/internal/link/url'}, + {text: 'external link text', url: 'http://external/link/url'}, + ]); + return element.reload().then(() => { + assert.equal(element._filteredLinks.length, 3); + assert.deepEqual(element._filteredLinks[1], { + url: '/internal/link/url', + name: 'internal link text', + noBaseUrl: true, + view: null, + viewableToAll: true, + target: null, + }); + assert.deepEqual(element._filteredLinks[2], { + url: 'http://external/link/url', + name: 'external link text', + noBaseUrl: false, + view: null, + viewableToAll: true, + target: '_blank', + }); + }); + }); + + test('Repo shows up in nav', done => { + element._repoName = 'Test Repo'; + sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({ + name: 'test-user', + })); + sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { + return Promise.resolve({ + createGroup: true, + createProject: true, + viewPlugins: true, + }); + }); + element.reload().then(() => { + flushAsynchronousOperations(); + assert.equal(Polymer.dom(element.root) + .querySelectorAll('.sectionTitle').length, 3); + assert.equal(element.$$('.breadcrumbText').innerText, 'Test Repo'); + assert.equal(element.$$('#pageSelect').items.length, 6); + done(); + }); + }); + + test('Group shows up in nav', done => { + element._groupId = 'a15262'; + element._groupName = 'my-group'; + element._groupIsInternal = true; + element._isAdmin = true; + element._groupOwner = false; + sandbox.stub(element.$.restAPI, 'getAccount').returns(Promise.resolve({ + name: 'test-user', + })); sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { return Promise.resolve({ createGroup: true, @@ -146,23 +214,24 @@ limitations under the License. viewPlugins: true, }); }); - element._loadAccountCapabilities().then(() => { + element.reload().then(() => { + flushAsynchronousOperations(); assert.equal(element._filteredLinks.length, 3); - // Projects - assert.equal(element._filteredLinks[0].children.length, 0); - assert.equal(element._filteredLinks[0].subsection.name, 'Test Project'); + // Repos + assert.isNotOk(element._filteredLinks[0].subsection); // Groups - assert.equal(element._filteredLinks[1].children.length, 0); + assert.equal(element._filteredLinks[1].subsection.children.length, 2); + assert.equal(element._filteredLinks[1].subsection.name, 'my-group'); // Plugins - assert.equal(element._filteredLinks[2].children.length, 0); + assert.isNotOk(element._filteredLinks[2].subsection); done(); }); }); - test('Nav is reloaded when project changes', () => { + test('Nav is reloaded when repo changes', () => { sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { return Promise.resolve({ createGroup: true, @@ -174,10 +243,10 @@ limitations under the License. return Promise.resolve({_id: 1}); }); sandbox.stub(element, 'reload'); - element.params = {project: 'Test Project', adminView: 'gr-project'}; + element.params = {repo: 'Test Repo', adminView: 'gr-repo'}; assert.equal(element.reload.callCount, 1); - element.params = {project: 'Test Project 2', - adminView: 'gr-project'}; + element.params = {repo: 'Test Repo 2', + adminView: 'gr-repo'}; assert.equal(element.reload.callCount, 2); }); @@ -206,10 +275,362 @@ limitations under the License. assert.isTrue(element.reload.called); done(); }); - element.params = {group: 1, adminView: 'gr-group'}; + element.params = {group: 1, view: Gerrit.Nav.View.GROUP}; element._groupName = 'oldName'; flushAsynchronousOperations(); element.$$('gr-group').fire('name-changed', {name: newName}); }); + + test('dropdown displays if there is a subsection', () => { + assert.isNotOk(element.$$('.mainHeader')); + element._subsectionLinks = [ + { + text: 'Home', + value: 'repo', + view: 'repo', + url: '', + parent: 'my-repo', + detailType: undefined, + }, + ]; + flushAsynchronousOperations(); + assert.isOk(element.$$('.mainHeader')); + element._subsectionLinks = undefined; + flushAsynchronousOperations(); + assert.equal(getComputedStyle(element.$$('.mainHeader')).display, 'none'); + }); + + test('Dropdown only triggers navigation on explicit select', done => { + element._repoName = 'my-repo'; + element.params = { + repo: 'my-repo', + view: Gerrit.Nav.View.REPO, + detail: Gerrit.Nav.RepoDetailView.ACCESS, + }; + sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { + return Promise.resolve({ + createGroup: true, + createProject: true, + viewPlugins: true, + }); + }); + sandbox.stub(element.$.restAPI, 'getAccount', () => { + return Promise.resolve({_id: 1}); + }); + flushAsynchronousOperations(); + const expectedFilteredLinks = [ + { + name: 'Repositories', + noBaseUrl: true, + url: '/admin/repos', + view: 'gr-repo-list', + viewableToAll: true, + subsection: { + name: 'my-repo', + view: 'repo', + url: '', + children: [ + { + name: 'Access', + view: 'repo', + detailType: 'access', + url: '', + }, + { + name: 'Commands', + view: 'repo', + detailType: 'commands', + url: '', + }, + { + name: 'Branches', + view: 'repo', + detailType: 'branches', + url: '', + }, + { + name: 'Tags', + view: 'repo', + detailType: 'tags', + url: '', + }, + { + name: 'Dashboards', + view: 'repo', + detailType: 'dashboards', + url: '', + }, + ], + }, + }, + { + name: 'Groups', + section: 'Groups', + noBaseUrl: true, + url: '/admin/groups', + view: 'gr-admin-group-list', + }, + { + name: 'Plugins', + capability: 'viewPlugins', + section: 'Plugins', + noBaseUrl: true, + url: '/admin/plugins', + view: 'gr-plugin-list', + }, + ]; + const expectedSubsectionLinks = [ + { + text: 'Home', + value: 'repo', + view: 'repo', + url: '', + parent: 'my-repo', + detailType: undefined, + }, + { + text: 'Access', + value: 'repoaccess', + view: 'repo', + url: '', + detailType: 'access', + parent: 'my-repo', + }, + { + text: 'Commands', + value: 'repocommands', + view: 'repo', + url: '', + detailType: 'commands', + parent: 'my-repo', + }, + { + text: 'Branches', + value: 'repobranches', + view: 'repo', + url: '', + detailType: 'branches', + parent: 'my-repo', + }, + { + text: 'Tags', + value: 'repotags', + view: 'repo', + url: '', + detailType: 'tags', + parent: 'my-repo', + }, + { + text: 'Dashboards', + value: 'repodashboards', + view: 'repo', + url: '', + detailType: 'dashboards', + parent: 'my-repo', + }, + ]; + sandbox.stub(Gerrit.Nav, 'navigateToRelativeUrl'); + sandbox.spy(element, '_selectedIsCurrentPage'); + sandbox.spy(element, '_handleSubsectionChange'); + element.reload().then(() => { + assert.deepEqual(element._filteredLinks, expectedFilteredLinks); + assert.deepEqual(element._subsectionLinks, expectedSubsectionLinks); + assert.equal(element.$$('#pageSelect').value, 'repoaccess'); + assert.isTrue(element._selectedIsCurrentPage.calledOnce); + // Doesn't trigger navigation from the page select menu. + assert.isFalse(Gerrit.Nav.navigateToRelativeUrl.called); + + // When explicitly changed, navigation is called + element.$$('#pageSelect').value = 'repo'; + assert.isTrue(element._selectedIsCurrentPage.calledTwice); + assert.isTrue(Gerrit.Nav.navigateToRelativeUrl.calledOnce); + done(); + }); + }); + + test('_selectedIsCurrentPage', () => { + element._repoName = 'my-repo'; + element.params = {view: 'repo', repo: 'my-repo'}; + const selected = { + view: 'repo', + detailType: undefined, + parent: 'my-repo', + }; + assert.isTrue(element._selectedIsCurrentPage(selected)); + selected.parent = 'my-second-repo'; + assert.isFalse(element._selectedIsCurrentPage(selected)); + selected.detailType = 'detailType'; + assert.isFalse(element._selectedIsCurrentPage(selected)); + }); + + suite('_computeSelectedClass', () => { + setup(() => { + sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { + return Promise.resolve({ + createGroup: true, + createProject: true, + viewPlugins: true, + }); + }); + sandbox.stub(element.$.restAPI, 'getAccount', () => { + return Promise.resolve({_id: 1}); + }); + + return element.reload(); + }); + + suite('repos', () => { + setup(() => { + stub('gr-repo-access', { + _repoChanged: () => {}, + }); + }); + + test('repo list', () => { + element.params = { + view: Gerrit.Nav.View.ADMIN, + adminView: 'gr-repo-list', + openCreateModal: false, + }; + flushAsynchronousOperations(); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'Repositories'); + }); + + test('repo', () => { + element.params = { + view: Gerrit.Nav.View.REPO, + repoName: 'foo', + }; + element._repoName = 'foo'; + return element.reload().then(() => { + flushAsynchronousOperations(); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'foo'); + }); + }); + + test('repo access', () => { + element.params = { + view: Gerrit.Nav.View.REPO, + detail: Gerrit.Nav.RepoDetailView.ACCESS, + repoName: 'foo', + }; + element._repoName = 'foo'; + return element.reload().then(() => { + flushAsynchronousOperations(); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'Access'); + }); + }); + + test('repo dashboards', () => { + element.params = { + view: Gerrit.Nav.View.REPO, + detail: Gerrit.Nav.RepoDetailView.DASHBOARDS, + repoName: 'foo', + }; + element._repoName = 'foo'; + return element.reload().then(() => { + flushAsynchronousOperations(); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'Dashboards'); + }); + }); + }); + + suite('groups', () => { + setup(() => { + stub('gr-group', { + _loadGroup: () => Promise.resolve({}), + }); + stub('gr-group-members', { + _loadGroupDetails: () => {}, + }); + + sandbox.stub(element.$.restAPI, 'getGroupConfig') + .returns(Promise.resolve({ + name: 'foo', + id: 'c0f83e941ce90caea30e6ad88f0d4ea0e841a7a9', + })); + sandbox.stub(element.$.restAPI, 'getIsGroupOwner') + .returns(Promise.resolve(true)); + return element.reload(); + }); + + test('group list', () => { + element.params = { + view: Gerrit.Nav.View.ADMIN, + adminView: 'gr-admin-group-list', + openCreateModal: false, + }; + flushAsynchronousOperations(); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'Groups'); + }); + + test('internal group', () => { + element.params = { + view: Gerrit.Nav.View.GROUP, + groupId: 1234, + }; + element._groupName = 'foo'; + return element.reload().then(() => { + flushAsynchronousOperations(); + const subsectionItems = Polymer.dom(element.root) + .querySelectorAll('.subsectionItem'); + assert.equal(subsectionItems.length, 2); + assert.isTrue(element._groupIsInternal); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'foo'); + }); + }); + + test('external group', () => { + element.$.restAPI.getGroupConfig.restore(); + sandbox.stub(element.$.restAPI, 'getGroupConfig') + .returns(Promise.resolve({ + name: 'foo', + id: 'external-id', + })); + element.params = { + view: Gerrit.Nav.View.GROUP, + groupId: 1234, + }; + element._groupName = 'foo'; + return element.reload().then(() => { + flushAsynchronousOperations(); + const subsectionItems = Polymer.dom(element.root) + .querySelectorAll('.subsectionItem'); + assert.equal(subsectionItems.length, 0); + assert.isFalse(element._groupIsInternal); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'foo'); + }); + }); + + test('group members', () => { + element.params = { + view: Gerrit.Nav.View.GROUP, + detail: Gerrit.Nav.GroupDetailView.MEMBERS, + groupId: 1234, + }; + element._groupName = 'foo'; + return element.reload().then(() => { + flushAsynchronousOperations(); + const selected = element.$$('gr-page-nav .selected'); + assert.isOk(selected); + assert.equal(selected.textContent.trim(), 'Members'); + }); + }); + }); + }); }); </script> |