test/unit/helpers.consultation.js
import test from 'ava';
import nock from 'nock';
import {
client,
clinical6,
Consultation,
ConsultationParticipant,
} from '../../src';
test.before('start server', (t) => {
client.apiBaseUrl = 'https://somesite.Clinical6.com';
client.authToken = 'valid_token';
t.context.updateResponse = {
data: {
id: '3',
type: 'video_consultations',
attributes: {
name: 'Video Consultation Name',
start_at: '2018-07-26T02:49:20Z',
end_at: '2018-07-26T03:49:20Z',
status: 'active',
confirmed_at: null,
deleted_at: null,
created_at: '2018-07-26T02:49:20Z',
updated_at: '2018-07-26T02:49:20Z'
},
relationships: {
video_consultation_participants: {
data: []
}
}
}
};
t.context.insertResponse = {
data: {
id: '4',
type: 'video_consultations',
attributes: {
name: 'Video Consultation Name',
start_at: '2018-07-26T02:49:20Z',
end_at: null,
status: null,
confirmed_at: null,
deleted_at: null,
created_at: '2018-07-26T02:49:20Z',
updated_at: '2018-07-26T02:49:20Z'
},
relationships: {
video_consultation_participants: {
data: []
}
}
}
};
t.context.insertParticipantResponse = {
data: {
id: '1',
type: 'video_consultation_participants',
attributes: {
created_at: '2018-07-26T02:48:37Z',
updated_at: '2018-07-26T02:48:37Z'
},
relationships: {
video_consultation: {
data: {
id: '1',
type: 'video_consultations'
}
},
participant: {
data: {
id: '33',
type: 'mobile_users'
}
}
}
},
included: [
{
id: '1',
type: 'video_consultations',
attributes: {
name: 'General Consultation',
start_at: '2018-07-26T02:48:08Z',
end_at: null,
status: null,
confirmed_at: null,
deleted_at: null,
created_at: '2018-07-26T02:48:37Z',
updated_at: '2018-07-26T02:48:37Z'
},
relationships: {
video_consultation_participants: {
data: [
{
id: '1',
type: 'video_consultation_participants'
}
]
}
}
},
{
id: '217',
type: 'mobile_users',
attributes: {
uuid: 'f22462a2-4a0d-4e8b-8762-9b677284d290',
account_name: 'dummy_33',
email: 'user103@fake.com',
created_at: '2018-07-26T02:48:37Z',
updated_at: '2018-07-26T02:48:37Z',
invitation_sent_at: null,
invitation_accepted_at: null,
disabled: false,
disabled_at: null,
password_expired_at: '2018-10-24T02:48:37Z'
},
relationships: {
devices: {
data: []
},
user_role: {
data: null
},
profile: {
data: {
id: '103',
type: 'profiles'
}
},
language: {
data: {
id: '1',
type: 'languages'
}
},
patient: {
data: null
},
threads: {
data: []
},
site_member: {
data: null
},
overall_status: {
data: null
}
}
}
]
};
t.context.joinResponse = {
data: {
id: '2',
type: 'video_consultations',
attributes: {
name: 'General Consultation',
start_at: '2018-08-09T17:59:22Z',
end_at: null,
status: null,
session_identity: '1_MX40NTYwNDkzMn5-MTUzMjM3NzM4NzEzMn5wdEM0WWx6ODZ6b3JKbWJ3aXNvNlQrbmZ-UH4',
confirmed_at: null,
deleted_at: null,
created_at: '2018-08-09T18:00:43Z',
updated_at: '2018-08-09T18:00:44Z'
},
relationships: {
video_consultation_participants: {
data: [
{
id: '1',
type: 'video_consultation_participants'
}
]
}
}
},
included: [
{
id: '1',
type: 'video_consultation_participants',
attributes: {
created_at: '2018-08-09T18:00:44Z',
updated_at: '2018-08-09T18:00:44Z'
},
relationships: {
video_consultation: {
data: {
id: '2',
type: 'video_consultations'
}
},
participant: {
data: {
id: '209',
type: 'mobile_users'
}
}
}
}
],
meta: {
join_token: 'T1==cGFydG5lcl9pZD00NTYwNDkzMiZzaWc9ZTI0MjE3NzhlYTU5MGQ4NWM1NDkwZjM1ZGE3NGE4NjZlY2NlOTliYjpyb2xlPXB1Ymxpc2hlciZzZXNzaW9uX2lkPTFfTVg0ME5UWXdORGt6TW41LU1UVXpNak0zTnpNNE56RXpNbjV3ZEVNMFdXeDZPRFo2YjNKS2JXSjNhWE52TmxRcmJtWi1VSDQmY3JlYXRlX3RpbWU9MTUzMzgzNzY0NCZub25jZT0wLjY4NjIwOTA1NTk4MTM3NzUmZXhwaXJlX3RpbWU9MTUzMzg0MTI0NCZjb25uZWN0aW9uX2RhdGE9',
api_key: '45604932'
}
};
});
test.beforeEach((t) => {
client.cache = 'never';
client.authToken = 'valid_token';
t.context.storage = client.storageUtility;
t.context.consultationJsonApi = {
id: 4,
type: 'video_consultations',
attributes: {
confirmed_at: null,
created_at: null,
deleted_at: null,
session_identity: null,
end_at: null,
name: 'Video Consultation Name',
start_at: '2018-07-26T02:49:20+00:00',
status: null,
updated_at: null
}
};
t.context.consultationJson = {
id: 4,
type: 'video_consultations',
confirmed_at: null,
created_at: null,
deleted_at: null,
session_identity: null,
end_at: null,
name: 'Video Consultation Name',
start_at: '2018-07-26T02:49:20+00:00',
status: null,
updated_at: null
};
t.context.consultation = new Consultation(t.context.consultationJsonApi);
t.context.participantJsonApi = {
id: 1,
type: 'video_consultation_participants',
attributes: {
created_at: null,
updated_at: null,
},
relationships: {
video_consultation: {
data: {
id: 1,
type: 'video_consultations'
}
}
}
};
t.context.participant = new ConsultationParticipant(t.context.participantJsonApi);
t.context.joinRequest = {
data: {
type: 'video_consultation_join',
attributes: {},
relationships: {
video_consultation: {
data: {
id: 4,
type: 'video_consultations'
}
},
video_consultation_participant: {
data: {
id: 1,
type: 'video_consultation_participants'
}
}
}
}
};
});
/**
* @test {Consultation}
*/
test('[unit] Consultation should handle consultation data with a normal json format', (t) => {
const { consultationJson } = t.context;
const consultation = new Consultation(consultationJson);
t.is(consultation.id, 4);
t.is(consultation.type, 'video_consultations');
t.is(consultation.name, 'Video Consultation Name');
t.is(consultation.startAt, '2018-07-26T02:49:20+00:00');
});
/**
* @test {Consultation}
*/
test('[unit] Consultation should handle consultation data with json api format', (t) => {
const { consultationJsonApi } = t.context;
const consultation = new Consultation({ data: consultationJsonApi });
t.is(consultation.id, 4);
t.is(consultation.type, 'video_consultations');
t.is(consultation.name, 'Video Consultation Name');
t.is(consultation.startAt, '2018-07-26T02:49:20+00:00');
});
/**
* @test {Consultation}
*/
test('[unit] Consultation should generate json api format when converted to string', (t) => {
const { consultationJsonApi } = t.context;
let consultation = new Consultation({ data: consultationJsonApi });
let json = consultation.toJSON();
t.deepEqual(json, consultationJsonApi);
consultation = new Consultation({ data: consultationJsonApi });
json = consultation.toJSON();
t.deepEqual(json, consultationJsonApi);
});
/**
* @test {Consultation.delete}
*/
test('[unit] Consultation.delete should successfully delete a cohort assignment', async (t) => {
const { consultation } = t.context;
consultation.id = 5;
let request = {};
nock(client.apiBaseUrl).delete(`/v3/video_consultations/${consultation.id}`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [200, ''];
});
const response = await consultation.delete();
t.is(request.path, `/v3/video_consultations/${consultation.id}`);
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.falsy(response);
});
/**
* @test {Consultation.join}
*/
test('[unit] Consultation.join should successfully join a consultation by passing in a participant', async (t) => {
const {
consultationJsonApi,
joinRequest,
joinResponse,
participant,
} = t.context;
const json = JSON.parse(JSON.stringify(consultationJsonApi));
const consultation = new Consultation({ data: json });
let request = {};
nock(client.apiBaseUrl).post(`/v3/video_consultation_join`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [201, joinResponse];
});
const response = await consultation.join(participant);
t.is(request.path, `/v3/video_consultation_join`);
t.is(request.headers.accept, 'application/json');
t.deepEqual(request.requestBody, joinRequest);
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
t.is(response.id, 2);
t.is(response.type, 'video_consultations');
t.is(response.name, 'General Consultation');
t.is(response.startAt, '2018-08-09T17:59:22Z');
t.is(response.meta.joinToken, `T1==cGFydG5lcl9pZD00NTYwNDkzMiZzaWc9ZTI0MjE3NzhlYTU5MGQ4NWM1NDkwZj`
+ `M1ZGE3NGE4NjZlY2NlOTliYjpyb2xlPXB1Ymxpc2hlciZzZXNzaW9uX2lkPTFfTVg0ME5UWXdORGt6TW41LU1UVXpNak`
+ `0zTnpNNE56RXpNbjV3ZEVNMFdXeDZPRFo2YjNKS2JXSjNhWE52TmxRcmJtWi1VSDQmY3JlYXRlX3RpbWU9MTUzMzgzNz`
+ `Y0NCZub25jZT0wLjY4NjIwOTA1NTk4MTM3NzUmZXhwaXJlX3RpbWU9MTUzMzg0MTI0NCZjb25uZWN0aW9uX2RhdGE9`);
});
/**
* @test {Consultation.join}
*/
test('[unit] Consultation.join should successfully join a consultation where the user is a participant', async (t) => {
const {
consultationJsonApi,
insertParticipantResponse,
joinRequest,
joinResponse,
} = t.context;
const json = JSON.parse(JSON.stringify(consultationJsonApi));
const consultation = new Consultation({ data: json });
clinical6.user.id = 217;
clinical6.user.type = 'mobile_users';
nock(client.apiBaseUrl).post(`/v3/video_consultation_participants`).reply(201, insertParticipantResponse);
let request = {};
nock(client.apiBaseUrl).post(`/v3/video_consultation_join`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [201, joinResponse];
});
const response = await consultation.join();
t.is(request.path, `/v3/video_consultation_join`);
t.is(request.headers.accept, 'application/json');
t.deepEqual(request.requestBody, joinRequest);
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
t.is(response.id, 2);
t.is(response.type, 'video_consultations');
t.is(response.name, 'General Consultation');
t.is(response.startAt, '2018-08-09T17:59:22Z');
t.is(response.meta.joinToken, `T1==cGFydG5lcl9pZD00NTYwNDkzMiZzaWc9ZTI0MjE3NzhlYTU5MGQ4NWM1NDkwZj`
+ `M1ZGE3NGE4NjZlY2NlOTliYjpyb2xlPXB1Ymxpc2hlciZzZXNzaW9uX2lkPTFfTVg0ME5UWXdORGt6TW41LU1UVXpNak`
+ `0zTnpNNE56RXpNbjV3ZEVNMFdXeDZPRFo2YjNKS2JXSjNhWE52TmxRcmJtWi1VSDQmY3JlYXRlX3RpbWU9MTUzMzgzNz`
+ `Y0NCZub25jZT0wLjY4NjIwOTA1NTk4MTM3NzUmZXhwaXJlX3RpbWU9MTUzMzg0MTI0NCZjb25uZWN0aW9uX2RhdGE9`);
});
// Consultation.save
/**
* @test {Consultation.save}
*/
test('[unit] Consultation.save should successfully insert a consultation with a consultation object when id does not exist', async (t) => {
const { consultationJsonApi, insertResponse } = t.context;
const json = JSON.parse(JSON.stringify(consultationJsonApi));
delete json.id;
const consultation = new Consultation({ data: json });
let request = {};
nock(client.apiBaseUrl).post(`/v3/video_consultations`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [201, insertResponse];
});
const response = await consultation.save();
t.is(request.path, `/v3/video_consultations`);
t.is(request.headers.accept, 'application/json');
t.deepEqual(request.requestBody, { data: json });
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
t.is(response.id, 4);
t.is(response.type, 'video_consultations');
t.is(response.name, 'Video Consultation Name');
t.is(response.startAt, '2018-07-26T02:49:20Z');
});
/**
* @test {Consultation.save}
*/
test('[unit] Consultation.save should successfully update a consultation with a consultation object when id exists', async (t) => {
const { consultationJsonApi, updateResponse } = t.context;
const consultation = new Consultation({ data: consultationJsonApi });
let request = {};
nock(client.apiBaseUrl).patch(`/v3/video_consultations/${consultation.id}`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [200, updateResponse];
});
const response = await consultation.save();
t.is(request.path, `/v3/video_consultations/${consultation.id}`);
t.is(request.headers.accept, 'application/json');
t.deepEqual(request.requestBody, { data: consultationJsonApi });
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
t.is(response.id, 3);
t.is(response.type, 'video_consultations');
t.is(response.name, 'Video Consultation Name');
t.is(response.startAt, '2018-07-26T02:49:20Z');
});