|
|
@@ -0,0 +1,96 @@
|
|
|
+import { serializeStateToUrlParam, parseUrlState } from './Wrapper';
|
|
|
+import { DEFAULT_RANGE } from './TimePicker';
|
|
|
+import { ExploreState } from './Explore';
|
|
|
+
|
|
|
+const DEFAULT_EXPLORE_STATE: ExploreState = {
|
|
|
+ datasource: null,
|
|
|
+ datasourceError: null,
|
|
|
+ datasourceLoading: null,
|
|
|
+ datasourceMissing: false,
|
|
|
+ datasourceName: '',
|
|
|
+ graphResult: null,
|
|
|
+ history: [],
|
|
|
+ latency: 0,
|
|
|
+ loading: false,
|
|
|
+ logsResult: null,
|
|
|
+ queries: [],
|
|
|
+ queryErrors: [],
|
|
|
+ queryHints: [],
|
|
|
+ range: DEFAULT_RANGE,
|
|
|
+ requestOptions: null,
|
|
|
+ showingGraph: true,
|
|
|
+ showingLogs: true,
|
|
|
+ showingTable: true,
|
|
|
+ supportsGraph: null,
|
|
|
+ supportsLogs: null,
|
|
|
+ supportsTable: null,
|
|
|
+ tableResult: null,
|
|
|
+};
|
|
|
+
|
|
|
+describe('Wrapper state functions', () => {
|
|
|
+ describe('parseUrlState', () => {
|
|
|
+ it('returns default state on empty string', () => {
|
|
|
+ expect(parseUrlState('')).toMatchObject({
|
|
|
+ datasource: null,
|
|
|
+ queries: [],
|
|
|
+ range: DEFAULT_RANGE,
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe('serializeStateToUrlParam', () => {
|
|
|
+ it('returns url parameter value for a state object', () => {
|
|
|
+ const state = {
|
|
|
+ ...DEFAULT_EXPLORE_STATE,
|
|
|
+ datasourceName: 'foo',
|
|
|
+ range: {
|
|
|
+ from: 'now - 5h',
|
|
|
+ to: 'now',
|
|
|
+ },
|
|
|
+ queries: [
|
|
|
+ {
|
|
|
+ query: 'metric{test="a/b"}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ query: 'super{foo="x/z"}',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ expect(serializeStateToUrlParam(state)).toBe(
|
|
|
+ '{"datasource":"foo","queries":[{"query":"metric{test=\\"a/b\\"}"},' +
|
|
|
+ '{"query":"super{foo=\\"x/z\\"}"}],"range":{"from":"now - 5h","to":"now"}}'
|
|
|
+ );
|
|
|
+ });
|
|
|
+ });
|
|
|
+ describe('interplay', () => {
|
|
|
+ it('can parse the serialized state into the original state', () => {
|
|
|
+ const state = {
|
|
|
+ ...DEFAULT_EXPLORE_STATE,
|
|
|
+ datasourceName: 'foo',
|
|
|
+ range: {
|
|
|
+ from: 'now - 5h',
|
|
|
+ to: 'now',
|
|
|
+ },
|
|
|
+ queries: [
|
|
|
+ {
|
|
|
+ query: 'metric{test="a/b"}',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ query: 'super{foo="x/z"}',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ };
|
|
|
+ const serialized = serializeStateToUrlParam(state);
|
|
|
+ const parsed = parseUrlState(serialized);
|
|
|
+
|
|
|
+ // Account for datasource vs datasourceName
|
|
|
+ const { datasource, ...rest } = parsed;
|
|
|
+ const sameState = {
|
|
|
+ ...rest,
|
|
|
+ datasource: DEFAULT_EXPLORE_STATE.datasource,
|
|
|
+ datasourceName: datasource,
|
|
|
+ };
|
|
|
+
|
|
|
+ expect(state).toMatchObject(sameState);
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|