virool-pivot
Version:
A web-based exploratory visualization UI for Druid.io
193 lines (179 loc) • 4.54 kB
text/typescript
import { expect } from 'chai';
import { testImmutableClass } from 'immutable-class/build/tester';
import { List } from 'immutable';
import { $, Expression } from 'plywood';
import { LinkItem } from './link-item';
import { DataSource } from "../data-source/data-source";
describe('LinkItem', () => {
var dataSourceJS = {
name: 'twitter',
title: 'Twitter',
engine: 'druid',
source: 'twitter',
introspection: 'none',
dimensions: [
{
expression: {
name: 'time',
op: 'ref'
},
kind: 'time',
name: 'time'
},
{
expression: '$statusCode',
kind: 'string',
name: 'statusCode'
}
],
measures: [
{
name: 'count',
expression: '$main.count()'
},
{
name: 'uniqueIp',
expression: '$main.countDistinct($ip)'
}
],
timeAttribute: 'time',
defaultTimezone: 'Etc/UTC',
defaultFilter: { op: 'literal', value: true },
defaultDuration: 'P3D',
defaultSortMeasure: 'count',
refreshRule: {
rule: "fixed",
time: new Date('2015-09-13T00:00:00Z')
}
};
var dataSources = List([DataSource.fromJS(dataSourceJS)]);
var visualizations: any = List([
{
id: 'vis1',
title: 'vis1',
handleCircumstance(): any {
return { 'isAutomatic': () => false };
}
}
]);
var context = { dataSources, visualizations };
it('is an immutable class', () => {
testImmutableClass(LinkItem, [
{
name: 'test1',
title: 'Test One',
description: 'I like testing',
group: 'Tests',
dataSource: 'twitter',
essence: {
visualization: 'vis1',
timezone: 'Etc/UTC',
filter: {
op: "literal",
value: true
},
pinnedDimensions: ['statusCode'],
singleMeasure: "count",
selectedMeasures: ['count'],
splits: []
}
},
{
name: 'test1',
title: 'Test One',
description: 'I like testing',
group: 'Tests',
dataSource: 'twitter',
essence: {
visualization: 'vis1',
timezone: 'Etc/UTC',
filter: {
op: "literal",
value: true
},
pinnedDimensions: ['statusCode'],
singleMeasure: "count",
selectedMeasures: ['count', 'uniqueIp'],
splits: []
}
}
], { context });
});
describe('errors', () => {
it('must have context', () => {
expect(() => {
LinkItem.fromJS({} as any);
}).to.throw('must have context');
});
});
describe('upgrades', () => {
it('must add filter and timezone', () => {
var linkItem = LinkItem.fromJS({
name: 'test1',
title: 'Test One',
description: 'I like testing',
group: 'Tests',
dataSource: 'twitter',
essence: {
visualization: 'vis1',
pinnedDimensions: ['statusCode'],
singleMeasure: "count",
selectedMeasures: ['count'],
splits: 'time'
}
}, context);
expect(linkItem.toJS()).to.deep.equal({
"dataSource": "twitter",
"description": "I like testing",
"essence": {
"filter": {
"action": {
"action": "in",
"expression": {
"action": {
"action": "timeRange",
"duration": "P3D",
"step": -1
},
"expression": {
"name": "m",
"op": "ref"
},
"op": "chain"
}
},
"expression": {
"name": "time",
"op": "ref"
},
"op": "chain"
},
"pinnedDimensions": [
"statusCode"
],
"singleMeasure": "count",
"selectedMeasures": [
"count"
],
"splits": [
{
"bucketAction": {
"action": "timeBucket",
"duration": "PT1H"
},
"expression": {
"name": "time",
"op": "ref"
}
}
],
"timezone": "Etc/UTC",
"visualization": "vis1"
},
"group": "Tests",
"name": "test1",
"title": "Test One"
});
});
});
});