Manual Reference Source Test

test/unit/services.user.v3.invitation.js

import test from 'ava';
import sinon from 'sinon';
import {
  client,
  mobileUserService,
  userService,
  Language,
  Role,
  Site,
  User,
} 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';
  mobileUserService.cacheMode = 'networkOnly';
  userService.cacheMode = 'networkOnly';

  t.context.server = sinon.fakeServer.create();
  t.context.server.respondImmediately = true;
  // t.context.server.autoRespond = true;

  t.context.server.respondWith('POST', `${client.apiBaseUrl}/v3/mobile_users/invitation`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '419',
        type: 'mobile_users',
        attributes: {
          uuid: 'ff030b0a-2f04-4a2f-ab39-59c2c5744b22',
          account_name: '25089567',
          email: 'user631@fake.com',
          created_at: '2018-02-14T16:39:05Z',
          updated_at: '2018-02-14T16:39:05Z',
          verified_at: null,
          invitation_sent_at: '2018-02-14T16:39:05Z',
          invitation_accepted_at: null,
          disabled: false,
          disabled_at: null
        },
        relationships: {
          devices: {
            data: []
          },
          user_role: {
            data: {
              id: '308',
              type: 'user_roles'
            }
          },
          profile: {
            data: {
              id: '650',
              type: 'profiles'
            }
          },
          language: {
            data: {
              id: '1',
              type: 'languages'
            }
          },
          patient: {
            data: null
          }
        }
      }
    })]);

  t.context.server.respondWith('PATCH', `${client.apiBaseUrl}/v3/mobile_users/invitation`,
    [201, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '10',
        type: 'mobile_users',
        attributes: {
          uuid: 'b5a0d8e9-a988-4a29-aefb-22402f92d58e',
          account_name: 'dummy_7',
          email: 'user10@fake.com',
          encryption_key: 'b00290b6e47e63dc7b221c64c0dc7fec',
          created_at: '2017-08-14T22:55:11Z',
          updated_at: '2017-08-14T22:55:11Z',
          verified_at: null,
          invitation_sent_at: null,
          invitation_accepted_at: '2017-08-14T22:55:11Z',
        },
        relationships: {
          devices: {
            data: [
              {
                id: '4',
                type: 'devices'
              }
            ]
          },
          user_role: {
            data: {
              id: '10',
              type: 'user_roles'
            }
          },
          language: {
            data: {
              id: '4',
              type: 'languages'
            }
          }
        }
      },
      included: [
        {
          id: '4',
          type: 'devices',
          attributes: {
            udid: 'ph2knq8xtg1znvuhrv0h',
            technology: 'ios',
            access_token: '05eaf798ce4bcce9e98ec01843af4881',
            push_id: 'vmp6cl06avq3k2v6ij1z6hv0gaz5y47qx6aotwywq60buoy2sla2hmmulmpbte45',
            created_at: '2017-08-14T22:55:11Z',
            updated_at: '2017-08-14T22:55:11Z',
            app_version: null
          }
        },
        {
          id: '10',
          type: 'user_roles',
          attributes: {
            permanent_link: 'mobile',
            name: 'Default Mobile',
            is_super: false,
            is_admin: false,
            is_mobile: true,
            is_default: true
          }
        }
      ]
    })]);

  t.context.server.respondWith('POST', `${client.apiBaseUrl}/v3/users/invitation`,
    [200, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '171',
        type: 'users',
        attributes: {
          uuid: 'b15686e7-8d9c-419e-8fe6-03fa4630fb2c',
          email: 'test@test.com',
          created_at: '2018-02-14T16:38:33Z',
          updated_at: '2018-02-14T16:38:33Z',
          invitation_sent_at: '2018-02-14T16:38:33Z',
          invitation_accepted_at: null,
          invitation_due_at: '2018-03-14T16:39:05Z',
          disabled_at: null
        },
        relationships: {
          user_role: {
            data: {
              id: '227',
              type: 'user_roles'
            }
          },
          devices: {
            data: []
          },
          profile: {
            data: {
              id: '492',
              type: 'profiles'
            }
          }
        }
      }
    })]);

  t.context.server.respondWith('PATCH', `${client.apiBaseUrl}/v3/users/invitation`,
    [201, { 'Content-Type': 'application/json' }, JSON.stringify({
      data: {
        id: '110',
        type: 'users',
        attributes: {
          uuid: '09140540-e23f-4ccd-9f99-072fed4f07b3',
          email: 'user326@fake.com',
          created_at: '2018-02-22T19:47:25Z',
          updated_at: '2018-02-22T19:47:25Z',
          invitation_sent_at: '2018-02-22T19:47:25Z',
          invitation_accepted_at: '2018-02-22T19:47:25Z',
          invitation_due_at: '2018-03-14T16:39:05Z',
          disabled_at: null
        },
        relationships: {
          user_role: {
            data: {
              id: '149',
              type: 'user_roles'
            }
          },
          devices: {
            data: []
          },
          profile: {
            data: {
              id: '337',
              type: 'profiles'
            }
          }
        }
      }
    })]);

  t.context.storage = client.storageUtility;
  // t.context.storage.clear();
  t.context.mobileUserJsonInvite = {
    data: {
      type: 'invitations',
      attributes: {
        email: 'user633@fake.com'
      },
      relationships: {
        language: {
          data: {
            type: 'languages',
            id: 9
          }
        }
      }
    }
  };
  t.context.mobileUserJsonInviteWithSite = {
    data: {
      type: 'invitations',
      attributes: {
        email: 'user633@fake.com'
      },
      relationships: {
        site: {
          data: {
            type: 'trials__sites',
            id: 15
          }
        }
      }
    }
  };
  t.context.mobileUserJsonInviteWithDP = {
    data: {
      type: 'invitations',
      attributes: {
        email: 'user633@fake.com',
        dynamic_profile: {
          cookies: 52
        }
      }
    }
  };
  t.context.adminUserJsonInvite = {
    data: {
      type: 'invitations',
      attributes: {
        email: 'test@test.com',
        first_name: 'John',
        last_name: 'Doe'
      },
      relationships: {
        user_role: {
          data: {
            type: 'user_roles',
            id: 227
          }
        }
      }
    }
  };
});

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

// UserService.invite method
/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should exist', (t) => {
  t.truthy(mobileUserService.invite);
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should throw errors for invalid parameters', async (t) => {
  const title = 'UserService.invite error';
  await t.throwsAsync(mobileUserService.invite(), `${title}: user is not defined`);
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should successfully invite mobile user with a mobile user object', async (t) => {
  // const { mobileUserJsonInvite } = t.context;
  const user = new User({ email: 'user633@fake.com' });
  user.profile.language = new Language({ id: 9 });
  const response = await mobileUserService.invite(user);
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/mobile_users/invitation`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), mobileUserJsonInvite);
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 419);
  t.is(response.type, 'mobile_users');
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should successfully invite mobile user with a mobile user object and a site', async (t) => {
  // const { mobileUserJsonInviteWithSite } = t.context;
  const user = new User({ email: 'user633@fake.com' });
  const response = await mobileUserService.invite(user, {}, { site: new Site({ id: 15 }) });
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/mobile_users/invitation`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), mobileUserJsonInviteWithSite);
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 419);
  t.is(response.type, 'mobile_users');
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should successfully invite mobile user with a mobile user object and a dynamic profile', async (t) => {
  // const { mobileUserJsonInviteWithDP } = t.context;
  const user = new User({ email: 'user633@fake.com' });
  const response = await mobileUserService.invite(user, { dynamic_profile: { cookies: 52 } });
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/mobile_users/invitation`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), mobileUserJsonInviteWithDP);
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 419);
  t.is(response.type, 'mobile_users');
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should successfully invite admin user with a admin user object', async (t) => {
  // const { adminUserJsonInvite } = t.context;
  const user = new User({ email: 'test@test.com' });
  user.profile.firstName = 'John';
  user.profile.lastName = 'Doe';
  user.type = 'users';
  user.role = new Role({ id: 227 });
  const response = await userService.invite(user);
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/users/invitation`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), adminUserJsonInvite);
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 171);
  t.is(response.type, 'users');
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should successfully invite admin user with a admin user object and a role as a relationship', async (t) => {
  // const { adminUserJsonInvite } = t.context;
  const user = new User({ email: 'test@test.com' });
  user.profile.firstName = 'John';
  user.profile.lastName = 'Doe';
  user.type = 'users';
  const response = await userService.invite(user, {}, { userRole: new Role({ id: 227 }) });
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/users/invitation`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // t.deepEqual(JSON.parse(request.requestBody), adminUserJsonInvite);
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 171);
  t.is(response.type, 'users');
});

/**
 * @test {UserService.invite}
 */
test('[unit] UserService.invite should successfully invite admin user with a admin user object and a role as a relationship (Platform UI Error)', async (t) => {
  // const { adminUserJsonInvite } = t.context;
  const user = new User({ email: 'test@test.com' });
  user.profile.firstName = 'John';
  user.profile.lastName = 'Doe';
  user.type = 'users';
  const userRoleId = 23;
  const siteId = 42;
  const response = await userService.invite(user, {}, {
    userRole: new Role({ id: userRoleId }),
    site: new Site({ id: siteId })
  });
  // const request = t.context.server.requests[0];
  // t.is(request.method, 'POST');
  // t.is(request.url, `${client.apiBaseUrl}/v3/users/invitation`);
  // t.is(request.requestHeaders.Accept, 'application/json');
  // // t.deepEqual(JSON.parse(request.requestBody), adminUserJsonInvite);
  // t.is(request.requestHeaders['Content-Type'], 'application/json;charset=utf-8');
  // t.is(request.requestHeaders.Authorization, 'Token token=valid_token');
  t.is(response.id, 171);
  t.is(response.type, 'users');
});

/**
 * @test {mobileUserService.acceptInvitation}
 */
test('[unit] mobileUserService.acceptInvitation should successfully register user ', async (t) => {
  const user = { 
                  email: 'user10@fake.com', 
                  password: 'Test.123',  
                  terms_of_use_accepted: true,
                  privacy_policy_accepted: true,
                  anti_spam_accepted: true
              };
  const response = await mobileUserService.acceptInvitation('1234', user);
  t.is(response.id, 10);
  t.is(response.type, 'mobile_users');
});