test/unit/helpers.consent-approver.js
import test from 'ava';
import nock from 'nock';
import {
client,
ConsentApprover,
} from '../../src';
// See tests.js for testing client creation
test.before('start server', () => {
client.apiBaseUrl = 'https://somesite.Clinical6.com';
client.authToken = 'valid_token';
});
test.beforeEach((t) => {
client.cache = 'never';
client.authToken = 'valid_token';
t.context.insertResponse = {
data: {
id: 14,
type: 'consent__approvers',
attributes: {
first_name: 'Snoop',
last_name: 'Dogg',
email: 'email@address.com',
title: 'title',
password: 'password'
},
relationships: {
consent_form_version: {
data: {
id: 1,
type: 'consent__form_versions'
}
}
}
}
};
t.context.consentApproverJsonApi = {
id: 14,
type: 'consent__approvers',
attributes: {
first_name: 'Snoop',
last_name: 'Dogg',
email: 'email@address.com',
password: 'password',
title: 'title'
},
relationships: {
consent_form_version: {
data: {
id: 1,
type: 'consent__form_versions'
}
}
}
};
t.context.consentApproverJson = {
id: 14,
first_name: 'Snoop',
last_name: 'Dogg',
email: 'email@address.com',
password: 'password',
title: 'title',
relationships: {
consent_form_version: {
data: {
id: 1,
type: 'consent__form_versions'
}
}
}
};
client.storageUtility.clear();
t.context.storage = client.storageUtility;
client.consentApprover = new ConsentApprover({});
t.context.consentApprover = new ConsentApprover({ data: t.context.consentApproverJsonApi });
});
/**
* @test {ConsentApprover}
*/
test('[unit] ConsentApprover should handle consentApprover data with a normal json format', (t) => {
const { consentApproverJson } = t.context;
const consentApprover = new ConsentApprover(consentApproverJson);
t.is(consentApprover.type, 'consent__approvers');
t.is(consentApprover.firstName, 'Snoop');
t.is(consentApprover.lastName, 'Dogg');
t.is(consentApprover.email, 'email@address.com');
t.is(consentApprover.title, 'title');
t.is(consentApprover.password, 'password');
t.is(consentApprover.consentFormVersion.id, 1);
t.is(consentApprover.consentFormVersion.type, 'consent__form_versions');
});
/**
* @test {ConsentApprover}
*/
test('[unit] ConsentApprover should handle consentApprover data with json api format', (t) => {
const { consentApproverJsonApi } = t.context;
const consentApprover = new ConsentApprover({ data: consentApproverJsonApi });
t.is(consentApprover.type, 'consent__approvers');
t.is(consentApprover.firstName, 'Snoop');
t.is(consentApprover.lastName, 'Dogg');
t.is(consentApprover.email, 'email@address.com');
t.is(consentApprover.title, 'title');
t.is(consentApprover.password, 'password');
t.is(consentApprover.consentFormVersion.id, 1);
t.is(consentApprover.consentFormVersion.type, 'consent__form_versions');
});
/**
* @test {ConsentApprover}
*/
test('[unit] ConsentApprover should generate json api format when converted to string', (t) => {
const { consentApproverJsonApi } = t.context;
let consentApprover = new ConsentApprover({ data: consentApproverJsonApi });
t.deepEqual(consentApprover.toJSON(), consentApproverJsonApi);
consentApprover = new ConsentApprover({ data: consentApproverJsonApi });
t.deepEqual(consentApprover.toJSON(), consentApproverJsonApi);
});
/**
* @test {ConsentApprover.delete}
*/
test('[unit] ConsentApprover.delete should successfully delete a site', async (t) => {
const { consentApproverJsonApi } = t.context;
const consentApprover = new ConsentApprover({ data: consentApproverJsonApi });
let request = {};
nock(client.apiBaseUrl).delete(`/v3/consent/approvers/${consentApprover.id}`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [204, ''];
});
const response = await consentApprover.delete();
t.is(request.path, `/v3/consent/approvers/${consentApprover.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 {ConsentApprover.delete}
*/
test('[unit] ConsentApprover.delete should remove the element from local storage', async (t) => {
const { consentApprover, storage } = t.context;
consentApprover.id = 14;
await storage.set('consent__approvers', consentApprover.toJSON(), { id: consentApprover.id });
await consentApprover.delete(consentApprover);
t.is(storage.has('consent__approvers', { id: consentApprover.id }), false);
});
/**
* @test {ConsentApprover.save}
*/
test('[unit] ConsentApprover.save should successfully save a new approver when id does not exist', async (t) => {
const { consentApproverJsonApi, insertResponse } = t.context;
const json = JSON.parse(JSON.stringify(consentApproverJsonApi));
delete json.id;
const consentApprover = new ConsentApprover({ data: json });
let request = {};
nock(client.apiBaseUrl).post(`/v3/consent/approvers`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [201, insertResponse];
});
const response = await consentApprover.save();
t.is(request.path, `/v3/consent/approvers`);
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, 14);
t.is(response.type, 'consent__approvers');
t.is(response.firstName, 'Snoop');
t.is(response.lastName, 'Dogg');
t.is(response.email, 'email@address.com');
t.is(response.title, 'title');
t.is(response.password, 'password');
t.is(response.consentFormVersion.id, 1);
t.is(response.consentFormVersion.type, 'consent__form_versions');
});
/**
* @test {ConsentApprover.save}
*/
test('[unit] ConsentApprover.save should successfully update a consentApprover with a consentApprover object when an id exists', async (t) => {
const { consentApproverJsonApi } = t.context;
let requestBody = {};
const server = nock(client.apiBaseUrl)
.patch('/v3/consent/approvers/14', (body) => {
requestBody = body;
return { data: json };
})
.reply(201, {
data: {
id: 14,
type: 'consent__approvers',
attributes: {
first_name: 'Snoop',
last_name: 'Dogg',
email: 'email',
title: 'title',
password: 'password'
},
relationships: {
consent_form_version: {
data: null
}
}
}
});
const json = JSON.parse(JSON.stringify(consentApproverJsonApi));
const consentApprover = new ConsentApprover({ data: json });
const response = await consentApprover.save();
t.deepEqual(requestBody, { data: json });
server.done();
t.is(response.id, 14);
t.is(response.type, 'consent__approvers');
t.is(response.firstName, 'Snoop');
t.is(response.lastName, 'Dogg');
t.is(response.email, 'email');
t.is(response.title, 'title');
t.is(response.password, 'password');
t.is(response.consentFormVersion, null);
t.is(response.consentFormVersion, null);
});