import { beforeEach, describe, expect, it, vi } from 'vitest';

const mocked = vi.hoisted(() => ({
  poolQuery: vi.fn(),
  poolEnd: vi.fn(),
  poolOn: vi.fn(),
}));

vi.mock('../../db', () => ({
  default: {
    query: mocked.poolQuery,
    end: mocked.poolEnd,
    on: mocked.poolOn,
  },
}));

describe('pending-order-expiry worker', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.resetModules();
    process.env.VITEST = 'true';
    delete process.env.PENDING_ORDER_EXPIRY_MINUTES;
  });

  it('expires abandoned pending orders after the default ttl', async () => {
    mocked.poolQuery.mockResolvedValueOnce({ rows: [{ count: 3 }] });

    const { expireStalePendingOrders } = await import('../pending-order-expiry');
    const expired = await expireStalePendingOrders(new Date('2026-03-29T18:00:00.000Z'));

    expect(expired).toBe(3);
    expect(String(mocked.poolQuery.mock.calls[0]?.[0])).toContain("SET status = 'expired'");
    expect(String(mocked.poolQuery.mock.calls[0]?.[0])).toContain("po.status = 'pending'");
    expect(mocked.poolQuery.mock.calls[0]?.[1]).toEqual(['2026-03-29T18:00:00.000Z', '120']);
  });

  it('respects the configured ttl override', async () => {
    process.env.PENDING_ORDER_EXPIRY_MINUTES = '30';
    mocked.poolQuery.mockResolvedValueOnce({ rows: [{ count: 1 }] });

    const { expireStalePendingOrders } = await import('../pending-order-expiry');
    await expireStalePendingOrders(new Date('2026-03-29T18:00:00.000Z'));

    expect(mocked.poolQuery.mock.calls[0]?.[1]).toEqual(['2026-03-29T18:00:00.000Z', '30']);
  });
});
