import _ from 'lodash';
import TableModel from 'app/core/table_model';
import {TableRenderer} from '../renderer';
describe('when rendering table', () => {
describe('given 2 columns', () => {
var table = new TableModel();
table.columns = [
{text: 'Time'},
{text: 'Value'},
{text: 'Colored'},
{text: 'Undefined'},
{text: 'String'},
{text: 'United', unit: 'bps'},
{text: 'Sanitized'},
{text: 'Link'},
{text: 'Array'},
];
table.rows = [
[1388556366666, 1230, 40, undefined, "", "", "my.host.com", "host1", ["value1", "value2"]]
];
var panel = {
pageSize: 10,
styles: [
{
pattern: 'Time',
type: 'date',
format: 'LLL',
alias: 'Timestamp'
},
{
pattern: '/(Val)ue/',
type: 'number',
unit: 'ms',
decimals: 3,
alias: '$1'
},
{
pattern: 'Colored',
type: 'number',
unit: 'none',
decimals: 1,
colorMode: 'value',
thresholds: [50, 80],
colors: ['green', 'orange', 'red']
},
{
pattern: 'String',
type: 'string',
},
{
pattern: 'United',
type: 'number',
unit: 'ms',
decimals: 2,
},
{
pattern: 'Sanitized',
type: 'string',
sanitize: true,
},
{
pattern: 'Link',
type: 'string',
link: true,
linkUrl: "/dashboard?param=$__cell¶m_1=$__cell_1¶m_2=$__cell_2",
linkTooltip: "$__cell $__cell_1 $__cell_6",
linkTargetBlank: true
},
{
pattern: 'Array',
type: 'number',
unit: 'ms',
decimals: 3
}
]
};
var sanitize = function(value) {
return 'sanitized';
};
var templateSrv = {
replace: function(value, scopedVars) {
if (scopedVars) {
// For testing variables replacement in link
_.each(scopedVars, function(val, key) {
value = value.replace('$' + key, val.value);
});
}
return value;
}
};
var renderer = new TableRenderer(panel, table, 'utc', sanitize, templateSrv);
it('time column should be formated', () => {
var html = renderer.renderCell(0, 0, 1388556366666);
expect(html).toBe('
2014-01-01T06:06:06Z | ');
});
it('undefined time column should be rendered as -', () => {
var html = renderer.renderCell(0, 0, undefined);
expect(html).toBe('- | ');
});
it('null time column should be rendered as -', () => {
var html = renderer.renderCell(0, 0, null);
expect(html).toBe('- | ');
});
it('number column with unit specified should ignore style unit', () => {
var html = renderer.renderCell(5, 0, 1230);
expect(html).toBe('1.23 kbps | ');
});
it('number column should be formated', () => {
var html = renderer.renderCell(1, 0, 1230);
expect(html).toBe('1.230 s | ');
});
it('number style should ignore string values', () => {
var html = renderer.renderCell(1, 0, 'asd');
expect(html).toBe('asd | ');
});
it('colored cell should have style', () => {
var html = renderer.renderCell(2, 0, 40);
expect(html).toBe('40.0 | ');
});
it('colored cell should have style', () => {
var html = renderer.renderCell(2, 0, 55);
expect(html).toBe('55.0 | ');
});
it('colored cell should have style', () => {
var html = renderer.renderCell(2, 0, 85);
expect(html).toBe('85.0 | ');
});
it('unformated undefined should be rendered as string', () => {
var html = renderer.renderCell(3, 0, 'value');
expect(html).toBe('value | ');
});
it('string style with escape html should return escaped html', () => {
var html = renderer.renderCell(4, 0, "&breaking
the
row");
expect(html).toBe('&breaking <br /> the <br /> row | ');
});
it('undefined formater should return escaped html', () => {
var html = renderer.renderCell(3, 0, "&breaking
the
row");
expect(html).toBe('&breaking <br /> the <br /> row | ');
});
it('undefined value should render as -', () => {
var html = renderer.renderCell(3, 0, undefined);
expect(html).toBe(' | ');
});
it('sanitized value should render as', () => {
var html = renderer.renderCell(6, 0, 'text link');
expect(html).toBe('sanitized | ');
});
it('Time column title should be Timestamp', () => {
expect(table.columns[0].title).toBe('Timestamp');
});
it('Value column title should be Val', () => {
expect(table.columns[1].title).toBe('Val');
});
it('Colored column title should be Colored', () => {
expect(table.columns[2].title).toBe('Colored');
});
it('link should render as', () => {
var html = renderer.renderCell(7, 0, 'host1');
var expectedHtml = `
host1
|
`;
expect(normalize(html)).toBe(normalize(expectedHtml));
});
it('Array column should not use number as formatter', () => {
var html = renderer.renderCell(8, 0, ['value1', 'value2']);
expect(html).toBe('value1, value2 | ');
});
});
});
function normalize(str) {
return str.replace(/\s+/gm, ' ').trim();
}