Manual Reference Source Test

test/unit/helpers.consultation.js

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

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

  t.context.updateResponse = {
    data: {
      id: '3',
      type: 'video_consultations',
      attributes: {
        name: 'Video Consultation Name',
        start_at: '2018-07-26T02:49:20Z',
        end_at: '2018-07-26T03:49:20Z',
        status: 'active',
        confirmed_at: null,
        deleted_at: null,
        created_at: '2018-07-26T02:49:20Z',
        updated_at: '2018-07-26T02:49:20Z'
      },
      relationships: {
        video_consultation_participants: {
          data: []
        }
      }
    }
  };

  t.context.insertResponse = {
    data: {
      id: '4',
      type: 'video_consultations',
      attributes: {
        name: 'Video Consultation Name',
        start_at: '2018-07-26T02:49:20Z',
        end_at: null,
        status: null,
        confirmed_at: null,
        deleted_at: null,
        created_at: '2018-07-26T02:49:20Z',
        updated_at: '2018-07-26T02:49:20Z'
      },
      relationships: {
        video_consultation_participants: {
          data: []
        }
      }
    }
  };

  t.context.insertParticipantResponse = {
    data: {
      id: '1',
      type: 'video_consultation_participants',
      attributes: {
        created_at: '2018-07-26T02:48:37Z',
        updated_at: '2018-07-26T02:48:37Z'
      },
      relationships: {
        video_consultation: {
          data: {
            id: '1',
            type: 'video_consultations'
          }
        },
        participant: {
          data: {
            id: '33',
            type: 'mobile_users'
          }
        }
      }
    },
    included: [
      {
        id: '1',
        type: 'video_consultations',
        attributes: {
          name: 'General Consultation',
          start_at: '2018-07-26T02:48:08Z',
          end_at: null,
          status: null,
          confirmed_at: null,
          deleted_at: null,
          created_at: '2018-07-26T02:48:37Z',
          updated_at: '2018-07-26T02:48:37Z'
        },
        relationships: {
          video_consultation_participants: {
            data: [
              {
                id: '1',
                type: 'video_consultation_participants'
              }
            ]
          }
        }
      },
      {
        id: '217',
        type: 'mobile_users',
        attributes: {
          uuid: 'f22462a2-4a0d-4e8b-8762-9b677284d290',
          account_name: 'dummy_33',
          email: 'user103@fake.com',
          created_at: '2018-07-26T02:48:37Z',
          updated_at: '2018-07-26T02:48:37Z',
          invitation_sent_at: null,
          invitation_accepted_at: null,
          disabled: false,
          disabled_at: null,
          password_expired_at: '2018-10-24T02:48:37Z'
        },
        relationships: {
          devices: {
            data: []
          },
          user_role: {
            data: null
          },
          profile: {
            data: {
              id: '103',
              type: 'profiles'
            }
          },
          language: {
            data: {
              id: '1',
              type: 'languages'
            }
          },
          patient: {
            data: null
          },
          threads: {
            data: []
          },
          site_member: {
            data: null
          },
          overall_status: {
            data: null
          }
        }
      }
    ]
  };

  t.context.joinResponse = {
    data: {
      id: '2',
      type: 'video_consultations',
      attributes: {
        name: 'General Consultation',
        start_at: '2018-08-09T17:59:22Z',
        end_at: null,
        status: null,
        session_identity: '1_MX40NTYwNDkzMn5-MTUzMjM3NzM4NzEzMn5wdEM0WWx6ODZ6b3JKbWJ3aXNvNlQrbmZ-UH4',
        confirmed_at: null,
        deleted_at: null,
        created_at: '2018-08-09T18:00:43Z',
        updated_at: '2018-08-09T18:00:44Z'
      },
      relationships: {
        video_consultation_participants: {
          data: [
            {
              id: '1',
              type: 'video_consultation_participants'
            }
          ]
        }
      }
    },
    included: [
      {
        id: '1',
        type: 'video_consultation_participants',
        attributes: {
          created_at: '2018-08-09T18:00:44Z',
          updated_at: '2018-08-09T18:00:44Z'
        },
        relationships: {
          video_consultation: {
            data: {
              id: '2',
              type: 'video_consultations'
            }
          },
          participant: {
            data: {
              id: '209',
              type: 'mobile_users'
            }
          }
        }
      }
    ],
    meta: {
      join_token: 'T1==cGFydG5lcl9pZD00NTYwNDkzMiZzaWc9ZTI0MjE3NzhlYTU5MGQ4NWM1NDkwZjM1ZGE3NGE4NjZlY2NlOTliYjpyb2xlPXB1Ymxpc2hlciZzZXNzaW9uX2lkPTFfTVg0ME5UWXdORGt6TW41LU1UVXpNak0zTnpNNE56RXpNbjV3ZEVNMFdXeDZPRFo2YjNKS2JXSjNhWE52TmxRcmJtWi1VSDQmY3JlYXRlX3RpbWU9MTUzMzgzNzY0NCZub25jZT0wLjY4NjIwOTA1NTk4MTM3NzUmZXhwaXJlX3RpbWU9MTUzMzg0MTI0NCZjb25uZWN0aW9uX2RhdGE9',
      api_key: '45604932'
    }
  };
});

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

  t.context.storage = client.storageUtility;
  t.context.consultationJsonApi = {
    id: 4,
    type: 'video_consultations',
    attributes: {
      confirmed_at: null,
      created_at: null,
      deleted_at: null,
      session_identity: null,
      end_at: null,
      name: 'Video Consultation Name',
      start_at: '2018-07-26T02:49:20+00:00',
      status: null,
      updated_at: null
    }
  };
  t.context.consultationJson = {
    id: 4,
    type: 'video_consultations',
    confirmed_at: null,
    created_at: null,
    deleted_at: null,
    session_identity: null,
    end_at: null,
    name: 'Video Consultation Name',
    start_at: '2018-07-26T02:49:20+00:00',
    status: null,
    updated_at: null
  };
  t.context.consultation = new Consultation(t.context.consultationJsonApi);

  t.context.participantJsonApi = {
    id: 1,
    type: 'video_consultation_participants',
    attributes: {
      created_at: null,
      updated_at: null,
    },
    relationships: {
      video_consultation: {
        data: {
          id: 1,
          type: 'video_consultations'
        }
      }
    }
  };
  t.context.participant = new ConsultationParticipant(t.context.participantJsonApi);

  t.context.joinRequest = {
    data: {
      type: 'video_consultation_join',
      attributes: {},
      relationships: {
        video_consultation: {
          data: {
            id: 4,
            type: 'video_consultations'
          }
        },
        video_consultation_participant: {
          data: {
            id: 1,
            type: 'video_consultation_participants'
          }
        }
      }
    }
  };
});

/**
 * @test {Consultation}
 */
test('[unit] Consultation should handle consultation data with a normal json format', (t) => {
  const { consultationJson } = t.context;
  const consultation = new Consultation(consultationJson);
  t.is(consultation.id, 4);
  t.is(consultation.type, 'video_consultations');
  t.is(consultation.name, 'Video Consultation Name');
  t.is(consultation.startAt, '2018-07-26T02:49:20+00:00');
});

/**
 * @test {Consultation}
 */
test('[unit] Consultation should handle consultation data with json api format', (t) => {
  const { consultationJsonApi } = t.context;
  const consultation = new Consultation({ data: consultationJsonApi });
  t.is(consultation.id, 4);
  t.is(consultation.type, 'video_consultations');
  t.is(consultation.name, 'Video Consultation Name');
  t.is(consultation.startAt, '2018-07-26T02:49:20+00:00');
});

/**
 * @test {Consultation}
 */
test('[unit] Consultation should generate json api format when converted to string', (t) => {
  const { consultationJsonApi } = t.context;
  let consultation = new Consultation({ data: consultationJsonApi });
  let json = consultation.toJSON();
  t.deepEqual(json, consultationJsonApi);

  consultation = new Consultation({ data: consultationJsonApi });
  json = consultation.toJSON();
  t.deepEqual(json, consultationJsonApi);
});


/**
 * @test {Consultation.delete}
 */
test('[unit] Consultation.delete should successfully delete a cohort assignment', async (t) => {
  const { consultation } = t.context;
  consultation.id = 5;
  let request = {};
  nock(client.apiBaseUrl).delete(`/v3/video_consultations/${consultation.id}`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [200, ''];
  });
  const response = await consultation.delete();
  t.is(request.path, `/v3/video_consultations/${consultation.id}`);
  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.falsy(response);
});


/**
 * @test {Consultation.join}
 */
test('[unit] Consultation.join should successfully join a consultation by passing in a participant', async (t) => {
  const {
    consultationJsonApi,
    joinRequest,
    joinResponse,
    participant,
  } = t.context;

  const json = JSON.parse(JSON.stringify(consultationJsonApi));
  const consultation = new Consultation({ data: json });
  let request = {};
  nock(client.apiBaseUrl).post(`/v3/video_consultation_join`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [201, joinResponse];
  });
  const response = await consultation.join(participant);

  t.is(request.path, `/v3/video_consultation_join`);
  t.is(request.headers.accept, 'application/json');
  t.deepEqual(request.requestBody, joinRequest);
  t.is(request.headers['content-type'], 'application/json');
  t.is(request.headers.authorization, 'Token token=valid_token');
  t.is(response.id, 2);
  t.is(response.type, 'video_consultations');
  t.is(response.name, 'General Consultation');
  t.is(response.startAt, '2018-08-09T17:59:22Z');
  t.is(response.meta.joinToken, `T1==cGFydG5lcl9pZD00NTYwNDkzMiZzaWc9ZTI0MjE3NzhlYTU5MGQ4NWM1NDkwZj`
    + `M1ZGE3NGE4NjZlY2NlOTliYjpyb2xlPXB1Ymxpc2hlciZzZXNzaW9uX2lkPTFfTVg0ME5UWXdORGt6TW41LU1UVXpNak`
    + `0zTnpNNE56RXpNbjV3ZEVNMFdXeDZPRFo2YjNKS2JXSjNhWE52TmxRcmJtWi1VSDQmY3JlYXRlX3RpbWU9MTUzMzgzNz`
    + `Y0NCZub25jZT0wLjY4NjIwOTA1NTk4MTM3NzUmZXhwaXJlX3RpbWU9MTUzMzg0MTI0NCZjb25uZWN0aW9uX2RhdGE9`);
});

/**
 * @test {Consultation.join}
 */
test('[unit] Consultation.join should successfully join a consultation where the user is a participant', async (t) => {
  const {
    consultationJsonApi,
    insertParticipantResponse,
    joinRequest,
    joinResponse,
  } = t.context;
  const json = JSON.parse(JSON.stringify(consultationJsonApi));
  const consultation = new Consultation({ data: json });
  clinical6.user.id = 217;
  clinical6.user.type = 'mobile_users';
  nock(client.apiBaseUrl).post(`/v3/video_consultation_participants`).reply(201, insertParticipantResponse);
  let request = {};
  nock(client.apiBaseUrl).post(`/v3/video_consultation_join`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [201, joinResponse];
  });
  const response = await consultation.join();

  t.is(request.path, `/v3/video_consultation_join`);
  t.is(request.headers.accept, 'application/json');
  t.deepEqual(request.requestBody, joinRequest);
  t.is(request.headers['content-type'], 'application/json');
  t.is(request.headers.authorization, 'Token token=valid_token');
  t.is(response.id, 2);
  t.is(response.type, 'video_consultations');
  t.is(response.name, 'General Consultation');
  t.is(response.startAt, '2018-08-09T17:59:22Z');
  t.is(response.meta.joinToken, `T1==cGFydG5lcl9pZD00NTYwNDkzMiZzaWc9ZTI0MjE3NzhlYTU5MGQ4NWM1NDkwZj`
    + `M1ZGE3NGE4NjZlY2NlOTliYjpyb2xlPXB1Ymxpc2hlciZzZXNzaW9uX2lkPTFfTVg0ME5UWXdORGt6TW41LU1UVXpNak`
    + `0zTnpNNE56RXpNbjV3ZEVNMFdXeDZPRFo2YjNKS2JXSjNhWE52TmxRcmJtWi1VSDQmY3JlYXRlX3RpbWU9MTUzMzgzNz`
    + `Y0NCZub25jZT0wLjY4NjIwOTA1NTk4MTM3NzUmZXhwaXJlX3RpbWU9MTUzMzg0MTI0NCZjb25uZWN0aW9uX2RhdGE9`);
});

// Consultation.save
/**
 * @test {Consultation.save}
 */
test('[unit] Consultation.save should successfully insert a consultation with a consultation object when id does not exist', async (t) => {
  const { consultationJsonApi, insertResponse } = t.context;
  const json = JSON.parse(JSON.stringify(consultationJsonApi));
  delete json.id;
  const consultation = new Consultation({ data: json });
  let request = {};
  nock(client.apiBaseUrl).post(`/v3/video_consultations`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [201, insertResponse];
  });
  const response = await consultation.save();

  t.is(request.path, `/v3/video_consultations`);
  t.is(request.headers.accept, 'application/json');
  t.deepEqual(request.requestBody, { data: json });
  t.is(request.headers['content-type'], 'application/json');
  t.is(request.headers.authorization, 'Token token=valid_token');
  t.is(response.id, 4);
  t.is(response.type, 'video_consultations');
  t.is(response.name, 'Video Consultation Name');
  t.is(response.startAt, '2018-07-26T02:49:20Z');
});

/**
 * @test {Consultation.save}
 */
test('[unit] Consultation.save should successfully update a consultation with a consultation object when id exists', async (t) => {
  const { consultationJsonApi, updateResponse } = t.context;
  const consultation = new Consultation({ data: consultationJsonApi });
  let request = {};
  nock(client.apiBaseUrl).patch(`/v3/video_consultations/${consultation.id}`).reply(function (uri, requestBody) {
    request = this.req;
    request.requestBody = requestBody;
    return [200, updateResponse];
  });
  const response = await consultation.save();

  t.is(request.path, `/v3/video_consultations/${consultation.id}`);
  t.is(request.headers.accept, 'application/json');
  t.deepEqual(request.requestBody, { data: consultationJsonApi });
  t.is(request.headers['content-type'], 'application/json');
  t.is(request.headers.authorization, 'Token token=valid_token');
  t.is(response.id, 3);
  t.is(response.type, 'video_consultations');
  t.is(response.name, 'Video Consultation Name');
  t.is(response.startAt, '2018-07-26T02:49:20Z');
});