Add Create-PB-Doc test

This commit is contained in:
zkldi
2021-04-29 23:16:03 +01:00
parent 230797e5e6
commit dc4f624437
2 changed files with 185 additions and 6 deletions
@@ -1,9 +1,21 @@
import t from "tap";
import db, { CloseMongoConnection } from "../../../../db/db";
import ResetDBState from "../../../../test-utils/reset-db-state";
import { Testing511SPA, TestingIIDXSPScorePB } from "../../../../test-utils/test-data";
import { GetRankingInfo } from "./create-pb-doc";
import {
GetKTDataJSON,
Testing511SPA,
TestingIIDXSPScore,
TestingIIDXSPScorePB,
} from "../../../../test-utils/test-data";
import { CreatePBDoc, GetRankingInfo } from "./create-pb-doc";
import deepmerge from "deepmerge";
import CreateLogCtx from "../../../../logger";
import { KtLogger } from "../../../../types";
import { lamps } from "kamaitachi-common/js/config";
let IIDXScore = TestingIIDXSPScore;
const logger = CreateLogCtx("create-pb-doc.test.ts");
t.test("#GetRankingInfo", (t) => {
t.beforeEach(ResetDBState);
@@ -80,4 +92,157 @@ t.test("#GetRankingInfo", (t) => {
t.end();
});
t.test("#CreatePBDoc", (t) => {
t.beforeEach(ResetDBState);
t.beforeEach(() => {
// monk adds _id onto the file when you import it, so lets try and avoid that
IIDXScore = GetKTDataJSON("./kamaitachi/iidx-score.json");
});
let chartID = Testing511SPA.chartID;
const ExamplePBDoc = {
chartID,
userID: 1,
songID: 1,
outOf: 1,
ranking: 1,
highlight: false,
game: "iidx",
playtype: "SP",
comments: [],
composedFrom: {
scorePB: IIDXScore.scoreID,
lampPB: "LAMP_PB_ID",
},
scoreData: {
score: IIDXScore.scoreData.score,
percent: IIDXScore.scoreData.percent,
esd: IIDXScore.scoreData.esd,
grade: IIDXScore.scoreData.grade,
gradeIndex: IIDXScore.scoreData.gradeIndex,
hitData: IIDXScore.scoreData.hitData,
lamp: "FULL COMBO",
lampIndex: lamps.iidx.indexOf("FULL COMBO"),
hitMeta: { bp: 1 },
},
calculatedData: {
rating: IIDXScore.calculatedData.rating,
lampRating: 12,
gameSpecific: {},
},
};
t.test(
"(IIDX) Should use the GameSpecificMergeFN to also join the BP PB if necessary.",
async (t) => {
await db.scores.remove({});
await db.scores.insert([
IIDXScore,
deepmerge(IIDXScore, {
scoreData: {
lamp: "FULL COMBO",
lampIndex: lamps.iidx.indexOf("FULL COMBO"),
score: 0,
percent: 0,
hitMeta: {
bp: 15,
},
},
calculatedData: {
lampRating: 12,
},
scoreID: "LAMP_PB_ID",
}),
deepmerge(IIDXScore, {
scoreData: {
lamp: "CLEAR",
lampIndex: lamps.iidx.indexOf("CLEAR"),
score: 1,
percent: 1,
hitMeta: {
bp: 5,
},
},
calculatedData: {
lampRating: 10,
},
scoreID: "BP_PB_ID",
}),
]);
let res = await CreatePBDoc(1, chartID, logger);
t.not(res, undefined, "Should actually return something.");
t.strictSame(
res,
deepmerge(ExamplePBDoc, {
composedFrom: {
other: [{ name: "Best BP", scoreID: "BP_PB_ID" }],
},
scoreData: {
hitMeta: {
bp: 5,
},
},
}),
"Should correctly return a merged PBDocument with BP"
);
t.end();
}
);
t.test("Should merge a score and lamp PB into one document.", async (t) => {
let d = deepmerge(IIDXScore, {
scoreData: {
lamp: "FULL COMBO",
lampIndex: lamps.iidx.indexOf("FULL COMBO"),
score: 0,
percent: 0,
hitMeta: {
bp: 1,
},
},
calculatedData: {
lampRating: 12,
},
scoreID: "LAMP_PB_ID",
});
await db.scores.remove({});
await db.scores.insert([IIDXScore, d]);
let res = await CreatePBDoc(1, chartID, logger);
t.not(res, undefined, "Should actually return something.");
t.strictSame(res, ExamplePBDoc, "Should correctly return a merged PBDocument");
t.end();
});
t.test("Should bail safely if no score exists when one should", async (t) => {
// a work of genius
const fakeLogger = ({
severe: () => (severeCalled = true),
} as unknown) as KtLogger;
let severeCalled = false;
await db.scores.remove({});
let res = await CreatePBDoc(1, chartID, fakeLogger);
t.equal(res, undefined, "Should return nothing (and emit a warning)");
t.equal(severeCalled, true, "Severe logging should have been called.");
t.end();
});
t.end();
});
t.teardown(CloseMongoConnection);
@@ -18,7 +18,7 @@ export async function CreatePBDoc(userID: integer, chartID: string, logger: KtLo
);
if (!scorePB) {
logger.warn(`User has no scores on chart, but a PB was attempted to be created?`, {
logger.severe(`User has no scores on chart, but a PB was attempted to be created?`, {
chartID,
userID,
});
@@ -35,10 +35,16 @@ export async function CreatePBDoc(userID: integer, chartID: string, logger: KtLo
"scoreData.lampIndex": -1,
},
}
)) as ScoreDocument; // guaranteed to not be null, but...
)) as ScoreDocument; // guaranteed to not be null, as this always resolves
// to atleast one score (and we got ScorePB above, so we know there's
// atleast one).
const pbDoc = await MergeScoreLampIntoPB(userID, scorePB, lampPB, logger);
if (!pbDoc) {
return;
}
return pbDoc;
}
@@ -87,7 +93,7 @@ async function MergeScoreLampIntoPB(
scorePB: ScoreDocument,
lampPB: ScoreDocument,
logger: KtLogger
): Promise<PBScoreDocument> {
): Promise<PBScoreDocument | void> {
let { outOf, ranking } = await GetRankingInfo(
scorePB.chartID,
userID,
@@ -128,7 +134,15 @@ async function MergeScoreLampIntoPB(
let GameSpecificMergeFn = GAME_SPECIFIC_MERGE_FNS[scorePB.game];
if (GameSpecificMergeFn) {
await GameSpecificMergeFn(pbDoc, scorePB, lampPB, logger);
let success = await GameSpecificMergeFn(pbDoc, scorePB, lampPB, logger);
// If the mergeFn returns false, this means something has gone
// rather wrong. We just return undefined here, which in turn
// tells our calling code to skip this PB. This typically results in a
// severe-level warning
if (success === false) {
return;
}
}
return pbDoc;