import React from 'react';
import TestUtils from 'react-dom/test-utils';
import { Provider } from 'react-redux';
import configureStore from '../../../stores/configureStore';
// need ES5 require to keep automocking off
const NodeDetailsTable = require('../node-details-table.js').default;
describe('NodeDetailsTable', () => {
let nodes;
let columns;
let component;
beforeEach(() => {
columns = [
{ dataType: 'ip', id: 'kubernetes_ip', label: 'IP' },
{ id: 'kubernetes_namespace', label: 'Namespace' },
{ dataType: 'duration', id: 'uptime', label: 'Uptime' },
];
nodes = [
{
id: 'node-1',
metadata: [
{ id: 'kubernetes_ip', label: 'IP', value: '10.244.253.24' },
{ id: 'kubernetes_namespace', label: 'Namespace', value: '1111' },
{
dataType: 'duration', id: 'uptime', label: 'Uptime', value: '1'
},
]
}, {
id: 'node-2',
metadata: [
{ id: 'kubernetes_ip', label: 'IP', value: '10.244.253.4' },
{ id: 'kubernetes_namespace', label: 'Namespace', value: '12' },
{
dataType: 'duration', id: 'uptime', label: 'Uptime', value: '4'
},
]
}, {
id: 'node-3',
metadata: [
{ id: 'kubernetes_ip', label: 'IP', value: '10.44.253.255' },
{ id: 'kubernetes_namespace', label: 'Namespace', value: '5' },
{
dataType: 'duration', id: 'uptime', label: 'Uptime', value: '30'
},
]
}, {
id: 'node-4',
metadata: [
{ id: 'kubernetes_ip', label: 'IP', value: '10.244.253.100' },
{ id: 'kubernetes_namespace', label: 'Namespace', value: '00000' },
{
dataType: 'duration', id: 'uptime', label: 'Uptime', value: '22222'
},
]
},
];
});
function matchColumnValues(columnLabel, expectedValues) {
// Get the index of the column whose values we want to match.
const columnIndex = columns.findIndex(column => column.id === columnLabel);
// Get all the values rendered in the table.
const values = TestUtils
.scryRenderedDOMComponentsWithClass(component, 'node-details-table-node-value')
.map(d => d.title);
// Since we are interested only in the values that appear in the column `columnIndex`,
// we drop the rest. As `values` are ordered by appearance in the DOM structure
// (that is, first by row and then by column), the indexes we are interested in are of the
// form columnIndex + n * columns.length, where n >= 0. Therefore we take only the values
// at the index which divided by columns.length gives a reminder columnIndex.
const filteredValues = values.filter(
(element, index) => index % columns.length === columnIndex
);
// Array comparison
expect(filteredValues).toEqual(expectedValues);
}
function clickColumn(title) {
const node = TestUtils.scryRenderedDOMComponentsWithTag(component, 'td')
.find(d => d.title === title);
TestUtils.Simulate.click(node.children[0]);
}
describe('kubernetes_ip', () => {
it('sorts by column', () => {
component = TestUtils.renderIntoDocument((
));
matchColumnValues('kubernetes_ip', [
'10.44.253.255',
'10.244.253.4',
'10.244.253.24',
'10.244.253.100'
]);
clickColumn('IP');
matchColumnValues('kubernetes_ip', [
'10.244.253.100',
'10.244.253.24',
'10.244.253.4',
'10.44.253.255'
]);
clickColumn('IP');
matchColumnValues('kubernetes_ip', [
'10.44.253.255',
'10.244.253.4',
'10.244.253.24',
'10.244.253.100'
]);
});
});
describe('kubernetes_namespace', () => {
it('sorts by column', () => {
component = TestUtils.renderIntoDocument((
));
matchColumnValues('kubernetes_namespace', ['00000', '1111', '12', '5']);
clickColumn('Namespace');
matchColumnValues('kubernetes_namespace', ['5', '12', '1111', '00000']);
clickColumn('Namespace');
matchColumnValues('kubernetes_namespace', ['00000', '1111', '12', '5']);
});
});
describe('uptime duration', () => {
it('sorts by column', () => {
component = TestUtils.renderIntoDocument((
));
matchColumnValues('uptime', ['1 second', '4 seconds', '30 seconds', '6 hours']);
clickColumn('Uptime');
matchColumnValues('uptime', ['6 hours', '30 seconds', '4 seconds', '1 second']);
});
});
});