JaneJeon/myURL

View on GitHub
routes/api/links.test.js

Summary

Maintainability
A
2 hrs
Test Coverage
const apiHeaderGen = require('../../__utils__/bearer-header-gen')
require('../../__utils__/mock-http-requests')

const merge = require('lodash/merge')
const supertest = require('supertest')
const app = require('../../app')
const session = supertest.agent(app)
const User = require('../../models/user')

describe('/api/links', () => {
  let link
  const TEST_SUPERUSER_ID = 'superuser-routes-links-api-test'
  const API_HEADER = apiHeaderGen()
  const SUPERUSER_HEADERS = {
    'X-Mock-Role': 'superuser',
    'X-Mock-Id': TEST_SUPERUSER_ID
  }

  beforeAll(async () => {
    await User.query().findById(TEST_SUPERUSER_ID).delete()
    await User.query().insert({
      id: TEST_SUPERUSER_ID,
      role: 'superuser',
      name: 'superuser',
      deactivated: false
    })
  })

  describe('POST /', () => {
    it('"creates"/shortens link', async () => {
      const { body, status } = await session
        .post('/api/links')
        .send({ originalUrl: 'js.org' })
        .set(SUPERUSER_HEADERS)
      expect(status).toEqual(201)
      expect(body.createdAt).toBeTruthy()

      link = body
    })

    it('handles duplicates', async () => {
      const { body } = await session
        .post('/api/links')
        .send({ originalUrl: 'www.js.org' })
        .set(API_HEADER)
      expect(body).toEqual(link)
    })
  })

  describe('GET /', () => {
    it('returns links (paginated)', async () => {
      const { body, status } = await session.get('/api/links').set(API_HEADER)
      expect(status).toEqual(200)
      expect(body.map(link => link.id)).toContain(link.id)
    })
  })

  describe('GET /:id', () => {
    it('returns a specific link', async () => {
      const { body, status } = await session
        .get(`/api/links/${link.id}`)
        .set(API_HEADER)
      expect(status).toEqual(200)
      expect(body).toEqual(link)
    })
  })

  describe('PUT /:id', () => {
    it('updates a link', async () => {
      const { body, status } = await session
        .put(`/api/links/${link.id}`)
        .send(merge({}, link, { hash: 'foobar' }))
        .set(SUPERUSER_HEADERS)
      expect(status).toEqual(200)
      expect(body.hash).toBe('foobar')
      expect(body.createdAt).toBeTruthy()
      expect(body.updatedAt).toBeTruthy()
    })
  })

  describe('DELETE /:id', () => {
    it('deletes a link (with admin approval)', async () => {
      const { status } = await session
        .delete(`/api/links/${link.id}`)
        .set(API_HEADER)
      expect(status).toEqual(204)
    })
  })
})