Manual Reference Source Test

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);
});