| // 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 {MrGridPage} from './mr-grid-page.js'; |
| |
| let element; |
| |
| describe('mr-grid-page', () => { |
| beforeEach(() => { |
| element = document.createElement('mr-grid-page'); |
| document.body.appendChild(element); |
| }); |
| |
| afterEach(() => { |
| document.body.removeChild(element); |
| }); |
| |
| it('initializes', () => { |
| assert.instanceOf(element, MrGridPage); |
| }); |
| |
| it('progress bar updates properly', async () => { |
| await element.updateComplete; |
| element.progress = .2499; |
| await element.updateComplete; |
| const title = |
| element.shadowRoot.querySelector('progress').getAttribute('title'); |
| assert.equal(title, '25%'); |
| }); |
| |
| it('displays error when no issues match query', async () => { |
| await element.updateComplete; |
| element.progress = 1; |
| element.totalIssues = 0; |
| await element.updateComplete; |
| const error = |
| element.shadowRoot.querySelector('.empty-search').textContent; |
| assert.equal(error.trim(), 'Your search did not generate any results.'); |
| }); |
| |
| it('calls to fetchIssueList made when _currentQuery changes', async () => { |
| await element.updateComplete; |
| const issueListCall = sinon.stub(element, '_fetchMatchingIssues'); |
| element._queryParams = {x: 'Blocked'}; |
| await element.updateComplete; |
| sinon.assert.notCalled(issueListCall); |
| |
| element._presentationConfigLoaded = true; |
| element._currentQuery = 'cc:me'; |
| await element.updateComplete; |
| sinon.assert.calledOnce(issueListCall); |
| }); |
| |
| it('calls to fetchIssueList made when _currentCan changes', async () => { |
| await element.updateComplete; |
| const issueListCall = sinon.stub(element, '_fetchMatchingIssues'); |
| element._queryParams = {y: 'Blocked'}; |
| await element.updateComplete; |
| sinon.assert.notCalled(issueListCall); |
| |
| element._presentationConfigLoaded = true; |
| element._currentCan = 1; |
| await element.updateComplete; |
| sinon.assert.calledOnce(issueListCall); |
| }); |
| |
| describe('_shouldFetchMatchingIssues', () => { |
| it('default returns false', () => { |
| const result = element._shouldFetchMatchingIssues(new Map()); |
| assert.isFalse(result); |
| }); |
| |
| it('returns true for projectName', () => { |
| element._queryParams = {q: ''}; |
| const changedProps = new Map(); |
| changedProps.set('projectName', 'anything'); |
| const result = element._shouldFetchMatchingIssues(changedProps); |
| assert.isTrue(result); |
| }); |
| |
| it('returns true when _currentQuery changes', () => { |
| element._presentationConfigLoaded = true; |
| |
| element._currentQuery = 'owner:me'; |
| const changedProps = new Map(); |
| changedProps.set('_currentQuery', ''); |
| |
| const result = element._shouldFetchMatchingIssues(changedProps); |
| assert.isTrue(result); |
| }); |
| |
| it('returns true when _currentCan changes', () => { |
| element._presentationConfigLoaded = true; |
| |
| element._currentCan = 1; |
| const changedProps = new Map(); |
| changedProps.set('_currentCan', 2); |
| |
| const result = element._shouldFetchMatchingIssues(changedProps); |
| assert.isTrue(result); |
| }); |
| |
| it('returns false when presentation config not loaded', () => { |
| element._presentationConfigLoaded = false; |
| |
| const changedProps = new Map(); |
| changedProps.set('projectName', 'anything'); |
| const result = element._shouldFetchMatchingIssues(changedProps); |
| |
| assert.isFalse(result); |
| }); |
| |
| it('returns true when presentationConfig fetch completes', () => { |
| element._presentationConfigLoaded = true; |
| |
| const changedProps = new Map(); |
| changedProps.set('_presentationConfigLoaded', false); |
| const result = element._shouldFetchMatchingIssues(changedProps); |
| |
| assert.isTrue(result); |
| }); |
| }); |
| }); |