blob: 9a14afa509e450ff2145d3741cbe5011332a3399 [file] [log] [blame]
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {assert, fixture, html, waitUntil} from '@open-wc/testing';
import {
BulkActionsModel,
bulkActionsModelToken,
} from '../../../models/bulk-actions/bulk-actions-model';
import {wrapInProvider} from '../../../models/di-provider-element';
import {getAppContext} from '../../../services/app-context';
import '../../../test/common-test-setup';
import {createChange} from '../../../test/test-data-generators';
import {waitUntilObserved} from '../../../test/test-utils';
import './gr-change-list-copy-link-flow';
import {GrChangeListCopyLinkFlow} from './gr-change-list-copy-link-flow';
import {ChangeInfo, NumericChangeId} from '../../../api/rest-api';
import {prependOrigin} from '../../../utils/url-util';
const change1: ChangeInfo = {...createChange(), _number: 1 as NumericChangeId};
const change2: ChangeInfo = {...createChange(), _number: 2 as NumericChangeId};
suite('gr-change-list-copy-link-flow tests', () => {
let element: GrChangeListCopyLinkFlow;
let model: BulkActionsModel;
async function selectChange(change: ChangeInfo) {
model.addSelectedChangeNum(change._number);
await waitUntilObserved(model.selectedChangeNums$, selectedChangeNums =>
selectedChangeNums.includes(change._number)
);
await element.updateComplete;
}
setup(async () => {
model = new BulkActionsModel(getAppContext().restApiService);
model.sync([change1, change2]);
element = (
await fixture(
wrapInProvider(
html`<gr-change-list-copy-link-flow></gr-change-list-copy-link-flow>`,
bulkActionsModelToken,
model
)
)
).querySelector('gr-change-list-copy-link-flow')!;
await element.updateComplete;
});
test('renders nothing when no changes selected', async () => {
assert.shadowDom.equal(element, '');
});
test('renders copy link button when changes are selected', async () => {
await selectChange(change1);
assert.shadowDom.equal(
element,
/* HTML */ `
<div class="copyLinkWrapper">
<gr-button
id="copyLinkButton"
link=""
role="button"
tabindex="0"
aria-disabled="false"
>
Copy Link
</gr-button>
<gr-copy-links></gr-copy-links>
</div>
`
);
});
test('copy links are generated correctly', async () => {
await selectChange(change1);
await selectChange(change2);
assert.deepEqual(element.getCopyLinks(), [
{
label: 'Change Query URL',
shortcut: 'u',
value: prependOrigin('/q/change:1+OR+change:2'),
},
{
label: 'Markdown',
shortcut: 'm',
value: `[Subject 1](${prependOrigin(
'/c/1'
)})\n[Subject 2](${prependOrigin('/c/2')})`,
multiline: true,
},
]);
});
test('clicking copy link button opens dropdown', async () => {
await selectChange(change1);
const copyLinks = element.shadowRoot?.querySelector('gr-copy-links');
assert.exists(copyLinks);
const button = element.shadowRoot?.querySelector('gr-button');
assert.exists(button);
button?.click();
await element.updateComplete;
await waitUntil(() => element.shadowRoot?.querySelector('gr-copy-links'));
assert.isTrue((copyLinks as any).isDropdownOpen);
});
});