Manual Reference Source Test

test/unit/services.custom.user.genisis.v3.js

import test from 'ava';
import nock from 'nock';
import {
  client,
  clinical6,
  stringToCamel,
  Helper,
  HelperFactory,
  User,
} from '../../src';

class CustomClass extends Helper {
  constructor(json = {}) {
    super(json);
    this._relationships = {};
    const _response = json.data || json; // if json api is passed in directly
    const attributes = _response.attributes || _response; // if json api is passed in directly

    if (_response.id) {
      /** @type {Number} */
      this.id = parseInt(_response.id, 10);
    }

    // Object.assign(this, attributes);
    Object.keys(attributes).forEach((key) => {
      if (['type', 'relationships', 'id'].indexOf(key) === -1) {
        /** @type {Any} */
        this[stringToCamel(key)] = attributes[key];
      }
    });

    this.deserializeRelationshipStubs(json);
    this.syncRelationships(json);
  }
}

class GenisisActivityStatus extends CustomClass {
  static get type() { return 'genisis__activity_statuses'; }
}

HelperFactory.map.genisis__activity_statuses = GenisisActivityStatus;

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

  t.context.getResponseActivityStatus = {
    data: [
      {
        id: '100000050',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'Informed Consent',
          study_activity_source: null,
          activity_status: 'None',
          activity_version: null,
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '329',
              type: 'mobile_users'
            }
          }
        }
      },
      {
        id: '100000051',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'HIPAA Authorization',
          study_activity_source: null,
          activity_status: 'None',
          activity_version: null,
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '329',
              type: 'mobile_users'
            }
          }
        }
      },
      {
        id: '100000053',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'Specimen Collection',
          study_activity_source: null,
          activity_status: 'None',
          activity_version: null,
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '329',
              type: 'mobile_users'
            }
          }
        }
      },
      {
        id: '100000054',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'Lifestyle Survey',
          study_activity_source: null,
          activity_status: 'None',
          activity_version: null,
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '329',
              type: 'mobile_users'
            }
          }
        }
      },
      {
        id: '100000052',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'Baseline Survey',
          study_activity_source: null,
          activity_status: 'None',
          activity_version: null,
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '329',
              type: 'mobile_users'
            }
          }
        }
      },
      {
        id: '100000055',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'Withdrawal',
          study_activity_source: null,
          activity_status: 'None',
          activity_version: null,
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '329',
              type: 'mobile_users'
            }
          }
        }
      }
    ]
  };
});

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

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


  t.context.storage = client.storageUtility;
});

// UserService.getChildren method
/**
 * @test {Clinical6.getChildren}
 */
test.serial('[unit] UserService.getChildren should throw an error when there is no authToken or invalid params', async (t) => {
  client.authToken = undefined;
  const title = `UserService.getChildren error`;
  const user = new User({ id: 329 });

  await t.throwsAsync(clinical6.getChildren(user, { type: 'genisis__activity_statuses' }), `${title}: requires authToken`);
  client.authToken = 'valid_authToken';
  await t.throwsAsync(clinical6.getChildren(user), `${title}: child does not have type`);
});

/**
 * @test {Clinical6.getChildren}
 */
test(`[unit] UserService.getChildren should receive a valid request and response for a get request without an id`, async (t) => {
  const { getResponseActivityStatus } = t.context;
  const user = new User({ id: 329 });
  user.type = 'mobile_users';

  let request = {};
  nock(client.apiBaseUrl).get(`/v3/mobile_users/${user.id}/genisis/activity_statuses`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [200, getResponseActivityStatus];
  });

  const response = await clinical6.getChildren(user, { type: 'genisis__activity_statuses' });
  t.is(request.path, `/v3/mobile_users/329/genisis/activity_statuses`);
  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.truthy(response);
  t.is(Object.keys(response).length, 6);
  t.truthy(response[0] instanceof GenisisActivityStatus);
  t.is(response[0].id, 100000050);
  t.is(response[0].type, 'genisis__activity_statuses');
  t.is(response[0].genisisId, 10000005);
  t.is(response[0].studyId, 1);
  t.is(response[0].studyActivityName, 'Informed Consent');
  t.is(response[0].studyActivitySource, null);
  t.is(response[0].activityStatus, 'None');
  t.is(response[0].activityVersion, null);
  t.is(response[0].updatedAt, null);
  t.is(response[0].additionalInfo, null);
  t.truthy(response[0].mobileUser);
  t.is(response[0].mobileUser.id, '329');
  t.truthy(response[1] instanceof GenisisActivityStatus);
  t.is(response[0].id, 100000050);
  t.is(response[0].type, 'genisis__activity_statuses');
  t.is(response[0].genisisId, 10000005);
  t.is(response[0].studyId, 1);
  t.is(response[0].studyActivityName, 'Informed Consent');
  t.is(response[0].studyActivitySource, null);
  t.is(response[0].activityStatus, 'None');
  t.is(response[0].activityVersion, null);
  t.is(response[0].updatedAt, null);
  t.is(response[0].additionalInfo, null);
  t.truthy(response[2] instanceof GenisisActivityStatus);
  t.is(response[0].id, 100000050);
  t.is(response[0].type, 'genisis__activity_statuses');
  t.is(response[0].genisisId, 10000005);
  t.is(response[0].studyId, 1);
  t.is(response[0].studyActivityName, 'Informed Consent');
  t.is(response[0].studyActivitySource, null);
  t.is(response[0].activityStatus, 'None');
  t.is(response[0].activityVersion, null);
  t.is(response[0].updatedAt, null);
  t.is(response[0].additionalInfo, null);
});