blob: 5319a23941b67f81e50d6adc216465a7b2901fe9 [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 {setupLocaleHooks} from '../../testing/LocaleHelpers.js';
import {setupRuntimeHooks} from '../../testing/RuntimeHelpers.js';
import * as Host from './host.js';
import type {DispatchHttpRequestRequest, DispatchHttpRequestResult} from './InspectorFrontendHostAPI.js';
describe('GcaClient', () => {
setupLocaleHooks();
setupRuntimeHooks();
let gcaClient: Host.GcaClient.GcaClient;
beforeEach(() => {
gcaClient = new Host.GcaClient.GcaClient();
});
it('throws for completeCode when request fails', async () => {
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 500, error: 'Internal Server Error'});
});
let threw = false;
try {
await gcaClient.completeCode(
{client: 'test', prefix: 'test', metadata: {disable_user_content_logging: true, client_version: '1.2.3'}});
} catch (err) {
threw = true;
assert.instanceOf(err, Error);
}
assert.isTrue(threw, 'completeCode did not throw');
});
it('throws for generateCode when request fails', async () => {
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 500, error: 'Internal Server Error'});
});
let threw = false;
try {
await gcaClient.generateCode({
client: 'test',
preamble: 'test',
current_message: {parts: [{text: 'test'}], role: Host.AidaClient.Role.USER},
use_case: Host.AidaClient.UseCase.CODE_GENERATION,
metadata: {disable_user_content_logging: true, client_version: '1.2.3'},
});
} catch (err) {
threw = true;
assert.instanceOf(err, Error);
}
assert.isTrue(threw, 'generateCode did not throw');
});
it('handles successful completeCode', async () => {
const mockResponse = {
candidates: [{
index: 0,
content: {role: 'model', parts: [{text: 'result'}]},
}],
responseId: '123',
};
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 200, response: JSON.stringify(mockResponse)});
});
const result = await gcaClient.completeCode(
{client: 'test', prefix: 'test', metadata: {disable_user_content_logging: true, client_version: '1.2.3'}});
assert.isNotNull(result);
assert.strictEqual(result.generatedSamples[0].generationString, 'result');
assert.strictEqual(result.metadata.rpcGlobalId, '123');
});
it('handles successful generateCode', async () => {
const mockResponse = {
candidates: [{
index: 0,
content: {role: 'model', parts: [{text: 'generated code'}]},
}],
responseId: '456',
};
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 200, response: JSON.stringify(mockResponse)});
});
const result = await gcaClient.generateCode({
client: 'test',
preamble: 'test',
current_message: {parts: [{text: 'test'}], role: Host.AidaClient.Role.USER},
use_case: Host.AidaClient.UseCase.CODE_GENERATION,
metadata: {disable_user_content_logging: true, client_version: '1.2.3'},
});
assert.isNotNull(result);
assert.strictEqual(result.samples[0].generationString, 'generated code');
assert.strictEqual(result.metadata.rpcGlobalId, '456');
});
it('handles successful conversationRequest', async () => {
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 200, response: '{}'});
});
await gcaClient.conversationRequest({
client: 'test',
current_message: {parts: [{text: 'test'}], role: Host.AidaClient.Role.USER},
metadata: {disable_user_content_logging: true, client_version: '1.2.3'},
},
1);
});
it('throws for conversationRequest when request fails', async () => {
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 500, error: 'Internal Server Error'});
});
try {
await gcaClient.conversationRequest({
client: 'test',
current_message: {parts: [{text: 'test'}], role: Host.AidaClient.Role.USER},
metadata: {disable_user_content_logging: true, client_version: '1.2.3'},
},
1);
assert.fail('Should have thrown');
} catch (err) {
assert.instanceOf(err, Error);
}
});
it('handles successful registerClientEvent', async () => {
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 200, response: '{}'});
});
const result = await gcaClient.registerClientEvent({
corresponding_aida_rpc_global_id: '123',
disable_user_content_logging: true,
});
assert.deepEqual(result, {});
});
it('returns error for registerClientEvent when request fails', async () => {
sinon.stub(Host.InspectorFrontendHost.InspectorFrontendHostInstance, 'dispatchHttpRequest')
.callsFake((_request: DispatchHttpRequestRequest, callback: (result: DispatchHttpRequestResult) => void) => {
callback({statusCode: 500, error: 'Internal Server Error'});
});
const result = await gcaClient.registerClientEvent({
corresponding_aida_rpc_global_id: '123',
disable_user_content_logging: true,
});
assert.property(result, 'error');
});
});