import { describe, expect, it, vi } from 'vitest'
import type { Response } from 'express'
import { created, noContent, ok } from './index'

function createResponseStub() {
  const res = {
    status: vi.fn(),
    json: vi.fn(),
    end: vi.fn(),
  }

  res.status.mockReturnValue(res)
  res.json.mockReturnValue(res)
  res.end.mockReturnValue(res)

  return res as unknown as Response & typeof res
}

describe('http/respond helpers', () => {
  it('ok responds with the expected data envelope', () => {
    const res = createResponseStub()
    const payload = { id: 'vehicle_1', name: 'Dacia Logan' }

    ok(res, payload)

    expect(res.status).not.toHaveBeenCalled()
    expect(res.json).toHaveBeenCalledWith({ data: payload })
  })

  it('created responds with status 201 and the expected data envelope', () => {
    const res = createResponseStub()
    const payload = { id: 'reservation_1' }

    created(res, payload)

    expect(res.status).toHaveBeenCalledWith(201)
    expect(res.json).toHaveBeenCalledWith({ data: payload })
  })

  it('noContent responds with status 204 and no body', () => {
    const res = createResponseStub()

    noContent(res)

    expect(res.status).toHaveBeenCalledWith(204)
    expect(res.end).toHaveBeenCalledWith()
    expect(res.json).not.toHaveBeenCalled()
  })
})
