@oriolrius/grafana-business-text
Version:
Data-driven text with Markdown and Handlebars support for Grafana
142 lines (115 loc) • 4.25 kB
text/typescript
import { Field, FieldType, PanelPlugin } from '@grafana/data';
import { DEFAULT_OPTIONS } from './constants';
import { plugin } from './module';
import { EditorType, PanelOptions } from './types';
/**
* Test Field
*/
type TestField = Pick<Field, 'name' | 'type'>;
/*
Plugin
*/
describe('plugin', () => {
/**
* Builder
*/
const builder: any = {
addCustomEditor: jest.fn().mockImplementation(() => builder),
addFieldNamePicker: jest.fn().mockImplementation(() => builder),
addRadio: jest.fn().mockImplementation(() => builder),
addSliderInput: jest.fn().mockImplementation(() => builder),
addMultiSelect: jest.fn().mockImplementation(() => builder),
addSelect: jest.fn().mockImplementation(() => builder),
addTextInput: jest.fn().mockImplementation(() => builder),
};
it('Should be instance of PanelPlugin', () => {
expect(plugin).toBeInstanceOf(PanelPlugin);
});
it('Should add inputs', () => {
/**
* Supplier
*/
plugin['optionsSupplier'](builder);
/**
* Inputs
*/
expect(builder.addCustomEditor).toHaveBeenCalled();
expect(builder.addRadio).toHaveBeenCalled();
expect(builder.addMultiSelect).toHaveBeenCalled();
});
describe('Input Visibility', () => {
beforeEach(() => {
builder.addCustomEditor.mockClear();
});
/**
* Add Input Implementation
* @param config
* @param result
*/
const addInputImplementation = (config: Partial<PanelOptions>, result: string[]) => (input: any) => {
if (input.showIf) {
if (input.showIf(config)) {
result.push(input.path);
}
} else {
result.push(input.path);
}
return builder;
};
it('Should show default content if editor includes default type', () => {
const shownOptionsPaths: string[] = [];
builder.addCustomEditor.mockImplementation(
addInputImplementation({ editors: [EditorType.DEFAULT] }, shownOptionsPaths)
);
plugin['optionsSupplier'](builder);
expect(shownOptionsPaths).toEqual(expect.arrayContaining(['defaultContent']));
});
it('Should show default content if value is not default', () => {
const shownOptionsPaths: string[] = [];
builder.addCustomEditor.mockImplementation(
addInputImplementation(
{ defaultContent: DEFAULT_OPTIONS.defaultContent + '123', editors: [] },
shownOptionsPaths
)
);
plugin['optionsSupplier'](builder);
expect(shownOptionsPaths).toEqual(expect.arrayContaining(['defaultContent']));
});
it('Should show javascript helpers if helpers enabled', () => {
const shownOptionsPaths: string[] = [];
builder.addCustomEditor.mockImplementation(
addInputImplementation({ editors: [EditorType.HELPERS] }, shownOptionsPaths)
);
plugin['optionsSupplier'](builder);
expect(shownOptionsPaths).toEqual(expect.arrayContaining(['helpers']));
});
it('Should show styles helpers if helpers enabled', () => {
const shownOptionsPaths: string[] = [];
builder.addCustomEditor.mockImplementation(
addInputImplementation({ editors: [EditorType.STYLES] }, shownOptionsPaths)
);
plugin['optionsSupplier'](builder);
expect(shownOptionsPaths).toEqual(expect.arrayContaining(['styles']));
});
});
describe('Settings', () => {
const addFieldNameImplementation =
(optionPath: string, allFields: TestField[], shownFields: TestField[]) => (input: any) => {
if (optionPath === input.path) {
const fields = allFields.filter(input.settings.filter);
shownFields.push(...fields);
}
return builder;
};
it('Should return only number fields for status', () => {
const fields: TestField[] = [
{ name: 'string', type: FieldType.string },
{ name: 'number', type: FieldType.number },
];
const shownFields: TestField[] = [];
builder.addFieldNamePicker.mockImplementation(addFieldNameImplementation('status', fields, shownFields));
plugin['optionsSupplier'](builder);
expect(shownFields).toEqual([{ name: 'number', type: FieldType.number }]);
});
});
});