blob: ccdbad4638bdce9da0cf0292f60f3b0ef487ef4b [file] [log] [blame] [edit]
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import '../../test/common-test-setup';
import './context-input-chip';
import {assert, fixture, html} from '@open-wc/testing';
import {ContextInputChip} from './context-input-chip';
import sinon from 'sinon';
import {ContextItem} from '../../api/ai-code-review';
import {testResolver} from '../../test/common-test-setup';
import {pluginLoaderToken} from '../shared/gr-js-api-interface/gr-plugin-loader';
import {chatProvider, createChange} from '../../test/test-data-generators';
import {changeModelToken} from '../../models/change/change-model';
import {ParsedChangeInfo} from '../../types/types';
suite('context-input-chip tests', () => {
let element: ContextInputChip;
setup(async () => {
const pluginLoader = testResolver(pluginLoaderToken);
pluginLoader.pluginsModel.aiCodeReviewRegister({
pluginName: 'test-plugin',
provider: chatProvider,
});
const changeModel = testResolver(changeModelToken);
changeModel.updateState({
change: createChange() as ParsedChangeInfo,
});
element = await fixture(html`<context-input-chip></context-input-chip>`);
await element.updateComplete;
});
test('renders the add context chip', () => {
const chip = element.shadowRoot?.querySelector('md-assist-chip');
assert.isOk(chip);
assert.equal(chip?.label, 'Add Context');
});
test('opens the menu when the chip is clicked', async () => {
const chip = element.shadowRoot?.querySelector('md-assist-chip');
const menu = element.shadowRoot?.querySelector('md-menu');
assert.isFalse(menu?.open);
chip?.click();
await element.updateComplete;
assert.isTrue(menu?.open);
});
test('shows link dialog when menu item is clicked', async () => {
const menuItem = element.shadowRoot?.querySelector('md-menu-item');
menuItem?.click();
await element.updateComplete;
assert.isTrue(element.addLinkDialogOpened);
const input = element.shadowRoot?.querySelector('.add-link-input');
assert.isOk(input);
});
test('fires context-item-added event on enter', async () => {
const spy = sinon.spy();
element.addEventListener('context-item-added', spy);
const menuItem = element.shadowRoot?.querySelector('md-menu-item');
menuItem?.click();
await element.updateComplete;
const link = 'http://www.google.com';
const input = element.shadowRoot?.querySelector(
'.add-link-input'
) as HTMLInputElement;
input.value = link;
input.dispatchEvent(new Event('input'));
await element.updateComplete;
input.dispatchEvent(new KeyboardEvent('keydown', {key: 'Enter'}));
await element.updateComplete;
assert.isTrue(spy.called);
const event = spy.args[0][0] as CustomEvent<ContextItem>;
assert.deepEqual(event.detail, {
type_id: 'google',
identifier: 'google-id',
link,
title: 'google-title',
});
});
});