blob: 18f8e4c9dabee575b6605d66e17d8e067c14f107 [file] [log] [blame]
/**
* @license
* Copyright 2021 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup';
import {fixture, assert} from '@open-wc/testing';
import {html} from 'lit';
import './gr-submit-requirement-hovercard';
import {GrSubmitRequirementHovercard} from './gr-submit-requirement-hovercard';
import {
createAccountWithId,
createApproval,
createChange,
createDetailedLabelInfo,
createParsedChange,
createSubmitRequirementExpressionInfo,
createSubmitRequirementResultInfo,
} from '../../../test/test-data-generators';
import {ParsedChangeInfo} from '../../../types/types';
import {query, queryAndAssert, stubRestApi} from '../../../test/test-utils';
import {GrButton} from '../../shared/gr-button/gr-button';
import {ChangeStatus, SubmitRequirementResultInfo} from '../../../api/rest-api';
suite('gr-submit-requirement-hovercard tests', () => {
let element: GrSubmitRequirementHovercard;
setup(async () => {
element = await fixture<GrSubmitRequirementHovercard>(
html`<gr-submit-requirement-hovercard
.requirement=${createSubmitRequirementResultInfo()}
.change=${createChange()}
.account=${createAccountWithId()}
></gr-submit-requirement-hovercard>`
);
});
test('renders', async () => {
assert.shadowDom.equal(
element,
/* HTML */ `
<div id="container" role="tooltip" tabindex="-1">
<div class="section">
<div class="sectionIcon">
<gr-icon
aria-label="satisfied"
role="img"
class="check_circle"
filled
icon="check_circle"
>
</gr-icon>
</div>
<div class="sectionContent">
<h3 class="heading-3 name">
<span> Verified </span>
</h3>
</div>
</div>
<div class="section">
<div class="sectionIcon">
<gr-icon class="small" icon="info"></gr-icon>
</div>
<div class="sectionContent">
<div class="row">
<div class="title">Status</div>
<div>SATISFIED</div>
</div>
</div>
</div>
<div class="button">
<gr-button
aria-disabled="false"
id="toggleConditionsButton"
link=""
role="button"
tabindex="0"
>
View conditions
<gr-icon icon="expand_more"></gr-icon>
</gr-button>
</div>
</div>
`
);
});
test('renders conditions after click', async () => {
const button = queryAndAssert<GrButton>(element, '#toggleConditionsButton');
button.click();
await element.updateComplete;
assert.shadowDom.equal(
element,
/* HTML */ `
<div id="container" role="tooltip" tabindex="-1">
<div class="section">
<div class="sectionIcon">
<gr-icon
aria-label="satisfied"
role="img"
class="check_circle"
filled
icon="check_circle"
>
</gr-icon>
</div>
<div class="sectionContent">
<h3 class="heading-3 name">
<span> Verified </span>
</h3>
</div>
</div>
<div class="section">
<div class="sectionIcon">
<gr-icon class="small" icon="info"></gr-icon>
</div>
<div class="sectionContent">
<div class="row">
<div class="title">Status</div>
<div>SATISFIED</div>
</div>
</div>
</div>
<div class="button">
<gr-button
aria-disabled="false"
id="toggleConditionsButton"
link=""
role="button"
tabindex="0"
>
Hide conditions
<gr-icon icon="expand_less"></gr-icon>
</gr-button>
</div>
<div class="section condition">
<div class="sectionContent">
Submit condition:
<br />
<span class="expression">
<span class="passing atom" title="Atom evaluates to True">
label:Verified=MAX
</span>
<span class="passing atom" title="Atom evaluates to True">
-label:Verified=MIN
</span>
</span>
</div>
</div>
</div>
`
);
});
test('renders label', async () => {
const submitRequirement: SubmitRequirementResultInfo = {
...createSubmitRequirementResultInfo(),
description: 'Test Description',
submittability_expression_result: createSubmitRequirementExpressionInfo(),
};
const change: ParsedChangeInfo = {
...createParsedChange(),
labels: {
Verified: {
...createDetailedLabelInfo(),
all: [
{
...createApproval(),
value: 2,
},
],
},
},
};
const element = await fixture<GrSubmitRequirementHovercard>(
html`<gr-submit-requirement-hovercard
.requirement=${submitRequirement}
.change=${change}
.account=${createAccountWithId()}
></gr-submit-requirement-hovercard>`
);
assert.shadowDom.equal(
element,
/* HTML */ `
<div id="container" role="tooltip" tabindex="-1">
<div class="section">
<div class="sectionIcon">
<gr-icon
aria-label="satisfied"
role="img"
class="check_circle"
filled
icon="check_circle"
></gr-icon>
</div>
<div class="sectionContent">
<h3 class="heading-3 name">
<span> Verified </span>
</h3>
</div>
</div>
<div class="section">
<div class="sectionIcon">
<gr-icon class="small" icon="info"></gr-icon>
</div>
<div class="sectionContent">
<div class="row">
<div class="title">Status</div>
<div>SATISFIED</div>
</div>
</div>
</div>
<div class="section">
<div class="sectionIcon"></div>
<div class="row">
<div>
<gr-label-info> </gr-label-info>
</div>
</div>
</div>
<div class="section description">
<div class="sectionIcon">
<gr-icon icon="description"></gr-icon>
</div>
<div class="sectionContent">
<gr-formatted-text></gr-formatted-text>
</div>
</div>
<div class="button">
<gr-button
aria-disabled="false"
id="toggleConditionsButton"
link=""
role="button"
tabindex="0"
>
View conditions
<gr-icon icon="expand_more"></gr-icon>
</gr-button>
</div>
</div>
`
);
});
suite('quick approve label', () => {
const submitRequirement: SubmitRequirementResultInfo = {
...createSubmitRequirementResultInfo(),
description: 'Test Description',
submittability_expression_result: createSubmitRequirementExpressionInfo(),
};
const account = createAccountWithId();
const change: ParsedChangeInfo = {
...createParsedChange(),
status: ChangeStatus.NEW,
permitted_labels: {
Verified: ['-1', ' 0', '+1', '+2'],
},
labels: {
Verified: {
...createDetailedLabelInfo(),
all: [
{
...createApproval(),
_account_id: account._account_id,
permitted_voting_range: {
min: -2,
max: 2,
},
},
],
},
},
};
test('renders', async () => {
const element = await fixture<GrSubmitRequirementHovercard>(
html`<gr-submit-requirement-hovercard
.requirement=${submitRequirement}
.change=${change}
.account=${account}
></gr-submit-requirement-hovercard>`
);
const quickApprove = queryAndAssert(element, '.quickApprove');
assert.dom.equal(
quickApprove,
/* HTML */ `
<div class="button quickApprove">
<gr-button aria-disabled="false" link="" role="button" tabindex="0">
Vote Verified +2
</gr-button>
</div>
`
);
});
test("doesn't render when already voted max vote", async () => {
const changeWithVote = {
...change,
labels: {
...change.labels,
Verified: {
...createDetailedLabelInfo(),
all: [
{
...createApproval(),
_account_id: account._account_id,
permitted_voting_range: {
min: -2,
max: 2,
},
value: 2,
},
],
},
},
};
const element = await fixture<GrSubmitRequirementHovercard>(
html`<gr-submit-requirement-hovercard
.requirement=${submitRequirement}
.change=${changeWithVote}
.account=${account}
></gr-submit-requirement-hovercard>`
);
assert.isUndefined(query(element, '.quickApprove'));
});
test('uses patchset from change', async () => {
const saveChangeReview = stubRestApi('saveChangeReview').resolves();
const element = await fixture<GrSubmitRequirementHovercard>(
html`<gr-submit-requirement-hovercard
.requirement=${submitRequirement}
.change=${change}
.account=${account}
></gr-submit-requirement-hovercard>`
);
queryAndAssert<GrButton>(element, '.quickApprove > gr-button').click();
assert.equal(saveChangeReview.callCount, 1);
assert.equal(saveChangeReview.firstCall.args[1], change.current_revision);
});
test('override button renders', async () => {
const submitRequirement: SubmitRequirementResultInfo = {
...createSubmitRequirementResultInfo(),
description: 'Test Description',
submittability_expression_result:
createSubmitRequirementExpressionInfo(),
override_expression_result: createSubmitRequirementExpressionInfo(
'label:Build-Cop=MAX'
),
};
const account = createAccountWithId();
const change: ParsedChangeInfo = {
...createParsedChange(),
status: ChangeStatus.NEW,
permitted_labels: {
'Build-Cop': ['-1', ' 0', '+1', '+2'],
},
labels: {
'Build-Cop': {
...createDetailedLabelInfo(),
all: [
{
...createApproval(),
_account_id: account._account_id,
permitted_voting_range: {
min: -2,
max: 2,
},
},
],
},
},
};
const element = await fixture<GrSubmitRequirementHovercard>(
html`<gr-submit-requirement-hovercard
.requirement=${submitRequirement}
.change=${change}
.account=${account}
></gr-submit-requirement-hovercard>`
);
const quickApprove = queryAndAssert(element, '.quickApprove');
assert.dom.equal(
quickApprove,
/* HTML */ `
<div class="button quickApprove">
<gr-button aria-disabled="false" link="" role="button" tabindex="0"
>Override (Build-Cop)
</gr-button>
</div>
`
);
});
});
});