blob: 4db7877f53c6cffc4b81a619a237bb901f3ea60e [file] [log] [blame]
// 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 sinon from 'sinon';
import {assert} from 'chai';
import {MrStar} from './mr-star.js';
let element;
describe('mr-star', () => {
beforeEach(() => {
element = document.createElement('mr-star');
document.body.appendChild(element);
});
afterEach(() => {
if (document.body.contains(element)) {
document.body.removeChild(element);
}
});
it('initializes', () => {
assert.instanceOf(element, MrStar);
});
it('unimplemented methods throw errors', () => {
assert.throws(element.star, 'Method not implemented.');
assert.throws(element.unstar, 'Method not implemented.');
});
describe('clicking star toggles star state', () => {
beforeEach(() => {
sinon.stub(element, 'star');
sinon.stub(element, 'unstar');
element._isLoggedIn = true;
element._canStar = true;
});
it('unstarred star', async () => {
element._isStarred = false;
await element.updateComplete;
sinon.assert.notCalled(element.star);
sinon.assert.notCalled(element.unstar);
element.shadowRoot.querySelector('button').click();
sinon.assert.calledOnce(element.star);
sinon.assert.notCalled(element.unstar);
});
it('starred star', async () => {
element._isStarred = true;
await element.updateComplete;
sinon.assert.notCalled(element.star);
sinon.assert.notCalled(element.unstar);
element.shadowRoot.querySelector('button').click();
sinon.assert.notCalled(element.star);
sinon.assert.calledOnce(element.unstar);
});
});
it('clicking while logged out logs you in', async () => {
sinon.stub(element, 'login');
element._isLoggedIn = false;
element._canStar = true;
await element.updateComplete;
sinon.assert.notCalled(element.login);
element.shadowRoot.querySelector('button').click();
sinon.assert.calledOnce(element.login);
});
describe('toggleStar', () => {
beforeEach(() => {
sinon.stub(element, 'star');
sinon.stub(element, 'unstar');
});
it('stars when unstarred', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = false;
element.toggleStar();
sinon.assert.calledOnce(element.star);
sinon.assert.notCalled(element.unstar);
});
it('unstars when starred', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = true;
element.toggleStar();
sinon.assert.calledOnce(element.unstar);
sinon.assert.notCalled(element.star);
});
it('does nothing when user is not logged in', () => {
element._isLoggedIn = false;
element._canStar = true;
element._isStarred = true;
element.toggleStar();
sinon.assert.notCalled(element.unstar);
sinon.assert.notCalled(element.star);
});
it('does nothing when user does not have permission', () => {
element._isLoggedIn = true;
element._canStar = false;
element._isStarred = true;
element.toggleStar();
sinon.assert.notCalled(element.unstar);
sinon.assert.notCalled(element.star);
});
it('does nothing when stars are being fetched', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = true;
element._requesting = true;
element.toggleStar();
sinon.assert.notCalled(element.unstar);
sinon.assert.notCalled(element.star);
});
});
describe('_starringEnabled', () => {
it('enabled when user is logged in and has permission', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = true;
element._requesting = false;
assert.isTrue(element._starringEnabled);
});
it('disabled when user is logged out', () => {
element._isLoggedIn = false;
element._canStar = false;
element._isStarred = false;
element._requesting = false;
assert.isFalse(element._starringEnabled);
});
it('disabled when user has no permission', () => {
element._isLoggedIn = true;
element._canStar = false;
element._isStarred = true;
element._requesting = false;
assert.isFalse(element._starringEnabled);
});
it('disabled when requesting star', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = true;
element._requesting = true;
assert.isFalse(element._starringEnabled);
});
});
it('loading state shown when requesting', async () => {
element._requesting = true;
await element.updateComplete;
const star = element.shadowRoot.querySelector('button');
assert.isTrue(star.classList.contains('loading'));
element._requesting = false;
await element.updateComplete;
assert.isFalse(star.classList.contains('loading'));
});
it('isStarred changes displayed icon', async () => {
element._isStarred = true;
await element.updateComplete;
const star = element.shadowRoot.querySelector('button');
assert.equal(star.textContent.trim(), 'star');
element._isStarred = false;
await element.updateComplete;
assert.equal(star.textContent.trim(), 'star_border');
});
describe('mr-star nested inside a link', () => {
let parent;
let oldHash;
beforeEach(() => {
parent = document.createElement('a');
parent.setAttribute('href', '#test-hash');
parent.appendChild(element);
oldHash = window.location.hash;
sinon.stub(element, 'star');
sinon.stub(element, 'unstar');
});
afterEach(() => {
window.location.hash = oldHash;
});
it('clicking to star does not cause navigation', async () => {
sinon.spy(element, 'toggleStar');
element._isLoggedIn = true;
element._canStar = true;
await element.updateComplete;
element.shadowRoot.querySelector('button').click();
assert.notEqual(window.location.hash, '#test-hash');
sinon.assert.calledOnce(element.toggleStar);
});
it('clicking on disabled star does not cause navigation', async () => {
element._isLoggedIn = true;
element._canStar = false;
await element.updateComplete;
element.shadowRoot.querySelector('button').click();
assert.notEqual(window.location.hash, '#test-hash');
});
it('clicking on link still navigates', async () => {
element._isLoggedIn = true;
element._canStar = true;
await element.updateComplete;
parent.click();
assert.equal(window.location.hash, '#test-hash');
});
});
describe('_starToolTip', () => {
it('not logged in', () => {
element._isLoggedIn = false;
element._canStar = false;
assert.equal(element._starToolTip,
`Login to star this resource.`);
});
it('no permission to star', () => {
element._isLoggedIn = true;
element._canStar = false;
assert.equal(element._starToolTip,
`You don't have permission to star this resource.`);
});
it('star is loading', () => {
element._isLoggedIn = true;
element._canStar = true;
element._requesting = true;
assert.equal(element._starToolTip,
`Loading star state for this resource.`);
});
it('issue is not starred', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = false;
assert.equal(element._starToolTip,
`Star this resource.`);
});
it('issue is starred', () => {
element._isLoggedIn = true;
element._canStar = true;
element._isStarred = true;
assert.equal(element._starToolTip,
`Unstar this resource.`);
});
});
});