import { describe, expect, it, beforeEach, vi } from "vitest"

import { api } from "@/convex/_generated/api"

const mutationMock = vi.fn()

vi.mock("@/server/convex-client", () => ({
  createConvexClient: () => ({
    mutation: mutationMock,
  }),
  ConvexConfigurationError: class extends Error {},
}))

describe("POST /api/machines/heartbeat", () => {
  beforeEach(() => {
    mutationMock.mockReset()
  })

  it("accepts a valid payload and forwards it to Convex", async () => {
    const payload = {
      machineToken: "token-123",
      status: "online",
      metrics: { cpu: 42 },
    }
    mutationMock.mockResolvedValue({ ok: true })

    const { POST } = await import("./route")
    const response = await POST(
      new Request("http://localhost/api/machines/heartbeat", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(payload),
      })
    )

    expect(response.status).toBe(200)
    const body = await response.json()
    expect(body).toEqual({ ok: true })
    expect(mutationMock).toHaveBeenCalledWith(api.devices.heartbeat, payload)
  })

  it("rejects an invalid payload", async () => {
    const { POST } = await import("./route")
    const response = await POST(
      new Request("http://localhost/api/machines/heartbeat", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({}),
      })
    )

    expect(response.status).toBe(400)
    const body = await response.json()
    expect(body).toHaveProperty("error", "Payload inválido")
    expect(mutationMock).not.toHaveBeenCalled()
  })
})

