2023-10-11 21:56:42 +08:00
|
|
|
import { createDashboardModelFixture, createPanelSaveModel } from '../../state/__fixtures__/dashboardFixtures';
|
2023-09-21 20:41:49 +08:00
|
|
|
|
2023-09-28 22:42:56 +08:00
|
|
|
import { openai } from './llms';
|
2023-10-06 20:11:15 +08:00
|
|
|
import { getDashboardChanges, isLLMPluginEnabled, sanitizeReply } from './utils';
|
2023-09-19 21:40:33 +08:00
|
|
|
|
|
|
|
|
// Mock the llms.openai module
|
2023-09-28 22:42:56 +08:00
|
|
|
jest.mock('./llms', () => ({
|
|
|
|
|
openai: {
|
|
|
|
|
streamChatCompletions: jest.fn(),
|
|
|
|
|
accumulateContent: jest.fn(),
|
|
|
|
|
enabled: jest.fn(),
|
2023-09-19 21:40:33 +08:00
|
|
|
},
|
|
|
|
|
}));
|
|
|
|
|
|
2023-09-21 20:41:49 +08:00
|
|
|
describe('getDashboardChanges', () => {
|
|
|
|
|
it('should correctly split user changes and migration changes', () => {
|
|
|
|
|
// Mock data for testing
|
|
|
|
|
const deprecatedOptions = {
|
|
|
|
|
legend: { displayMode: 'hidden', showLegend: false },
|
|
|
|
|
};
|
|
|
|
|
const deprecatedVersion = 37;
|
|
|
|
|
const dashboard = createDashboardModelFixture({
|
|
|
|
|
schemaVersion: deprecatedVersion,
|
2023-10-11 21:56:42 +08:00
|
|
|
panels: [createPanelSaveModel({ title: 'Panel 1', options: deprecatedOptions })],
|
2023-09-21 20:41:49 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Update title for the first panel
|
|
|
|
|
dashboard.updatePanels([
|
|
|
|
|
{
|
|
|
|
|
...dashboard.panels[0],
|
|
|
|
|
title: 'New title',
|
|
|
|
|
},
|
|
|
|
|
...dashboard.panels.slice(1),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// Call the function to test
|
|
|
|
|
const result = getDashboardChanges(dashboard);
|
|
|
|
|
|
|
|
|
|
// Assertions
|
|
|
|
|
expect(result.userChanges).toEqual({
|
|
|
|
|
panels: [
|
|
|
|
|
{
|
|
|
|
|
op: 'replace',
|
|
|
|
|
originalValue: 'Panel 1',
|
|
|
|
|
value: 'New title',
|
|
|
|
|
startLineNumber: expect.any(Number),
|
|
|
|
|
path: ['panels', '0', 'title'],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
expect(result.migrationChanges).toBeDefined();
|
|
|
|
|
expect(result.userChanges).not.toContain({
|
|
|
|
|
panels: [
|
|
|
|
|
{
|
|
|
|
|
op: 'replace',
|
|
|
|
|
originalValue: 'Panel 1',
|
|
|
|
|
value: 'New title',
|
|
|
|
|
startLineNumber: expect.any(Number),
|
|
|
|
|
path: ['panels', '0', 'title'],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
2023-09-27 22:47:06 +08:00
|
|
|
|
|
|
|
|
describe('isLLMPluginEnabled', () => {
|
|
|
|
|
it('should return true if LLM plugin is enabled', async () => {
|
|
|
|
|
// Mock llms.openai.enabled to return true
|
2023-09-28 22:42:56 +08:00
|
|
|
jest.mocked(openai.enabled).mockResolvedValue(true);
|
2023-09-27 22:47:06 +08:00
|
|
|
|
|
|
|
|
const enabled = await isLLMPluginEnabled();
|
|
|
|
|
|
|
|
|
|
expect(enabled).toBe(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should return false if LLM plugin is not enabled', async () => {
|
|
|
|
|
// Mock llms.openai.enabled to return false
|
2023-09-28 22:42:56 +08:00
|
|
|
jest.mocked(openai.enabled).mockResolvedValue(false);
|
2023-09-27 22:47:06 +08:00
|
|
|
|
|
|
|
|
const enabled = await isLLMPluginEnabled();
|
|
|
|
|
|
|
|
|
|
expect(enabled).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
});
|
2023-10-06 20:11:15 +08:00
|
|
|
|
|
|
|
|
describe('sanitizeReply', () => {
|
|
|
|
|
it('should remove quotes from the beginning and end of a string', () => {
|
|
|
|
|
expect(sanitizeReply('"Hello, world!"')).toBe('Hello, world!');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should not remove quotes from the middle of a string', () => {
|
|
|
|
|
expect(sanitizeReply('Hello, "world"!')).toBe('Hello, "world"!');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should only remove quotes if they are at the beginning or end of a string, and not in the middle', () => {
|
|
|
|
|
expect(sanitizeReply('"Hello", world!')).toBe('Hello", world!');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should return an empty string if given an empty string', () => {
|
|
|
|
|
expect(sanitizeReply('')).toBe('');
|
|
|
|
|
});
|
|
|
|
|
});
|