Skip to content

Commit 7cbe643

Browse files
committed
Update Enketo mock in testing
1 parent 8fa1c3e commit 7cbe643

File tree

6 files changed

+82
-37
lines changed

6 files changed

+82
-37
lines changed

test/integration/api/forms/draft.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ describe('api: /projects/:id/forms (drafts)', () => {
9696
.then(({ body }) => {
9797
body.enketoId.should.equal('::abcdefgh');
9898
should.not.exist(body.enketoOnceId);
99-
global.enketoReceivedUrl.startsWith(container.env.domain).should.equal(true);
100-
global.enketoReceivedUrl.should.match(/\/v1\/test\/[a-z0-9$!]{64}\/projects\/1\/forms\/simple\/draft/i);
99+
global.enketo.receivedUrl.startsWith(container.env.domain).should.equal(true);
100+
global.enketo.receivedUrl.should.match(/\/v1\/test\/[a-z0-9$!]{64}\/projects\/1\/forms\/simple\/draft/i);
101101
})))));
102102

103103
it('should manage draft/published enketo tokens separately', testService((service, container) =>
@@ -108,7 +108,7 @@ describe('api: /projects/:id/forms (drafts)', () => {
108108
.expect(200)
109109
.then(() => exhaust(container))
110110
.then(() => {
111-
global.enketoToken = '::ijklmnop';
111+
global.enketo.token = '::ijklmnop';
112112
return asAlice.post('/v1/projects/1/forms/simple2/draft')
113113
.expect(200)
114114
.then(() => exhaust(container))
@@ -814,7 +814,7 @@ describe('api: /projects/:id/forms (drafts)', () => {
814814
.expect(200)
815815
.then(() => exhaust(container))
816816
.then(() => {
817-
global.enketoToken = '::ijklmnop';
817+
global.enketo.token = '::ijklmnop';
818818
return asAlice.post('/v1/projects/1/forms/simple2/draft')
819819
.expect(200)
820820
.then(() => exhaust(container))

test/integration/api/forms/forms.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,7 @@ describe('api: /projects/:id/forms (create, read, update)', () => {
768768
.expect(200)
769769
.then(() => exhaust(container))
770770
.then(() => {
771-
global.enketoToken = '::ijklmnop';
771+
global.enketo.token = '::ijklmnop';
772772
return asAlice.post('/v1/projects/1/forms/simple2/draft')
773773
.expect(200)
774774
.then(() => exhaust(container))

test/integration/api/submissions.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,11 +1247,12 @@ describe('api: /forms/:id/submissions', () => {
12471247
.then(() => asAlice.get('/v1/projects/1/forms/binaryType/submissions/both/edit')
12481248
.expect(302))
12491249
.then(() => {
1250-
global.enketoEditData.openRosaUrl.should.equal('http://localhost:8989/v1/projects/1');
1251-
global.enketoEditData.domain.should.equal('http://localhost:8989');
1252-
global.enketoEditData.logicalId.should.equal('both');
1253-
global.enketoEditData.attachments.length.should.equal(2);
1254-
global.enketoEditData.token.should.be.a.token();
1250+
const { editData } = global.enketo;
1251+
editData.openRosaUrl.should.equal('http://localhost:8989/v1/projects/1');
1252+
editData.domain.should.equal('http://localhost:8989');
1253+
editData.logicalId.should.equal('both');
1254+
editData.attachments.length.should.equal(2);
1255+
editData.token.should.be.a.token();
12551256
}))));
12561257
});
12571258

test/integration/other/transactions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ describe('enketo worker transaction', () => {
5252
await Audits.log(null, 'form.update.publish', simple);
5353

5454
let flush;
55-
global.enketoWait = (f) => { flush = f; };
55+
global.enketo.wait = (f) => { flush = f; };
5656
const workerTicket = exhaust(container);
5757
// eslint-disable-next-line no-await-in-loop
5858
while (flush == null) await sometime(50);

test/integration/setup.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ const bcrypt = require(appRoot + '/lib/util/crypto').password(_bcrypt);
4444

4545
// set up our enketo mock.
4646
// eslint-disable-next-line import/no-dynamic-require
47-
const enketo = require(appRoot + '/test/util/enketo');
47+
const { reset: resetEnketo, ...enketo } = require(appRoot + '/test/util/enketo');
48+
beforeEach(resetEnketo);
4849

4950
// set up odk analytics mock.
5051
// eslint-disable-next-line import/no-dynamic-require

test/util/enketo.js

Lines changed: 68 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,76 @@
1+
// This file exports an enketo mock for testing. A test can communicate with the
2+
// mock by getting or setting properties of global.enketo.
3+
14
const appRoot = require('app-root-path');
25
const { call } = require('ramda');
3-
// eslint-disable-next-line import/no-dynamic-require
46
const Problem = require(appRoot + '/lib/util/problem');
7+
const { without } = require(appRoot + '/lib/util/util');
8+
9+
const defaults = {
10+
// Properties that each test can set
11+
12+
// If `state` is set to 'error', the mock will pretend that Enketo has
13+
// misbehaved and will return a rejected promise for the next call.
14+
state: undefined,
15+
// Controls the timing of the Enketo response.
16+
wait: call,
17+
// The enketoId for the create() or createOnceToken() method to return. By
18+
// default, it is ::abcdefgh for create() and ::::abcdefgh for
19+
// createOnceToken().
20+
token: undefined,
21+
22+
// Properties that may be updated after the mock is called
23+
24+
// The total number of times that the mock has been called during the test
25+
callCount: 0,
26+
// The OpenRosa URL that was passed to the create() or createOnceToken()
27+
// method
28+
receivedUrl: undefined,
29+
// An object with a property for each argument passed to the edit() method
30+
editData: undefined
31+
};
532

6-
const _create = (prefix) => (openRosaUrl) => new Promise((resolve, reject) => {
7-
const state = global.enketoPreviewTest;
8-
global.enketoPreviewTest = null;
9-
const token = global.enketoToken || `${prefix}abcdefgh`;
10-
global.enketoToken = null;
11-
global.enketoReceivedUrl = null;
12-
const wait = global.enketoWait || call;
13-
global.enketoWait = null;
14-
15-
wait(() => {
16-
if (state === 'error') {
17-
// pretend that Enketo has misbehaved
18-
reject(Problem.internal.enketoUnexpectedResponse('wrong status code'));
19-
} else {
20-
global.enketoReceivedUrl = openRosaUrl;
21-
resolve(token);
22-
}
33+
let cancelToken = 0;
34+
35+
const reset = () => {
36+
if (global.enketo === undefined) global.enketo = {};
37+
Object.assign(global.enketo, defaults);
38+
cancelToken += 1;
39+
};
40+
41+
// Mocks a request to Enketo.
42+
const request = (f) => {
43+
global.enketo.callCount += 1;
44+
const options = { ...global.enketo };
45+
Object.assign(global.enketo, without(['callCount'], defaults));
46+
return new Promise((resolve, reject) => {
47+
const { wait } = options;
48+
const tokenBeforeWait = cancelToken;
49+
wait(() => {
50+
if (cancelToken !== tokenBeforeWait)
51+
reject(new Error('request was canceled'));
52+
else if (options.state === 'error')
53+
reject(Problem.internal.enketoUnexpectedResponse('wrong status code'));
54+
else
55+
resolve(f(options));
56+
});
2357
});
24-
});
58+
};
2559

26-
const edit = (openRosaUrl, domain, form, logicalId, submissionDef, attachments, token) => new Promise((resolve) => {
27-
global.enketoEditTest = null;
28-
global.enketoEditData = { openRosaUrl, domain, form, logicalId, submissionDef, attachments, token };
29-
resolve('https://enketo/edit/url');
30-
});
60+
const _create = (prefix) => (openRosaUrl) =>
61+
request(({ token = `${prefix}abcdefgh` }) => {
62+
global.enketo.receivedUrl = openRosaUrl;
63+
return token;
64+
});
65+
66+
const edit = (openRosaUrl, domain, form, logicalId, submissionDef, attachments, token) =>
67+
request(() => {
68+
global.enketo.editData = { openRosaUrl, domain, form, logicalId, submissionDef, attachments, token };
69+
return 'https://enketo/edit/url';
70+
});
3171

32-
module.exports = { create: _create('::'), createOnceToken: _create('::::'), edit };
72+
module.exports = {
73+
create: _create('::'), createOnceToken: _create('::::'), edit,
74+
reset
75+
};
3376

0 commit comments

Comments
 (0)