Manual Reference Source Test

test/unit/services.agreement-template-field.v3.js

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

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

test.after('server shut down', () => {});

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

  nock(client.apiBaseUrl)
    .delete(/\/v3\/agreement\/template_fields\/([0-9]*)$/)
    .reply(200, '');

  t.context.storage = client.storageUtility;
  t.context.fieldJsonApi = {
    data: {
      type: 'agreement__template_fields',
      attributes: {
        label: 'Label for field 1',
        field_name: 'template_field_1',
        required: false,
        default_value: 'DEFAULT_VALUE',
        attribute_name: 'template_field_1_attribute',
        signer_index: 1,
        source_type: 'mobile_user'
      },
      relationships: {
        agreement_template: {
          data: {
            type: 'agreement__templates',
            id: 1
          }
        }
      }
    }
  };
  t.context.field = new AgreementTemplateField(t.context.fieldJsonApi);
});

// test.afterEach(t => t.context.server.restore());


// AgreementTemplateFieldService.delete method
/**
 * @test {Clinical6.delete}
 */
test('[unit] AgreementTemplateFieldService.delete should throw errors for invalid parameters', async (t) => {
  const title = `AgreementTemplateFieldService.delete error`;
  await t.throwsAsync(clinical6.delete(new AgreementTemplateField()), `${title}: template_field does not have id`);
});

/**
 * @test {Clinical6.delete}
 */
test('[unit] AgreementTemplateFieldService.delete should make a properly formatted delete request', async (t) => {
  const { field } = t.context;
  field.id = 5;
  const response = await clinical6.delete(field);
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'DELETE');
  // t.is(request.url, `${client.apiBaseUrl}/v3/agreement/template_fields/${field.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.falsy(response);
});

/**
 * @test {Clinical6.delete}
 */
test('[unit] AgreementTemplateFieldService.delete should receive a valid response for a delete request', async (t) => {
  const { field } = t.context;
  field.id = 5;
  const response = await clinical6.delete(field);
  // const request = t.context.server.requests[0];
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');

  t.falsy(response);
});

/**
 * @test {Clinical6.delete}
 */
test.serial('[unit] AgreementTemplateFieldService.delete should remove the element from local storage', async (t) => {
  const { field, storage } = t.context;
  field.id = 5;
  await storage.set(field.type, field.toJSON(), { id: field.id });
  await clinical6.delete(field);
  t.is(storage.has(field.type, { id: field.id }), false);
});


// AgreementTemplateFieldService.get method
/**
 * @test {Clinical6.get}
 */
test.serial('[unit] AgreementTemplateFieldService.get should throw an error when there is no authToken', async (t) => {
  client.authToken = undefined;
  const title = 'AgreementTemplateFieldService.get error';
  await t.throwsAsync(clinical6.get(AgreementTemplateField), `${title}: requires authToken`);
});

// AgreementTemplateFieldService.insert method
/**
 * @test {Clinical6.insert}
 */
test.serial('[unit] AgreementTemplateFieldService.insert should throw an error when there is no authToken', async (t) => {
  client.authToken = undefined;
  const title = 'AgreementTemplateFieldService.insert error';
  await t.throwsAsync(clinical6.insert(new AgreementTemplateField()), `${title}: requires authToken`);
});

/**
 * @test {Clinical6.insert}
 */
test('[unit] AgreementTemplateFieldService.insert should successfully insert an agreement template field with an agreement template object', async (t) => {
  const requestJsonApi = {
    data: {
      type: 'agreement__template_fields',
      attributes: {
        label: 'Label for field 1',
        field_name: 'template_field_1',
        required: false,
        default_value: 'DEFAULT_VALUE',
        attribute_name: 'template_field_1_attribute',
        signer_index: 1,
        source_type: 'mobile_user'
      },
      relationships: {
        agreement_template: {
          data: {
            type: 'agreement__templates',
            id: 1
          }
        }
      }
    }
  };

  let requestBody = {};
  const server = nock(client.apiBaseUrl)
    .post('/v3/agreement/template_fields', (body) => {
      requestBody = body;
      return requestJsonApi;
    })
    .reply(201, {
      data: {
        id: 1,
        type: 'agreement__template_fields',
        attributes: {
          source_type: 'mobile_user'
        }
      }
    });

  const agreementTemplateField = new AgreementTemplateField(requestJsonApi);
  const response = await clinical6.insert(agreementTemplateField);
  t.deepEqual(requestBody, requestJsonApi);
  server.done();

  t.true(response instanceof AgreementTemplateField);
  t.is(response.id, 1);
  t.is(response.type, 'agreement__template_fields');
  t.is(response.sourceType, 'mobile_user');
});

/**
 * @test {Clinical6.insert}
 */
test('[unit] AgreementTemplateFieldService.insert should throw an error without the necessary attributes', async (t) => {
  const requestJsonApi = {
    data: {
      type: 'agreement__template_fields',
      attributes: {
        label: 'Label for field 1',
        required: false,
        default_value: 'DEFAULT_VALUE',
        attribute_name: 'template_field_1_attribute',
        signer_index: 1,
        source_type: 'mobile_user'
      },
      relationships: {
        agreement_template: {
          data: {
            type: 'agreement__templates',
            id: 1
          }
        }
      }
    }
  };

  let requestBody = {};
  const server = nock(client.apiBaseUrl)
    .post('/v3/agreement/template_fields', (body) => {
      requestBody = body;
      return requestJsonApi;
    })
    .reply(422, {
      errors: [
        {
          source: {
            pointer: '/data/attributes/field_name'
          },
          detail: 'can\'t be blank'
        }
      ]
    });

  const agreementTemplateField = new AgreementTemplateField(requestJsonApi);
  const response = await clinical6.insert(agreementTemplateField).catch(err => err);
  t.deepEqual(requestBody, requestJsonApi);
  server.done();

  t.is(response.message, `"/data/attributes/field_name": can't be blank`);
});

// AgreementTemplateFieldService.update method