test/unit/helpers.site-member.js
import test from 'ava';
import sinon from 'sinon';
import {
client,
SiteMember,
} from '../../src';
// See tests.js for testing client creation
const siteMemberJsonApi = {
id: 5,
type: 'trials__site_members',
attributes: {
account_status: undefined,
consent_status: undefined,
member_type: 'pi',
first_consented_at: undefined,
last_consented_at: undefined,
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
}
};
const siteMemberJson = {
id: 5,
consent_status: undefined,
type: 'trials__site_members',
first_consented_at: undefined,
last_consented_at: undefined,
member_type: 'pi',
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
};
test.before('start server', () => {
client.apiBaseUrl = 'https://somesiteMember.Clinical6.com';
client.authToken = 'valid_token';
});
test.beforeEach((t) => {
client.cache = 'never';
client.authToken = 'valid_token';
t.context.server = sinon.fakeServer.create();
t.context.server.autoRespond = true;
t.context.server.respondWith('DELETE', `${client.apiBaseUrl}/v3/trials/site_members/*`,
[200, { 'Content-Type': 'application/json' }, JSON.stringify({ status: 'ok' })]);
t.context.server.respondWith('PATCH', `${client.apiBaseUrl}/v3/trials/site_members/*`,
[200, { 'Content-Type': 'application/json' }, JSON.stringify({
data: {
id: '7',
type: 'trials__site_members',
attributes: {
member_type: 'pi',
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
},
relationships: {
site: {
data: {
id: '4',
type: 'trials__sites'
}
},
mobile_user: {
data: {
id: '66',
type: 'mobile_users'
}
}
}
},
included: [
{
id: '4',
type: 'trials__sites',
attributes: {
site_id: '196988',
name: 'Florine Turcotte',
email: 'marilou@donnelly.org',
phone_number: null,
fax_number: null,
contact_name: null,
contact_email: null,
contact_phone: null,
contact_fax: null,
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
},
relationships: {
location: {
data: {
id: '8',
type: 'locations'
}
},
agreement_templates: {
data: []
}
}
},
{
id: '66',
type: 'mobile_users',
attributes: {
uuid: '10e6b58f-f14c-41e8-9418-1c6662ba2c55',
account_name: 'dummy_65',
email: 'user75@fake.com',
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z',
verified_at: null,
invitation_sent_at: null,
invitation_accepted_at: null,
disabled: false,
disabled_at: null
},
relationships: {
devices: {
data: []
},
user_role: {
data: null
},
profile: {
data: {
id: '73',
type: 'profiles'
}
},
language: {
data: {
id: '39',
type: 'languages'
}
},
patient: {
data: {
id: '7',
type: 'trials__site_members'
}
}
}
},
{
id: '73',
type: 'profiles',
attributes: {
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z',
first_name: 'Orlo',
middle_initial: null,
last_name: 'Mills',
prefix: null,
suffix: null,
gender: 'male',
ethnicity: '',
occupation: null,
avatar: {
url: '/uploads/test/profile/avatar/73/1.png',
small: {
url: '/uploads/test/profile/avatar/73/small_1.png'
},
main: {
url: '/uploads/test/profile/avatar/73/main_1.png'
},
thumb: {
url: '/uploads/test/profile/avatar/73/thumb_1.png'
}
},
username: null,
dob: null,
timezone: 'UTC',
phone: null,
email: 'user75@fake.com',
age: 40
},
relationships: {
profileable: {
data: {
id: '66',
type: 'mobile_users'
}
}
}
}
]
})]);
t.context.server.respondWith('POST', `${client.apiBaseUrl}/v3/trials/site_members`,
[201, { 'Content-Type': 'application/json' }, JSON.stringify({
data: {
id: '4',
type: 'trials__site_members',
attributes: {
member_type: 'pi',
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
},
relationships: {
site: {
data: {
id: '1',
type: 'trials__sites'
}
},
mobile_user: {
data: {
id: '60',
type: 'mobile_users'
}
}
}
},
included: [
{
id: '1',
type: 'trials__sites',
attributes: {
site_id: '945378',
name: 'Florine Turcotte',
email: 'marilou@donnelly.org',
phone_number: null,
fax_number: null,
contact_name: null,
contact_email: null,
contact_phone: null,
contact_fax: null,
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
},
relationships: {
location: {
data: {
id: '5',
type: 'locations'
}
},
agreement_templates: {
data: []
}
}
},
{
id: '60',
type: 'mobile_users',
attributes: {
uuid: 'e9f40ce5-eb70-4b01-ae66-6d1d966df1f4',
account_name: 'dummy_59',
email: 'user69@fake.com',
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z',
verified_at: null,
invitation_sent_at: null,
invitation_accepted_at: null,
disabled: false,
disabled_at: null
},
relationships: {
devices: {
data: []
},
user_role: {
data: null
},
profile: {
data: {
id: '67',
type: 'profiles'
}
},
language: {
data: {
id: '36',
type: 'languages'
}
},
patient: {
data: {
id: '4',
type: 'trials__site_members'
}
}
}
},
{
id: '67',
type: 'profiles',
attributes: {
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z',
first_name: 'Sean',
middle_initial: null,
last_name: 'Hudson',
prefix: null,
suffix: null,
gender: 'male',
ethnicity: '',
occupation: null,
avatar: {
url: '/uploads/test/profile/avatar/67/1.png',
small: {
url: '/uploads/test/profile/avatar/67/small_1.png'
},
main: {
url: '/uploads/test/profile/avatar/67/main_1.png'
},
thumb: {
url: '/uploads/test/profile/avatar/67/thumb_1.png'
}
},
username: null,
dob: null,
timezone: 'UTC',
phone: null,
email: 'user69@fake.com',
age: 40
},
relationships: {
profileable: {
data: {
id: '60',
type: 'mobile_users'
}
}
}
}
]
})]);
t.context.storage = client.storageUtility;
client.siteMember = new SiteMember({});
t.context.siteMemberJsonApi = {
id: 5,
type: 'trials__site_members',
attributes: {
member_type: 'pi',
created_at: '2017-10-27T23:41:16Z',
updated_at: '2017-10-27T23:41:16Z'
},
relationships: {
mobile_user: {
data: {
type: 'mobile_users',
id: 66
}
},
site: {
data: {
type: 'trials__sites',
id: 4
}
}
}
};
t.context.siteMember = new SiteMember(t.context.siteMemberJsonApi);
});
test.afterEach(t => t.context.server.restore());
/**
* @test {SiteMember}
*/
test('[unit] SiteMember should handle siteMember data with a normal json format', (t) => {
const siteMember = new SiteMember(siteMemberJson);
t.is(siteMember.id, 5);
t.is(siteMember.type, 'trials__site_members');
t.is(siteMember.createdAt, '2017-10-27T23:41:16Z');
t.is(siteMember.updatedAt, '2017-10-27T23:41:16Z');
});
/**
* @test {SiteMember}
*/
test('[unit] SiteMember should handle siteMember data with json api format', (t) => {
const siteMember = new SiteMember({ data: siteMemberJsonApi });
t.is(siteMember.id, 5);
t.is(siteMember.type, 'trials__site_members');
t.is(siteMember.createdAt, '2017-10-27T23:41:16Z');
t.is(siteMember.updatedAt, '2017-10-27T23:41:16Z');
});
/**
* @test {SiteMember}
*/
test('[unit] SiteMember should generate json api format when converted to string', (t) => {
let siteMember = new SiteMember({ data: siteMemberJsonApi });
let json = siteMember.toJSON();
// delete json.relationships;
t.deepEqual(json, siteMemberJsonApi);
siteMember = new SiteMember({ data: siteMemberJsonApi });
json = siteMember.toJSON();
// delete json.relationships;
t.deepEqual(json, siteMemberJsonApi);
});
/**
* @test {SiteMember.delete}
*/
test('[unit] SiteMember.delete should successfully delete a siteMember', async (t) => {
const siteMember = new SiteMember({ data: siteMemberJsonApi });
const response = await siteMember.delete();
// const request = t.context.server.requests[0];
// t.is(request.method, 'DELETE');
// t.is(request.url, `${client.apiBaseUrl}/v3/trials/site_members/${siteMember.id}`);
// t.is(request.requestHeaders.Accept, 'application/json');
// t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
t.truthy(response);
});
/**
* @test {SiteMember.save}
*/
test('[unit] SiteMember.save should successfully insert a siteMember with a siteMember object when id does not exist', async (t) => {
const json = JSON.parse(JSON.stringify(siteMemberJsonApi));
delete json.id;
const siteMember = new SiteMember({ data: json });
const response = await siteMember.save();
// const request = t.context.server.requests[0];
// t.is(request.method, 'POST');
// t.is(request.url, `${client.apiBaseUrl}/v3/trials/site_members`);
// t.is(request.requestHeaders.Accept, 'application/json');
// t.deepEqual(JSON.parse(request.requestBody), { data: json });
// t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
t.is(response.id, 4);
t.is(response.type, 'trials__site_members');
});
/**
* @test {SiteMember.save}
*/
test('[unit] SiteMember.save should successfully update a siteMember with a siteMember object when id exists', async (t) => {
const siteMember = new SiteMember({ data: siteMemberJsonApi });
const response = await siteMember.save();
// const request = t.context.server.requests[0];
// t.is(request.method, 'PATCH');
// t.is(request.url, `${client.apiBaseUrl}/v3/trials/site_members/${siteMember.id}`);
// t.is(request.requestHeaders.Accept, 'application/json');
// t.deepEqual(JSON.parse(request.requestBody), { data: siteMemberJsonApi });
// t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
t.is(response.id, 7);
t.is(response.type, 'trials__site_members');
});