datahub/test/model.test.js
Rufus Pollock 5d24fd474d [csv,bugfix][s]: fix to csv backend to correct issue with header row appearing in data in case where fields passed explicitly.
* The bug was triggered by change in 4d128af797546e5174537d8ed530a243e444eeab to use model fields if explicitly provided
  * model.test.js illustrated issue (that new test was failing prior to changes to csv backend in this commit)
* Issue was that CSV backend did not pass back fields option. Previously, if no fields provided from backend we extracted fields from first row of the returned records. With change in 4d128af797546e5174537d8ed530a243e444eeab to use model fields if provided we had an issue as we no longer removed first row for fields.
* Fixed by having CSV backend explicitly extract fields and pass them back
2013-06-15 12:12:15 +01:00

378 lines
8.9 KiB
JavaScript

(function ($) {
module("Model");
// =================================
// Field
test('Field: basics', function () {
var field = new recline.Model.Field({
id: 'x'
});
equal(field.attributes.label, 'x', 'Field label should be set from id');
var field = new recline.Model.Field({
id: 'x',
label: 'My label'
});
equal(field.attributes.label, 'My label', 'Field label should be set from id but not if explicitly provided');
raises(function() {
var field = new recline.Model.Field('xxx');
},
'should throw an error if not passed in a hash with id'
);
// toJSON
var field = new recline.Model.Field({
id: 'x',
label: 'My label'
});
var out = field.toJSON();
equal('My label', out.label);
var fieldList = new recline.Model.FieldList([
{id: 'xx', label: 'XX'},
{id: 'yy', label: 'YY'}
]);
var out = fieldList.toJSON();
equal('XX', out[0].label);
});
test('Field: type mapping', function () {
var tests = [
{ input: 'text', exp: 'string'},
{ input: 'int', exp: 'integer'},
{ input: 'float', exp: 'number'},
{ input: 'double', exp: 'number'},
{ input: 'datetime', exp: 'date-time'},
{ input: 'dateTime', exp: 'date-time'},
{ input: 'bool', exp: 'boolean'},
{ input: 'timestamp', exp: 'date-time'},
{ input: 'json', exp: 'object'}
];
_.each(tests, function(data) {
var field = new recline.Model.Field({
id: 'x',
type: data.input
});
equal(field.get('type'), data.exp);
});
});
test('Field: getFieldValue', function () {
var doc = new recline.Model.Record({
x: 12.3
});
var field = new recline.Model.Field({id: 'x'});
var out = doc.getFieldValue(field);
var exp = 12.3;
equal(out, exp);
// bad value
var out = doc.getFieldValue();
equal(out, '');
});
test('Field: default renderers', function () {
var doc = new recline.Model.Record({
x: 12.3,
myobject: {a: 1, b: 2},
link: 'http://abc.com/',
link2: 'Some text then https://abc.com/',
markdown: '### ABC',
geopoint: [18.7, -122]
});
var field = new recline.Model.Field({id: 'myobject', type: 'object'});
var out = doc.getFieldValue(field);
var exp = '{"a":1,"b":2}';
equal(out, exp);
var field = new recline.Model.Field({id: 'geopoint', type: 'geo_point'});
var out = doc.getFieldValue(field);
var exp = '[18.7,-122]';
equal(out, exp);
var field = new recline.Model.Field({id: 'x', type: 'float', format: 'percentage'});
var out = doc.getFieldValue(field);
var exp = '12.3%';
equal(out, exp);
var field = new recline.Model.Field({id: 'link'});
var out = doc.getFieldValue(field);
var exp = '<a href="http://abc.com/">http://abc.com/</a>';
equal(out, exp);
var field = new recline.Model.Field({id: 'link2'});
var out = doc.getFieldValue(field);
var exp = 'Some text then <a href="https://abc.com/">https://abc.com/</a>';
equal(out, exp);
var field = new recline.Model.Field({id: 'markdown', type: 'string', format: 'markdown'});
var out = doc.getFieldValue(field);
// Showdown is not installed so nothing should happen
var exp = doc.get('markdown');
equal(out, exp);
});
test('Field: custom deriver and renderer', function () {
var doc = new recline.Model.Record({x: 123});
var cellRenderer = function(value, field) {
return '<span class="field-' + field.id + '">' + value + '</span>';
}
var deriver = function(val, field, doc) {
return doc.get('x') * 2
}
var field = new recline.Model.Field({id: 'computed', is_derived: true}, {
deriver: deriver
});
var out1 = doc.getFieldValueUnrendered(field);
var out = doc.getFieldValue(field);
var exp = 246;
equal(out1, exp);
equal(out, exp);
var field = new recline.Model.Field({id: 'x'}, {
renderer: cellRenderer
});
var out = doc.getFieldValue(field);
var exp = '<span class="field-x">123</span>'
equal(out, exp);
var field = new recline.Model.Field({id: 'computed'}, {
renderer: cellRenderer,
deriver: deriver
});
var out = doc.getFieldValue(field);
var exp = '<span class="field-computed">246</span>'
equal(out, exp);
});
// =================================
// Dataset
module("Model Dataset");
test('Dataset', function () {
var meta = {id: 'test', title: 'xyz'};
var dataset = new recline.Model.Dataset(meta);
dataset.fields = new recline.Model.FieldList([{id: 'xx'}, {id: 'yy'}]);
var out = dataset.toTemplateJSON();
equal(out.fields.length, 2);
});
test('Dataset getFieldsSummary', function () {
var dataset = Fixture.getDataset();
dataset.getFieldsSummary().done(function() {
var countryField = dataset.fields.get('country');
var facet = countryField.facets.models[0];
equal(facet.get('terms').length, 3);
var exp = [
{ count: 3, term: 'UK' },
{ count: 2, term: 'DE' },
{ count: 1, term: 'US' }
];
deepEqual(facet.get('terms'), exp);
});
});
test('fetch without and with explicit fields', function () {
var dataset = new recline.Model.Dataset({
backend: 'csv',
data: 'A,B\n1,2\n3,4'
});
dataset.fetch();
equal(dataset.fields.at(0).id, 'A');
equal(dataset.fields.at(0).get('type'), 'string');
var dataset = new recline.Model.Dataset({
fields: [{id: 'X', type: 'number'}, {id: 'Y'}],
backend: 'csv',
data: 'A,B\n1,2\n3,4'
});
dataset.fetch();
equal(dataset.fields.at(0).id, 'X');
equal(dataset.fields.at(0).get('type'), 'number');
equal(dataset.records.at(0).get('X'), 1);
});
test('_normalizeRecordsAndFields', function () {
var data = [
// fields but no records
{
in_: {
fields: [ '', 'abc', 'abc', 'xyz', '' ],
records: null
},
exp: {
fields: [
{id: '_noname_'},
{id: 'abc'},
{id: 'abc1'},
{id: 'xyz'},
{id: '_noname_1'}
],
records: null
},
},
// non-string fields
{
in_: {
fields: [ null, 1, 1, 3 ],
records: [ [1,2,3,4] ]
},
exp: {
fields: [
{id: '_noname_'},
{id: '1'},
{id: '11'},
{id: '3'}
],
records: [ { '_noname_': 1, '1': 2, '11': 3, '3': 4 } ]
},
},
// records array but no fields
{
in_: {
fields: undefined,
records: [
['col1', 'col2'],
[1,2],
[3,4]
]
},
exp: {
fields: [
{id: 'col1'},
{id: 'col2'}
],
records: [
{col1: 1, col2: 2},
{col1: 3, col2: 4}
]
}
},
// records objects but no fields
{
in_: {
fields: undefined,
records: [
{col1: 1, col2: 2},
{col1: 3, col2: 4}
]
},
exp: {
fields: [
{id: 'col1'},
{id: 'col2'}
],
records: [
{col1: 1, col2: 2},
{col1: 3, col2: 4}
]
}
},
// fields and records array
{
in_: {
fields: [{id: 'col1'}, {id: 'col2'}],
records: [
[1,2],
[3,4]
]
},
exp: {
fields: [
{id: 'col1'},
{id: 'col2'}
],
records: [
{col1: 1, col2: 2},
{col1: 3, col2: 4}
]
}
},
// everything already correct
{
in_: {
fields: [{id: 'col1'}, {id: 'col2'}],
records: [
{col1: 1, col2: 2},
{col1: 3, col2: 4}
]
},
exp: {
fields: [
{id: 'col1'},
{id: 'col2'}
],
records: [
{col1: 1, col2: 2},
{col1: 3, col2: 4}
]
}
}
];
var dataset = new recline.Model.Dataset();
_.each(data, function(item) {
out = dataset._normalizeRecordsAndFields(item.in_.records, item.in_.fields);
deepEqual(out, item.exp);
});
});
// =================================
// Record
module("Model Record");
test('summary', function () {
var dataset = new recline.Model.Dataset({
records: [ {a: 1, b: 2} ]
});
var record = dataset.records.at(0);
var out = record.summary();
var exp = '<div class="recline-record-summary"><div class="a"><strong>a</strong>: 1</div><div class="b"><strong>b</strong>: 2</div></div>'
equal(out, exp);
});
// =================================
// Query
test('Query', function () {
var query = new recline.Model.Query();
query.addFacet('xyz');
deepEqual({terms: {field: 'xyz'}}, query.get('facets')['xyz']);
});
test('Query.addFilter', function () {
var query = new recline.Model.Query();
query.addFilter({type: 'term', field: 'xyz'});
var exp = {
field: 'xyz',
type: 'term',
term: ''
};
deepEqual(query.get('filters')[0], exp);
query.addFilter({type: 'term', field: 'abc'});
deepEqual(query.get('filters')[0], exp);
query.addFilter({type: 'geo_distance', field: 'xyz'});
var exp = {
distance: 10,
unit: 'km',
point: {
lon: 0,
lat: 0
},
field: 'xyz',
type: 'geo_distance'
};
deepEqual(exp, query.get('filters')[2]);
});
})(this.jQuery);