blob: f0971fc54d3788f97460bc67f4f1baf81583a3bf [file] [log] [blame]
/**
* @license
* Copyright 2020 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../test/common-test-setup';
import './gr-checks-results';
import {
GrChecksResults,
GrResultExpanded,
GrResultRow,
} from './gr-checks-results';
import {html} from 'lit';
import {fixture, assert} from '@open-wc/testing';
import {checksModelToken, RunResult} from '../../models/checks/checks-model';
import {
fakeRun0,
fakeRun1,
setAllFakeRuns,
} from '../../models/checks/checks-fakes';
import {resolve} from '../../models/dependency';
import {createLabelInfo} from '../../test/test-data-generators';
import {queryAndAssert, query, assertIsDefined} from '../../utils/common-util';
import {PatchSetNumber} from '../../api/rest-api';
import {GrDropdownList} from '../shared/gr-dropdown-list/gr-dropdown-list';
suite('gr-result-row test', () => {
let element: GrResultRow;
setup(async () => {
const result = {...fakeRun0, ...fakeRun0.results![0]};
element = await fixture<GrResultRow>(
html`<gr-result-row .result=${result}></gr-result-row>`
);
element.shouldRender = true;
});
test('renders label association', async () => {
element.result = {...element.result!, labelName: 'test-label', patchset: 1};
element.labels = {'test-label': createLabelInfo()};
// don't show when patchset does not match latest
element.latestPatchNum = 2 as PatchSetNumber;
await element.updateComplete;
let labelDiv = query(element, '.label');
assert.isNotOk(labelDiv);
element.latestPatchNum = 1 as PatchSetNumber;
await element.updateComplete;
labelDiv = queryAndAssert(element, '.label');
assert.dom.equal(
labelDiv,
/* HTML */ `
<div class="approved label">
<span> test-label +1 </span>
<paper-tooltip offset="5" role="tooltip" tabindex="-1">
The check result has (probably) influenced this label vote.
</paper-tooltip>
</div>
`
);
});
test('renders', async () => {
await element.updateComplete;
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="flex">
<gr-hovercard-run> </gr-hovercard-run>
<div class="name" role="button" tabindex="0">
FAKE Error Finder Finder Finder Finder Finder Finder Finder
</div>
<div class="space"></div>
</div>
<div class="summary-cell">
<a class="link"
href="https://www.google.com"
target="_blank"
rel="noopener noreferrer">
<gr-icon
icon="open_in_new"
aria-label="external link to details"
class="link"
></gr-icon>
<paper-tooltip offset="5" role="tooltip" tabindex="-1">
Link to details
</paper-tooltip>
</a>
<div
class="summary"
title="I would like to point out this error: 1 is not equal to 2!"
>
I would like to point out this error: 1 is not equal to 2!
</div>
<div class="message"></div>
<div class="tags">
<button class="tag">
<span> OBSOLETE </span>
<paper-tooltip
offset="5"
role="tooltip"
tabindex="-1"
>
A category tag for this check result. Click to filter.
</paper-tooltip>
</button>
<button class="tag">
<span> E2E </span>
<paper-tooltip
offset="5"
role="tooltip"
tabindex="-1"
>
A category tag for this check result. Click to filter.
</paper-tooltip>
</button>
</div>
</div>
<div
aria-checked="false"
aria-label="Expand result row"
class="show-hide"
hidden
role="switch"
tabindex="0"
>
<gr-icon icon="expand_more"></gr-icon>
</div>
</div>
`
);
});
test('click summary, toggle expand', async () => {
element.isExpandable = true;
await element.updateComplete;
assert.isFalse(element.isExpanded);
const summaryDiv: HTMLElement =
element.shadowRoot!.querySelector('.summary')!;
summaryDiv.click();
await element.updateComplete;
assert.isTrue(element.isExpanded);
summaryDiv.click();
await element.updateComplete;
assert.isFalse(element.isExpanded);
});
});
suite('gr-result-expanded test', () => {
let element: GrResultExpanded;
setup(async () => {
element = await fixture<GrResultExpanded>(
html`<gr-result-expanded></gr-result-expanded>`
);
await element.updateComplete;
});
test('renders fake result 1 of run 0', async () => {
element.result = {...fakeRun0, ...fakeRun0.results![1]} as RunResult;
await element.updateComplete;
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="links">
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" icon="download"> </gr-icon>
<span> Download </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" icon="system_update"> </gr-icon>
<span> Download </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" filled="" icon="image"> </gr-icon>
<span> Link to image </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" filled="" icon="image"> </gr-icon>
<span> Link to image </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" filled="" icon="bug_report"> </gr-icon>
<span> Link for reporting a problem </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" icon="help"> </gr-icon>
<span> Link to help page </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" icon="history"> </gr-icon>
<span> Link to result history </span>
</a>
</div>
<div class="links">
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" icon="open_in_new"> </gr-icon>
<span> Link to details </span>
</a>
<a
href="https://google.com"
rel="noopener noreferrer"
target="_blank"
>
<gr-icon class="link" filled="" icon="image"> </gr-icon>
<span> Link to image </span>
</a>
</div>
<gr-endpoint-decorator name="check-result-expanded">
<gr-endpoint-param name="run"> </gr-endpoint-param>
<gr-endpoint-param name="result"> </gr-endpoint-param>
<gr-formatted-text class="message"> </gr-formatted-text>
</gr-endpoint-decorator>
<div class="useful">
<div class="title">Was this helpful?</div>
<gr-checks-action icon="thumb_up"> </gr-checks-action>
<gr-checks-action icon="thumb_down"> </gr-checks-action>
</div>
`
);
});
test('renders fake result 2 of run 1', async () => {
element.result = {...fakeRun1, ...fakeRun1.results![2]} as RunResult;
await element.updateComplete;
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="links"></div>
<gr-endpoint-decorator name="check-result-expanded">
<gr-endpoint-param name="run"> </gr-endpoint-param>
<gr-endpoint-param name="result"> </gr-endpoint-param>
<gr-formatted-text class="message"> </gr-formatted-text>
</gr-endpoint-decorator>
<gr-checks-fix-preview> </gr-checks-fix-preview>
<div class="useful">
<div class="title">Was this helpful?</div>
<gr-checks-action icon="thumb_up"> </gr-checks-action>
<gr-checks-action icon="thumb_down"> </gr-checks-action>
</div>
`
);
});
});
suite('gr-checks-results test', () => {
let element: GrChecksResults;
setup(async () => {
element = await fixture<GrChecksResults>(
html`<gr-checks-results></gr-checks-results>`
);
const getChecksModel = resolve(element, checksModelToken);
getChecksModel().allRunsSelectedPatchset$.subscribe(
runs => (element.runs = runs)
);
setAllFakeRuns(getChecksModel());
await element.updateComplete;
});
test('attempt dropdown items', async () => {
const attemptDropdown = queryAndAssert<GrDropdownList>(
element,
'gr-dropdown-list'
);
assertIsDefined(attemptDropdown.items);
assert.equal(attemptDropdown.items.length, 42);
assert.deepEqual(attemptDropdown.items[0], {
text: 'Latest Attempt',
value: 'latest',
});
assert.deepEqual(attemptDropdown.items[1], {
text: 'All Attempts',
value: 'all',
});
assert.deepEqual(attemptDropdown.items[2], {
text: 'Attempt 0',
value: 0,
});
assert.deepEqual(attemptDropdown.items[41], {
text: 'Attempt 40',
value: 40,
});
});
test('renders', async () => {
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="header">
<div class="headerTopRow">
<div class="left">
<h2 class="heading-2">Results</h2>
<div class="loading" hidden="">
<span> Loading results </span>
<span class="loadingSpin"> </span>
</div>
</div>
<div class="right">
<div class="goToLatest">
<gr-button link=""> Go to latest patchset </gr-button>
</div>
<gr-dropdown-list value="latest"> </gr-dropdown-list>
<gr-dropdown-list value="0"> </gr-dropdown-list>
</div>
</div>
<div class="headerBottomRow">
<div class="left">
<div class="filterDiv">
<input
id="filterInput"
placeholder="Filter results by tag or regular expression"
type="text"
/>
</div>
</div>
<div class="right">
<a
href="https://www.google.com"
target="_blank"
rel="noopener noreferrer"
>
<gr-icon
icon="bug_report"
filled
aria-label="Fake Bug Report 1"
class="link"
></gr-icon>
<paper-tooltip offset="5"> </paper-tooltip>
</a>
<a
href="https://www.google.com"
target="_blank"
rel="noopener noreferrer"
>
<gr-icon
icon="open_in_new"
aria-label="Fake Link 1"
class="link"
></gr-icon>
<paper-tooltip offset="5"> </paper-tooltip>
</a>
<a
href="https://www.google.com"
target="_blank"
rel="noopener noreferrer"
>
<gr-icon icon="code" aria-label="Fake Code Link" class="link">
</gr-icon>
<paper-tooltip offset="5"> </paper-tooltip>
</a>
<a
href="https://www.google.com"
target="_blank"
rel="noopener noreferrer"
>
<gr-icon
icon="image"
filled
aria-label="Fake Image Link"
class="link"
></gr-icon>
<paper-tooltip offset="5"> </paper-tooltip>
</a>
<div class="space"></div>
<gr-checks-action context="results"> </gr-checks-action>
<gr-dropdown
horizontal-align="right"
id="moreActions"
link=""
vertical-offset="32"
>
<gr-icon
icon="more_vert"
aria-labelledby="moreMessage"
></gr-icon>
<span id="moreMessage"> More </span>
</gr-dropdown>
</div>
</div>
</div>
<div class="body">
<div class="error expanded">
<div class="categoryHeader error">
<h3 class="left heading-3">
<gr-icon icon="expand_less" class="expandIcon"></gr-icon>
<div class="statusIconWrapper">
<gr-icon
icon="error"
filled
class="error statusIcon"
></gr-icon>
<span class="title"> error </span>
<span class="count"> (3) </span>
<paper-tooltip offset="5"> </paper-tooltip>
</div>
</h3>
<div class="right">
<gr-button link=""> Expand All </gr-button>
</div>
</div>
<gr-result-row
class="FAKEErrorFinderFinderFinderFinderFinderFinderFinder"
>
</gr-result-row>
<gr-result-row
isexpandable
class="FAKEErrorFinderFinderFinderFinderFinderFinderFinder"
>
</gr-result-row>
<gr-result-row isexpandable class="FAKESuperCheck"> </gr-result-row>
<table class="resultsTable">
<thead>
<tr class="headerRow">
<th class="longNames nameCol">Run</th>
<th class="summaryCol">Summary</th>
<th class="expanderCol"></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="expanded warning">
<div class="categoryHeader warning">
<h3 class="left heading-3">
<gr-icon icon="expand_less" class="expandIcon"></gr-icon>
<div class="statusIconWrapper">
<gr-icon icon="warning" filled class="warning statusIcon">
</gr-icon>
<span class="title"> warning </span>
<span class="count"> (1) </span>
<paper-tooltip offset="5"> </paper-tooltip>
</div>
</h3>
<div class="right">
<gr-button link=""> Expand All </gr-button>
</div>
</div>
<gr-result-row class="FAKESuperCheck" isexpandable> </gr-result-row>
<table class="resultsTable">
<thead>
<tr class="headerRow">
<th class="nameCol">Run</th>
<th class="summaryCol">Summary</th>
<th class="expanderCol"></th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="collapsed info">
<div class="categoryHeader info">
<h3 class="left heading-3">
<gr-icon icon="expand_more" class="expandIcon"></gr-icon>
<div class="statusIconWrapper">
<gr-icon icon="info" class="info statusIcon"></gr-icon>
<span class="title"> info </span>
<span class="count"> (3) </span>
<paper-tooltip offset="5"> </paper-tooltip>
</div>
</h3>
<div class="right">
<gr-button hidden="" link=""> Expand All </gr-button>
</div>
</div>
</div>
<div class="collapsed success">
<div class="categoryHeader empty success">
<h3 class="left heading-3">
<gr-icon icon="expand_more" class="expandIcon"></gr-icon>
<div class="statusIconWrapper">
<gr-icon icon="check_circle" class="statusIcon success">
</gr-icon>
<span class="title"> success </span>
<span class="count"> (0) </span>
<paper-tooltip offset="5"> </paper-tooltip>
</div>
</h3>
<div class="right">
<gr-button hidden="" link=""> Expand All </gr-button>
</div>
</div>
</div>
</div>
`,
{
ignoreChildren: ['paper-tooltip'],
ignoreAttributes: ['tabindex', 'aria-disabled', 'role'],
}
);
});
});