Manual Reference Source Test

test/unit/helpers.approver-assignment.js

import test from 'ava';
import nock from 'nock';
import {
  client,
  ApproverAssignment,
} from '../../src';

test.before('start server', (t) => {
  client.apiBaseUrl = 'https://somesite.Clinical6.com';
  client.authToken = 'valid_token';

  t.context.updateResponse = {
    data: {
      id: '23',
      type: 'consent__approver_assignments',
      relationships: {
        approver_group: {
          data: {
            id: '21',
            type: 'consent__approver_groups'
          }
        },
        approver: {
          data: {
            id: '30',
            type: 'consent__approvers'
          }
        }
      }
    },
    included: [
      {
        id: '21',
        type: 'consent__approver_groups',
        attributes: {
          name: 'Approver Group 23',
          created_at: '2018-05-04T18:47:01Z',
          updated_at: '2018-05-04T18:47:01Z'
        },
        relationships: {
          approver_assignments: {
            data: [
              {
                id: '23',
                type: 'consent__approver_assignments'
              }
            ]
          },
          group_assignments: {
            data: []
          },
          approvers: {
            data: [
              {
                id: '30',
                type: 'consent__approvers'
              }
            ]
          }
        }
      },
      {
        id: '30',
        type: 'consent__approvers',
        attributes: {
          first_name: 'John',
          last_name: 'Doe',
          email: 'john@example.com',
          title: null
        },
        relationships: {
          approver_groups: {
            data: [
              {
                id: '21',
                type: 'consent__approver_groups'
              }
            ]
          },
          consent_form_versions: {
            data: []
          }
        }
      }
    ]
  };

  t.context.insertResponse = {
    data: {
      id: '23',
      type: 'consent__approver_assignments',
      relationships: {
        approver_group: {
          data: {
            id: '21',
            type: 'consent__approver_groups'
          }
        },
        approver: {
          data: {
            id: '30',
            type: 'consent__approvers'
          }
        }
      }
    },
    included: [
      {
        id: '21',
        type: 'consent__approver_groups',
        attributes: {
          name: 'Approver Group 23',
          created_at: '2018-05-04T18:47:01Z',
          updated_at: '2018-05-04T18:47:01Z'
        },
        relationships: {
          approver_assignments: {
            data: [
              {
                id: '23',
                type: 'consent__approver_assignments'
              }
            ]
          },
          group_assignments: {
            data: []
          },
          approvers: {
            data: [
              {
                id: '30',
                type: 'consent__approvers'
              }
            ]
          }
        }
      },
      {
        id: '30',
        type: 'consent__approvers',
        attributes: {
          first_name: 'John',
          last_name: 'Doe',
          email: 'john@example.com',
          title: null
        },
        relationships: {
          approver_groups: {
            data: [
              {
                id: '21',
                type: 'consent__approver_groups'
              }
            ]
          },
          consent_form_versions: {
            data: []
          }
        }
      }
    ]
  };
});

test.beforeEach((t) => {
  client.cache = 'never';
  client.authToken = 'valid_token';

  t.context.storage = client.storageUtility;
  t.context.approverAssignmentJsonApi = {
    id: 1,
    type: 'consent__approver_assignments',
    attributes: {}
  };
  t.context.approverAssignmentJson = {
    id: 1,
    type: 'consent__approver_assignments'
  };
  t.context.approverAssignment = new ApproverAssignment(t.context.approverAssignmentJsonApi);
});

/**
 * @test {ApproverAssignment}
 */
test('[unit] ApproverAssignment should handle approverAssignment data with a normal json format', (t) => {
  const { approverAssignmentJson } = t.context;
  const approverAssignment = new ApproverAssignment(approverAssignmentJson);
  t.is(approverAssignment.id, 1);
  t.is(approverAssignment.type, 'consent__approver_assignments');
});

/**
 * @test {ApproverAssignment}
 */
test('[unit] ApproverAssignment should handle approverAssignment data with json api format', (t) => {
  const { approverAssignmentJsonApi } = t.context;
  const approverAssignment = new ApproverAssignment({ data: approverAssignmentJsonApi });
  t.is(approverAssignment.id, 1);
  t.is(approverAssignment.type, 'consent__approver_assignments');
});

/**
 * @test {ApproverAssignment}
 */
test('[unit] ApproverAssignment should generate json api format when converted to string', (t) => {
  const { approverAssignmentJsonApi } = t.context;
  let approverAssignment = new ApproverAssignment({ data: approverAssignmentJsonApi });
  let json = approverAssignment.toJSON();
  t.deepEqual(json, approverAssignmentJsonApi);

  approverAssignment = new ApproverAssignment({ data: approverAssignmentJsonApi });
  json = approverAssignment.toJSON();
  t.deepEqual(json, approverAssignmentJsonApi);
});


/**
 * @test {ApproverAssignment.delete}
 */
test('[unit] ApproverAssignment.delete should successfully delete a approver assignment', async (t) => {
  const { approverAssignment } = t.context;
  approverAssignment.id = 5;
  let request = {};
  nock(client.apiBaseUrl).delete(`/v3/consent/approver_assignments/${approverAssignment.id}`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [200, ''];
  });
  const response = await approverAssignment.delete();
  t.is(request.path, `/v3/consent/approver_assignments/${approverAssignment.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);
});


// ApproverAssignment.save
/**
 * @test {ApproverAssignment.save}
 */
test('[unit] ApproverAssignment.save should successfully insert a approverAssignment with a approverAssignment object when id does not exist', async (t) => {
  const { approverAssignmentJsonApi, insertResponse } = t.context;
  const json = JSON.parse(JSON.stringify(approverAssignmentJsonApi));
  delete json.id;
  const approverAssignment = new ApproverAssignment({ data: json });
  let request = {};
  nock(client.apiBaseUrl).post(`/v3/consent/approver_assignments`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [201, insertResponse];
  });
  const response = await approverAssignment.save();

  t.is(request.path, `/v3/consent/approver_assignments`);
  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, 23);
  t.is(response.type, 'consent__approver_assignments');
});

/**
 * @test {ApproverAssignment.save}
 */
test('[unit] ApproverAssignment.save should successfully update a approverAssignment with a approverAssignment object when id exists', async (t) => {
  const { approverAssignmentJsonApi, updateResponse } = t.context;
  const approverAssignment = new ApproverAssignment({ data: approverAssignmentJsonApi });
  let request = {};
  nock(client.apiBaseUrl).patch(`/v3/consent/approver_assignments/${approverAssignment.id}`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [200, updateResponse];
  });
  const response = await approverAssignment.save();

  t.is(request.path, `/v3/consent/approver_assignments/${approverAssignment.id}`);
  t.is(request.headers.accept, 'application/json');
  t.deepEqual(request.requestBody, { data: approverAssignmentJsonApi });
  t.is(request.headers['content-type'], 'application/json');
  t.is(request.headers.authorization, 'Token token=valid_token');
  t.is(response.id, 23);
  t.is(response.type, 'consent__approver_assignments');
});