Files
grafana/public/app/features/plugins/pluginSettings.test.ts
Kristian Bremberg b30f501bff backendsrv: Implement optional URL path fetch sanitize (#106540)
* feat: Implement optional URL path sanitization in BackendSrv methods

* add comment

* revert

* remove namespace import from backendsrv

* change method to validatePath, remove query params and fragments

* Moved validatePath call into fetch and make it throw an error instead

* update pluginSettings tests

* prettier

* Update public/app/features/plugins/pluginSettings.ts

Co-authored-by: Hugo Häggmark <hugo.haggmark@gmail.com>

* change name to validatePath

* fix other tests

* rename property in backend_srv tests

* rename to validatePath in backend_srv, add extra tests

* Move path validation into parseUrlFromOptions

* fix

* Add additional check

* Add test

---------

Co-authored-by: joshhunt <josh.hunt@grafana.com>
Co-authored-by: Hugo Häggmark <hugo.haggmark@gmail.com>
2025-06-20 11:27:53 +01:00

120 lines
3.8 KiB
TypeScript

import { getBackendSrv } from '@grafana/runtime';
import { getPluginSettings, clearPluginSettingsCache } from './pluginSettings';
jest.mock('@grafana/runtime', () => ({
getBackendSrv: jest.fn().mockReturnValue({
get: jest.fn(),
}),
}));
describe('PluginSettings', () => {
beforeEach(() => {
jest.clearAllMocks();
clearPluginSettingsCache();
});
it('should fetch settings when cache is empty', async () => {
// arrange
const testPluginResponse = {
name: 'TestPlugin',
type: 'datasource',
id: 'test-plugin',
enabled: true,
};
getBackendSrv().get = jest.fn().mockResolvedValue(testPluginResponse);
const getRequestSpy = jest.spyOn(getBackendSrv(), 'get');
// act
const response = await getPluginSettings('test');
// assert
expect(response).toEqual(testPluginResponse);
expect(getRequestSpy).toHaveBeenCalledTimes(1);
expect(getRequestSpy).toHaveBeenCalledWith('/api/plugins/test/settings', undefined, undefined, {
validatePath: true,
});
});
it('should fetch settings from cache when it has a hit', async () => {
// arrange
const testPluginResponse = {
name: 'TestPlugin',
type: 'datasource',
id: 'test-plugin',
enabled: true,
};
getBackendSrv().get = jest.fn().mockResolvedValue(testPluginResponse);
const getRequestSpy = jest.spyOn(getBackendSrv(), 'get');
// act
const response1 = await getPluginSettings('test');
const response2 = await getPluginSettings('test');
// assert
expect(response1).toEqual(testPluginResponse);
expect(response2).toEqual(testPluginResponse);
expect(getRequestSpy).toHaveBeenCalledTimes(1);
});
it('should refetch from backend when cache is cleared', async () => {
// arrange
const testPluginResponse = {
name: 'TestPlugin',
type: 'datasource',
id: 'test-plugin',
enabled: true,
};
getBackendSrv().get = jest.fn().mockResolvedValue(testPluginResponse);
const getRequestSpy = jest.spyOn(getBackendSrv(), 'get');
// act
const response1 = await getPluginSettings('test');
await clearPluginSettingsCache('test');
const response2 = await getPluginSettings('test');
// assert
expect(response1).toEqual(testPluginResponse);
expect(response2).toEqual(testPluginResponse);
expect(getRequestSpy).toHaveBeenCalledTimes(2);
});
it('should fetch from cache when it is cleared for another plugin setting', async () => {
// arrange
const testPluginResponse = {
name: 'TestPlugin',
type: 'datasource',
id: 'test-plugin',
enabled: true,
};
getBackendSrv().get = jest.fn().mockResolvedValue(testPluginResponse);
const getRequestSpy = jest.spyOn(getBackendSrv(), 'get');
// act
const response1 = await getPluginSettings('test');
await clearPluginSettingsCache('another-test');
const response2 = await getPluginSettings('test');
// assert
expect(response1).toEqual(testPluginResponse);
expect(response2).toEqual(testPluginResponse);
expect(getRequestSpy).toHaveBeenCalledTimes(1);
});
it('should clear all cache when no plugin id is provided to the clear function', async () => {
// arrange
const testPluginResponse = {
name: 'TestPlugin',
type: 'datasource',
id: 'test-plugin',
enabled: true,
};
getBackendSrv().get = jest.fn().mockResolvedValue(testPluginResponse);
const getRequestSpy = jest.spyOn(getBackendSrv(), 'get');
// act
const response1 = await getPluginSettings('test');
await clearPluginSettingsCache();
const response2 = await getPluginSettings('test');
// assert
expect(response1).toEqual(testPluginResponse);
expect(response2).toEqual(testPluginResponse);
expect(getRequestSpy).toHaveBeenCalledTimes(2);
});
});