diff --git a/scripts/test-extension-trial.ts b/scripts/test-extension-trial.ts new file mode 100644 index 0000000..263d91a --- /dev/null +++ b/scripts/test-extension-trial.ts @@ -0,0 +1,159 @@ +import { config } from "dotenv"; + +config({ path: ".env.local" }); + +async function main() { + const { db } = await import("@/lib/db"); + const { createExtensionRequest, approveExtensionRequest } = await import( + "@/lib/extension-requests" + ); + const { ACTIVATE_STATUSES, ACCOUNT_TYPES, REQUEST_STATUSES } = await import( + "@/lib/constants" + ); + + const scenarios = [ + { + label: "TRIAL status + paid tier (BASIC_20)", + accountType: ACCOUNT_TYPES.BASIC_20, + }, + { + label: "TRIAL status + trial tier (STUDENT_TRIAL)", + accountType: ACCOUNT_TYPES.STUDENT_TRIAL, + }, + ]; + + let failures = 0; + + for (const scenario of scenarios) { + const stamp = Date.now(); + const testName = `__TEST_TRIAL_EXT_${stamp}__`.slice(0, 50); + const initialAvailable = new Date(2000, 0, 1); + let maestroID: number | null = null; + + console.log(`\n=== Scenario: ${scenario.label} ===`); + + try { + const created = await db.maestro.create({ + data: { + Name: testName, + Password: "", + Email: `${stamp}@test.invalid`.slice(0, 50), + AccountType: scenario.accountType, + ActivateStatus: ACTIVATE_STATUSES.TRIAL, + AvailableActivateDateTime: initialAvailable, + PlayerCount: 0, + AcceptClausesDateTime: new Date(), + AllowEditEnterCode: 0, + }, + select: { MaestroID: true }, + }); + maestroID = created.MaestroID; + console.log(` seeded maestro MaestroID=${maestroID}`); + + const requestResult = await createExtensionRequest(maestroID); + console.log( + ` createExtensionRequest → maestroExtensionID=${requestResult.maestroExtensionID}, status=${requestResult.status}` + ); + + if (requestResult.status !== REQUEST_STATUSES.REQUESTED) { + throw new Error( + `expected new request status=${REQUEST_STATUSES.REQUESTED}, got ${requestResult.status}` + ); + } + + const approveResult = await approveExtensionRequest( + requestResult.maestroExtensionID + ); + console.log( + ` approveExtensionRequest → availableActivateDateTime=${approveResult.availableActivateDateTime}` + ); + + const afterApprove = await db.maestro.findUniqueOrThrow({ + where: { MaestroID: maestroID }, + select: { + ActivateStatus: true, + AvailableActivateDateTime: true, + AccountType: true, + }, + }); + const requestRow = await db.maestro_extension.findUniqueOrThrow({ + where: { MaestroExtensionID: requestResult.maestroExtensionID }, + select: { Status: true, AccountType: true }, + }); + const logRows = await db.maestro_log.findMany({ + where: { MaestroID: maestroID }, + select: { Type: true }, + orderBy: { MaestroLogID: "asc" }, + }); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const expectedYear = today.getFullYear() + 1; + const actualAvailable = afterApprove.AvailableActivateDateTime; + const actualYear = actualAvailable.getFullYear(); + + const checks: Array<[string, boolean, string]> = [ + [ + "maestro.ActivateStatus becomes ACTIVE", + afterApprove.ActivateStatus === ACTIVATE_STATUSES.ACTIVE, + `got ${afterApprove.ActivateStatus}`, + ], + [ + "maestro.AccountType preserved", + afterApprove.AccountType === scenario.accountType, + `got ${afterApprove.AccountType}`, + ], + [ + "AvailableActivateDateTime = today +1 year (initial was in the past)", + actualYear === expectedYear, + `got year=${actualYear}, expected ${expectedYear}`, + ], + [ + "extension request Status becomes APPLIED", + requestRow.Status === REQUEST_STATUSES.APPLIED, + `got ${requestRow.Status}`, + ], + [ + "logs include request_extension_maestro", + logRows.some((l) => l.Type === "request_extension_maestro"), + JSON.stringify(logRows.map((l) => l.Type)), + ], + [ + "logs include extension_maestro", + logRows.some((l) => l.Type === "extension_maestro"), + JSON.stringify(logRows.map((l) => l.Type)), + ], + ]; + + for (const [name, passed, detail] of checks) { + console.log(` ${passed ? "PASS" : "FAIL"} ${name} (${detail})`); + if (!passed) failures += 1; + } + } catch (error) { + failures += 1; + console.error(` ERROR:`, error); + } finally { + if (maestroID !== null) { + await db.maestro_extension.deleteMany({ where: { MaestroID: maestroID } }); + await db.maestro_log.deleteMany({ where: { MaestroID: maestroID } }); + await db.maestro.delete({ where: { MaestroID: maestroID } }); + console.log(` cleanup: removed rows for MaestroID=${maestroID}`); + } + } + } + + await db.$disconnect(); + + if (failures > 0) { + console.error(`\n${failures} check(s) failed.`); + process.exitCode = 1; + } else { + console.log(`\nAll checks passed.`); + } +} + +main().catch((error) => { + console.error("Test run failed"); + console.error(error); + process.exitCode = 1; +});