mirror of
https://github.com/bckelley/cgm-remote-monitor.git
synced 2026-08-24 03:14:12 -05:00
115 lines
3.0 KiB
JavaScript
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;
|
|
}
|
|
};
|
|
}
|