import { describe, expect, it } from "vitest"; import { decidePaidAccess, monthStartUtc } from "@/lib/clean-pdf/access"; const now = new Date("2026-07-06T10:00:00Z"); const freeSlug = "obsidian-start"; describe("decidePaidAccess", () => { it("платный enrollment без срока — да", () => { expect(decidePaidAccess({ role: "student", banned: false, freeSlug, now, enrollments: [{ courseSlug: "zotero", expiresAt: null }] })).toBe(true); }); it("только бесплатный курс — нет", () => { expect(decidePaidAccess({ role: "student", banned: false, freeSlug, now, enrollments: [{ courseSlug: "obsidian-start", expiresAt: null }] })).toBe(false); }); it("без enrollments — нет", () => { expect(decidePaidAccess({ role: "student", banned: false, freeSlug, now, enrollments: [] })).toBe(false); }); it("истёкший платный — нет, живой срок — да", () => { expect(decidePaidAccess({ role: "student", banned: false, freeSlug, now, enrollments: [{ courseSlug: "zotero", expiresAt: new Date("2026-01-01") }] })).toBe(false); expect(decidePaidAccess({ role: "student", banned: false, freeSlug, now, enrollments: [{ courseSlug: "zotero", expiresAt: new Date("2027-01-01") }] })).toBe(true); }); it("admin и curator — да даже без курсов", () => { expect(decidePaidAccess({ role: "admin", banned: false, freeSlug, now, enrollments: [] })).toBe(true); expect(decidePaidAccess({ role: "curator", banned: false, freeSlug, now, enrollments: [] })).toBe(true); }); it("бан всё перекрывает", () => { expect(decidePaidAccess({ role: "admin", banned: true, freeSlug, now, enrollments: [] })).toBe(false); }); }); describe("monthStartUtc", () => { it("возвращает первое число месяца 00:00 UTC", () => { expect(monthStartUtc(new Date("2026-07-06T23:59:59Z")).toISOString()).toBe("2026-07-01T00:00:00.000Z"); }); });