| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {assert} from 'chai'; |
| import sinon from 'sinon'; |
| |
| import {prpcClient} from 'prpc-client-instance.js'; |
| import {MrHeader} from './mr-header.js'; |
| |
| |
| window.CS_env = { |
| token: 'foo-token', |
| }; |
| |
| let element; |
| |
| describe('mr-header', () => { |
| beforeEach(() => { |
| element = document.createElement('mr-header'); |
| document.body.appendChild(element); |
| |
| window.ga = sinon.stub(); |
| }); |
| |
| afterEach(() => { |
| document.body.removeChild(element); |
| }); |
| |
| it('initializes', () => { |
| assert.instanceOf(element, MrHeader); |
| }); |
| |
| it('presentationConfig renders', async () => { |
| element.projectName = 'best-project'; |
| element.projectThumbnailUrl = 'http://images.google.com/'; |
| element.presentationConfig = { |
| projectSummary: 'The best project', |
| }; |
| |
| await element.updateComplete; |
| |
| assert.equal(element.shadowRoot.querySelector('.project-logo').src, |
| 'http://images.google.com/'); |
| |
| assert.endsWith(element.shadowRoot.querySelector('.new-issue-link').href, |
| '/p/best-project/issues/entry'); |
| |
| assert.equal(element.shadowRoot.querySelector('.project-selector').title, |
| 'The best project'); |
| }); |
| |
| describe('issueEntryUrl', () => { |
| let oldToken; |
| |
| beforeEach(() => { |
| oldToken = prpcClient.token; |
| prpcClient.token = 'token1'; |
| |
| element.projectName = 'proj'; |
| |
| sinon.stub(element, '_origin').get(() => 'http://localhost'); |
| }); |
| |
| afterEach(() => { |
| prpcClient.token = oldToken; |
| }); |
| |
| it('updates on project change', async () => { |
| await element.updateComplete; |
| |
| assert.endsWith(element.shadowRoot.querySelector('.new-issue-link').href, |
| '/p/proj/issues/entry'); |
| |
| element.projectName = 'the-best-project'; |
| |
| await element.updateComplete; |
| |
| assert.endsWith(element.shadowRoot.querySelector('.new-issue-link').href, |
| '/p/the-best-project/issues/entry'); |
| }); |
| |
| it('generates wizard URL when customIssueEntryUrl defined', () => { |
| element.presentationConfig = {customIssueEntryUrl: 'https://issue.wizard'}; |
| element.userProjects = {ownerOf: ['not-proj']}; |
| element.userDisplayName = 'test@example.com'; |
| assert.equal(element.issueEntryUrl, |
| 'https://issue.wizard?token=token1&role=&' + |
| 'continue=http://localhost/p/proj/issues/entry.do'); |
| }); |
| |
| it('uses default issue filing URL when user is not logged in', () => { |
| element.presentationConfig = {customIssueEntryUrl: 'https://issue.wizard'}; |
| element.userDisplayName = ''; |
| assert.equal(element.issueEntryUrl, '/p/proj/issues/entry'); |
| }); |
| |
| it('uses default issue filing URL when user is project owner', () => { |
| element.presentationConfig = {customIssueEntryUrl: 'https://issue.wizard'}; |
| element.userProjects = {ownerOf: ['proj']}; |
| assert.equal(element.issueEntryUrl, '/p/proj/issues/entry'); |
| }); |
| |
| it('uses default issue filing URL when user is project member', () => { |
| element.presentationConfig = {customIssueEntryUrl: 'https://issue.wizard'}; |
| element.userProjects = {memberOf: ['proj']}; |
| assert.equal(element.issueEntryUrl, '/p/proj/issues/entry'); |
| }); |
| |
| it('uses default issue filing URL when user is project contributor', () => { |
| element.presentationConfig = {customIssueEntryUrl: 'https://issue.wizard'}; |
| element.userProjects = {contributorTo: ['proj']}; |
| assert.equal(element.issueEntryUrl, '/p/proj/issues/entry'); |
| }); |
| }); |
| |
| |
| it('canAdministerProject is false when user is not logged in', () => { |
| element.userDisplayName = ''; |
| |
| assert.isFalse(element.canAdministerProject); |
| }); |
| |
| it('canAdministerProject is true when user is site admin', () => { |
| element.userDisplayName = 'test@example.com'; |
| element.isSiteAdmin = true; |
| |
| assert.isTrue(element.canAdministerProject); |
| |
| element.isSiteAdmin = false; |
| |
| assert.isFalse(element.canAdministerProject); |
| }); |
| |
| it('canAdministerProject is true when user is owner', () => { |
| element.userDisplayName = 'test@example.com'; |
| element.isSiteAdmin = false; |
| |
| element.projectName = 'chromium'; |
| element.userProjects = {ownerOf: ['chromium']}; |
| |
| assert.isTrue(element.canAdministerProject); |
| |
| element.projectName = 'v8'; |
| |
| assert.isFalse(element.canAdministerProject); |
| |
| element.userProjects = {memberOf: ['v8']}; |
| |
| assert.isFalse(element.canAdministerProject); |
| }); |
| |
| it('_projectDropdownItems tells user to sign in if not logged in', () => { |
| element.userDisplayName = ''; |
| element.loginUrl = 'http://login'; |
| |
| const items = element._projectDropdownItems; |
| |
| // My Projects |
| assert.deepEqual(items[0], { |
| text: 'Sign in to see your projects', |
| url: 'http://login', |
| }); |
| }); |
| |
| it('_projectDropdownItems computes projects for user', () => { |
| element.userProjects = { |
| ownerOf: ['chromium'], |
| memberOf: ['v8'], |
| contributorTo: ['skia'], |
| starredProjects: ['gerrit'], |
| }; |
| element.userDisplayName = 'test@example.com'; |
| |
| const items = element._projectDropdownItems; |
| |
| // TODO(http://crbug.com/monorail/6236): Replace these checks with |
| // deepInclude once we upgrade Chai. |
| // My Projects |
| assert.equal(items[1].text, 'chromium'); |
| assert.equal(items[1].url, '/p/chromium/issues/list'); |
| assert.equal(items[2].text, 'skia'); |
| assert.equal(items[2].url, '/p/skia/issues/list'); |
| assert.equal(items[3].text, 'v8'); |
| assert.equal(items[3].url, '/p/v8/issues/list'); |
| |
| // Starred Projects |
| assert.equal(items[5].text, 'gerrit'); |
| assert.equal(items[5].url, '/p/gerrit/issues/list'); |
| }); |
| }); |