Archived
2
This repository has been archived on 2023-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
definma-api/src/routes/template.spec.ts

814 lines
33 KiB
TypeScript
Raw Normal View History

2020-05-04 15:48:07 +02:00
import should from 'should/as-function';
2020-05-14 15:36:47 +02:00
import _ from 'lodash';
import TemplateConditionModel from '../models/condition_template';
2020-05-04 15:48:07 +02:00
import TemplateMeasurementModel from '../models/measurement_template';
import TestHelper from "../test/helper";
2020-05-04 15:48:07 +02:00
// TODO: do not allow usage of old templates for new samples
// TODO: remove number_prefix
// TODO: template parameters are not allowed to be condition_template
2020-05-13 17:28:18 +02:00
2020-05-04 15:48:07 +02:00
describe('/template', () => {
let server;
before(done => TestHelper.before(done));
beforeEach(done => server = TestHelper.beforeEach(server, done));
afterEach(done => TestHelper.afterEach(server, done));
describe('/template/condition', () => {
describe('GET /template/conditions', () => {
it('returns all condition templates', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'get',
url: '/template/conditions',
2020-05-04 15:48:07 +02:00
auth: {basic: 'janedoe'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
const json = require('../test/db.json');
should(res.body).have.lengthOf(json.collections.condition_templates.length);
should(res.body).matchEach(condition => {
should(condition).have.only.keys('_id', 'name', 'version', 'parameters');
should(condition).have.property('_id').be.type('string');
should(condition).have.property('name').be.type('string');
should(condition).have.property('version').be.type('number');
should(condition.parameters).matchEach(number => {
2020-05-04 15:48:07 +02:00
should(number).have.only.keys('name', 'range');
should(number).have.property('name').be.type('string');
should(number).have.property('range').be.type('object');
});
});
done();
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/conditions',
2020-05-04 15:48:07 +02:00
auth: {key: 'janedoe'},
httpStatus: 401
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/conditions',
2020-05-04 15:48:07 +02:00
httpStatus: 401
});
});
});
describe('GET /template/condition/{id}', () => {
it('returns the right condition template', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'get',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'janedoe'},
httpStatus: 200,
res: {_id: '200000000000000000000001', name: 'heat treatment', version: 1, parameters: [{name: 'material', range: {values: ['copper', 'hot air']}}, {name: 'weeks', range: {min: 1, max: 10}}]}
2020-05-04 15:48:07 +02:00
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {key: 'janedoe'},
httpStatus: 401
});
});
2020-05-13 17:28:18 +02:00
it('rejects an unknown id', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'get',
url: '/template/condition/000000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'janedoe'},
httpStatus: 404
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
httpStatus: 401
});
});
});
describe('PUT /template/condition/{name}', () => {
it('returns the right condition template', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {},
res: {_id: '200000000000000000000001', name: 'heat treatment', version: 1, parameters: [{name: 'material', range: {values: ['copper', 'hot air']}}, {name: 'weeks', range: {min: 1, max: 10}}]}
2020-05-04 15:48:07 +02:00
});
});
it('keeps unchanged properties', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'heat treatment', parameters: [{name: 'material', range: {values: ['copper', 'hot air']}}, {name: 'weeks', range: {min: 1, max: 10}}]},
res: {_id: '200000000000000000000001', name: 'heat treatment', version: 1, parameters: [{name: 'material', range: {values: ['copper', 'hot air']}}, {name: 'weeks', range: {min: 1, max: 10}}]}
2020-05-13 17:28:18 +02:00
});
});
it('keeps only one unchanged property', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-13 17:28:18 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'heat treatment'},
res: {_id: '200000000000000000000001', name: 'heat treatment', version: 1, parameters: [{name: 'material', range: {values: ['copper', 'hot air']}}, {name: 'weeks', range: {min: 1, max: 10}}]}
2020-05-04 15:48:07 +02:00
});
});
it('changes the given properties', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
}).end((err, res) => {
if (err) return done(err);
TemplateConditionModel.findById(res.body._id).lean().exec((err, data:any) => {
2020-05-04 15:48:07 +02:00
if (err) return done(err);
should(data).have.only.keys('_id', 'name', 'version', 'parameters', '__v');
2020-05-14 12:31:57 +02:00
should(data).have.property('name', 'heat aging');
should(data).have.property('version', 2);
should(data).have.property('parameters').have.lengthOf(1);
should(data.parameters[0]).have.property('name', 'time');
should(data.parameters[0]).have.property('range');
should(data.parameters[0].range).have.property('min', 1);
2020-05-04 15:48:07 +02:00
done();
});
});
});
2020-05-14 12:31:57 +02:00
it('allows changing only one property', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-14 12:31:57 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'heat aging'}
}).end((err, res) => {
if (err) return done(err);
TemplateConditionModel.findById(res.body._id).lean().exec((err, data:any) => {
2020-05-14 12:31:57 +02:00
if (err) return done(err);
should(data).have.only.keys('_id', 'name', 'version', 'parameters', '__v');
2020-05-14 15:36:47 +02:00
should(data).have.property('name', 'heat aging');
should(data).have.property('version', 2);
should(data).have.property('parameters').have.lengthOf(2);
should(data.parameters[0]).have.property('name', 'material');
should(data.parameters[1]).have.property('name', 'weeks');
2020-05-14 12:31:57 +02:00
done();
});
});
});
2020-05-04 15:48:07 +02:00
it('supports values ranges', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'time', range: {values: [1, 2, 5]}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'heat treatment', version: 2, parameters: [{name: 'time', range: {values: [1, 2, 5]}}]});
2020-05-14 15:36:47 +02:00
done();
2020-05-04 15:48:07 +02:00
});
});
it('supports min max ranges', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'time', range: {min: 1, max: 11}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'heat treatment', version: 2, parameters: [{name: 'time', range: {min: 1, max: 11}}]});
2020-05-14 15:36:47 +02:00
done();
2020-05-04 15:48:07 +02:00
});
});
2020-05-14 12:31:57 +02:00
it('supports array type ranges', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-14 12:31:57 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'time', range: {type: 'array'}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'heat treatment', version: 2, parameters: [{name: 'time', range: {type: 'array'}}]});
2020-05-14 15:36:47 +02:00
done();
2020-05-14 12:31:57 +02:00
});
});
2020-05-04 15:48:07 +02:00
it('supports empty ranges', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'time', range: {}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'heat treatment', version: 2, parameters: [{name: 'time', range: {}}]});
2020-05-14 15:36:47 +02:00
done();
2020-05-04 15:48:07 +02:00
});
});
2020-05-14 12:31:57 +02:00
it('rejects not specified parameters', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-14 12:31:57 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat treatment', parameters: [{name: 'material', range: {xx: 5}}]},
2020-05-14 15:36:47 +02:00
res: {status: 'Invalid body format', details: '"parameters[0].range.xx" is not allowed'}
2020-05-14 12:31:57 +02:00
});
})
2020-05-13 17:28:18 +02:00
it('rejects an invalid id', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/2000000000h0000000000001',
2020-05-13 17:28:18 +02:00
auth: {basic: 'admin'},
httpStatus: 404,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
});
});
it('rejects an unknown id', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/000000000000000000000001',
2020-05-13 17:28:18 +02:00
auth: {basic: 'admin'},
httpStatus: 404,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-13 17:28:18 +02:00
auth: {key: 'admin'},
httpStatus: 401,
req: {}
});
});
it('rejects requests from a write user', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-13 17:28:18 +02:00
auth: {basic: 'janedoe'},
httpStatus: 403,
req: {}
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/condition/200000000000000000000001',
2020-05-13 17:28:18 +02:00
httpStatus: 401,
req: {}
});
});
});
describe('POST /template/condition/new', () => {
it('returns the right condition template', done => {
2020-05-13 17:28:18 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-13 17:28:18 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'heat treatment3', parameters: [{name: 'material', range: {values: ['copper']}}]}
2020-05-14 12:31:57 +02:00
}).end((err, res) => {
if (err) return done(err);
should(res.body).have.only.keys('_id', 'name', 'version', 'parameters');
2020-05-14 12:31:57 +02:00
should(res.body).have.property('name', 'heat treatment3');
should(res.body).have.property('version', 1);
should(res.body).have.property('parameters').have.lengthOf(1);
should(res.body.parameters[0]).have.property('name', 'material');
should(res.body.parameters[0]).have.property('range');
should(res.body.parameters[0].range).have.property('values');
should(res.body.parameters[0].range.values[0]).be.eql('copper');
2020-05-14 16:42:47 +02:00
done();
2020-05-13 17:28:18 +02:00
});
});
it('stores the template', done => {
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
2020-05-13 17:28:18 +02:00
}).end((err, res) => {
2020-05-04 15:48:07 +02:00
if (err) return done(err);
TemplateConditionModel.findById(res.body._id).lean().exec((err, data:any) => {
2020-05-04 15:48:07 +02:00
if (err) return done(err);
should(data).have.only.keys('_id', 'name', 'version', 'parameters', '__v');
2020-05-14 12:31:57 +02:00
should(data).have.property('name', 'heat aging');
should(data).have.property('version', 1);
should(data).have.property('parameters').have.lengthOf(1);
should(data.parameters[0]).have.property('name', 'time');
should(data.parameters[0]).have.property('range');
should(data.parameters[0].range).have.property('min', 1);
2020-05-04 15:48:07 +02:00
done();
});
});
});
2020-05-13 17:28:18 +02:00
it('rejects a missing name', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {parameters: [{name: 'time', range: {min: 1}}]},
2020-05-07 21:55:29 +02:00
res: {status: 'Invalid body format', details: '"name" is required'}
});
});
it('rejects a number prefix', done => {
2020-05-14 12:31:57 +02:00
TestHelper.request(server, done, {
method: 'post',
url: '/template/condition/new',
2020-05-14 12:31:57 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat aging', number_prefix: 'C', parameters: [{name: 'time', range: {min: 1}}]},
res: {status: 'Invalid body format', details: '"number_prefix" is not allowed'}
2020-05-14 12:31:57 +02:00
});
});
2020-05-13 17:28:18 +02:00
it('rejects missing parameters', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat aging'},
2020-05-07 21:55:29 +02:00
res: {status: 'Invalid body format', details: '"parameters" is required'}
});
});
2020-05-13 17:28:18 +02:00
it('rejects a missing parameter name', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat aging', parameters: [{range: {min: 1}}]},
2020-05-07 21:55:29 +02:00
res: {status: 'Invalid body format', details: '"parameters[0].name" is required'}
});
});
2020-05-13 17:28:18 +02:00
it('rejects a missing parameter range', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat aging', parameters: [{name: 'time'}]},
2020-05-07 21:55:29 +02:00
res: {status: 'Invalid body format', details: '"parameters[0].range" is required'}
});
});
2020-05-14 12:31:57 +02:00
it('rejects an invalid parameter range property', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat aging', parameters: [{name: 'time', range: {xx: 1}}]},
2020-05-07 21:55:29 +02:00
res: {status: 'Invalid body format', details: '"parameters[0].range.xx" is not allowed'}
2020-05-04 15:48:07 +02:00
});
});
it('rejects wrong properties', done => {
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/condition/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'heat aging', parameters: [{name: 'time', range: {}}], xx: 33},
2020-05-14 16:42:47 +02:00
res: {status: 'Invalid body format', details: '"xx" is not allowed'}
2020-05-14 12:31:57 +02:00
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'post',
url: '/template/condition/new',
2020-05-14 12:31:57 +02:00
auth: {key: 'admin'},
httpStatus: 401,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
2020-05-14 12:31:57 +02:00
});
});
it('rejects requests from a write user', done => {
TestHelper.request(server, done, {
method: 'post',
url: '/template/condition/new',
2020-05-14 12:31:57 +02:00
auth: {basic: 'janedoe'},
httpStatus: 403,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
2020-05-14 12:31:57 +02:00
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'post',
url: '/template/condition/new',
2020-05-14 12:31:57 +02:00
httpStatus: 401,
req: {name: 'heat aging', parameters: [{name: 'time', range: {min: 1}}]}
2020-05-04 15:48:07 +02:00
});
});
});
});
describe('/template/measurement', () => {
describe('GET /template/measurements', () => {
it('returns all measurement templates', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/measurements',
auth: {basic: 'janedoe'},
httpStatus: 200
}).end((err, res) => {
if (err) return done(err);
const json = require('../test/db.json');
should(res.body).have.lengthOf(json.collections.measurement_templates.length);
should(res.body).matchEach(measurement => {
2020-05-14 12:31:57 +02:00
should(measurement).have.only.keys('_id', 'name', 'version', 'parameters');
2020-05-04 15:48:07 +02:00
should(measurement).have.property('_id').be.type('string');
should(measurement).have.property('name').be.type('string');
2020-05-14 12:31:57 +02:00
should(measurement).have.property('version').be.type('number');
2020-05-04 15:48:07 +02:00
should(measurement.parameters).matchEach(number => {
should(number).have.only.keys('name', 'range');
should(number).have.property('name').be.type('string');
should(number).have.property('range').be.type('object');
});
});
done();
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/measurements',
auth: {key: 'janedoe'},
httpStatus: 401
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'get',
url: '/template/measurements',
httpStatus: 401
});
});
});
2020-05-14 12:31:57 +02:00
describe('GET /template/measurement/id', () => {
2020-05-04 15:48:07 +02:00
it('returns the right measurement template', done => {
TestHelper.request(server, done, {
method: 'get',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'janedoe'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
res: {_id: '300000000000000000000001', name: 'spectrum', version: 1, parameters: [{name: 'dpt', range: { type: 'array'}}]}
2020-05-04 15:48:07 +02:00
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'get',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {key: 'janedoe'},
httpStatus: 401
});
});
2020-05-14 12:31:57 +02:00
it('rejects an unknown id', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'get',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/000000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'janedoe'},
httpStatus: 404
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'get',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
httpStatus: 401
});
});
});
describe('PUT /template/measurement/{name}', () => {
it('returns the right measurement template', done => {
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {},
2020-05-14 15:36:47 +02:00
res: {_id: '300000000000000000000001', name: 'spectrum', version: 1, parameters: [{name: 'dpt', range: { type: 'array'}}]}
2020-05-04 15:48:07 +02:00
});
});
it('keeps unchanged properties', done => {
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {name: 'spectrum', parameters: [{name: 'dpt', range: { type: 'array'}}]},
2020-05-14 12:31:57 +02:00
res: {_id: '300000000000000000000001', name: 'spectrum', version: 1, parameters: [{name: 'dpt', range: {type: 'array'}}]}
});
});
it('keeps only one unchanged property', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'spectrum'},
res: {_id: '300000000000000000000001', name: 'spectrum', version: 1, parameters: [{name: 'dpt', range: {type: 'array'}}]}
2020-05-04 15:48:07 +02:00
});
});
it('changes the given properties', done => {
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'IR spectrum', parameters: [{name: 'data point table', range: {min: 0, max: 1000}}]},
}).end((err, res) => {
if (err) return done(err);
2020-05-14 15:36:47 +02:00
should(_.omit(res.body, '_id')).be.eql({name: 'IR spectrum', version: 2, parameters: [{name: 'data point table', range: {min: 0, max: 1000}}]});
TemplateMeasurementModel.findById(res.body._id).lean().exec((err, data:any) => {
2020-05-04 15:48:07 +02:00
if (err) return done(err);
2020-05-14 15:36:47 +02:00
should(data).have.only.keys('_id', 'name', 'version', 'parameters', '__v');
should(data).have.property('name', 'IR spectrum');
should(data).have.property('version', 2);
should(data).have.property('parameters').have.lengthOf(1);
should(data.parameters[0]).have.property('name', 'data point table');
should(data.parameters[0]).have.property('range');
should(data.parameters[0].range).have.property('min', 0);
should(data.parameters[0].range).have.property('max', 1000);
2020-05-04 15:48:07 +02:00
done();
});
});
});
2020-05-14 12:31:57 +02:00
it('allows changing only one property', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'IR spectrum'},
}).end((err, res) => {
if (err) return done(err);
2020-05-14 15:36:47 +02:00
should(_.omit(res.body, '_id')).be.eql({name: 'IR spectrum', version: 2, parameters: [{name: 'dpt', range: {type: 'array'}}]});
TemplateMeasurementModel.findById(res.body._id).lean().exec((err, data:any) => {
2020-05-14 12:31:57 +02:00
if (err) return done(err);
should(data).have.only.keys('_id', 'name', 'version', 'parameters', '__v');
should(data).have.property('name', 'IR spectrum');
should(data).have.property('version', 2);
should(data).have.property('parameters').have.lengthOf(1);
should(data.parameters[0]).have.property('name', 'dpt');
should(data.parameters[0]).have.property('range');
should(data.parameters[0].range).have.property('type', 'array');
done();
});
});
});
2020-05-04 15:48:07 +02:00
it('supports values ranges', done => {
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'dpt', range: {values: [1, 2, 5]}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'spectrum', version: 2, parameters: [{name: 'dpt', range: {values: [1, 2, 5]}}]});
done();
2020-05-04 15:48:07 +02:00
});
});
it('supports min max ranges', done => {
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000001',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'dpt', range: {min: 0, max: 1000}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'spectrum', version: 2, parameters: [{name: 'dpt', range: {min: 0, max: 1000}}]});
done();
2020-05-14 12:31:57 +02:00
});
});
2020-05-14 15:36:47 +02:00
it('supports array type ranges', done => {
2020-05-14 12:31:57 +02:00
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'dpt2', range: {type: 'array'}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'spectrum', version: 2, parameters: [{name: 'dpt2', range: {type: 'array'}}]});
done();
2020-05-04 15:48:07 +02:00
});
});
it('supports empty ranges', done => {
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/300000000000000000000002',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
2020-05-14 15:36:47 +02:00
req: {parameters: [{name: 'weight %', range: {}}]}
}).end((err, res) => {
if (err) return done(err);
should(_.omit(res.body, '_id')).be.eql({name: 'kf', version: 3, parameters: [{name: 'weight %', range: {}}]});
done();
2020-05-14 12:31:57 +02:00
});
});
it('rejects not specified parameters', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
auth: {basic: 'admin'},
httpStatus: 400,
req: {parameters: [{name: 'dpt'}], range: {xx: 33}},
2020-05-14 15:36:47 +02:00
res: {status: 'Invalid body format', details: '"parameters[0].range" is required'}
2020-05-14 12:31:57 +02:00
});
});
it('rejects an invalid id', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/3000000000h0000000000001',
auth: {basic: 'admin'},
httpStatus: 404,
req: {name: 'IR spectrum', parameters: [{name: 'data point table', range: {min: 0, max: 1000}}]},
2020-05-04 15:48:07 +02:00
});
});
2020-05-14 12:31:57 +02:00
it('rejects an unknown id', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
method: 'put',
2020-05-14 12:31:57 +02:00
url: '/template/measurement/000000000000000000000001',
auth: {basic: 'admin'},
httpStatus: 404,
req: {name: 'IR spectrum', parameters: [{name: 'data point table', range: {min: 0, max: 1000}}]},
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
auth: {key: 'admin'},
httpStatus: 401,
req: {}
});
});
it('rejects requests from a write user', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
auth: {basic: 'janedoe'},
httpStatus: 403,
req: {}
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
method: 'put',
url: '/template/measurement/300000000000000000000001',
httpStatus: 401,
req: {}
});
});
});
describe('POST /template/measurement/new', () => {
it('returns the right measurement template', done => {
TestHelper.request(server, done, {
method: 'post',
url: '/template/measurement/new',
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'vz', parameters: [{name: 'vz', range: {min: 1}}]}
}).end((err, res) => {
if (err) return done(err);
should(res.body).have.only.keys('_id', 'name', 'version', 'parameters');
should(res.body).have.property('name', 'vz');
should(res.body).have.property('version', 1);
should(res.body).have.property('parameters').have.lengthOf(1);
should(res.body.parameters[0]).have.property('name', 'vz');
should(res.body.parameters[0]).have.property('range');
should(res.body.parameters[0].range).have.property('min', 1);
2020-05-14 16:42:47 +02:00
done();
2020-05-14 12:31:57 +02:00
});
});
it('stores the template', done => {
TestHelper.request(server, done, {
method: 'post',
url: '/template/measurement/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 200,
req: {name: 'vz', parameters: [{name: 'vz', range: {min: 1}}]}
}).end(err => {
if (err) return done(err);
TemplateMeasurementModel.find({name: 'vz'}).lean().exec((err, data:any) => {
if (err) return done(err);
should(data).have.lengthOf(1);
2020-05-14 12:31:57 +02:00
should(data[0]).have.only.keys('_id', 'name', 'version', 'parameters', '__v');
2020-05-04 15:48:07 +02:00
should(data[0]).have.property('name', 'vz');
2020-05-14 16:42:47 +02:00
should(data[0]).have.property('version', 1);
2020-05-04 15:48:07 +02:00
should(data[0]).have.property('parameters').have.lengthOf(1);
should(data[0].parameters[0]).have.property('name', 'vz');
should(data[0].parameters[0]).have.property('range');
should(data[0].parameters[0].range).have.property('min', 1);
done();
});
});
});
2020-05-14 12:31:57 +02:00
it('rejects a missing name', done => {
2020-05-04 15:48:07 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {parameters: [{name: 'data point table', range: {min: 0, max: 1000}}]},
res: {status: 'Invalid body format', details: '"name" is required'}
});
});
2020-05-14 12:31:57 +02:00
it('rejects missing parameters', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'IR spectrum'},
res: {status: 'Invalid body format', details: '"parameters" is required'}
});
});
2020-05-14 12:31:57 +02:00
it('rejects a missing parameter name', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'IR spectrum', parameters: [{range: {min: 0, max: 1000}}]},
res: {status: 'Invalid body format', details: '"parameters[0].name" is required'}
});
});
2020-05-14 12:31:57 +02:00
it('rejects a missing parameter range', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-07 21:55:29 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
req: {name: 'IR spectrum', parameters: [{name: 'data point table'}]},
res: {status: 'Invalid body format', details: '"parameters[0].range" is required'}
});
});
2020-05-14 12:31:57 +02:00
it('rejects a an invalid parameter range property', done => {
2020-05-07 21:55:29 +02:00
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
2020-05-07 21:55:29 +02:00
req: {name: 'IR spectrum', parameters: [{name: 'data point table', range: {xx: 0}}]},
res: {status: 'Invalid body format', details: '"parameters[0].range.xx" is not allowed'}
2020-05-04 15:48:07 +02:00
});
});
it('rejects wrong properties', done => {
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'admin'},
httpStatus: 400,
2020-05-14 12:31:57 +02:00
req: {name: 'IR spectrum', parameters: [{name: 'data point table', range: {}}], xx: 35},
2020-05-14 16:42:47 +02:00
res: {status: 'Invalid body format', details: '"xx" is not allowed'}
2020-05-04 15:48:07 +02:00
});
});
it('rejects an API key', done => {
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-04 15:48:07 +02:00
auth: {key: 'admin'},
httpStatus: 401,
2020-05-14 12:31:57 +02:00
req: {name: 'vz', parameters: [{name: 'vz', range: {min: 1}}]}
2020-05-04 15:48:07 +02:00
});
});
it('rejects requests from a write user', done => {
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-04 15:48:07 +02:00
auth: {basic: 'janedoe'},
httpStatus: 403,
2020-05-14 12:31:57 +02:00
req: {name: 'vz', parameters: [{name: 'vz', range: {min: 1}}]}
2020-05-04 15:48:07 +02:00
});
});
it('rejects unauthorized requests', done => {
TestHelper.request(server, done, {
2020-05-14 12:31:57 +02:00
method: 'post',
url: '/template/measurement/new',
2020-05-04 15:48:07 +02:00
httpStatus: 401,
2020-05-14 12:31:57 +02:00
req: {name: 'vz', parameters: [{name: 'vz', range: {min: 1}}]}
2020-05-04 15:48:07 +02:00
});
});
});
});
});