import mongoose from 'mongoose' import RESTController from './RESTController' import { Model } from '../routeGenModel' const spyFind = jest.spyOn(Model, 'find') const spyFindOne = jest.spyOn(Model, 'findOne') const spyCreate = jest.spyOn(Model, 'create') const spyRemove = jest.spyOn(Model, 'remove') describe('REST Controller', () => { mongoose.connect('mongodb://localhost/rest-controller') const ModelController = new RESTController(Model) const createdModel = { name: 'Gisele' } const updatedModel = { name: 'Adriana' } let createdId = null it('creates an element', () => { return ModelController.create(createdModel) .then(response => { // Check the copy due to a bug with jest. const copy = {} Object.keys(Model.schema.paths).forEach(key => { copy[key] = response.model[key] }) createdId = response.model._id expect(copy).toMatchObject({__v: 0, ...createdModel}) expect(spyCreate).toHaveBeenCalledWith(createdModel) expect(spyCreate).toHaveBeenCalledTimes(1) spyCreate.mockReset() }) }) it('reads an element', () => { return ModelController.read(createdId) .then(response => { // Check the copy due to a bug with jest. const copy = {} Object.keys(Model.schema.paths).forEach(key => { copy[key] = response.model[key] }) expect(copy).toMatchObject({__v: 0, ...createdModel}) expect(spyFindOne).toHaveBeenCalledWith({ _id: createdId }) expect(spyFindOne).toHaveBeenCalledTimes(1) spyFindOne.mockReset() }) }) it('lists elements', () => { return ModelController.list() .then(response => { // Check the copy due to a bug with jest. const copy = {} Object.keys(Model.schema.paths).forEach(key => { copy[key] = response.model[0][key] }) expect(copy).toMatchObject({__v: 0, ...createdModel}) expect(response.model).toHaveLength(2) expect(spyFind).toHaveBeenCalledWith({}) expect(spyFind).toHaveBeenCalledTimes(1) spyFind.mockReset() }) }) it('update elements', () => { return ModelController.update(createdId, { name: 'Adriana' }) .then(response => { // Check the copy due to a bug with jest. const copy = {} Object.keys(Model.schema.paths).forEach(key => { copy[key] = response.model[0][key] }) expect(copy).toMatchObject({__v: 0, ...updatedModel}) expect(spyFind).toHaveBeenCalledWith({}) expect(spyFind).toHaveBeenCalledTimes(1) spyFind.mockReset() }) }) })