mirror of
https://github.com/jambonz/jambonz-api-server.git
synced 2025-12-19 05:47:46 +00:00
* https://github.com/jambonz/jambonz-api-server/issues/371 Implemented view_only permission feature * calling prepare-permissions in create-test-db.js * check if there is only 1 permission and if it is VIEW_ONLY then consider user as read-only user * setting is_view_only flag for view user by userid
522 lines
16 KiB
JavaScript
522 lines
16 KiB
JavaScript
const test = require('tape') ;
|
|
const exec = require('child_process').exec ;
|
|
const Account = require('../lib/models/account');
|
|
const request = require('request-promise-native').defaults({
|
|
baseUrl: 'http://127.0.0.1:3000/v1'
|
|
});
|
|
const theOneAndOnlyServiceProviderSid = '2708b1b3-2736-40ea-b502-c53d8396247f';
|
|
const {createApiKey} = require('./utils');
|
|
|
|
const sleepFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
|
|
test('re-creating schema', (t) => {
|
|
exec(`mysql -h 127.0.0.1 -u root --protocol=tcp --port=3360 -D jambones_test < ${__dirname}/../db/jambones-sql.sql`, (err, stdout, stderr) => {
|
|
if (err) return t.end(err);
|
|
t.pass('schema successfully created');
|
|
t.end();
|
|
});
|
|
});
|
|
|
|
test('seeding database for webapp tests', (t) => {
|
|
exec(`mysql -h 127.0.0.1 -u root --protocol=tcp --port=3360 -D jambones_test < ${__dirname}/../db/webapp-tests.sql`, (err, stdout, stderr) => {
|
|
if (err) return t.end(err);
|
|
t.pass('successfully re-seeded database');
|
|
t.end();
|
|
});
|
|
});
|
|
test('prepare permissions', (t) => {
|
|
exec(`mysql -h 127.0.0.1 -u root --protocol=tcp --port=3360 -D jambones_test < ${__dirname}/../db/prepare-permissions-test.sql`, (err, stdout, stderr) => {
|
|
if (err) return t.end(err);
|
|
t.pass('permissions prepared');
|
|
t.end();
|
|
});
|
|
});
|
|
test('webapp tests', async(t) => {
|
|
const app = require('../app');
|
|
let sid;
|
|
try {
|
|
let result;
|
|
|
|
/* create a new user/account using email/password */
|
|
const code = '123456';
|
|
result = await request.post('/register', {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
body: {
|
|
service_provider_sid: theOneAndOnlyServiceProviderSid,
|
|
provider: 'local',
|
|
name: 'Joe User',
|
|
email: 'joe@user.com',
|
|
password: 'fiddlesticks',
|
|
email_activation_code: code
|
|
}
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.pristine === true &&
|
|
!result.body.is_active && result.body.root_domain === 'sip.yakeeda.com',
|
|
'successfully created a user and account and got jwt using email validation');
|
|
|
|
const {user_sid, account_sid, jwt} = result.body;
|
|
let authUser = {bearer: jwt};
|
|
|
|
/* invalid code */
|
|
result = await request.put('/ActivationCode/38383', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
simple: false,
|
|
json: true,
|
|
body: {
|
|
user_sid,
|
|
type: 'email'
|
|
}
|
|
});
|
|
|
|
t.ok(result.statusCode === 400, 'fails to validate email with invalid code');
|
|
|
|
/* invalid user */
|
|
result = await request.put(`/ActivationCode/${code}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
simple: false,
|
|
json: true,
|
|
body: {
|
|
user_sid: 'foobar',
|
|
type: 'email'
|
|
}
|
|
});
|
|
|
|
t.ok(result.statusCode === 400, 'fails to validate email with invalid user');
|
|
|
|
/* successfully validate the password */
|
|
result = await request.put(`/ActivationCode/${code}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
user_sid,
|
|
type: 'email'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully validated email and activated account');
|
|
|
|
/* create a phone validation code */
|
|
result = await request.post('/ActivationCode', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
simple: false,
|
|
body: {
|
|
user_sid: 'foobar',
|
|
type: 'phone',
|
|
value: '16173333456',
|
|
code: '12389'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 400, 'returns 400 bad request creating activation code with invalid user_sid');
|
|
|
|
result = await request.post('/ActivationCode', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
simple: false,
|
|
body: {
|
|
user_sid,
|
|
type: 'foobar',
|
|
value: '16173333456',
|
|
code: '12389'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 400, 'returns 400 bad request creating activation code with invalid type');
|
|
|
|
result = await request.post('/ActivationCode', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
simple: false,
|
|
body: {
|
|
user_sid,
|
|
type: 'email',
|
|
value: 'notanemail',
|
|
code: '12389'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 400, 'returns 400 bad request creating activation code with invalid email');
|
|
|
|
/* create a phone validation code */
|
|
result = await request.post('/ActivationCode', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
user_sid,
|
|
type: 'phone',
|
|
value: '16173333456',
|
|
code: '12389'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully added a phone validation code');
|
|
|
|
/* successfully validate the code */
|
|
result = await request.put('/ActivationCode/12389', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
user_sid,
|
|
type: 'phone'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully validated phone number');
|
|
|
|
/* check availability of a phone numbers and email */
|
|
result = await request.get('/Availability?type=phone&value=16173333456', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
t.ok(result.statusCode === 200 && result.body.available === false, 'indicates when phone number is not available');
|
|
|
|
result = await request.get('/Availability?type=phone&value=15083084809', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
t.ok(result.statusCode === 200 && result.body.available === true, 'indicates when phone number is available');
|
|
|
|
result = await request.get('/Availability?type=email&value=joe@user.com', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
t.ok(result.statusCode === 200 && result.body.available === false, 'indicates when email is not available');
|
|
|
|
result = await request.get('/Availability?type=email&value=jim@user.com', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
t.ok(result.statusCode === 200 && result.body.available === true, 'indicates when email is available');
|
|
|
|
/* check if a subdomain is available */
|
|
result = await request.get('/Availability?type=subdomain&value=mycompany.sip.jambonz.cloud', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
t.ok(result.statusCode === 200 && result.body.available === true, 'indicates when subdomain is available');
|
|
|
|
/* these hit the DNS provider (dnsmadeeasy) so only do as needed */
|
|
if (process.env.DME_API_KEY) {
|
|
/* add a subdomain to the account */
|
|
result = await request.post(`Accounts/${account_sid}/SipRealms/test.yakeeda.com`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
});
|
|
t.ok(result.statusCode === 204, 'added subdomain');
|
|
|
|
/* change the subdomain */
|
|
result = await request.post(`Accounts/${account_sid}/SipRealms/myco.yakeeda.com`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
});
|
|
t.ok(result.statusCode === 204, 'added subdomain');
|
|
|
|
/* retrieve account and verify sip_realm */
|
|
result = await request.get(`Accounts/${account_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.sip_realm === 'myco.yakeeda.com' && result.body.is_active,
|
|
'sip_realm successfully added to account');
|
|
|
|
/* check if a subdomain is available */
|
|
result = await request.get('/Availability?type=subdomain&value=myco.yakeeda.com', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
t.ok(result.statusCode === 200 && result.body.available === false, 'indicates when subdomain is not available');
|
|
}
|
|
|
|
/* retrieve test number and app for a service provider */
|
|
result = await request.get(`/AccountTest/${theOneAndOnlyServiceProviderSid}`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
});
|
|
//console.log(JSON.stringify(result.body));
|
|
t.ok(result.statusCode === 200 &&
|
|
result.body.phonenumbers.length === 1 && result.body.applications.length === 1, 'retrieves test number and application');
|
|
|
|
/* try to update user name passing an invalid uuid */
|
|
try {
|
|
await request.put(`/Users/foobar`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
simple: false,
|
|
auth: authUser,
|
|
body: {
|
|
name: 'Jane Doe'
|
|
}
|
|
});
|
|
} catch (error) {
|
|
t.ok(error.statusCode === 400, 'returns 400 bad request if user sid param is not a valid uuid');
|
|
}
|
|
|
|
/* update user name */
|
|
result = await request.put(`/Users/${user_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
auth: authUser,
|
|
body: {
|
|
name: 'Jane Doe'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'updates user name');
|
|
|
|
/* update password */
|
|
result = await request.put(`/Users/${user_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
auth: authUser,
|
|
body: {
|
|
old_password: 'fiddlesticks',
|
|
new_password: 'foobarbazzle'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'updates user password');
|
|
|
|
/* update email */
|
|
result = await request.put(`/Users/${user_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
auth: authUser,
|
|
body: {
|
|
email: 'janedoe@gmail.com',
|
|
email_activation_code: '39877'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'updates email address');
|
|
|
|
/* successfully validate the new email */
|
|
result = await request.put('/ActivationCode/39877', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
user_sid,
|
|
type: 'email'
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully validated the new email address');
|
|
|
|
/* add api keys */
|
|
await createApiKey(request, account_sid);
|
|
await createApiKey(request, account_sid);
|
|
|
|
/* retrieve my own user info */
|
|
result = await request.get(`/Users/me`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
auth: authUser,
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200, 'successfully retrieved my own user details');
|
|
|
|
/* sign in with new email and password */
|
|
result = await request.post('/signin', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
email: 'janedoe@gmail.com',
|
|
password: 'foobarbazzle'
|
|
}
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.user_sid === user_sid, 'successfully signed in with changed email and password');
|
|
|
|
/* logout */
|
|
result = await request.post('/logout', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
email: 'janedoe@gmail.com',
|
|
password: 'foobarbazzle'
|
|
}
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 204, 'successfully logged out');
|
|
await sleepFor(1200);
|
|
|
|
/* using old jwt fails */
|
|
result = await request.get(`/Users/me`, {
|
|
resolveWithFullResponse: true,
|
|
simple: false,
|
|
auth: authUser,
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 401, 'fails using jwt after logout');
|
|
|
|
/* sign in again */
|
|
result = await request.post('/signin', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
email: 'janedoe@gmail.com',
|
|
password: 'foobarbazzle'
|
|
}
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.user_sid === user_sid, 'successfully signed in again');
|
|
authUser = {bearer: result.body.jwt};
|
|
|
|
/* new jwt works */
|
|
result = await request.get(`/Users/me`, {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
auth: authUser,
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200, 'new jwt works');
|
|
|
|
/* can not delete a voip_carrier that is not associated to my account */
|
|
result = await request.delete('/VoipCarriers/5145b436-2f38-4029-8d4c-fd8c67831c7a', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
simple: false
|
|
});
|
|
t.ok(result.statusCode === 422, 'fails to delete a voip_carrier not associated with users account');
|
|
|
|
/* add a BYOC carrier
|
|
Note: no need to supply account_sid, it will be assigned based on the jwt
|
|
*/
|
|
result = await request.post('/VoipCarriers', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
name: 'BYCO1',
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 201 && result.body.sid, 'succesfully created BYOC carrier');
|
|
const carrier_sid = result.body.sid;
|
|
|
|
/* add a sip gateway to the carrier */
|
|
result = await request.post('/SipGateways', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
voip_carrier_sid: carrier_sid,
|
|
ipv4: '192.168.1.1',
|
|
inbound: true,
|
|
outbound: true
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 201, 'successfully created sip gateway for BYOC carrier');
|
|
let gateway_sid = result.body.sid;
|
|
|
|
/* update sip gateway */
|
|
result = await request.put(`/SipGateways/${gateway_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
port: 5080
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully updated sip gateway for BYOC carrier');
|
|
|
|
/* delete sip gateway */
|
|
result = await request.delete(`/SipGateways/${gateway_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully deleted sip gateway for BYOC carrier');
|
|
|
|
/* add a smpp gateway to the carrier */
|
|
result = await request.post('/SmppGateways', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
voip_carrier_sid: carrier_sid,
|
|
ipv4: '192.168.1.1',
|
|
inbound: true,
|
|
outbound: true
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 201, 'successfully created smpp gateway for BYOC carrier');
|
|
gateway_sid = result.body.sid;
|
|
|
|
/* update smpp gateway */
|
|
result = await request.put(`/SmppGateways/${gateway_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
body: {
|
|
port: 5080
|
|
}
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully updated smpp gateway for BYOC carrier');
|
|
|
|
/* delete smpp gateway */
|
|
result = await request.delete(`/SmppGateways/${gateway_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully deleted smpp gateway for BYOC carrier');
|
|
|
|
result = await request.get('/Sbcs', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.length === 1, 'retrieve Sbcs');
|
|
|
|
result = await request.get('/Smpps', {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
json: true,
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.length === 2, 'retrieve Smpps');
|
|
|
|
/* delete account */
|
|
result = await request.delete(`/Accounts/${account_sid}`, {
|
|
resolveWithFullResponse: true,
|
|
auth: authUser,
|
|
});
|
|
t.ok(result.statusCode === 204, 'successfully deleted account');
|
|
|
|
/* create a new user/account using same email/password */
|
|
result = await request.post('/register', {
|
|
resolveWithFullResponse: true,
|
|
json: true,
|
|
body: {
|
|
service_provider_sid: theOneAndOnlyServiceProviderSid,
|
|
provider: 'local',
|
|
name: 'Joe User',
|
|
email: 'joe@user.com',
|
|
password: 'fiddlesticks',
|
|
email_activation_code: code
|
|
}
|
|
});
|
|
//console.log(result.body);
|
|
t.ok(result.statusCode === 200 && result.body.pristine === true &&
|
|
!result.body.is_active && result.body.root_domain === 'sip.yakeeda.com',
|
|
'successfully created a user and account and got jwt using email validation');
|
|
|
|
}
|
|
catch (err) {
|
|
console.error(err);
|
|
t.end(err);
|
|
}
|
|
});
|
|
|