| // 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 {MrCue} from './mr-cue.js'; |
| import page from 'page'; |
| import {rootReducer} from 'reducers/base.js'; |
| |
| let element; |
| |
| describe('mr-cue', () => { |
| beforeEach(() => { |
| element = document.createElement('mr-cue'); |
| document.body.appendChild(element); |
| |
| sinon.stub(page, 'call'); |
| }); |
| |
| afterEach(() => { |
| document.body.removeChild(element); |
| |
| page.call.restore(); |
| }); |
| |
| it('initializes', () => { |
| assert.instanceOf(element, MrCue); |
| }); |
| |
| it('stateChanged', () => { |
| const state = rootReducer({ |
| userV0: {currentUser: {prefs: new Map(), prefsLoaded: false}}, |
| }, {}); |
| element.stateChanged(state); |
| assert.deepEqual(element.prefs, new Map([['render_markdown', false]])); |
| assert.isFalse(element.prefsLoaded); |
| }); |
| |
| it('cues are hidden before prefs load', () => { |
| element.prefsLoaded = false; |
| assert.isTrue(element.hidden); |
| }); |
| |
| it('cue is hidden if user already dismissed it', () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'code_of_conduct'; |
| element.prefs = new Map([['code_of_conduct', true]]); |
| assert.isTrue(element.hidden); |
| }); |
| |
| it('cue is hidden if no relevent message', () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'this_has_no_message'; |
| assert.isTrue(element.hidden); |
| }); |
| |
| it('cue is shown if relevant message has not been dismissed', async () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'code_of_conduct'; |
| |
| await element.updateComplete; |
| |
| assert.isFalse(element.hidden); |
| const messageEl = element.shadowRoot.querySelector('#message'); |
| assert.include(messageEl.innerHTML, 'chromium.googlesource.com'); |
| }); |
| |
| it('code of conduct is specific to the project', async () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'code_of_conduct'; |
| element.projectName = 'fuchsia'; |
| |
| await element.updateComplete; |
| |
| assert.isFalse(element.hidden); |
| const messageEl = element.shadowRoot.querySelector('#message'); |
| assert.include(messageEl.innerHTML, 'fuchsia.dev'); |
| }); |
| |
| it('availability cue is hidden if no relevent issue particpants', () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'availability_msgs'; |
| element.issue = {summary: 'no owners or cc'}; |
| assert.isTrue(element.hidden); |
| |
| element.issue = { |
| summary: 'owner and ccs have no availability msg', |
| ownerRef: {}, |
| ccRefs: [{}, {}], |
| }; |
| assert.isTrue(element.hidden); |
| }); |
| |
| it('availability cue is shown if issue particpants are unavailable', |
| async () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'availability_msgs'; |
| element.referencedUsers = new Map([ |
| ['user@example.com', {availability: 'Never visited'}], |
| ]); |
| |
| element.issue = { |
| summary: 'owner is unavailable', |
| ownerRef: {displayName: 'user@example.com'}, |
| ccRefs: [{}, {}], |
| }; |
| await element.updateComplete; |
| |
| assert.isFalse(element.hidden); |
| const messageEl = element.shadowRoot.querySelector('#message'); |
| assert.include(messageEl.innerText, 'Clock icons'); |
| |
| element.issue = { |
| summary: 'owner is unavailable', |
| ownerRef: {}, |
| ccRefs: [ |
| {displayName: 'ok@example.com'}, |
| {displayName: 'user@example.com'}], |
| }; |
| await element.updateComplete; |
| assert.isFalse(element.hidden); |
| assert.include(messageEl.innerText, 'Clock icons'); |
| }); |
| |
| it('switch_to_parent_account cue is hidden if no linked account', () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'switch_to_parent_account'; |
| |
| element.user = undefined; |
| assert.isTrue(element.hidden); |
| |
| element.user = {groups: []}; |
| assert.isTrue(element.hidden); |
| }); |
| |
| it('switch_to_parent_account is shown if user has parent account', |
| async () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'switch_to_parent_account'; |
| element.user = {linkedParentRef: {displayName: 'parent@example.com'}}; |
| |
| await element.updateComplete; |
| assert.isFalse(element.hidden); |
| const messageEl = element.shadowRoot.querySelector('#message'); |
| assert.include(messageEl.innerText, 'a linked account'); |
| }); |
| |
| it('search_for_numbers cue is hidden if no number was used', () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'search_for_numbers'; |
| element.issue = {}; |
| element.jumpLocalId = null; |
| assert.isTrue(element.hidden); |
| }); |
| |
| it('search_for_numbers cue is shown if jumped to issue ID', |
| async () => { |
| element.prefsLoaded = true; |
| element.cuePrefName = 'search_for_numbers'; |
| element.issue = {}; |
| element.jumpLocalId = '123'.match(new RegExp('^\\d+$')); |
| |
| await element.updateComplete; |
| assert.isFalse(element.hidden); |
| const messageEl = element.shadowRoot.querySelector('#message'); |
| assert.include(messageEl.innerText, 'use quotes'); |
| }); |
| |
| it('cue is dismissible unless there is attribute nondismissible', |
| async () => { |
| assert.isFalse(element.nondismissible); |
| |
| element.setAttribute('nondismissible', ''); |
| await element.updateComplete; |
| assert.isTrue(element.nondismissible); |
| }); |
| }); |