Project import generated by Copybara.
GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/static_src/elements/framework/mr-header/mr-header.test.js b/static_src/elements/framework/mr-header/mr-header.test.js
new file mode 100644
index 0000000..277347f
--- /dev/null
+++ b/static_src/elements/framework/mr-header/mr-header.test.js
@@ -0,0 +1,191 @@
+// 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');
+ });
+});