test/unit/services.custom-class.user.genisis.v3.js
import test from 'ava';
import nock from 'nock';
import {
client,
clinical6,
jsonApiService,
CustomClass,
HelperFactory,
User,
} from '../../src';
class GenisisActivityStatus extends CustomClass {
static get type() { return 'genisis__activity_statuses'; }
}
HelperFactory.map.genisis__activity_statuses = GenisisActivityStatus;
test.before('start server', (t) => {
client.apiBaseUrl = 'https://somesite.Clinical6.com';
t.context.getResponseActivityStatus = {
data: [
{
id: '100000050',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Informed Consent',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '329',
type: 'mobile_users'
}
}
}
},
{
id: '100000051',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'HIPAA Authorization',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '329',
type: 'mobile_users'
}
}
}
},
{
id: '100000053',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Specimen Collection',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '329',
type: 'mobile_users'
}
}
}
},
{
id: '100000054',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Lifestyle Survey',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '329',
type: 'mobile_users'
}
}
}
},
{
id: '100000052',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Baseline Survey',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '329',
type: 'mobile_users'
}
}
}
},
{
id: '100000055',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Withdrawal',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '329',
type: 'mobile_users'
}
}
}
}
]
};
t.context.updateResponseActivityStatus = {
data: [
{
id: '100000050',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Informed Consent',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '221',
type: 'mobile_users'
}
}
}
},
{
id: '100000051',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'HIPAA Authorization',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '221',
type: 'mobile_users'
}
}
}
},
{
id: '100000053',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Specimen Collection',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '221',
type: 'mobile_users'
}
}
}
},
{
id: '100000054',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Lifestyle Survey',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '221',
type: 'mobile_users'
}
}
}
},
{
id: '100000052',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Baseline Survey',
study_activity_source: 'PRE',
activity_status: 'None',
activity_version: '1.0',
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '221',
type: 'mobile_users'
}
}
}
},
{
id: '100000055',
type: 'genisis__activity_statuses',
attributes: {
genisis_id: 10000005,
study_id: 1,
study_activity_name: 'Withdrawal',
study_activity_source: null,
activity_status: 'None',
activity_version: null,
updated_at: null,
additional_info: null
},
relationships: {
mobile_user: {
data: {
id: '221',
type: 'mobile_users'
}
}
}
}
]
};
});
test.after('server shut down', () => {});
test.beforeEach((t) => {
client.cache = 'never';
client.authToken = 'valid_token';
t.context.storage = client.storageUtility;
});
// UserService.getChildren method
/**
* @test {Clinical6.getChildren}
*/
test.serial('[unit] UserService.getChildren should throw an error when there is no authToken or invalid params', async (t) => {
client.authToken = undefined;
const title = `UserService.getChildren error`;
const user = new User({ id: 329 });
await t.throwsAsync(clinical6.getChildren(user, { type: 'genisis__activity_statuses' }), `${title}: requires authToken`);
client.authToken = 'valid_authToken';
await t.throwsAsync(clinical6.getChildren(user), `${title}: child does not have type`);
});
/**
* @test {Clinical6.getChildren}
*/
test(`[unit] UserService.getChildren should receive a valid request and response for a get request without an id`, async (t) => {
const { getResponseActivityStatus } = t.context;
const user = new User({ id: 329 });
user.type = 'mobile_users';
let request = {};
nock(client.apiBaseUrl).get(`/v3/mobile_users/${user.id}/genisis/activity_statuses`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [200, getResponseActivityStatus];
});
const response = await clinical6.getChildren(user, { type: 'genisis__activity_statuses' });
t.is(request.path, `/v3/mobile_users/329/genisis/activity_statuses`);
t.is(request.headers.accept, 'application/json');
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
t.truthy(response);
t.is(Object.keys(response).length, 6);
t.truthy(response[0] instanceof GenisisActivityStatus);
t.is(response[0].id, 100000050);
t.is(response[0].type, 'genisis__activity_statuses');
t.is(response[0].genisisId, 10000005);
t.is(response[0].studyId, 1);
t.is(response[0].studyActivityName, 'Informed Consent');
t.is(response[0].studyActivitySource, null);
t.is(response[0].activityStatus, 'None');
t.is(response[0].activityVersion, null);
t.is(response[0].updatedAt, null);
t.is(response[0].additionalInfo, null);
t.truthy(response[0].mobileUser);
t.is(response[0].mobileUser.id, '329');
t.truthy(response[1] instanceof GenisisActivityStatus);
t.is(response[0].id, 100000050);
t.is(response[0].type, 'genisis__activity_statuses');
t.is(response[0].genisisId, 10000005);
t.is(response[0].studyId, 1);
t.is(response[0].studyActivityName, 'Informed Consent');
t.is(response[0].studyActivitySource, null);
t.is(response[0].activityStatus, 'None');
t.is(response[0].activityVersion, null);
t.is(response[0].updatedAt, null);
t.is(response[0].additionalInfo, null);
t.truthy(response[2] instanceof GenisisActivityStatus);
t.is(response[0].id, 100000050);
t.is(response[0].type, 'genisis__activity_statuses');
t.is(response[0].genisisId, 10000005);
t.is(response[0].studyId, 1);
t.is(response[0].studyActivityName, 'Informed Consent');
t.is(response[0].studyActivitySource, null);
t.is(response[0].activityStatus, 'None');
t.is(response[0].activityVersion, null);
t.is(response[0].updatedAt, null);
t.is(response[0].additionalInfo, null);
});
/**
* @test {JsonApiService.update}
*/
test(`[unit] JsonApiService.update should update a genisis status`, async (t) => {
const { updateResponseActivityStatus } = t.context;
const genisisStatusObj = new GenisisActivityStatus({
studyActivityName: 'Baseline Survey',
studyActivitySource: 'PRE',
activityStatus: 'None',
activityVersion: '1.0',
additionalInfo: null
});
const user = new User({ id: 221 });
user.type = 'mobile_users';
let request = {};
nock(client.apiBaseUrl).patch(`/v3/${user.type}/${user.id}/genisis/activity_statuses`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [200, updateResponseActivityStatus];
});
const response = await jsonApiService.update(genisisStatusObj, { url: `/v3/${user.type}/${user.id}/genisis/activity_statuses` });
t.truthy(response, 'Status must exist');
t.truthy(response);
t.is(Object.keys(response).length, 6);
t.truthy(response[0] instanceof GenisisActivityStatus);
t.is(response[0].id, 100000050);
t.is(response[0].type, 'genisis__activity_statuses');
t.is(response[0].genisisId, 10000005);
t.is(response[0].studyId, 1);
t.is(response[0].studyActivityName, 'Informed Consent');
t.is(response[0].studyActivitySource, null);
t.is(response[0].activityStatus, 'None');
t.is(response[0].activityVersion, null);
t.is(response[0].updatedAt, null);
t.is(response[0].additionalInfo, null);
t.truthy(response[0].mobileUser);
t.is(response[0].mobileUser.id, '221');
t.truthy(response[1] instanceof GenisisActivityStatus);
t.is(response[0].id, 100000050);
t.is(response[0].type, 'genisis__activity_statuses');
t.is(response[0].genisisId, 10000005);
t.is(response[0].studyId, 1);
t.is(response[0].studyActivityName, 'Informed Consent');
t.is(response[0].studyActivitySource, null);
t.is(response[0].activityStatus, 'None');
t.is(response[0].activityVersion, null);
t.is(response[0].updatedAt, null);
t.is(response[0].additionalInfo, null);
t.truthy(response[2] instanceof GenisisActivityStatus);
t.is(response[0].id, 100000050);
t.is(response[0].type, 'genisis__activity_statuses');
t.is(response[0].genisisId, 10000005);
t.is(response[0].studyId, 1);
t.is(response[0].studyActivityName, 'Informed Consent');
t.is(response[0].studyActivitySource, null);
t.is(response[0].activityStatus, 'None');
t.is(response[0].activityVersion, null);
t.is(response[0].updatedAt, null);
t.is(response[0].additionalInfo, null);
});