blob: 34dfdd352ba714b910f251d9bdec262317413be1 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import sinon from 'sinon';
import * as Host from '../../../core/host/host.js';
import {describeWithEnvironment} from '../../../testing/EnvironmentHelpers.js';
import {createViewFunctionStub, type ViewFunctionStub} from '../../../testing/ViewFunctionHelpers.js';
import * as UI from '../../../ui/legacy/legacy.js';
import * as ApplicationComponents from './components.js';
describeWithEnvironment('CrashReportContextGrid', () => {
let viewFunction: ViewFunctionStub<typeof ApplicationComponents.CrashReportContextGrid.CrashReportContextGrid>;
let component: ApplicationComponents.CrashReportContextGrid.CrashReportContextGrid;
beforeEach(() => {
viewFunction = createViewFunctionStub(ApplicationComponents.CrashReportContextGrid.CrashReportContextGrid);
component = new ApplicationComponents.CrashReportContextGrid.CrashReportContextGrid(undefined, viewFunction);
});
it('renders entries in the grid', async () => {
const inputPromise = viewFunction.nextInput;
component.data = {
entries: [
{key: 'key1', value: 'value1'},
{key: 'key2', value: 'value2'},
],
};
const input = await inputPromise;
assert.lengthOf(input.entries, 2);
assert.strictEqual(input.entries[0].key, 'key1');
assert.strictEqual(input.entries[0].value, 'value1');
assert.strictEqual(input.entries[1].key, 'key2');
assert.strictEqual(input.entries[1].value, 'value2');
});
it('filters entries when a filter is applied', async () => {
const inputPromise = viewFunction.nextInput;
component.data = {
entries: [
{key: 'apple', value: 'red'},
{key: 'banana', value: 'yellow'},
],
filters: [{key: 'key,value', regex: /apple/i, negative: false}],
};
const input = await inputPromise;
assert.lengthOf(input.entries, 1);
assert.strictEqual(input.entries[0].key, 'apple');
});
it('fires select event when a row is selected', async () => {
const inputPromise = viewFunction.nextInput;
component.data = {
entries: [
{key: 'apple', value: 'red'},
],
};
const input = await inputPromise;
let selectedKey = '';
component.element.addEventListener('select', (e: Event) => {
selectedKey = (e as CustomEvent<string>).detail;
});
// Simulate selecting
input.onSelect('apple');
assert.strictEqual(selectedKey, 'apple');
});
it('copies key and value correctly from context menu', async () => {
const inputPromise = viewFunction.nextInput;
component.data = {
entries: [
{key: 'apple', value: 'red'},
],
};
const input = await inputPromise;
const copyTextStub = sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'copyText');
const contextMenu = new UI.ContextMenu.ContextMenu(new MouseEvent('contextmenu'));
input.onContextMenu(new CustomEvent('contextmenu', {detail: contextMenu}), 'apple', 'red');
const copyKeyItem = contextMenu.defaultSection().items.find(item => item.buildDescriptor().label === 'Copy key');
assert.exists(copyKeyItem);
const copyValueItem =
contextMenu.defaultSection().items.find(item => item.buildDescriptor().label === 'Copy value');
assert.exists(copyValueItem);
// Trigger copy key
contextMenu.invokeHandler(copyKeyItem!.id());
sinon.assert.calledWith(copyTextStub, 'apple');
// Trigger copy value
contextMenu.invokeHandler(copyValueItem!.id());
sinon.assert.calledWith(copyTextStub, 'red');
});
});