Manual Reference Source Test

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

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

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'
            }
          }
        }
      }
    ]
  };

  t.context.updateResponseActivityStatus = {
    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: '221',
              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: '221',
              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: '221',
              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: '221',
              type: 'mobile_users'
            }
          }
        }
      },
      {
        id: '100000052',
        type: 'genisis__activity_statuses',
        attributes: {
          genisis_id: 10000005,
          study_id: 1,
          study_activity_name: 'Baseline Survey',
          study_activity_source: 'PRE',
          activity_status: 'None',
          activity_version: '1.0',
          updated_at: null,
          additional_info: null
        },
        relationships: {
          mobile_user: {
            data: {
              id: '221',
              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: '221',
              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);
});


/**
 * @test {JsonApiService.update}
 */
test(`[unit] JsonApiService.update should update a genisis status`, async (t) => {
  const { updateResponseActivityStatus } = t.context;
  const genisisStatusObj = new GenisisActivityStatus({
    studyActivityName: 'Baseline Survey',
    studyActivitySource: 'PRE',
    activityStatus: 'None',
    activityVersion: '1.0',
    additionalInfo: null
  });
  const user = new User({ id: 221 });
  user.type = 'mobile_users';

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

  const response = await jsonApiService.update(genisisStatusObj, { url: `/v3/${user.type}/${user.id}/genisis/activity_statuses` });
  t.truthy(response, 'Status must exist');
  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, '221');
  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);
});