Manual Reference Source Test

test/unit/helpers.site-member.js

import test from 'ava';
import sinon from 'sinon';
import {
  client,
  SiteMember,
} from '../../src';

// See tests.js for testing client creation
const siteMemberJsonApi = {
  id: 5,
  type: 'trials__site_members',
  attributes: {
    account_status: undefined,
    consent_status: undefined,
    member_type: 'pi',
    first_consented_at: undefined,
    last_consented_at: undefined,
    created_at: '2017-10-27T23:41:16Z',
    updated_at: '2017-10-27T23:41:16Z'
  }
};

const siteMemberJson = {
  id: 5,
  consent_status: undefined,
  type: 'trials__site_members',
  first_consented_at: undefined,
  last_consented_at: undefined,
  member_type: 'pi',
  created_at: '2017-10-27T23:41:16Z',
  updated_at: '2017-10-27T23:41:16Z'
};

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

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('DELETE', `${client.apiBaseUrl}/v3/trials/site_members/*`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({ status: 'ok' })]);

  t.context.server.respondWith('PATCH', `${client.apiBaseUrl}/v3/trials/site_members/*`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '7',
        type: 'trials__site_members',
        attributes: {
          member_type: 'pi',
          created_at: '2017-10-27T23:41:16Z',
          updated_at: '2017-10-27T23:41:16Z'
        },
        relationships: {
          site: {
            data: {
              id: '4',
              type: 'trials__sites'
            }
          },
          mobile_user: {
            data: {
              id: '66',
              type: 'mobile_users'
            }
          }
        }
      },
      included: [
        {
          id: '4',
          type: 'trials__sites',
          attributes: {
            site_id: '196988',
            name: 'Florine Turcotte',
            email: 'marilou@donnelly.org',
            phone_number: null,
            fax_number: null,
            contact_name: null,
            contact_email: null,
            contact_phone: null,
            contact_fax: null,
            created_at: '2017-10-27T23:41:16Z',
            updated_at: '2017-10-27T23:41:16Z'
          },
          relationships: {
            location: {
              data: {
                id: '8',
                type: 'locations'
              }
            },
            agreement_templates: {
              data: []
            }
          }
        },
        {
          id: '66',
          type: 'mobile_users',
          attributes: {
            uuid: '10e6b58f-f14c-41e8-9418-1c6662ba2c55',
            account_name: 'dummy_65',
            email: 'user75@fake.com',
            created_at: '2017-10-27T23:41:16Z',
            updated_at: '2017-10-27T23:41:16Z',
            verified_at: null,
            invitation_sent_at: null,
            invitation_accepted_at: null,
            disabled: false,
            disabled_at: null
          },
          relationships: {
            devices: {
              data: []
            },
            user_role: {
              data: null
            },
            profile: {
              data: {
                id: '73',
                type: 'profiles'
              }
            },
            language: {
              data: {
                id: '39',
                type: 'languages'
              }
            },
            patient: {
              data: {
                id: '7',
                type: 'trials__site_members'
              }
            }
          }
        },
        {
          id: '73',
          type: 'profiles',
          attributes: {
            created_at: '2017-10-27T23:41:16Z',
            updated_at: '2017-10-27T23:41:16Z',
            first_name: 'Orlo',
            middle_initial: null,
            last_name: 'Mills',
            prefix: null,
            suffix: null,
            gender: 'male',
            ethnicity: '',
            occupation: null,
            avatar: {
              url: '/uploads/test/profile/avatar/73/1.png',
              small: {
                url: '/uploads/test/profile/avatar/73/small_1.png'
              },
              main: {
                url: '/uploads/test/profile/avatar/73/main_1.png'
              },
              thumb: {
                url: '/uploads/test/profile/avatar/73/thumb_1.png'
              }
            },
            username: null,
            dob: null,
            timezone: 'UTC',
            phone: null,
            email: 'user75@fake.com',
            age: 40
          },
          relationships: {
            profileable: {
              data: {
                id: '66',
                type: 'mobile_users'
              }
            }
          }
        }
      ]
    })]);

  t.context.server.respondWith('POST', `${client.apiBaseUrl}/v3/trials/site_members`,
    [201, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '4',
        type: 'trials__site_members',
        attributes: {
          member_type: 'pi',
          created_at: '2017-10-27T23:41:16Z',
          updated_at: '2017-10-27T23:41:16Z'
        },
        relationships: {
          site: {
            data: {
              id: '1',
              type: 'trials__sites'
            }
          },
          mobile_user: {
            data: {
              id: '60',
              type: 'mobile_users'
            }
          }
        }
      },
      included: [
        {
          id: '1',
          type: 'trials__sites',
          attributes: {
            site_id: '945378',
            name: 'Florine Turcotte',
            email: 'marilou@donnelly.org',
            phone_number: null,
            fax_number: null,
            contact_name: null,
            contact_email: null,
            contact_phone: null,
            contact_fax: null,
            created_at: '2017-10-27T23:41:16Z',
            updated_at: '2017-10-27T23:41:16Z'
          },
          relationships: {
            location: {
              data: {
                id: '5',
                type: 'locations'
              }
            },
            agreement_templates: {
              data: []
            }
          }
        },
        {
          id: '60',
          type: 'mobile_users',
          attributes: {
            uuid: 'e9f40ce5-eb70-4b01-ae66-6d1d966df1f4',
            account_name: 'dummy_59',
            email: 'user69@fake.com',
            created_at: '2017-10-27T23:41:16Z',
            updated_at: '2017-10-27T23:41:16Z',
            verified_at: null,
            invitation_sent_at: null,
            invitation_accepted_at: null,
            disabled: false,
            disabled_at: null
          },
          relationships: {
            devices: {
              data: []
            },
            user_role: {
              data: null
            },
            profile: {
              data: {
                id: '67',
                type: 'profiles'
              }
            },
            language: {
              data: {
                id: '36',
                type: 'languages'
              }
            },
            patient: {
              data: {
                id: '4',
                type: 'trials__site_members'
              }
            }
          }
        },
        {
          id: '67',
          type: 'profiles',
          attributes: {
            created_at: '2017-10-27T23:41:16Z',
            updated_at: '2017-10-27T23:41:16Z',
            first_name: 'Sean',
            middle_initial: null,
            last_name: 'Hudson',
            prefix: null,
            suffix: null,
            gender: 'male',
            ethnicity: '',
            occupation: null,
            avatar: {
              url: '/uploads/test/profile/avatar/67/1.png',
              small: {
                url: '/uploads/test/profile/avatar/67/small_1.png'
              },
              main: {
                url: '/uploads/test/profile/avatar/67/main_1.png'
              },
              thumb: {
                url: '/uploads/test/profile/avatar/67/thumb_1.png'
              }
            },
            username: null,
            dob: null,
            timezone: 'UTC',
            phone: null,
            email: 'user69@fake.com',
            age: 40
          },
          relationships: {
            profileable: {
              data: {
                id: '60',
                type: 'mobile_users'
              }
            }
          }
        }
      ]
    })]);

  t.context.storage = client.storageUtility;
  client.siteMember = new SiteMember({});
  t.context.siteMemberJsonApi = {
    id: 5,
    type: 'trials__site_members',
    attributes: {
      member_type: 'pi',
      created_at: '2017-10-27T23:41:16Z',
      updated_at: '2017-10-27T23:41:16Z'
    },
    relationships: {
      mobile_user: {
        data: {
          type: 'mobile_users',
          id: 66
        }
      },
      site: {
        data: {
          type: 'trials__sites',
          id: 4
        }
      }
    }
  };
  t.context.siteMember = new SiteMember(t.context.siteMemberJsonApi);
});

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

/**
 * @test {SiteMember}
 */
test('[unit] SiteMember should handle siteMember data with a normal json format', (t) => {
  const siteMember = new SiteMember(siteMemberJson);
  t.is(siteMember.id, 5);
  t.is(siteMember.type, 'trials__site_members');
  t.is(siteMember.createdAt, '2017-10-27T23:41:16Z');
  t.is(siteMember.updatedAt, '2017-10-27T23:41:16Z');
});

/**
 * @test {SiteMember}
 */
test('[unit] SiteMember should handle siteMember data with json api format', (t) => {
  const siteMember = new SiteMember({ data: siteMemberJsonApi });
  t.is(siteMember.id, 5);
  t.is(siteMember.type, 'trials__site_members');
  t.is(siteMember.createdAt, '2017-10-27T23:41:16Z');
  t.is(siteMember.updatedAt, '2017-10-27T23:41:16Z');
});

/**
 * @test {SiteMember}
 */
test('[unit] SiteMember should generate json api format when converted to string', (t) => {
  let siteMember = new SiteMember({ data: siteMemberJsonApi });
  let json = siteMember.toJSON();
  // delete json.relationships;
  t.deepEqual(json, siteMemberJsonApi);

  siteMember = new SiteMember({ data: siteMemberJsonApi });
  json = siteMember.toJSON();
  // delete json.relationships;
  t.deepEqual(json, siteMemberJsonApi);
});

/**
 * @test {SiteMember.delete}
 */
test('[unit] SiteMember.delete should successfully delete a siteMember', async (t) => {
  const siteMember = new SiteMember({ data: siteMemberJsonApi });
  const response = await siteMember.delete();

  // const request = t.context.server.requests[0];
  // t.is(request.method, 'DELETE');
  // t.is(request.url, `${client.apiBaseUrl}/v3/trials/site_members/${siteMember.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.truthy(response);
});

/**
 * @test {SiteMember.save}
 */
test('[unit] SiteMember.save should successfully insert a siteMember with a siteMember object when id does not exist', async (t) => {
  const json = JSON.parse(JSON.stringify(siteMemberJsonApi));
  delete json.id;
  const siteMember = new SiteMember({ data: json });
  const response = await siteMember.save();

  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/trials/site_members`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), { data: json });
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 4);
  t.is(response.type, 'trials__site_members');
});

/**
 * @test {SiteMember.save}
 */
test('[unit] SiteMember.save should successfully update a siteMember with a siteMember object when id exists', async (t) => {
  const siteMember = new SiteMember({ data: siteMemberJsonApi });
  const response = await siteMember.save();

  // const request = t.context.server.requests[0];
  // t.is(request.method, 'PATCH');
  // t.is(request.url, `${client.apiBaseUrl}/v3/trials/site_members/${siteMember.id}`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), { data: siteMemberJsonApi });
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 7);
  t.is(response.type, 'trials__site_members');
});