Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test runs only with pattern: os != 'android'
- Manifest: browser/components/aiwindow/models/tests/xpcshell/xpcshell.toml
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
const { openAIEngine, resolveChatModelChoice } = ChromeUtils.importESModule(
"moz-src:///browser/components/aiwindow/models/Utils.sys.mjs"
);
const { sinon } = ChromeUtils.importESModule(
);
add_task(async function test_resolveChatModelChoice_found() {
const sb = sinon.createSandbox();
try {
// Mock Remote Settings data with model_choice_id
const fakeRecords = [
{
feature: "chat",
version: "4.1",
model: "qwen3-235b-a22b-instruct-2507-maas",
model_choice_id: "2",
owner_name: "Alibaba",
is_default: true,
},
{
feature: "chat",
version: "4.1",
model: "gemini-2.5-flash-lite",
model_choice_id: "1",
owner_name: "Google",
},
// Non-chat feature should be filtered out
{
feature: "title-generation",
version: "3.0",
model: "some-model",
model_choice_id: "1",
owner_name: "",
},
];
sb.stub(openAIEngine, "getRemoteClient").returns({
get: sb.stub().resolves(fakeRecords),
});
const result = await resolveChatModelChoice("1");
Assert.ok(result, "Should resolve choice 1");
Assert.equal(
result.model,
"gemini-2.5-flash-lite",
"Should return correct server model ID"
);
Assert.equal(result.ownerName, "Google", "Should return owner name");
} finally {
sb.restore();
}
});
add_task(async function test_resolveChatModelChoice_custom_model() {
// Custom model (choice "0") doesn't need RS lookup
const result = await resolveChatModelChoice("0");
Assert.ok(result, "Should resolve custom model");
Assert.equal(result.model, "custom-model", "Should return custom model ID");
Assert.equal(result.ownerName, "", "Should return empty owner");
});
add_task(async function test_resolveChatModelChoice_version_filtering() {
const sb = sinon.createSandbox();
try {
// Test that higher version records are filtered out
const fakeRecords = [
{
feature: "chat",
version: "3.0", // Should be filtered out with maxMajorVersion=2
model: "future-model",
model_choice_id: "1",
},
{
feature: "chat",
version: "2.5",
model: "current-model",
model_choice_id: "1",
},
];
sb.stub(openAIEngine, "getRemoteClient").returns({
get: sb.stub().resolves(fakeRecords),
});
const result = await resolveChatModelChoice("1", 2);
Assert.ok(result, "Should resolve choice 1");
Assert.equal(
result.model,
"current-model",
"Should use version 2.5 model, not 3.0"
);
} finally {
sb.restore();
}
});
add_task(async function test_resolveChatModelChoice_not_found() {
const sb = sinon.createSandbox();
try {
// No matching records
const fakeRecords = [
{
feature: "chat",
version: "4.0",
model: "some-model",
model_choice_id: "2", // Different choice ID
},
];
sb.stub(openAIEngine, "getRemoteClient").returns({
get: sb.stub().resolves(fakeRecords),
});
const result = await resolveChatModelChoice("1");
Assert.equal(result, null, "Should return null when choice ID not found");
} finally {
sb.restore();
}
});