// Top-level prisma mock so the resolver's findUnique calls don't reach
// a real client in CI without a DB.
jest.mock('@/lib/prisma', () => ({
    prisma: {
        monitor: {
            findUnique: jest.fn(),
        },
    },
}));

import { resolveDedupWindow } from '../window-resolver';
import { DEFAULT_DEDUP_WINDOW_SECONDS } from '../types';
import { prisma } from '@/lib/prisma';

const findUnique = prisma.monitor.findUnique as jest.Mock;

describe('resolveDedupWindow', () => {
    beforeEach(() => findUnique.mockReset());

    it('returns default when monitorId is undefined', async () => {
        expect(await resolveDedupWindow(undefined)).toBe(DEFAULT_DEDUP_WINDOW_SECONDS);
        expect(findUnique).not.toHaveBeenCalled();
    });

    it('returns default when monitor row has dedupWindowSeconds=null', async () => {
        findUnique.mockResolvedValueOnce({ dedupWindowSeconds: null });
        expect(await resolveDedupWindow(42)).toBe(DEFAULT_DEDUP_WINDOW_SECONDS);
    });

    it('returns the override when set', async () => {
        findUnique.mockResolvedValueOnce({ dedupWindowSeconds: 60 });
        expect(await resolveDedupWindow(42)).toBe(60);
    });

    it('rejects non-positive overrides and falls back to default', async () => {
        findUnique.mockResolvedValueOnce({ dedupWindowSeconds: 0 });
        expect(await resolveDedupWindow(42)).toBe(DEFAULT_DEDUP_WINDOW_SECONDS);
        findUnique.mockResolvedValueOnce({ dedupWindowSeconds: -30 });
        expect(await resolveDedupWindow(42)).toBe(DEFAULT_DEDUP_WINDOW_SECONDS);
    });

    it('falls back to default when the DB lookup throws', async () => {
        findUnique.mockRejectedValueOnce(new Error('connection lost'));
        expect(await resolveDedupWindow(42)).toBe(DEFAULT_DEDUP_WINDOW_SECONDS);
    });
});
