Project import generated by Copybara.
GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/static_src/elements/framework/mr-star/mr-project-star.test.js b/static_src/elements/framework/mr-star/mr-project-star.test.js
new file mode 100644
index 0000000..6afd982
--- /dev/null
+++ b/static_src/elements/framework/mr-star/mr-project-star.test.js
@@ -0,0 +1,181 @@
+// Copyright 2020 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 {MrProjectStar} from './mr-project-star.js';
+import {stars} from 'reducers/stars.js';
+
+let element;
+
+describe('mr-project-star (disconnected)', () => {
+ beforeEach(() => {
+ element = document.createElement('mr-project-star');
+ document.body.appendChild(element);
+
+ sinon.stub(element, 'stateChanged');
+ sinon.spy(stars, 'starProject');
+ sinon.spy(stars, 'unstarProject');
+ });
+
+ afterEach(() => {
+ document.body.removeChild(element);
+
+ stars.starProject.restore();
+ stars.unstarProject.restore();
+ });
+
+ it('initializes', () => {
+ assert.instanceOf(element, MrProjectStar);
+ });
+
+ it('clicking on star when logged out logs in user', async () => {
+ element._currentUserName = undefined;
+ sinon.stub(element, 'login');
+
+ await element.updateComplete;
+
+ const star = element.shadowRoot.querySelector('button');
+
+ star.click();
+
+ sinon.assert.calledOnce(element.login);
+ });
+
+ it('star dispatches star request', () => {
+ element._currentUserName = 'users/1234';
+ element.name = 'projects/monorail';
+
+ element.star();
+
+ sinon.assert.calledWith(stars.starProject,
+ 'projects/monorail', 'users/1234');
+ });
+
+ it('unstar dispatches unstar request', () => {
+ element._currentUserName = 'users/1234';
+ element.name = 'projects/monorail';
+
+ element.unstar();
+
+ sinon.assert.calledWith(stars.unstarProject,
+ 'projects/monorail', 'users/1234');
+ });
+
+ describe('isStarred', () => {
+ beforeEach(() => {
+ element._stars = {
+ 'users/1234/projectStars/monorail':
+ {name: 'users/1234/projectStars/monorail'},
+ 'users/5678/projectStars/chromium':
+ {name: 'users/5678/projectStars/chromium'},
+ };
+ });
+
+ it('false when no data', () => {
+ element._stars = {};
+ assert.isFalse(element.isStarred);
+ });
+
+ it('false when user is not logged in', () => {
+ element._currentUserName = '';
+ element.name = 'projects/monorail';
+
+ assert.isFalse(element.isStarred);
+ });
+
+ it('false when project is not starred', () => {
+ element._currentUserName = 'users/1234';
+ element.name = 'projects/chromium';
+
+ assert.isFalse(element.isStarred);
+
+ element._currentUserName = 'users/5678';
+ element.name = 'projects/monorail';
+
+ assert.isFalse(element.isStarred);
+ });
+
+ it('true when user has starred project', () => {
+ element._currentUserName = 'users/1234';
+ element.name = 'projects/monorail';
+
+ assert.isTrue(element.isStarred);
+
+ element._currentUserName = 'users/5678';
+ element.name = 'projects/chromium';
+
+ assert.isTrue(element.isStarred);
+ });
+ });
+
+ describe('_starringEnabled', () => {
+ beforeEach(() => {
+ element._currentUserName = 'users/1234';
+ element.name = 'projects/monorail';
+ });
+
+ it('disabled when user is not logged in', () => {
+ element._currentUserName = '';
+
+ assert.isFalse(element._starringEnabled);
+ });
+
+ it('disabled when stars are being fetched', () => {
+ element._fetchingStars = true;
+ element._starringProjects = {};
+ element._unstarringProjects = {};
+
+ assert.isFalse(element._starringEnabled);
+ });
+
+ it('disabled when user is starring project', () => {
+ element._fetchingStars = false;
+ element._starringProjects =
+ {'users/1234/projectStars/monorail': {requesting: true}};
+ element._unstarringProjects = {};
+
+ assert.isFalse(element._starringEnabled);
+ });
+
+ it('disabled when user is unstarring project', () => {
+ element._fetchingStars = false;
+ element._starringProjects = {};
+ element._unstarringProjects =
+ {'users/1234/projectStars/monorail': {requesting: true}};
+
+ assert.isFalse(element._starringEnabled);
+ });
+
+ it('enabled when user is starring an unrelated project', () => {
+ element._fetchingStars = false;
+ element._starringProjects = {
+ 'users/1234/projectStars/chromium': {requesting: true},
+ 'users/1234/projectStars/monorail': {requesting: false},
+ };
+ element._unstarringProjects = {};
+
+ assert.isTrue(element._starringEnabled);
+ });
+
+ it('enabled when user is unstarring an unrelated project', () => {
+ element._fetchingStars = false;
+ element._starringProjects = {};
+ element._unstarringProjects = {
+ 'users/1234/projectStars/chromium': {requesting: true},
+ 'users/1234/projectStars/monorail': {requesting: false},
+ };
+
+ assert.isTrue(element._starringEnabled);
+ });
+
+ it('enabled when no in-flight requests', () => {
+ element._fetchingStars = false;
+ element._starringProjects = {};
+ element._unstarringProjects = {};
+
+ assert.isTrue(element._starringEnabled);
+ });
+ });
+});