blob: 092c63f0e339662e0c30f0406f95cfc8a6d49de9 [file] [log] [blame]
/**
* @license
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../../test/common-test-setup';
import './gr-diff-preferences';
import {GrDiffPreferences} from './gr-diff-preferences';
import {
makePrefixedJSON,
queryAll,
stubRestApi,
waitUntil,
} from '../../../test/test-utils';
import {DiffPreferencesInfo} from '../../../types/diff';
import {createDefaultDiffPrefs} from '../../../constants/constants';
import {assert, fixture, html} from '@open-wc/testing';
import {MdOutlinedTextField} from '@material/web/textfield/outlined-text-field';
import {MdOutlinedSelect} from '@material/web/select/outlined-select';
suite('gr-diff-preferences tests', () => {
let element: GrDiffPreferences;
let diffPreferences: DiffPreferencesInfo;
function valueOf(title: string, id: string) {
const sections = queryAll(element, `#${id} section`) ?? [];
let titleEl;
for (let i = 0; i < sections.length; i++) {
titleEl = sections[i].querySelector('.title');
if (titleEl?.textContent?.trim() === title) {
const el = sections[i].querySelector('.value');
if (el) return el;
}
}
assert.fail(`element with title ${title} not found`);
}
setup(async () => {
diffPreferences = createDefaultDiffPrefs();
stubRestApi('getDiffPreferences').returns(Promise.resolve(diffPreferences));
element = await fixture(html`<gr-diff-preferences></gr-diff-preferences>`);
await element.updateComplete;
});
test('renders', () => {
assert.shadowDom.equal(
element,
/* HTML */ `<div class="gr-form-styles" id="diffPreferences">
<section>
<label class="title" for="contextLineSelect"> Context </label>
<span class="value">
<md-outlined-select id="contextSelect" value="10">
<md-select-option md-menu-item="" tabindex="0" value="3">
<div slot="headline">3 lines</div>
</md-select-option>
<md-select-option
data-aria-selected="true"
md-menu-item=""
tabindex="-1"
value="10"
>
<div slot="headline">10 lines</div>
</md-select-option>
<md-select-option md-menu-item="" tabindex="-1" value="25">
<div slot="headline">25 lines</div>
</md-select-option>
<md-select-option md-menu-item="" tabindex="-1" value="50">
<div slot="headline">50 lines</div>
</md-select-option>
<md-select-option md-menu-item="" tabindex="-1" value="75">
<div slot="headline">75 lines</div>
</md-select-option>
<md-select-option md-menu-item="" tabindex="-1" value="100">
<div slot="headline">100 lines</div>
</md-select-option>
<md-select-option md-menu-item="" tabindex="-1" value="-1">
<div slot="headline">Whole file</div>
</md-select-option>
</md-outlined-select>
</span>
</section>
<section>
<label class="title" for="lineWrappingInput"> Fit to screen </label>
<span class="value">
<md-checkbox id="lineWrappingInput"> </md-checkbox>
</span>
</section>
<section>
<label class="title" for="columnsInput"> Diff width </label>
<span class="value">
<md-outlined-text-field
autocomplete=""
class="showBlueFocusBorder"
id="columnsInput"
inputmode=""
step="1"
type="number"
>
</md-outlined-text-field>
</span>
</section>
<section>
<label class="title" for="tabSizeInput"> Tab width </label>
<span class="value">
<md-outlined-text-field
autocomplete=""
class="showBlueFocusBorder"
id="tabSizeInput"
inputmode=""
step="1"
type="number"
>
</md-outlined-text-field>
</span>
</section>
<section>
<label class="title" for="fontSizeInput"> Font size </label>
<span class="value">
<md-outlined-text-field
autocomplete=""
class="showBlueFocusBorder"
id="fontSizeInput"
inputmode=""
step="1"
type="number"
>
</md-outlined-text-field>
</span>
</section>
<section>
<label class="title" for="showTabsInput"> Show tabs </label>
<span class="value">
<md-checkbox checked="" id="showTabsInput"> </md-checkbox>
</span>
</section>
<section>
<label class="title" for="showTrailingWhitespaceInput">
Show trailing whitespace
</label>
<span class="value">
<md-checkbox checked="" id="showTrailingWhitespaceInput">
</md-checkbox>
</span>
</section>
<section>
<label class="title" for="syntaxHighlightInput">
Syntax highlighting
</label>
<span class="value">
<md-checkbox checked="" id="syntaxHighlightInput"> </md-checkbox>
</span>
</section>
<section>
<label class="title" for="automaticReviewInput">
Automatically mark viewed files reviewed
</label>
<span class="value">
<md-checkbox checked="" id="automaticReviewInput"> </md-checkbox>
</span>
</section>
<section>
<div class="pref">
<label class="title" for="ignoreWhiteSpace">
Ignore Whitespace
</label>
<span class="value">
<md-outlined-select id="contextSelect" value="IGNORE_NONE">
<md-select-option
data-aria-selected="true"
md-menu-item=""
tabindex="0"
value="IGNORE_NONE"
>
<div slot="headline">None</div>
</md-select-option>
<md-select-option
md-menu-item=""
tabindex="-1"
value="IGNORE_TRAILING"
>
<div slot="headline">Trailing</div>
</md-select-option>
<md-select-option
md-menu-item=""
tabindex="-1"
value="IGNORE_LEADING_AND_TRAILING"
>
<div slot="headline">Leading & trailing</div>
</md-select-option>
<md-select-option
md-menu-item=""
tabindex="-1"
value="IGNORE_ALL"
>
<div slot="headline">All</div>
</md-select-option>
</md-outlined-select>
</span>
</div>
</section>
</div>`
);
});
test('renders preferences', () => {
// Rendered with the expected preferences selected.
const contextInput = valueOf('Context', 'diffPreferences')
.firstElementChild as MdOutlinedSelect;
assert.equal(contextInput.value, `${diffPreferences.context}`);
const lineWrappingInput = valueOf('Fit to screen', 'diffPreferences')
.firstElementChild as HTMLInputElement;
assert.equal(lineWrappingInput.checked, diffPreferences.line_wrapping);
const lineLengthInput = valueOf('Diff width', 'diffPreferences')
.firstElementChild as MdOutlinedTextField;
assert.equal(lineLengthInput.value, `${diffPreferences.line_length}`);
const tabSizeInput = valueOf('Tab width', 'diffPreferences')
.firstElementChild as MdOutlinedTextField;
assert.equal(tabSizeInput.value, `${diffPreferences.tab_size}`);
const fontSizeInput = valueOf('Font size', 'diffPreferences')
.firstElementChild as MdOutlinedTextField;
assert.equal(fontSizeInput.value, `${diffPreferences.font_size}`);
const showTabsInput = valueOf('Show tabs', 'diffPreferences')
.firstElementChild as HTMLInputElement;
assert.equal(showTabsInput.checked, diffPreferences.show_tabs);
const showWhitespaceErrorsInput = valueOf(
'Show trailing whitespace',
'diffPreferences'
).firstElementChild as HTMLInputElement;
assert.equal(
showWhitespaceErrorsInput.checked,
diffPreferences.show_whitespace_errors
);
const syntaxHighlightingInput = valueOf(
'Syntax highlighting',
'diffPreferences'
).firstElementChild as HTMLInputElement;
assert.equal(
syntaxHighlightingInput.checked,
diffPreferences.syntax_highlighting
);
const manualReviewInput = valueOf(
'Automatically mark viewed files reviewed',
'diffPreferences'
).firstElementChild as HTMLInputElement;
assert.equal(manualReviewInput.checked, !diffPreferences.manual_review);
const ignoreWhitespaceInput = valueOf(
'Ignore Whitespace',
'diffPreferences'
).firstElementChild as MdOutlinedSelect;
assert.equal(
ignoreWhitespaceInput.value,
diffPreferences.ignore_whitespace
);
assert.isFalse(element.hasUnsavedChanges());
});
test('save changes', async () => {
assert.isTrue(element.diffPrefs!.show_whitespace_errors);
const showTrailingWhitespaceCheckbox = valueOf(
'Show trailing whitespace',
'diffPreferences'
).firstElementChild as HTMLInputElement;
showTrailingWhitespaceCheckbox.checked = false;
element.handleShowTrailingWhitespaceTap();
assert.isTrue(element.hasUnsavedChanges());
const savePrefStub = stubRestApi('saveDiffPreferences').resolves(
new Response(makePrefixedJSON(element.diffPrefs))
);
await element.save();
// Wait for model state update, since this is not awaited by element.save()
await waitUntil(
() =>
!element.getUserModel().getState().diffPreferences
?.show_whitespace_errors
);
assert.isTrue(savePrefStub.called);
assert.isFalse(element.diffPrefs!.show_whitespace_errors);
assert.isFalse(element.hasUnsavedChanges());
});
});