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