|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | @license | 
|  | Copyright (C) 2017 The Android Open Source Project | 
|  |  | 
|  | Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | you may not use this file except in compliance with the License. | 
|  | You may obtain a copy of the License at | 
|  |  | 
|  | http://www.apache.org/licenses/LICENSE-2.0 | 
|  |  | 
|  | Unless required by applicable law or agreed to in writing, software | 
|  | distributed under the License is distributed on an "AS IS" BASIS, | 
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | See the License for the specific language governing permissions and | 
|  | limitations under the License. | 
|  | --> | 
|  |  | 
|  | <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> | 
|  | <title>gr-admin-view</title> | 
|  |  | 
|  | <script src="../../../bower_components/webcomponentsjs/webcomponents-lite.min.js"></script> | 
|  | <script src="../../../bower_components/web-component-tester/browser.js"></script> | 
|  | <link rel="import" href="../../../test/common-test-setup.html"/> | 
|  | <link rel="import" href="gr-admin-view.html"> | 
|  |  | 
|  | <script>void(0);</script> | 
|  |  | 
|  | <test-fixture id="basic"> | 
|  | <template> | 
|  | <gr-admin-view></gr-admin-view> | 
|  | </template> | 
|  | </test-fixture> | 
|  |  | 
|  | <script> | 
|  | suite('gr-admin-view tests', () => { | 
|  | let element; | 
|  | let sandbox; | 
|  |  | 
|  | setup(done => { | 
|  | sandbox = sinon.sandbox.create(); | 
|  | element = fixture('basic'); | 
|  | stub('gr-rest-api-interface', { | 
|  | getProjectConfig() { | 
|  | return Promise.resolve({}); | 
|  | }, | 
|  | }); | 
|  | const pluginsLoaded = Promise.resolve(); | 
|  | sandbox.stub(Gerrit, 'awaitPluginsLoaded').returns(pluginsLoaded); | 
|  | pluginsLoaded.then(() => flush(done)); | 
|  | }); | 
|  |  | 
|  | teardown(() => { | 
|  | sandbox.restore(); | 
|  | }); | 
|  |  | 
|  | test('_computeURLHelper', () => { | 
|  | const path = '/test'; | 
|  | const host = 'http://www.testsite.com'; | 
|  | const computedPath = element._computeURLHelper(host, path); | 
|  | assert.equal(computedPath, '//http://www.testsite.com/test'); | 
|  | }); | 
|  |  | 
|  | test('link URLs', () => { | 
|  | assert.equal( | 
|  | 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'); | 
|  | }); | 
|  |  | 
|  | test('current page gets selected and is displayed', () => { | 
|  | element._filteredLinks = [{ | 
|  | name: 'Repositories', | 
|  | url: '/admin/repos', | 
|  | view: 'gr-repo-list', | 
|  | }]; | 
|  |  | 
|  | element.params = { | 
|  | view: 'admin', | 
|  | adminView: 'gr-repo-list', | 
|  | }; | 
|  |  | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(Polymer.dom(element.root).querySelectorAll( | 
|  | '.selected').length, 1); | 
|  | 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, | 
|  | createProject: true, | 
|  | viewPlugins: true, | 
|  | }); | 
|  | }); | 
|  | element.reload().then(() => { | 
|  | assert.equal(element._filteredLinks.length, 3); | 
|  |  | 
|  | // Repos | 
|  | assert.isNotOk(element._filteredLinks[0].subsection); | 
|  |  | 
|  | // Groups | 
|  | assert.isNotOk(element._filteredLinks[0].subsection); | 
|  |  | 
|  | // Plugins | 
|  | 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.reload().then(() => { | 
|  | assert.equal(element._filteredLinks.length, 2); | 
|  |  | 
|  | // Repos | 
|  | assert.isNotOk(element._filteredLinks[0].subsection); | 
|  |  | 
|  | // Groups | 
|  | assert.isNotOk(element._filteredLinks[0].subsection); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('_filteredLinks non admin unathenticated', done => { | 
|  | element.reload().then(() => { | 
|  | assert.equal(element._filteredLinks.length, 1); | 
|  |  | 
|  | // Repos | 
|  | assert.isNotOk(element._filteredLinks[0].subsection); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | 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, | 
|  | createProject: true, | 
|  | viewPlugins: true, | 
|  | }); | 
|  | }); | 
|  | element.reload().then(() => { | 
|  | flushAsynchronousOperations(); | 
|  | assert.equal(element._filteredLinks.length, 3); | 
|  |  | 
|  | // Repos | 
|  | assert.isNotOk(element._filteredLinks[0].subsection); | 
|  |  | 
|  | // Groups | 
|  | assert.equal(element._filteredLinks[1].subsection.children.length, 2); | 
|  | assert.equal(element._filteredLinks[1].subsection.name, 'my-group'); | 
|  |  | 
|  | // Plugins | 
|  | assert.isNotOk(element._filteredLinks[2].subsection); | 
|  | done(); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('Nav is reloaded when repo changes', () => { | 
|  | sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { | 
|  | return Promise.resolve({ | 
|  | createGroup: true, | 
|  | createProject: true, | 
|  | viewPlugins: true, | 
|  | }); | 
|  | }); | 
|  | sandbox.stub(element.$.restAPI, 'getAccount', () => { | 
|  | return Promise.resolve({_id: 1}); | 
|  | }); | 
|  | sandbox.stub(element, 'reload'); | 
|  | element.params = {repo: 'Test Repo', adminView: 'gr-repo'}; | 
|  | assert.equal(element.reload.callCount, 1); | 
|  | element.params = {repo: 'Test Repo 2', | 
|  | adminView: 'gr-repo'}; | 
|  | assert.equal(element.reload.callCount, 2); | 
|  | }); | 
|  |  | 
|  | test('Nav is reloaded when group changes', () => { | 
|  | sandbox.stub(element, '_computeGroupName'); | 
|  | sandbox.stub(element.$.restAPI, 'getAccountCapabilities', () => { | 
|  | return Promise.resolve({ | 
|  | createGroup: true, | 
|  | createProject: true, | 
|  | viewPlugins: true, | 
|  | }); | 
|  | }); | 
|  | sandbox.stub(element.$.restAPI, 'getAccount', () => { | 
|  | return Promise.resolve({_id: 1}); | 
|  | }); | 
|  | sandbox.stub(element, 'reload'); | 
|  | element.params = {groupId: '1', adminView: 'gr-group'}; | 
|  | assert.equal(element.reload.callCount, 1); | 
|  | }); | 
|  |  | 
|  | test('Nav is reloaded when group name changes', done => { | 
|  | const newName = 'newName'; | 
|  | sandbox.stub(element, '_computeGroupName'); | 
|  | sandbox.stub(element, 'reload', () => { | 
|  | assert.equal(element._groupName, newName); | 
|  | assert.isTrue(element.reload.called); | 
|  | done(); | 
|  | }); | 
|  | 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> |