Files
cgm-remote-monitor/tests/api3.patch.operation.test.js

115 lines
3.0 KiB
JavaScript

'use strict';
require('should');
describe('API3 PATCH operation', function () {
const should = require('should');
const security = require('../lib/api3/security');
const patchOperation = require('../lib/api3/generic/patch/operation');
let originalAuthenticate;
let originalDemandPermission;
beforeEach(() => {
originalAuthenticate = security.authenticate;
originalDemandPermission = security.demandPermission;
});
afterEach(() => {
security.authenticate = originalAuthenticate;
security.demandPermission = originalDemandPermission;
});
it('emits the merged patched document without re-reading storage', async () => {
const date = 1741255200000;
const storageDoc = {
identifier: 'test-patch-operation',
date: date,
utcOffset: 0,
app: 'nightscout-test',
device: 'ns://pump',
eventType: 'Temp Basal',
absolute: 1.2,
duration: 30,
srvModified: date - 1000
};
const patchDoc = {
absolute: 0.7,
duration: 0,
durationInMilliseconds: 26584
};
const events = [];
security.authenticate = async () => ({ subject: { name: 'patch-user' } });
security.demandPermission = async () => true;
const col = {
colName: 'treatments',
storage: {
identifyingFilter: identifier => ({ identifier }),
findOneFilter: async () => [Object.assign({}, storageDoc)],
updateOne: async () => ({ updated: 1 }),
findOne: async () => {
throw new Error('PATCH should not re-read the document after update');
}
},
resolveDates: doc => new Date(doc.srvModified),
autoPrune: () => {
events.push({ name: 'auto-prune' });
}
};
const ctx = {
bus: {
emit: (name, payload) => {
events.push({ name, payload });
}
}
};
const req = {
body: Object.assign({}, patchDoc),
params: { identifier: storageDoc.identifier },
get: () => null
};
const res = createResponse();
const handler = patchOperation(ctx, {}, {}, col);
await handler(req, res);
res.statusCode.should.equal(200);
should.exist(res.headers['Last-Modified']);
const updateEvent = events.find(event => event.name === 'storage-socket-update');
should.exist(updateEvent);
updateEvent.payload.colName.should.equal('treatments');
updateEvent.payload.doc.should.containEql({
identifier: storageDoc.identifier,
absolute: 0.7,
duration: 0,
durationInMilliseconds: 26584,
modifiedBy: 'patch-user'
});
updateEvent.payload.doc.endmills.should.equal(date + 26584);
});
});
function createResponse () {
return {
headers: {},
headersSent: false,
statusCode: null,
body: null,
setHeader (name, value) {
this.headers[name] = value;
},
status (code) {
this.statusCode = code;
return this;
},
json (body) {
this.body = body;
this.headersSent = true;
return this;
}
};
}