Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
post.test.js 4.48 KiB
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
process.env.SUPPRESS_NO_CONFIG_WARNING = true

const fixtures = require('./../fixtures/fixtures')
const Chance = require('chance')
const Model = require('./../helpers/Model')
const cloneDeep = require('lodash/cloneDeep')
const requests = require('./../helpers/requests')

const chance = new Chance()
const reqBody = {
  recommendation: 'accept',
  comments: [
    {
      content: chance.paragraph(),
      public: chance.bool(),
      files: [
        {
          id: chance.guid(),
          name: 'file.pdf',
          size: chance.natural(),
        },
      ],
    },
  ],
  recommendationType: 'review',
}

const path = '../../routes/fragmentsRecommendations/post'
const route = {
  path: '/api/collections/:collectionId/fragments/:fragmentId/recommendations',
}
describe('Post fragments recommendations route handler', () => {
  let testFixtures = {}
  let body = {}
  let models
  beforeEach(() => {
    testFixtures = cloneDeep(fixtures)
    body = cloneDeep(reqBody)
    models = Model.build(testFixtures)
  })
  it('should return an error when params are missing', async () => {
    const { reviewer } = testFixtures.users
    delete body.recommendationType
    const res = await requests.sendRequest({
      body,
      userId: reviewer.id,
      route,
      models,
      path,
    })

    expect(res.statusCode).toBe(400)
    const data = JSON.parse(res._getData())
    expect(data.error).toEqual('Recommendation type is required.')
  })
  it('should return success when the parameters are correct', async () => {
    const { reviewer } = testFixtures.users
    const { collection } = testFixtures.collections
    const { fragment } = testFixtures.fragments

    const res = await requests.sendRequest({
      body,
      userId: reviewer.id,
      models,
      route,
      path,
      params: {
        collectionId: collection.id,
        fragmentId: fragment.id,
      },
    })

    expect(res.statusCode).toBe(200)
    const data = JSON.parse(res._getData())
    expect(data.userId).toEqual(reviewer.id)
  })
  it('should return an error when the fragmentId does not match the collectionId', async () => {
    const { reviewer } = testFixtures.users
    const { collection } = testFixtures.collections
    const { fragment } = testFixtures.fragments
    collection.fragments.length = 0
    const res = await requests.sendRequest({
      body,
      userId: reviewer.id,
      models,
      route,
      path,
      params: {
        collectionId: collection.id,
        fragmentId: fragment.id,
      },
    })

    expect(res.statusCode).toBe(400)
    const data = JSON.parse(res._getData())
    expect(data.error).toEqual('Collection and fragment do not match.')
  })
  it('should return an error when the collection does not exist', async () => {
    const { reviewer } = testFixtures.users
    const { fragment } = testFixtures.fragments
    const res = await requests.sendRequest({
      body,
      userId: reviewer.id,
      models,
      route,
      path,
      params: {
        collectionId: 'invalid-id',
        fragmentId: fragment.id,
      },
    })

    expect(res.statusCode).toBe(404)
    const data = JSON.parse(res._getData())
    expect(data.error).toEqual('Item not found')
  })
  it('should return an error when the request user is not a reviewer', async () => {
    const { author } = testFixtures.users
    const { collection } = testFixtures.collections
    const { fragment } = testFixtures.fragments

    const res = await requests.sendRequest({
      body,
      userId: author.id,
      models,
      route,
      path,
      params: {
        collectionId: collection.id,
        fragmentId: fragment.id,
      },
    })

    expect(res.statusCode).toBe(403)
    const data = JSON.parse(res._getData())
    expect(data.error).toEqual('Unauthorized.')
  })
  it('should return success when a HE recommends to reject', async () => {
    const { handlingEditor } = testFixtures.users
    const { collection } = testFixtures.collections
    const { fragment } = testFixtures.fragments
    body.recommendation = 'reject'
    body.recommendationType = 'editorRecommendation'

    const res = await requests.sendRequest({
      body,
      userId: handlingEditor.id,
      models,
      route,
      path,
      params: {
        collectionId: collection.id,
        fragmentId: fragment.id,
      },
    })

    expect(res.statusCode).toBe(200)
    const data = JSON.parse(res._getData())

    expect(data.userId).toEqual(handlingEditor.id)
    expect(data.recommendation).toBe('reject')
  })
})