Manual Reference Source Test

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