44 lines
2.0 KiB
TypeScript
44 lines
2.0 KiB
TypeScript
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");
|
|
});
|
|
});
|