grafana/public/app/features/commandPalette/actions/dashboardActions.test.ts
Leon Sorokin b24ba7b7ae
FieldValues: Use plain arrays instead of Vector (part 3 of 2) (#66612)
Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
2023-04-20 17:59:18 +03:00

169 lines
5.7 KiB
TypeScript

import { DataFrame, DataFrameView, FieldType } from '@grafana/data';
import { config } from '@grafana/runtime';
import { ContextSrv, contextSrv } from 'app/core/services/context_srv';
import impressionSrv from 'app/core/services/impression_srv';
import { DashboardQueryResult, getGrafanaSearcher, QueryResponse } from 'app/features/search/service';
import { getRecentDashboardActions, getSearchResultActions } from './dashboardActions';
describe('dashboardActions', () => {
let grafanaSearcherSpy: jest.SpyInstance;
let mockContextSrv: jest.MockedObjectDeep<ContextSrv>;
const mockRecentDashboardUids = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];
const searchData: DataFrame = {
fields: [
{ name: 'kind', type: FieldType.string, config: {}, values: ['dashboard'] },
{ name: 'name', type: FieldType.string, config: {}, values: ['My dashboard 1'] },
{ name: 'uid', type: FieldType.string, config: {}, values: ['my-dashboard-1'] },
{ name: 'url', type: FieldType.string, config: {}, values: ['/my-dashboard-1'] },
{ name: 'tags', type: FieldType.other, config: {}, values: [['foo', 'bar']] },
{ name: 'location', type: FieldType.string, config: {}, values: ['my-folder-1'] },
],
meta: {
custom: {
locationInfo: {
'my-folder-1': {
name: 'My folder 1',
kind: 'folder',
url: '/my-folder-1',
},
},
},
},
length: 1,
};
const mockSearchResult: QueryResponse = {
isItemLoaded: jest.fn(),
loadMoreItems: jest.fn(),
totalRows: searchData.length,
view: new DataFrameView<DashboardQueryResult>(searchData),
};
beforeAll(() => {
mockContextSrv = jest.mocked(contextSrv);
grafanaSearcherSpy = jest.spyOn(getGrafanaSearcher(), 'search').mockResolvedValue(mockSearchResult);
});
afterEach(() => {
jest.clearAllMocks();
});
describe('getRecentDashboardActions', () => {
let impressionSrvSpy: jest.SpyInstance;
beforeAll(() => {
impressionSrvSpy = jest.spyOn(impressionSrv, 'getDashboardOpened').mockResolvedValue(mockRecentDashboardUids);
});
describe('when not signed in', () => {
beforeAll(() => {
mockContextSrv.user.isSignedIn = false;
});
it('returns an empty array, does not call the impressionSrv and does not call the search backend', async () => {
const results = await getRecentDashboardActions();
expect(impressionSrvSpy).not.toHaveBeenCalled();
expect(grafanaSearcherSpy).not.toHaveBeenCalled();
expect(results).toEqual([]);
});
});
describe('when signed in', () => {
beforeAll(() => {
mockContextSrv.user.isSignedIn = true;
});
it('calls the search backend with recent dashboards and returns an array of CommandPaletteActions', async () => {
const results = await getRecentDashboardActions();
expect(impressionSrvSpy).toHaveBeenCalled();
expect(grafanaSearcherSpy).toHaveBeenCalledWith({
kind: ['dashboard'],
limit: 5,
uid: ['1', '2', '3', '4', '5'],
});
expect(results).toEqual([
{
id: 'recent-dashboards/my-dashboard-1',
name: 'My dashboard 1',
priority: 5,
section: 'Recent dashboards',
url: '/my-dashboard-1',
},
]);
});
});
});
describe('getSearchResultActions', () => {
it('returns an empty array if the search query is empty', async () => {
const searchQuery = '';
const results = await getSearchResultActions(searchQuery);
expect(grafanaSearcherSpy).not.toHaveBeenCalled();
expect(results).toEqual([]);
});
describe('when not signed in', () => {
beforeAll(() => {
mockContextSrv.user.isSignedIn = false;
});
it('returns an empty array if anonymous access is not enabled', async () => {
config.bootData.settings.anonymousEnabled = false;
const searchQuery = 'mySearchQuery';
const results = await getSearchResultActions(searchQuery);
expect(grafanaSearcherSpy).not.toHaveBeenCalled();
expect(results).toEqual([]);
});
it('calls the search backend and returns an array of CommandPaletteActions if anonymous access is enabled', async () => {
config.bootData.settings.anonymousEnabled = true;
const searchQuery = 'mySearchQuery';
const results = await getSearchResultActions(searchQuery);
expect(grafanaSearcherSpy).toHaveBeenCalledWith({
kind: ['dashboard', 'folder'],
query: searchQuery,
limit: 100,
});
expect(results).toEqual([
{
id: 'go/dashboard/my-dashboard-1',
name: 'My dashboard 1',
priority: 1,
section: 'Dashboards',
subtitle: 'My folder 1',
url: '/my-dashboard-1',
},
]);
});
});
describe('when signed in', () => {
beforeAll(() => {
mockContextSrv.user.isSignedIn = true;
});
it('calls the search backend with recent dashboards and returns an array of CommandPaletteActions', async () => {
const searchQuery = 'mySearchQuery';
const results = await getSearchResultActions(searchQuery);
expect(grafanaSearcherSpy).toHaveBeenCalledWith({
kind: ['dashboard', 'folder'],
query: searchQuery,
limit: 100,
});
expect(results).toEqual([
{
id: 'go/dashboard/my-dashboard-1',
name: 'My dashboard 1',
priority: 1,
section: 'Dashboards',
subtitle: 'My folder 1',
url: '/my-dashboard-1',
},
]);
});
});
});
});