From 77c516a4d2acc75a4f3c8d37a16f4978fa2c82be Mon Sep 17 00:00:00 2001 From: zkldi <20380519+zkldi@users.noreply.github.com> Date: Wed, 19 Jan 2022 22:44:12 +0000 Subject: [PATCH] Some last tests --- server/src/external/mongo/indexes.ts | 5 +- .../import-types/ir/beatoraja/converter.ts | 2 +- .../import-types/ir/beatoraja/parser.ts | 10 +- .../server/router/ir/beatoraja/router.test.ts | 135 ++++++++++++++++-- .../src/server/router/ir/beatoraja/router.ts | 25 +++- server/src/test-utils/mock-db/charts-pms.json | 58 ++++++++ server/src/test-utils/mock-db/songs-pms.json | 14 ++ .../test-data/beatoraja/pms-base.json | 60 ++++++++ 8 files changed, 284 insertions(+), 25 deletions(-) create mode 100644 server/src/test-utils/mock-db/charts-pms.json create mode 100644 server/src/test-utils/mock-db/songs-pms.json create mode 100644 server/src/test-utils/test-data/beatoraja/pms-base.json diff --git a/server/src/external/mongo/indexes.ts b/server/src/external/mongo/indexes.ts index da50f5684..bb7cf67fd 100644 --- a/server/src/external/mongo/indexes.ts +++ b/server/src/external/mongo/indexes.ts @@ -97,7 +97,10 @@ const staticIndexes: Partial> = { "charts-wacca": [index({ isHot: 1 })], "charts-usc": [index({ "data.hashSHA1": 1, playtype: 1 }, UNIQUE)], "charts-jubeat": [index({ "data.inGameID": 1, difficulty: 1 }, UNIQUE)], - "charts-pms": [index({ "data.hashSHA256": 1 }, UNIQUE), index({ "data.hashMD5": 1 }, UNIQUE)], + "charts-pms": [ + index({ "data.hashSHA256": 1, playtype: 1 }, UNIQUE), + index({ "data.hashMD5": 1, playtype: 1 }, UNIQUE), + ], }; const indexes: Partial> = staticIndexes; diff --git a/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts b/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts index 85ea59e0d..b60003f0a 100644 --- a/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts +++ b/server/src/lib/score-import/import-types/ir/beatoraja/converter.ts @@ -144,7 +144,7 @@ export const ConverterIRBeatoraja: ConverterFunction | null; if (game === "bms") { chart = (await FindChartOnSHA256(game, data.sha256)) as ChartDocument< diff --git a/server/src/lib/score-import/import-types/ir/beatoraja/parser.ts b/server/src/lib/score-import/import-types/ir/beatoraja/parser.ts index 0a77352ce..f1fd84fd7 100644 --- a/server/src/lib/score-import/import-types/ir/beatoraja/parser.ts +++ b/server/src/lib/score-import/import-types/ir/beatoraja/parser.ts @@ -76,11 +76,11 @@ const SUPPORTED_BMS_CLIENTS = [ ]; const SUPPORTED_PMS_CLIENTS = [ - "Beatoraja 0.8.4", - "Beatoraja 0.8.3", - "Beatoraja 0.8.2", - "Beatoraja 0.8.1", - "Beatoraja 0.8.0", + "beatoraja 0.8.4", + "beatoraja 0.8.3", + "beatoraja 0.8.2", + "beatoraja 0.8.1", + "beatoraja 0.8.0", ]; export function ParseBeatorajaSingle( diff --git a/server/src/server/router/ir/beatoraja/router.test.ts b/server/src/server/router/ir/beatoraja/router.test.ts index c10ae5f46..2254cec43 100644 --- a/server/src/server/router/ir/beatoraja/router.test.ts +++ b/server/src/server/router/ir/beatoraja/router.test.ts @@ -20,20 +20,22 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { }) ); - const scoreReq = GetKTDataJSON("./beatoraja/base.json"); + const bmsScoreReq = GetKTDataJSON("./beatoraja/base.json"); + const pmsScoreReq = GetKTDataJSON("./beatoraja/pms-base.json"); - t.test("Should import a valid score.", async (t) => { + t.test("Should import a valid BMS score.", async (t) => { const res = await mockApi .post("/ir/beatoraja/submit-score") .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer mock_token") - .send(scoreReq); + .send(bmsScoreReq); t.equal(res.status, 200); t.equal(res.body.success, true); t.hasStrict(res.body.body, { score: { + game: "bms", scoreData: { score: 1004, }, @@ -54,6 +56,85 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { t.not(score, null); + t.hasStrict(res.body.body.score, score); + t.hasStrict(res.body.body.score, score); + + t.end(); + }); + + t.test("Should import a valid PMS score.", async (t) => { + const res = await mockApi + .post("/ir/beatoraja/submit-score") + .set("X-TachiIR-Version", "v2.0.0") + .set("Authorization", "Bearer mock_token") + .send(pmsScoreReq); + + t.equal(res.status, 200); + + t.equal(res.body.success, true); + t.hasStrict(res.body.body, { + score: { + game: "pms", + playtype: "Controller", + scoreData: { + score: 1004, + }, + importType: "ir/beatoraja", + }, + chart: { + chartID: "0446f1b54e90d631ff9fe98419ebaea9481fab1f", + }, + song: { + id: 1, + }, + }); + + const score = await db.scores.findOne( + { scoreID: res.body.body.score.scoreID }, + { projection: { _id: 0 } } + ); + + t.not(score, null); + + t.hasStrict(res.body.body.score, score); + + t.end(); + }); + + t.test("Should infer playtype from the PMS score.", async (t) => { + const res = await mockApi + .post("/ir/beatoraja/submit-score") + .set("X-TachiIR-Version", "v2.0.0") + .set("Authorization", "Bearer mock_token") + .send(deepmerge(pmsScoreReq, { score: { deviceType: "KEYBOARD" } })); + + t.equal(res.status, 200); + + t.equal(res.body.success, true); + t.hasStrict(res.body.body, { + score: { + game: "pms", + playtype: "Keyboard", + scoreData: { + score: 1004, + }, + importType: "ir/beatoraja", + }, + chart: { + chartID: "ca553d77cbf8b3e9e7709dad6123ffed1695a1dd", + }, + song: { + id: 1, + }, + }); + + const score = await db.scores.findOne( + { scoreID: res.body.body.score.scoreID }, + { projection: { _id: 0 } } + ); + + t.not(score, null); + t.hasStrict(res.body.body.score, score); t.end(); @@ -64,7 +145,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .post("/ir/beatoraja/submit-score") .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer mock_token") - .send(deepmerge(scoreReq, { client: "INVALID" })); + .send(deepmerge(bmsScoreReq, { client: "INVALID" })); t.equal(res.status, 400); @@ -74,12 +155,42 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { t.end(); }); + t.test("Should return an error if BMS scores try to use beatoraja.", async (t) => { + const res = await mockApi + .post("/ir/beatoraja/submit-score") + .set("X-TachiIR-Version", "v2.0.0") + .set("Authorization", "Bearer mock_token") + .send(deepmerge(bmsScoreReq, { client: "beatoraja 0.8.0" })); + + t.equal(res.status, 400); + + t.equal(res.body.success, false); + t.match(res.body.description, /Unsupported BMS client/u); + + t.end(); + }); + + t.test("Should return an error if PMS scores try to use lr2oraja.", async (t) => { + const res = await mockApi + .post("/ir/beatoraja/submit-score") + .set("X-TachiIR-Version", "v2.0.0") + .set("Authorization", "Bearer mock_token") + .send(deepmerge(pmsScoreReq, { client: "LR2oraja 0.8.0" })); + + t.equal(res.status, 400); + + t.equal(res.body.success, false); + t.match(res.body.description, /Unsupported PMS client/u); + + t.end(); + }); + t.test("Should return an error if invalid score.", async (t) => { const res = await mockApi .post("/ir/beatoraja/submit-score") .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer mock_token") - .send(deepmerge(scoreReq, { score: { exscore: -1 } })); + .send(deepmerge(bmsScoreReq, { score: { exscore: -1 } })); t.equal(res.status, 400); @@ -94,7 +205,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .post("/ir/beatoraja/submit-score") .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer mock_token") - .send(deepmerge(scoreReq, { chart: { title: null } })); + .send(deepmerge(bmsScoreReq, { chart: { title: null } })); t.equal(res.status, 400); @@ -110,7 +221,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer mock_token") .send( - deepmerge(scoreReq, { + deepmerge(bmsScoreReq, { chart: { sha256: "new_chart", md5: "new_md5" }, score: { sha256: "new_chart", md5: "new_md5" }, }) @@ -171,7 +282,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer mock_token") .send( - deepmerge(scoreReq, { + deepmerge(bmsScoreReq, { chart: { sha256: "new_chart", md5: "new_md5" }, score: { sha256: "new_chart", md5: "new_md5" }, }) @@ -184,7 +295,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer token2") .send( - deepmerge(scoreReq, { + deepmerge(bmsScoreReq, { chart: { sha256: "new_chart", md5: "new_md5" }, score: { sha256: "new_chart", md5: "new_md5" }, }) @@ -203,7 +314,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer token3") .send( - deepmerge(scoreReq, { + deepmerge(bmsScoreReq, { chart: { sha256: "new_chart", md5: "new_md5" }, score: { sha256: "new_chart", md5: "new_md5" }, }) @@ -236,7 +347,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { const res = await mockApi .post("/ir/beatoraja/submit-score") .set("X-TachiIR-Version", "v2.0.0") - .send(scoreReq); + .send(bmsScoreReq); t.equal(res.status, 401); @@ -249,7 +360,7 @@ t.test("POST /ir/beatoraja/submit-score", (t) => { .set("X-TachiIR-Version", "v2.0.0") .set("Authorization", "Bearer invalid_token") - .send(scoreReq); + .send(bmsScoreReq); t.equal(res.status, 401); diff --git a/server/src/server/router/ir/beatoraja/router.ts b/server/src/server/router/ir/beatoraja/router.ts index 817356b7a..6cb4608e5 100644 --- a/server/src/server/router/ir/beatoraja/router.ts +++ b/server/src/server/router/ir/beatoraja/router.ts @@ -74,13 +74,26 @@ router.post("/submit-score", RequireNotGuest, async (req, res) => { }); } - const chart = await db.charts.bms.findOne({ - chartID: scoreDoc.chartID, - }); + let song; + let chart; - const song = await db.songs.bms.findOne({ - id: chart!.songID, - }); + if (importRes.body.body.game === "bms") { + chart = await db.charts.bms.findOne({ + chartID: scoreDoc.chartID, + }); + + song = await db.songs.bms.findOne({ + id: chart!.songID, + }); + } else { + chart = await db.charts.pms.findOne({ + chartID: scoreDoc.chartID, + }); + + song = await db.songs.pms.findOne({ + id: chart!.songID, + }); + } return res.status(importRes.statusCode).json({ success: true, diff --git a/server/src/test-utils/mock-db/charts-pms.json b/server/src/test-utils/mock-db/charts-pms.json new file mode 100644 index 000000000..712a24150 --- /dev/null +++ b/server/src/test-utils/mock-db/charts-pms.json @@ -0,0 +1,58 @@ +[ + { + "chartID": "0446f1b54e90d631ff9fe98419ebaea9481fab1f", + "data": { + "hashMD5": "d1253dd56bb2087d0b0d474f0d562aae", + "hashSHA256": "a10193f7ae05ce839292dc716f182fda0b1cc6ac5382c2056f37e22ffba87b7d", + "notecount": 1065, + "tableFolders": [ + { + "table": "P●", + "level": "1" + } + ] + }, + "level": "?", + "levelNum": 0, + "playtype": "Controller", + "rgcID": null, + "songID": 1, + "tierlistInfo": { + "sgl-EC": { + "value": 46 + }, + "sgl-HC": { + "value": 46 + } + }, + "versions": [] + }, + { + "chartID": "ca553d77cbf8b3e9e7709dad6123ffed1695a1dd", + "data": { + "hashMD5": "d1253dd56bb2087d0b0d474f0d562aae", + "hashSHA256": "a10193f7ae05ce839292dc716f182fda0b1cc6ac5382c2056f37e22ffba87b7d", + "notecount": 1065, + "tableFolders": [ + { + "table": "P●", + "level": "1" + } + ] + }, + "level": "?", + "levelNum": 0, + "playtype": "Keyboard", + "rgcID": null, + "songID": 1, + "tierlistInfo": { + "sgl-EC": { + "value": 46 + }, + "sgl-HC": { + "value": 46 + } + }, + "versions": [] + } +] \ No newline at end of file diff --git a/server/src/test-utils/mock-db/songs-pms.json b/server/src/test-utils/mock-db/songs-pms.json new file mode 100644 index 000000000..ae5bdd017 --- /dev/null +++ b/server/src/test-utils/mock-db/songs-pms.json @@ -0,0 +1,14 @@ +[ + { + "altTitles": [], + "artist": "Rocky", + "data": { + "genre": null, + "subartist": null, + "subtitle": null + }, + "id": 1, + "searchTerms": [], + "title": "Annihilate the living" + } +] \ No newline at end of file diff --git a/server/src/test-utils/test-data/beatoraja/pms-base.json b/server/src/test-utils/test-data/beatoraja/pms-base.json new file mode 100644 index 000000000..8adbf5a30 --- /dev/null +++ b/server/src/test-utils/test-data/beatoraja/pms-base.json @@ -0,0 +1,60 @@ +{ + "chart": { + "md5": "d1253dd56bb2087d0b0d474f0d562aae", + "sha256": "a10193f7ae05ce839292dc716f182fda0b1cc6ac5382c2056f37e22ffba87b7d", + "title": "GPMSAZER [MANIAQ]", + "subtitle": "", + "genre": "Annihilate the living", + "artist": "Rocky", + "subartist": "", + "url": "", + "appendurl": "", + "level": 8, + "total": 220, + "mode": "POPN_9K", + "lntype": 0, + "judge": 100, + "minbpm": 135, + "maxbpm": 135, + "notes": 568, + "hasUndefinedLN": false, + "hasLN": false, + "hasCN": false, + "hasHCN": false, + "hasMine": false, + "hasRandom": false, + "hasStop": false, + "values": {} + }, + "score": { + "sha256": "a10193f7ae05ce839292dc716f182fda0b1cc6ac5382c2056f37e22ffba87b7d", + "lntype": 0, + "player": "unknown", + "clear": "Easy", + "date": 0, + "epg": 332, + "lpg": 127, + "egr": 65, + "lgr": 21, + "egd": 2, + "lgd": 2, + "ebd": 1, + "lbd": 0, + "epr": 7, + "lpr": 11, + "ems": 1, + "lms": 0, + "maxcombo": 223, + "notes": 568, + "passnotes": 568, + "minbp": 20, + "option": 2, + "assist": 0, + "gauge": -1, + "deviceType": "BM_CONTROLLER", + "judgeAlgorithm": "Combo", + "rule": "LR2", + "exscore": 1004 + }, + "client": "beatoraja 0.8.0" +} \ No newline at end of file