720 lines
32 KiB
TypeScript
720 lines
32 KiB
TypeScript
import should from 'should/as-function';
|
|
import SampleModel from '../models/sample';
|
|
import NoteModel from '../models/note';
|
|
import NoteFieldModel from '../models/note_field';
|
|
import TestHelper from "../test/helper";
|
|
// TODO: generate sample number
|
|
// TODO: think again which parameters are required at POST
|
|
// TODO: status
|
|
|
|
describe('/sample', () => {
|
|
let server;
|
|
before(done => TestHelper.before(done));
|
|
beforeEach(done => server = TestHelper.beforeEach(server, done));
|
|
afterEach(done => TestHelper.afterEach(server, done));
|
|
|
|
describe('GET /samples', () => {
|
|
it('returns all samples', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'get',
|
|
url: '/samples',
|
|
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.samples.length);
|
|
should(res.body).matchEach(material => {
|
|
should(material).have.only.keys('_id', 'number', 'type', 'color', 'batch', 'material_id', 'note_id', 'user_id');
|
|
should(material).have.property('_id').be.type('string');
|
|
should(material).have.property('number').be.type('string');
|
|
should(material).have.property('type').be.type('string');
|
|
should(material).have.property('color').be.type('string');
|
|
should(material).have.property('batch').be.type('string');
|
|
should(material).have.property('material_id').be.type('string');
|
|
should(material).have.property('note_id');
|
|
should(material).have.property('user_id').be.type('string');
|
|
});
|
|
done();
|
|
});
|
|
});
|
|
it('works with an API key', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'get',
|
|
url: '/samples',
|
|
auth: {key: 'janedoe'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
const json = require('../test/db.json');
|
|
should(res.body).have.lengthOf(json.collections.samples.length);
|
|
should(res.body).matchEach(material => {
|
|
should(material).have.only.keys('_id', 'number', 'type', 'color', 'batch', 'material_id', 'note_id', 'user_id');
|
|
should(material).have.property('_id').be.type('string');
|
|
should(material).have.property('number').be.type('string');
|
|
should(material).have.property('type').be.type('string');
|
|
should(material).have.property('color').be.type('string');
|
|
should(material).have.property('batch').be.type('string');
|
|
should(material).have.property('material_id').be.type('string');
|
|
should(material).have.property('note_id');
|
|
should(material).have.property('user_id').be.type('string');
|
|
});
|
|
done();
|
|
});
|
|
});
|
|
it('rejects unauthorized requests', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'get',
|
|
url: '/samples',
|
|
httpStatus: 401
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('PUT /sample/{id}', () => {
|
|
it('returns the right sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {},
|
|
res: {_id: '400000000000000000000001', number: '1', type: 'granulate', color: 'black', batch: '', material_id: '100000000000000000000004', note_id: null, user_id: '000000000000000000000002'}
|
|
});
|
|
});
|
|
it('keeps unchanged properties', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {number: '1', type: 'granulate', color: 'black', batch: '', material_id: '100000000000000000000004', notes: {}},
|
|
res: {_id: '400000000000000000000001', number: '1', type: 'granulate', color: 'black', batch: '', material_id: '100000000000000000000004', note_id: null, user_id: '000000000000000000000002'}
|
|
});
|
|
});
|
|
it('changes the given properties', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
}).end(err => {
|
|
if (err) return done (err);
|
|
SampleModel.findById('400000000000000000000001').lean().exec((err, data: any) => {
|
|
if (err) return done (err);
|
|
should(data).have.only.keys('_id', 'number', 'color', 'type', 'batch', 'validated', 'material_id', 'note_id', 'user_id', '__v');
|
|
should(data).have.property('_id');
|
|
should(data).have.property('number', '10');
|
|
should(data).have.property('color', 'signalviolet');
|
|
should(data).have.property('type', 'part');
|
|
should(data).have.property('batch', '114531');
|
|
should(data).have.property('validated').be.type('boolean');
|
|
should(data.material_id.toString()).be.eql('100000000000000000000002');
|
|
should(data.user_id.toString()).be.eql('000000000000000000000002');
|
|
should(data).have.property('note_id');
|
|
NoteModel.findById(data.note_id).lean().exec((err, data: any) => {
|
|
if (err) return done (err);
|
|
should(data).have.property('_id');
|
|
should(data).have.property('comment', 'Testcomment');
|
|
should(data).have.property('sample_references');
|
|
should(data.sample_references).have.lengthOf(1);
|
|
should(data.sample_references[0].id.toString()).be.eql('400000000000000000000003');
|
|
should(data.sample_references[0]).have.property('relation', 'part to this sample');
|
|
done();
|
|
});
|
|
})
|
|
});
|
|
});
|
|
it('adjusts the note_fields correctly', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000003',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200,
|
|
req: {notes: {comment: 'Testcomment', sample_references: [], custom_fields: {field1: 'value 1'}}}
|
|
}).end(err => {
|
|
if (err) return done(err);
|
|
NoteFieldModel.findOne({name: 'not allowed for new applications'}).lean().exec((err, data) => {
|
|
console.log(data);
|
|
if (err) return done(err);
|
|
should(data).have.property('qty', 1);
|
|
NoteFieldModel.findOne({name: 'field1'}).lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
console.log(data);
|
|
should(data).have.property('qty', 1);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
it('deletes old note_fields', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000004',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200,
|
|
req: {notes: {comment: 'Testcomment', sample_references: []}}
|
|
}).end(err => {
|
|
if (err) return done (err);
|
|
NoteFieldModel.findOne({name: 'another_field'}).lean().exec((err, data) => {
|
|
if (err) return done (err);
|
|
should(data).be.null();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
it('keeps untouched notes', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000002',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {number: '111'}
|
|
}).end((err, res) => {
|
|
if (err) return done (err);
|
|
NoteModel.findById(res.body.note_id).lean().exec((err, data) => {
|
|
if (err) return done (err);
|
|
console.log(data);
|
|
should(data).not.be.null();
|
|
should(data).have.property('comment', 'Stoff gesperrt');
|
|
should(data).have.property('sample_references').have.lengthOf(0);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
it('deletes old notes', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000004',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200,
|
|
req: {notes: {comment: 'Testcomment', sample_references: []}}
|
|
}).end(err => {
|
|
if (err) return done (err);
|
|
NoteModel.findById('500000000000000000000003').lean().exec((err, data) => {
|
|
if (err) return done (err);
|
|
should(data).be.null();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
it('rejects a color not defined for the material', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Color not available for material'}
|
|
});
|
|
});
|
|
it('rejects an unknown material id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '000000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Material not available'}
|
|
});
|
|
});
|
|
it('rejects a sample number in use', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: '21', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Sample number already taken'}
|
|
});
|
|
});
|
|
it('rejects an invalid sample reference', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '000000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Sample reference not available'}
|
|
});
|
|
});
|
|
it('rejects an invalid material id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '10000000000h000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"material_id" with value "10000000000h000000000001" fails to match the required pattern: /[0-9a-f]{24}/'}
|
|
});
|
|
});
|
|
it('rejects an invalid id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/10000000000h000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 404,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
});
|
|
});
|
|
it('rejects an API key', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {key: 'janedoe'},
|
|
httpStatus: 401,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
});
|
|
});
|
|
it('rejects changes for samples from another user for a write user', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000003',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 403,
|
|
req: {}
|
|
});
|
|
});
|
|
it('accepts changes for samples from another user for a maintain/admin user', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200,
|
|
req: {},
|
|
res: {_id: '400000000000000000000001', number: '1', type: 'granulate', color: 'black', batch: '', material_id: '100000000000000000000004', note_id: null, user_id: '000000000000000000000002'}
|
|
});
|
|
});
|
|
it('rejects requests from a read user', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'user'},
|
|
httpStatus: 403,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
});
|
|
});
|
|
it('returns 404 for an unknown sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/000000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 404,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
});
|
|
})
|
|
it('rejects unauthorized requests', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'put',
|
|
url: '/sample/400000000000000000000001',
|
|
httpStatus: 401,
|
|
req: {number: '10', type: 'part', color: 'signalviolet', batch: '114531', material_id: '100000000000000000000002', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('DELETE /sample/{id}', () => {
|
|
it('deletes the sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
should(res.body).be.eql({status: 'OK'});
|
|
SampleModel.findById('400000000000000000000001').lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).be.null();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
it('deletes the notes of the sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000002',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
should(res.body).be.eql({status: 'OK'});
|
|
NoteModel.findById('500000000000000000000001').lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).be.null();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
it('adjusts the note_fields correctly', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000004',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
should(res.body).be.eql({status: 'OK'});
|
|
NoteFieldModel.findOne({name: 'not allowed for new applications'}).lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).have.property('qty', 1);
|
|
NoteFieldModel.findOne({name: 'another_field'}).lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).be.null();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
it('resets references to this sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000003',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
should(res.body).be.eql({status: 'OK'});
|
|
setTimeout(() => { // background action takes some time before we can check
|
|
NoteModel.findById('500000000000000000000003').lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
console.log(data);
|
|
should(data).have.property('sample_references').with.lengthOf(0);
|
|
done();
|
|
});
|
|
}, 100);
|
|
|
|
});
|
|
});
|
|
it('lets admin/maintain users delete samples of other users', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {basic: 'admin'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
should(res.body).be.eql({status: 'OK'});
|
|
SampleModel.findById('400000000000000000000001').lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).be.null();
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
it('rejects deleting samples of other users for write users', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000004',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 403
|
|
});
|
|
});
|
|
it('rejects an invalid id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000h00000000004',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 404
|
|
});
|
|
});
|
|
it('rejects requests from a read user', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000004',
|
|
auth: {basic: 'user'},
|
|
httpStatus: 403
|
|
});
|
|
});
|
|
it('returns 404 for an unknown id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/000000000000000000000004',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 404
|
|
});
|
|
});
|
|
it('rejects an API key', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000001',
|
|
auth: {key: 'janedoe'},
|
|
httpStatus: 401
|
|
});
|
|
});
|
|
it('rejects unauthorized requests', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'delete',
|
|
url: '/sample/400000000000000000000001',
|
|
httpStatus: 401
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('POST /sample/new', () => {
|
|
it('returns the right sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
}).end((err, res) => {
|
|
if (err) return done (err);
|
|
should(res.body).have.only.keys('_id', 'number', 'color', 'type', 'batch', 'material_id', 'note_id', 'user_id');
|
|
should(res.body).have.property('_id').be.type('string');
|
|
should(res.body).have.property('number', 'Rng172');
|
|
should(res.body).have.property('color', 'black');
|
|
should(res.body).have.property('type', 'granulate');
|
|
should(res.body).have.property('batch', '1560237365');
|
|
should(res.body).have.property('material_id', '100000000000000000000001');
|
|
should(res.body).have.property('note_id').be.type('string');
|
|
should(res.body).have.property('user_id', '000000000000000000000002');
|
|
done();
|
|
});
|
|
});
|
|
it('stores the sample', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
}).end(err => {
|
|
if (err) return done (err);
|
|
SampleModel.find({number: 'Rng172'}).lean().exec((err, data: any) => {
|
|
if (err) return done (err);
|
|
should(data).have.lengthOf(1);
|
|
should(data[0]).have.only.keys('_id', 'number', 'color', 'type', 'batch', 'material_id', 'note_id', 'user_id', '__v');
|
|
should(data[0]).have.property('_id');
|
|
should(data[0]).have.property('number', 'Rng172');
|
|
should(data[0]).have.property('color', 'black');
|
|
should(data[0]).have.property('type', 'granulate');
|
|
should(data[0]).have.property('batch', '1560237365');
|
|
should(data[0].material_id.toString()).be.eql('100000000000000000000001');
|
|
should(data[0].user_id.toString()).be.eql('000000000000000000000002');
|
|
should(data[0]).have.property('note_id');
|
|
NoteModel.findById(data[0].note_id).lean().exec((err, data: any) => {
|
|
if (err) return done (err);
|
|
should(data).have.property('_id');
|
|
should(data).have.property('comment', 'Testcomment');
|
|
should(data).have.property('sample_references');
|
|
should(data.sample_references).have.lengthOf(1);
|
|
should(data.sample_references[0].id.toString()).be.eql('400000000000000000000003');
|
|
should(data.sample_references[0]).have.property('relation', 'part to this sample');
|
|
done();
|
|
});
|
|
})
|
|
});
|
|
});
|
|
it('stores the custom fields', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 200,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [], custom_fields: {field1: 'a', field2: 'b', 'not allowed for new applications': true}}}
|
|
}).end((err, res) => {
|
|
if (err) return done (err);
|
|
NoteModel.findById(res.body.note_id).lean().exec((err, data: any) => {
|
|
if (err) return done(err);
|
|
should(data).have.property('_id');
|
|
should(data).have.property('comment', 'Testcomment');
|
|
should(data).have.property('sample_references').have.lengthOf(0);
|
|
should(data).have.property('custom_fields');
|
|
should(data.custom_fields).have.property('field1', 'a');
|
|
should(data.custom_fields).have.property('field2', 'b');
|
|
should(data.custom_fields).have.property('not allowed for new applications', true);
|
|
NoteFieldModel.find({name: 'field1'}).lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).have.lengthOf(1);
|
|
should(data[0]).have.property('qty', 1);
|
|
NoteFieldModel.find({name: 'field2'}).lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).have.lengthOf(1);
|
|
should(data[0]).have.property('qty', 1);
|
|
NoteFieldModel.find({name: 'not allowed for new applications'}).lean().exec((err, data) => {
|
|
if (err) return done(err);
|
|
should(data).have.lengthOf(1);
|
|
should(data[0]).have.property('qty', 3);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
it('rejects a color not defined for the material', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'green', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Color not available for material'}
|
|
});
|
|
});
|
|
it('rejects an unknown material id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '000000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Material not available'}
|
|
});
|
|
});
|
|
it('rejects a sample number in use', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: '1', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Sample number already taken'}
|
|
});
|
|
});
|
|
it('rejects an invalid sample reference', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '000000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Sample reference not available'}
|
|
});
|
|
});
|
|
it('rejects a missing color', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"color" is required'}
|
|
});
|
|
});
|
|
it('rejects a missing sample number', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"number" is required'}
|
|
});
|
|
});
|
|
it('rejects a missing type', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'black', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"type" is required'}
|
|
});
|
|
});
|
|
it('rejects a missing batch', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"batch" is required'}
|
|
});
|
|
});
|
|
it('rejects a missing material id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"material_id" is required'}
|
|
});
|
|
});
|
|
it('rejects an invalid material id', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'janedoe'},
|
|
httpStatus: 400,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '10000000000h000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}},
|
|
res: {status: 'Invalid body format', details: '"material_id" with value "10000000000h000000000001" fails to match the required pattern: /[0-9a-f]{24}/'}
|
|
});
|
|
});
|
|
it('rejects an API key', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {key: 'janedoe'},
|
|
httpStatus: 401,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
});
|
|
});
|
|
it('rejects requests from a read user', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
auth: {basic: 'user'},
|
|
httpStatus: 403,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
});
|
|
});
|
|
it('rejects unauthorized requests', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'post',
|
|
url: '/sample/new',
|
|
httpStatus: 401,
|
|
req: {number: 'Rng172', color: 'black', type: 'granulate', batch: '1560237365', material_id: '100000000000000000000001', notes: {comment: 'Testcomment', sample_references: [{id: '400000000000000000000003', relation: 'part to this sample'}]}}
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('GET /sample/notes/fields', () => {
|
|
it('returns all fields', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'get',
|
|
url: '/sample/notes/fields',
|
|
auth: {basic: 'user'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
const json = require('../test/db.json');
|
|
should(res.body).have.lengthOf(json.collections.note_fields.length);
|
|
should(res.body).matchEach(material => {
|
|
should(material).have.only.keys('name', 'qty');
|
|
should(material).have.property('qty').be.type('number');
|
|
});
|
|
done();
|
|
});
|
|
});
|
|
it('works with an API key', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'get',
|
|
url: '/sample/notes/fields',
|
|
auth: {key: 'user'},
|
|
httpStatus: 200
|
|
}).end((err, res) => {
|
|
if (err) return done(err);
|
|
const json = require('../test/db.json');
|
|
should(res.body).have.lengthOf(json.collections.note_fields.length);
|
|
should(res.body).matchEach(material => {
|
|
should(material).have.only.keys('name', 'qty');
|
|
should(material).have.property('qty').be.type('number');
|
|
});
|
|
done();
|
|
});
|
|
});
|
|
it('rejects unauthorized requests', done => {
|
|
TestHelper.request(server, done, {
|
|
method: 'get',
|
|
url: '/sample/notes/fields',
|
|
httpStatus: 401
|
|
});
|
|
});
|
|
});
|
|
});
|