blob: 78e4224be6a00d97fc61fea051d9e9cc427d91d7 [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 {fireEvent} from '@testing-library/react';
import {MrBulkApprovalUpdate, NO_APPROVALS_MESSAGE,
NO_UPDATES_MESSAGE} from './mr-bulk-approval-update.js';
import {prpcClient} from 'prpc-client-instance.js';
let element;
describe('mr-bulk-approval-update', () => {
beforeEach(() => {
element = document.createElement('mr-bulk-approval-update');
document.body.appendChild(element);
sinon.stub(prpcClient, 'call');
});
afterEach(() => {
document.body.removeChild(element);
prpcClient.call.restore();
});
it('initializes', () => {
assert.instanceOf(element, MrBulkApprovalUpdate);
});
it('_computeIssueRefs: missing information', () => {
element.projectName = 'chromium';
assert.equal(element.issueRefs.length, 0);
element.projectName = null;
element.localIdsStr = '1,2,3,5';
assert.equal(element.issueRefs.length, 0);
element.localIdsStr = null;
assert.equal(element.issueRefs.length, 0);
});
it('_computeIssueRefs: normal', () => {
const project = 'chromium';
element.projectName = project;
element.localIdsStr = '1,2,3';
assert.deepEqual(element.issueRefs, [
{projectName: project, localId: '1'},
{projectName: project, localId: '2'},
{projectName: project, localId: '3'},
]);
});
it('fetchApprovals: applicable fields exist', async () => {
const responseFieldDefs = [
{fieldRef: {type: 'INT_TYPE'}},
{fieldRef: {type: 'APPROVAL_TYPE'}},
{fieldRef: {type: 'APPROVAL_TYPE'}},
];
const promise = Promise.resolve({fieldDefs: responseFieldDefs});
prpcClient.call.returns(promise);
sinon.spy(element, 'fetchApprovals');
await element.updateComplete;
element.querySelector('.js-showApprovals').click();
assert.isTrue(element.fetchApprovals.calledOnce);
// Wait for promise in fetchApprovals to resolve.
await promise;
assert.deepEqual([
{fieldRef: {type: 'APPROVAL_TYPE'}},
{fieldRef: {type: 'APPROVAL_TYPE'}},
], element.approvals);
assert.equal(null, element.errorMessage);
});
it('fetchApprovals: applicable fields dont exist', async () => {
const promise = Promise.resolve({fieldDefs: []});
prpcClient.call.returns(promise);
await element.updateComplete;
element.querySelector('.js-showApprovals').click();
await promise;
assert.equal(element.approvals.length, 0);
assert.equal(NO_APPROVALS_MESSAGE, element.errorMessage);
});
it('save: normal', async () => {
const promise =
Promise.resolve({issueRefs: [{localId: '1'}, {localId: '3'}]});
prpcClient.call.returns(promise);
const fieldDefs = [
{fieldRef: {fieldName: 'Approval-One', type: 'APPROVAL_TYPE'}},
{fieldRef: {fieldName: 'Approval-Two', type: 'APPROVAL_TYPE'}},
];
element.approvals = fieldDefs;
element.projectName = 'chromium';
element.localIdsStr = '1,2,3';
await element.updateComplete;
fireEvent.change(element.querySelector('#commentText'), {target: {value: 'comment'}});
fireEvent.change(element.querySelector('#statusInput'), {target: {value: 'NotApproved'}});
element.querySelector('.js-save').click();
// Wait for promise in save() to resolve.
await promise;
await element.updateComplete;
// Assert messages correct
assert.equal(
true,
element.responseMessage.includes(
'Updated Approval-One in issues: 1, 3 (2 of 3).'));
assert.equal('', element.errorMessage);
// Assert all inputs not disabled.
element.querySelectorAll('input, textarea, select').forEach((input) => {
assert.equal(input.disabled, false);
});
// Assert all inputs cleared.
element.querySelectorAll('input, textarea').forEach((input) => {
assert.equal(input.value, '');
});
element.querySelectorAll('select').forEach((select) => {
assert.equal(select.selectedIndex, 0);
});
// Assert BulkUpdateApprovals correctly called.
const expectedMessage = {
approvalDelta: {status: 'NOT_APPROVED'},
commentContent: 'comment',
fieldRef: fieldDefs[0].fieldRef,
issueRefs: element.issueRefs,
send_email: true,
};
sinon.assert.calledWith(
prpcClient.call,
'monorail.Issues',
'BulkUpdateApprovals',
expectedMessage);
});
it('save: no updates', async () => {
const promise = Promise.resolve({issueRefs: []});
prpcClient.call.returns(promise);
const fieldDefs = [
{fieldRef: {fieldName: 'Approval-One', type: 'APPROVAL_TYPE'}},
{fieldRef: {fieldName: 'Approval-Two', type: 'APPROVAL_TYPE'}},
];
element.approvals = fieldDefs;
element.projectName = 'chromium';
element.localIdsStr = '1,2,3';
await element.updateComplete;
element.querySelector('#commentText').value = 'comment';
element.querySelector('#statusInput').value = 'NotApproved';
element.querySelector('.js-save').click();
// Wait for promise in save() to resolve
await promise;
// Assert messages correct.
assert.equal('', element.responseMessage);
assert.equal(NO_UPDATES_MESSAGE, element.errorMessage);
// Assert inputs not cleared.
assert.equal(element.querySelector('#commentText').value, 'comment');
assert.equal(element.querySelector('#statusInput').value, 'NotApproved');
// Assert inputs not disabled.
element.querySelectorAll('input, textarea, select').forEach((input) => {
assert.equal(input.disabled, false);
});
});
});