test/unit/helpers.app-menu.js
import test from 'ava';
import nock from 'nock';
import {
client,
AppMenu,
} from '../../src';
// See tests.js for testing client creation
test.before('start server', () => {
client.apiBaseUrl = 'https://someappMenu.Clinical6.com';
client.authToken = 'valid_token';
});
test.beforeEach((t) => {
client.cache = 'never';
client.authToken = 'valid_token';
nock(client.apiBaseUrl).delete(`/v3/navigation/app_menus/9`).reply(200, '');
nock(client.apiBaseUrl).post(`/v3/navigation/app_menus`).reply(201, {
data: {
id: '3',
type: 'navigation__app_menus',
attributes: {
title: 'title',
image: {
url: '/default/default.png',
small: {
url: '/default/small_default.png'
},
small_hd: {
url: '/default/small_hd_default.png'
},
fullscreen: {
url: '/default/fullscreen_default.png'
},
main: {
url: '/default/main_default.png'
},
fullscreen_hd: {
url: '/default/fullscreen_hd_default.png'
},
main_hd: {
url: '/default/main_hd_default.png'
}
},
action: 'action',
enabled: true,
created_at: '2018-03-20T18:24:29Z',
updated_at: '2018-03-20T18:24:29Z',
position: 2
},
relationships: {
action_detail: {
data: {
id: '179',
type: 'data_collection__flow_processes'
}
},
parent: {
data: {
id: 2,
type: 'navigation__app_menus'
}
}
}
}
});
t.context.appMenuJsonApi = {
id: 9,
type: 'navigation__app_menus',
attributes: {
title: 'some-title 7',
image: {
url: '/assets/default/default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png',
small: {
url: '/assets/default/small_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
small_hd: {
url: '/assets/default/small_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen: {
url: '/assets/default/fullscreen_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main: {
url: '/assets/default/main_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen_hd: {
url: '/assets/default/fullscreen_hd_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main_hd: {
url: '/assets/default/main_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
}
},
action: 'subcategory',
enabled: true,
created_at: '2018-03-20T16:18:28Z',
updated_at: '2018-03-20T16:18:28Z',
position: 9
},
relationships: {
action_detail: {
data: {
id: 1,
type: 'data_collection__flow_processes'
}
}
}
};
t.context.appMenuJson = {
id: 9,
title: 'some-title 7',
image: {
url: '/assets/default/default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png',
small: {
url: '/assets/default/small_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
small_hd: {
url: '/assets/default/small_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen: {
url: '/assets/default/fullscreen_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main: {
url: '/assets/default/main_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen_hd: {
url: '/assets/default/fullscreen_hd_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main_hd: {
url: '/assets/default/main_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
}
},
action: 'subcategory',
enabled: true,
created_at: '2018-03-20T16:18:28Z',
updated_at: '2018-03-20T16:18:28Z',
position: 9,
relationships: {
action_detail: {
data: {
id: '1',
type: 'data_collection__flow_processes'
}
}
}
};
client.storageUtility.clear();
t.context.storage = client.storageUtility;
client.appMenu = new AppMenu({});
t.context.appMenu = new AppMenu(t.context.appMenuJsonApi);
});
/**
* @test {AppMenu}
*/
test('[unit] AppMenu should handle appMenu data with a normal json format', (t) => {
const { appMenuJson } = t.context;
const appMenu = new AppMenu(appMenuJson);
t.is(appMenu.id, 9);
t.is(appMenu.type, 'navigation__app_menus');
t.is(appMenu.title, 'some-title 7');
t.is(appMenu.action, 'subcategory');
t.is(appMenu.enabled, true);
t.is(appMenu.createdAt, '2018-03-20T16:18:28Z');
t.is(appMenu.updatedAt, '2018-03-20T16:18:28Z');
t.is(appMenu.position, 9);
t.is(appMenu.image.url, '/assets/default/default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png');
});
/**
* @test {AppMenu}
*/
test('[unit] AppMenu should handle appMenu data with json api format', (t) => {
const { appMenuJsonApi } = t.context;
const appMenu = new AppMenu({ data: appMenuJsonApi });
t.is(appMenu.id, 9);
t.is(appMenu.type, 'navigation__app_menus');
t.is(appMenu.title, 'some-title 7');
t.is(appMenu.action, 'subcategory');
t.is(appMenu.enabled, true);
t.is(appMenu.createdAt, '2018-03-20T16:18:28Z');
t.is(appMenu.updatedAt, '2018-03-20T16:18:28Z');
t.is(appMenu.position, 9);
t.is(appMenu.image.url, '/assets/default/default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png');
});
/**
* @test {AppMenu}
*/
test('[unit] AppMenu should generate json api format when converted to string', (t) => {
const { appMenuJsonApi } = t.context;
const appMenu1 = new AppMenu({ data: appMenuJsonApi });
t.deepEqual(appMenu1.toJSON(), appMenuJsonApi);
const appMenu2 = new AppMenu(appMenuJsonApi);
t.deepEqual(appMenu2.toJSON(), appMenuJsonApi);
});
/**
* @test {AppMenu.delete} testing responses from child object
*/
test('[unit] AppMenu.delete should successfully deletes an appMenu and all it submenus', async (t) => {
const { appMenuJsonApi } = t.context;
// when cascade is true, all submenus along with the appMenu it is associated to is deleted with a response of 204 as success
let request = {};
nock(client.apiBaseUrl).delete(`/v3/navigation/app_menus/9?options[cascade]=true`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [204, ''];
});
const appMenu = new AppMenu({ data: appMenuJsonApi });
appMenu.id = 9;
await appMenu.delete(true);
t.is(request.path, `/v3/navigation/app_menus/${appMenu.id}?options[cascade]=true`);
t.is(request.headers.accept, 'application/json');
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
});
/**
* @test {AppMenu.delete}
*/
test('[unit] AppMenu.delete should successfully delete an appMenu without submenus', async (t) => {
const { appMenuJsonApi } = t.context;
const appMenu = new AppMenu({ data: appMenuJsonApi });
let request = {};
// when cascade is false and there are submenus that are called to be deleted with a response of 422 as an error handler
// nock(client.apiBaseUrl).delete(`/v3/navigation/app_menus/${appMenu.id}?options[cascade]=false`).reply(function (uri, requestBody) {
// request = this.req;
// request.requestBody = requestBody;
// return [422, { data: [{
// errors: [{
// source: {
// pointer: '/data/attributes/ancestry'
// },
// detail: 'Cannot delete menu that has sub-menus'
// }] }]
// }];
// });
nock(client.apiBaseUrl).delete(`/v3/navigation/app_menus/9?options[cascade]=false`).reply(function (uri, requestBody) {
request = this.req;
request.requestBody = requestBody;
return [204, ''];
});
await appMenu.delete(false);
t.is(request.path, `/v3/navigation/app_menus/${appMenu.id}?options[cascade]=false`);
t.is(request.headers.accept, 'application/json');
t.is(request.headers['content-type'], 'application/json');
t.is(request.headers.authorization, 'Token token=valid_token');
});
/**
* @test {AppMenu.save}
*/
test('[unit] AppMenu.save should successfully insert a appMenu with a appMenu object when id does not exist', async (t) => {
const { appMenuJsonApi } = t.context;
const json = JSON.parse(JSON.stringify(appMenuJsonApi));
delete json.id;
const appMenu = new AppMenu({ data: json });
const response = await appMenu.save();
// t.is(request.path, `/v3/navigation/app_menus`);
// t.is(request.headers.accept, 'application/json');
// t.deepEqual(JSON.parse(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, 3);
t.is(response.type, 'navigation__app_menus');
});
/**
* @test {AppMenu.save}
*/
test('[unit] AppMenu.save should successfully update a appMenu with a appMenu object when id exists', async (t) => {
const { appMenuJsonApi } = t.context;
let requestBody = {};
const server = nock(client.apiBaseUrl)
.patch('/v3/navigation/app_menus/9', (body) => {
requestBody = body;
return { data: json };
})
.reply(201, {
data: {
id: '9',
type: 'navigation__app_menus',
attributes: {
title: 'some-title',
image: {
url: '/assets/default/default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png',
small: {
url: '/assets/default/small_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
small_hd: {
url: '/assets/default/small_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen: {
url: '/assets/default/fullscreen_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main: {
url: '/assets/default/main_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen_hd: {
url: '/assets/default/fullscreen_hd_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main_hd: {
url: '/assets/default/main_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
}
},
action: 'some-action',
enabled: true,
created_at: '2018-03-20T15:46:33Z',
updated_at: '2018-03-20T15:46:33Z',
position: 1
},
relationships: {
action_detail: {
data: {
id: 1,
type: 'data_collection__flow_processes'
}
}
}
}
});
const json = JSON.parse(JSON.stringify(appMenuJsonApi));
const appMenu = new AppMenu({ data: json });
const response = await appMenu.save();
t.deepEqual(requestBody, { data: json });
server.done();
t.is(response.id, 9);
t.is(response.type, 'navigation__app_menus');
t.is(response.title, 'some-title');
t.is(response.action, 'some-action');
t.is(response.enabled, true);
t.is(response.createdAt, '2018-03-20T15:46:33Z');
t.is(response.updatedAt, '2018-03-20T15:46:33Z');
t.is(response.position, 1);
t.is(response.actionDetail.id, 1);
t.is(response.actionDetail.type, 'data_collection__flow_processes');
});
/**
* @test {AppMenu.save}
*/
test('[unit] AppMenu.save should successfully update a appMenu with a appMenu object with a null relationship when id exists', async (t) => {
const { appMenuJsonApi } = t.context;
let requestBody = {};
const server = nock(client.apiBaseUrl)
.patch('/v3/navigation/app_menus/10', (body) => {
requestBody = body;
return { data: json };
})
.reply(201, {
data: {
id: '10',
type: 'navigation__app_menus',
attributes: {
title: 'some-title',
image: {
url: '/assets/default/default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png',
small: {
url: '/assets/default/small_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
small_hd: {
url: '/assets/default/small_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen: {
url: '/assets/default/fullscreen_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main: {
url: '/assets/default/main_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
},
fullscreen_hd: {
url: '/assets/default/fullscreen_hd_default-80b0cfa7e6bd6ee57d0f3806eb25b31a842fe9ab69fc4a594303f5555b5bc4bd.png'
},
main_hd: {
url: '/assets/default/main_hd_default-16daaa70b849a969f5ab41d3b7c9513c8ca890a6dd3b30e39c5afc25b8a773b6.png'
}
},
action: 'some-action',
enabled: true,
created_at: '2018-03-20T15:46:33Z',
updated_at: '2018-03-20T15:46:33Z',
position: 1
},
relationships: {
action_detail: null
}
}
});
appMenuJsonApi.id = 10;
appMenuJsonApi.relationships.action_detail.data = null;
const json = JSON.parse(JSON.stringify(appMenuJsonApi));
const appMenu = new AppMenu({ data: json });
const response = await appMenu.save();
t.deepEqual(requestBody, { data: json });
server.done();
t.is(response.id, 10);
t.is(response.type, 'navigation__app_menus');
t.is(response.title, 'some-title');
t.is(response.action, 'some-action');
t.is(response.enabled, true);
t.is(response.createdAt, '2018-03-20T15:46:33Z');
t.is(response.updatedAt, '2018-03-20T15:46:33Z');
t.is(response.position, 1);
t.is(response.actionDetail, null);
});