Manual Reference Source Test

test/unit/services.project-content.js

import test from 'ava';
import sinon from 'sinon';
import { client, projectContentService } 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';
  t.context.server = sinon.fakeServer.create();
  t.context.server.autoRespond = true;

  t.context.server.respondWith('GET', `${client.apiBaseUrl}/api/v2/site_start/labs`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: [{
        id: 1,
        name: 'New Lab'
      }, {
        id: 2,
        name: 'New Lab'
      }, {
        id: 3,
        name: 'New Lab'
      }, {
        id: 4,
        name: 'New Lab Test'
      }
      ]
    })]);

  t.context.server.respondWith('POST', `${client.apiBaseUrl}/api/v2/site_start/labs`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: 4,
        name: 'New Lab'
      }
    })]);

  t.context.server.respondWith('GET', `${client.apiBaseUrl}/api/v2/site_start/labs/1`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: 1,
        name: 'New Lab'
      }
    })]);

  t.context.server.respondWith('GET', `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: [{
        first_name: 'Pat2',
        last_name: 'Cooper',
        license_number: '09876543',
        cv_effective_date: null,
        cv: null
      }
      ]
    })]);

  t.context.server.respondWith('POST', `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors`,
    [201, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        first_name: 'Yevtsye',
        last_name: 'Ferrer',
        license_number: '55551234',
        cv_effective_date: null,
        cv: null
      }
    })]);

  t.context.server.respondWith('GET', `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors/1`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        first_name: 'Pat2',
        last_name: 'Cooper',
        license_number: '09876543',
        cv_effective_date: null,
        cv: null
      }
    })]);

  t.context.server.respondWith('PUT', `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors/2`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        first_name: 'Yevtsye',
        last_name: 'Ferrer',
        license_number: '88888888',
        cv_effective_date: null,
        cv: null
      }
    })]);
});

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

// ProjectContentService.get method
/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should exist', (t) => {
  t.truthy(projectContentService.get);
});

/**
 * @test {ProjectContentService.get}
 */
test.serial('[unit] ProjectContentService.get should throw an error when there is no authToken', (t) => {
  client.authToken = undefined;
  const expectedError = 'ProjectContentService.get error: requires authToken'
    + ' and version is not defined'
    + ' and ownerType is not defined';

  t.throws(() => projectContentService.get(), expectedError);
});

/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should throw an error when version is not defined', (t) => {
  const expectedError = 'ProjectContentService.get error: version is not defined'
      + ' and ownerType is not defined';

  t.throws(() => projectContentService.get(), expectedError);
});

/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should throw an error when ownerType is not defined', (t) => {
  const expectedError = 'ProjectContentService.get error: ownerType is not defined';

  t.throws(() => projectContentService.get('v2'), expectedError);
});

/**
 * @test {ProjectContentService.get}
 */
// test('[unit] ProjectContentService.get should throw an error when owner is not defined', (t) => {
//   const expectedError = 'ProjectContentService.get error: owner is not defined';

//   t.throws(() => projectContentService.get('v2', 'ownerType'), expectedError);
// });


/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should return a promise', async (t) => {
  t.truthy(await projectContentService.get('v2', 'site_start/labs', 1, 'lab_directors').then);
});

// -api/version/ownerType/owner
// /**
//  * @test {ProjectContentService.get}
//  */
// test('[unit] ProjectContentService.get should make a properly formatted GET request without contentType or an id param', async (t) => {
//   await projectContentService.get('v2', 'site_start/labs');
//   const request = t.context.server.requests[0];

//   t.is(request.method, 'GET');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// });

/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should receive a valid response for a get request without contentType or an id param', async (t) => {
  const response = await projectContentService.get('v2', 'site_start/labs');
  t.truthy(response);
  t.is(response.data.length, 4);
  t.is(response.data[0].id, 1);
  t.is(response.data[0].name, 'New Lab');
  t.is(response.data[1].id, 2);
  t.is(response.data[1].name, 'New Lab');
  t.is(response.data[2].id, 3);
  t.is(response.data[2].name, 'New Lab');
  t.is(response.data[3].id, 4);
  t.is(response.data[3].name, 'New Lab Test');
});

// // -api/version/ownerType/owner/id/contentType
// /**
//  * @test {ProjectContentService.get}
//  */
// test('[unit] ProjectContentService.get should make a properly formatted GET request with an id param', async (t) => {
//   await projectContentService.get('v2', 'site_start/labs', 1, 'lab_directors');
//   const request = t.context.server.requests[0];
//   t.is(request.method, 'GET');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// });

/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should receive a valid response for a get request with an id param', async (t) => {
  const response = await projectContentService.get('v2', 'site_start/labs', 1, 'lab_directors');
  t.truthy(response);
  t.is(response.data.length, 1);
  t.is(response.data[0].first_name, 'Pat2');
  t.is(response.data[0].last_name, 'Cooper');
  t.is(response.data[0].license_number, '09876543');
  t.is(response.data[0].cv_effective_date, null);
  t.is(response.data[0].cv, null);
});

// // -api/version/ownerType/owner/objectId
// /**
//  * @test {ProjectContentService.get}
//  */
// test('[unit] ProjectContentService.get should make a properly formatted GET request with version, ownerType, owner, and objectId', async (t) => {
//   await projectContentService.get('v2', 'site_start/labs', 1);
//   const request = t.context.server.requests[0];
//   t.is(request.method, 'GET');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs/1`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// });

/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should receive a valid response for a get request with version, ownerType, owner, and objectId', async (t) => {
  const response = await projectContentService.get('v2', 'site_start/labs', 1);
  t.truthy(response);
  t.is(response.data.id, 1);
  t.is(response.data.name, 'New Lab');
});

// // -api/version/ownerType/owner/id/contentType/objectId
// /**
//  * @test {ProjectContentService.get}
//  */
// test('[unit] ProjectContentService.get should make a properly formatted GET request with all params', async (t) => {
//   await projectContentService.get('v2', 'site_start/labs', 1, 'lab_directors', 1);
//   const request = t.context.server.requests[0];
//   t.is(request.method, 'GET');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors/1`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
// });

/**
 * @test {ProjectContentService.get}
 */
test('[unit] ProjectContentService.get should receive a valid response for a get request with all params', async (t) => {
  const response = await projectContentService.get('v2', 'site_start/labs', 1, 'lab_directors', 1);
  t.truthy(response);
  t.is(response.data.first_name, 'Pat2');
  t.is(response.data.last_name, 'Cooper');
  t.is(response.data.license_number, '09876543');
  t.is(response.data.cv_effective_date, null);
  t.is(response.data.cv, null);
});

// ProjectContentService.insert method
/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should exist method', (t) => {
  t.truthy(projectContentService.insert);
});

/**
 * @test {ProjectContentService.insert}
 */
test.serial('[unit] ProjectContentService.insert should throw an error when there is no authToken', (t) => {
  client.authToken = undefined;
  const expectedError = 'ProjectContentService.insert error: requires authToken'
    + ' and version is not defined'
    + ' and ownerType is not defined'
    + ' and data is not defined';

  t.throws(() => projectContentService.insert(), expectedError);
});

/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should throw an error when version is not defined', (t) => {
  const expectedError = 'ProjectContentService.insert error: version is not defined'
      + ' and ownerType is not defined'
      + ' and data is not defined';

  t.throws(() => projectContentService.insert(), expectedError);
});

/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should throw an error when ownerType is not defined', (t) => {
  const expectedError = 'ProjectContentService.insert error: ownerType is not defined'
      + ' and data is not defined';

  t.throws(() => projectContentService.insert('v2'), expectedError);
});

/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should throw an error when owner is not defined', (t) => {
  const expectedError = 'ProjectContentService.insert error: data is not defined';

  t.throws(() => projectContentService.insert('v2', 'ownerType'), expectedError);
});

/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should return a promise', async (t) => {
  t.truthy(await projectContentService.insert('v2', 'site_start/labs', 1, 'lab_directors', {}).then);
});

// /**
//  * @test {ProjectContentService.insert}
//  */
// test('[unit] ProjectContentService.insert should make a properly formatted POST request with the id param and no action param', async (t) => {
//   const data = {
//     first_name: 'Yevtsye',
//     last_name: 'Ferrer',
//     license_number: '55551234',
//     effective_date: '2025/01/30',
//   };
//   await projectContentService.insert('v2', 'site_start/labs', 1, 'lab_directors', data);
//   const request = t.context.server.requests[0];
//   t.is(request.method, 'POST');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
//   t.is(request.requestBody, JSON.stringify({
//     data: {
//       first_name: 'Yevtsye',
//       last_name: 'Ferrer',
//       license_number: '55551234',
//       effective_date: '2025/01/30',
//     },
//   }));
// });

/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should receive a valid response for a POST request with the id param and no action param', async (t) => {
  const data = {
    data: {
      first_name: 'Yevtsye',
      last_name: 'Ferrer',
      license_number: '55551234',
      effective_date: '2025/01/30',
    },
  };

  const response = await projectContentService.insert('v2', 'site_start/labs', 1, 'lab_directors', data);
  t.truthy(response);
  t.is(response.first_name, 'Yevtsye');
  t.is(response.last_name, 'Ferrer');
  t.is(response.license_number, '55551234');
  t.is(response.cv_effective_date, null);
  t.is(response.cv, null);
});

// /**
//  * @test {ProjectContentService.insert}
//  */
// test('[unit] ProjectContentService.insert should make a properly formatted POST request without contentType, id, and action params', async (t) => {
//   const data = { name: 'New Lab' };
//   await projectContentService.insert('v2', 'site_start/labs', null, '', data);
//   const request = t.context.server.requests[0];
//   t.is(request.method, 'POST');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
//   t.is(request.requestBody, JSON.stringify({ data: { name: 'New Lab' } }));
// });

/**
 * @test {ProjectContentService.insert}
 */
test('[unit] ProjectContentService.insert should receive a valid response for a POST request  without contentType, id, and action params', async (t) => {
  const data = { name: 'New Lab' };
  const response = await projectContentService.insert('v2', 'site_start/labs', null, '', data);
  t.truthy(response);
  t.is(response.id, 4);
  t.is(response.name, 'New Lab');
});

// ProjectContentService.update method
/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should exist method', (t) => {
  t.truthy(projectContentService.update);
});

/**
 * @test {ProjectContentService.update}
 */
test.serial('[unit] ProjectContentService.update should throw an error when there is no authToken', (t) => {
  client.authToken = undefined;
  const expectedError = 'ProjectContentService.update error: requires authToken'
    + ' and version is not defined'
    + ' and ownerType is not defined'
    + ' and owner is not defined'
    + ' and data is not defined';

  t.throws(() => projectContentService.update(), expectedError);
});

/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should throw an error when version is not defined', (t) => {
  const expectedError = 'ProjectContentService.update error: version is not defined'
      + ' and ownerType is not defined'
      + ' and owner is not defined'
      + ' and data is not defined';

  t.throws(() => projectContentService.update(), expectedError);
});

/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should throw an error when ownerType is not defined', (t) => {
  const expectedError = 'ProjectContentService.update error: ownerType is not defined'
      + ' and owner is not defined'
      + ' and data is not defined';

  t.throws(() => projectContentService.update('v2'), expectedError);
});

/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should throw an error when owner is not defined', (t) => {
  const expectedError = 'ProjectContentService.update error: owner is not defined'
      + ' and data is not defined';

  t.throws(() => projectContentService.update('v2', 'ownerType'), expectedError);
});

/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should throw an error when data is not defined', (t) => {
  const expectedError = 'ProjectContentService.update error: data is not defined';

  t.throws(() => projectContentService.update('v2', 'ownerType', 1, 'contentType', 1), expectedError);
});

/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should return a promise', async (t) => {
  t.truthy(await projectContentService.update('v2', 'site_start/labs', 1, 'lab_directors', 2, {}).then);
});

// /**
//  * @test {ProjectContentService.update}
//  */
// test('[unit] ProjectContentService.update should make a properly formatted PUT request', async (t) => {
//   const data = {
//     first_name: 'Yevtsye',
//     last_name: 'Ferrer',
//     license_number: '88888888',
//     effective_date: '2025/01/30',
//   };
//   await projectContentService.update('v2', 'site_start/labs', 1, 'lab_directors', 2, data);
//   const request = t.context.server.requests[0];
//   t.is(request.method, 'PUT');
//   t.is(request.url, `${client.apiBaseUrl}/api/v2/site_start/labs/1/lab_directors/2`);
//   t.is(request.requestHeaders.Accept, 'application/json');
//   t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
//   t.is(request.requestBody, JSON.stringify({
//     data: {
//       first_name: 'Yevtsye',
//       last_name: 'Ferrer',
//       license_number: '88888888',
//       effective_date: '2025/01/30',
//     },
//   }));
// });

/**
 * @test {ProjectContentService.update}
 */
test('[unit] ProjectContentService.update should receive a valid response for a PUT request', async (t) => {
  const data = {
    first_name: 'Yevtsye',
    last_name: 'Ferrer',
    license_number: '88888888',
    effective_date: '2025/01/30',
  };

  const response = await projectContentService.update('v2', 'site_start/labs', 1, 'lab_directors', 2, data);
  t.truthy(response);
  t.is(response.first_name, 'Yevtsye');
  t.is(response.last_name, 'Ferrer');
  t.is(response.license_number, '88888888');
  t.is(response.cv_effective_date, null);
  t.is(response.cv, null);
});