test/unit/services.custom.user.genisis.v3.js
import test from 'ava';
import nock from 'nock';
import {
client,
clinical6,
stringToCamel,
Helper,
HelperFactory,
User,
} from '../../src';
class CustomClass extends Helper {
constructor(json = {}) {
super(json);
this._relationships = {};
const _response = json.data || json; // if json api is passed in directly
const attributes = _response.attributes || _response; // if json api is passed in directly
if (_response.id) {
/** @type {Number} */
this.id = parseInt(_response.id, 10);
}
// Object.assign(this, attributes);
Object.keys(attributes).forEach((key) => {
if (['type', 'relationships', 'id'].indexOf(key) === -1) {
/** @type {Any} */
this[stringToCamel(key)] = attributes[key];
}
});
this.deserializeRelationshipStubs(json);
this.syncRelationships(json);
}
}
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'
}
}
}
}
]
};
});
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);
});