Files
chocoadmin/scripts/test-extension-trial.ts
T

160 lines
5.1 KiB
TypeScript

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;
});