테스트 코드 - 계정 연장
This commit is contained in:
@@ -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;
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user