blob: f626e3db1b7028f53f7834c5203f06590aeadf73 [file]
// Copyright 2025 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 {it} from 'mocha';
import sinon from 'sinon';
import * as Host from '../../../core/host/host.js';
import * as Root from '../../../core/root/root.js';
import {renderElementIntoDOM} from '../../../testing/DOMHelpers.js';
import {describeWithEnvironment, updateHostConfig} from '../../../testing/EnvironmentHelpers.js';
import {createViewFunctionStub} from '../../../testing/ViewFunctionHelpers.js';
import * as UI from '../../legacy/legacy.js';
import * as TextEditor from './text_editor.js';
describeWithEnvironment('AiCodeCompletionDisclaimer', () => {
async function createDisclaimer() {
const view = createViewFunctionStub(TextEditor.AiCodeCompletionDisclaimer.AiCodeCompletionDisclaimer);
const widget = new TextEditor.AiCodeCompletionDisclaimer.AiCodeCompletionDisclaimer(undefined, view);
widget.disclaimerTooltipId = 'disclaimer-tooltip';
widget.spinnerTooltipId = 'spinner-tooltip';
widget.markAsRoot();
renderElementIntoDOM(widget);
await view.nextInput;
return {view, widget};
}
it('should show disclaimer with no logging text when enterprise policy value is ALLOW_WITHOUT_LOGGING', async () => {
updateHostConfig({
aidaAvailability: {enterprisePolicyValue: Root.Runtime.GenAiEnterprisePolicyValue.ALLOW_WITHOUT_LOGGING},
});
const {view, widget} = await createDisclaimer();
assert.isTrue(view.input.noLogging);
widget.detach();
});
it('should show disclaimer without no logging text when enterprise policy value is ALLOW', async () => {
updateHostConfig({aidaAvailability: {enterprisePolicyValue: Root.Runtime.GenAiEnterprisePolicyValue.ALLOW}});
const {view, widget} = await createDisclaimer();
assert.isFalse(view.input.noLogging);
widget.detach();
});
it('should open settings on manage in settings tooltip click', async () => {
const {view, widget} = await createDisclaimer();
const showViewStub = sinon.stub(UI.ViewManager.ViewManager.instance(), 'showView');
view.input.onManageInSettingsTooltipClick();
assert.isTrue(showViewStub.calledOnceWith('chrome-ai'));
widget.detach();
});
it('renders when AIDA becomes available', async () => {
const checkAccessPreconditionsStub = sinon.stub(Host.AidaClient.AidaClient, 'checkAccessPreconditions');
checkAccessPreconditionsStub.resolves(Host.AidaClient.AidaAccessPreconditions.NO_ACCOUNT_EMAIL);
const {view, widget} = await createDisclaimer();
assert.strictEqual(view.input.aidaAvailability, Host.AidaClient.AidaAccessPreconditions.NO_ACCOUNT_EMAIL);
Host.AidaClient.HostConfigTracker.instance().dispatchEventToListeners(
Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, Host.AidaClient.AidaAccessPreconditions.AVAILABLE);
await view.nextInput;
assert.strictEqual(view.input.aidaAvailability, Host.AidaClient.AidaAccessPreconditions.AVAILABLE);
widget.detach();
});
it('does not render when AIDA becomes unavailable', async () => {
const checkAccessPreconditionsStub = sinon.stub(Host.AidaClient.AidaClient, 'checkAccessPreconditions');
checkAccessPreconditionsStub.resolves(Host.AidaClient.AidaAccessPreconditions.AVAILABLE);
const {view, widget} = await createDisclaimer();
assert.strictEqual(view.input.aidaAvailability, Host.AidaClient.AidaAccessPreconditions.AVAILABLE);
Host.AidaClient.HostConfigTracker.instance().dispatchEventToListeners(
Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, Host.AidaClient.AidaAccessPreconditions.NO_ACCOUNT_EMAIL);
await view.nextInput;
assert.strictEqual(view.input.aidaAvailability, Host.AidaClient.AidaAccessPreconditions.NO_ACCOUNT_EMAIL);
widget.detach();
});
});