blob: 49e7babe9e910d05dd005e8fb40233828ae30411 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// 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, '/p/proj/issues/wizard');
});
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',
});
});
// TODO(b/283983843): Prefix project names with "mock".
it('_projectDropdownItems computes projects for user', () => {
element.userProjects = {
ownerOf: ['chromium'],
memberOf: ['v8'],
contributorTo: ['mockskia'],
starredProjects: ['mockgerrit'],
};
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, 'mockskia');
assert.equal(items[2].url, '/p/mockskia/issues/list');
assert.equal(items[3].text, 'v8');
assert.equal(items[3].url, '/p/v8/issues/list');
// Starred Projects
assert.equal(items[5].text, 'mockgerrit');
assert.equal(items[5].url, '/p/mockgerrit/issues/list');
});
});