'use strict' const test = require('ava') const { stub } = require('sinon') const Hapi = require('@hapi/hapi') const plugin = require('../lib/plugins/membership') const Grouping = require('../lib/models/grouping') const Membership = require('../lib/models/membership') const ProfileService = require('../lib/services/profile') const params = { profile_id: 3, } const mockReturn = { memberships: [ { membership_id: 4, profile_id: 3, grouping_id: 3, membership_type: 'participant', can_edit: false, is_active: true, }, { membership_id: 5, profile_id: 1, grouping_id: 3, membership_type: 'participant', can_edit: false, is_active: false, }, ], hasMatch: false, groupings: [], } const pathToTest = { method: 'POST', url: `/${params.profile_id}/join`, payload: { grouping_id: 3, grouping_name: 'test_match', grouping_type: 'test_group', target_id: 1, role: 'participant', }, } let membership_id = 4 test(`path ${pathToTest.url} should return two memberships`, async t => { const server = Hapi.server() server.registerModel = () => {} server.models = () => ({ Grouping, Membership, }) await plugin.register(server) server.services()['profileService'] = new ProfileService(server) /** * TODO: adjust stubs to mock joinGrouping more closely */ stub(server.models()['Grouping'], 'query').returns({ whereIn: () => mockReturn.groupings, }) stub(server.models()['Membership'], 'query').returns({ where: pid => { if (pid == 'membership_id') { return { where: () => ({ patch: () => {}, }), } } return mockReturn.memberships.filter( membership => membership.profile_id == pid.profile_id, ) }, insert: toInsert => { const membership = { membership_id, ...toInsert } mockReturn.memberships.push(membership) membership_id++ return membership }, whereIn: () => mockReturn.memberships, }) /** * Test the server with registered models and services */ const { payload } = await server.inject(pathToTest) const res = JSON.parse(payload) t.deepEqual(res.ok, true) t.deepEqual(res.data, mockReturn) server.stop() })