blob: 21fa5d6a28f3f7fce4487b5e6feef0a33187fe70 [file] [log] [blame]
/**
* @license
* Copyright 2024 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../test/common-test-setup';
import './gr-checks-results';
import {html} from 'lit';
import {fixture, assert} from '@open-wc/testing';
import {createCheckFix, createDiff} from '../../test/test-data-generators';
import {GrChecksFixPreview} from './gr-checks-fix-preview';
import {rectifyFix} from '../../models/checks/checks-util';
import {
MockPromise,
mockPromise,
queryAndAssert,
stubRestApi,
waitUntil,
} from '../../test/test-utils';
import {NumericChangeId, PatchSetNumber, RepoName} from '../../api/rest-api';
import {FilePathToDiffInfoMap} from '../../types/common';
import {testResolver} from '../../test/common-test-setup';
import {navigationToken} from '../core/gr-navigation/gr-navigation';
suite('gr-checks-fix-preview test', () => {
let element: GrChecksFixPreview;
let promise: MockPromise<FilePathToDiffInfoMap | undefined>;
setup(async () => {
promise = mockPromise<FilePathToDiffInfoMap | undefined>();
stubRestApi('getFixPreview').returns(promise);
const fix = rectifyFix(createCheckFix(), 'test-checker');
element = await fixture<GrChecksFixPreview>(
html`<gr-checks-fix-preview></gr-checks-fix-preview>`
);
await element.updateComplete;
element.changeNum = 123 as NumericChangeId;
element.patchSet = 5 as PatchSetNumber;
element.latestPatchNum = 5 as PatchSetNumber;
element.repo = 'test-repo' as RepoName;
element.fixSuggestionInfo = fix;
await element.updateComplete;
});
const loadDiff = async () => {
promise.resolve({'foo.c': createDiff()});
await waitUntil(() => !!element.diff);
};
test('renders loading', async () => {
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="header">
<div class="title">
<span> Attached Fix </span>
</div>
<div>
<gr-button
class="showFix"
aria-disabled="true"
disabled=""
flatten=""
role="button"
secondary=""
tabindex="-1"
>
Show fix side-by-side
</gr-button>
<gr-button
class="applyFix"
aria-disabled="true"
disabled=""
flatten=""
primary=""
role="button"
tabindex="-1"
title="Fix is still loading ..."
>
Apply fix
</gr-button>
</div>
</div>
<div class="loading">Loading fix preview ...</div>
`
);
});
test('renders diff', async () => {
await loadDiff();
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="header">
<div class="title">
<span> Attached Fix </span>
</div>
<div>
<gr-button
class="showFix"
aria-disabled="false"
flatten=""
role="button"
secondary=""
tabindex="0"
>
Show fix side-by-side
</gr-button>
<gr-button
class="applyFix"
aria-disabled="false"
flatten=""
primary=""
role="button"
tabindex="0"
title=""
>
Apply fix
</gr-button>
</div>
</div>
<div class="diff-container">
<gr-diff
class="disable-context-control-buttons hide-line-length-indicator"
style="--line-limit-marker: 100ch; --content-width: none; --diff-max-width: none; --font-size: 12px;"
>
</gr-diff>
</div>
`
);
});
test('show-fix', async () => {
await loadDiff();
const stub = sinon.stub();
element.addEventListener('open-fix-preview', stub);
const button = queryAndAssert<HTMLElement>(element, 'gr-button.showFix');
assert.isFalse(button.hasAttribute('disabled'));
button.click();
assert.isTrue(stub.called);
assert.deepEqual(stub.lastCall.args[0].detail, {
patchNum: element.patchSet,
fixSuggestions: [element.fixSuggestionInfo],
onCloseFixPreviewCallbacks: [],
});
});
test('apply-fix', async () => {
await loadDiff();
const setUrlSpy = sinon.stub(testResolver(navigationToken), 'setUrl');
stubRestApi('applyFixSuggestion').returns(
Promise.resolve({ok: true} as Response)
);
const button = queryAndAssert<HTMLElement>(element, 'gr-button.applyFix');
assert.isFalse(button.hasAttribute('disabled'));
button.click();
await waitUntil(() => setUrlSpy.called);
assert.equal(
setUrlSpy.lastCall.args[0],
'/c/test-repo/+/123/5..edit?forceReload=true'
);
});
});