diff --git a/project/Server.code-workspace b/project/Server.code-workspace index b989ba88..1758f080 100644 --- a/project/Server.code-workspace +++ b/project/Server.code-workspace @@ -9,8 +9,7 @@ "EditorConfig.EditorConfig", "dprint.dprint", "dbaeumer.vscode-eslint", - "biomejs.biome", - "streetsidesoftware.code-spell-checker" + "biomejs.biome" ] }, "settings": { @@ -18,68 +17,7 @@ "editor.formatOnSave": true, "editor.defaultFormatter": "dprint.dprint", "editor.codeActionsOnSave": [ - "source.fixAll.eslint", "source.organizeImports.biome" - ], - "cSpell.language": "en-GB", - "cSpell.words": [ - "armor", - "asonline", - "behaviour", - "biomejs", - "botreload", - "currexp", - "currlvl", - "dbaeumer", - "deathmatch", - "dprint", - "edgeofdarkness", - "fulfill", - "gethideout", - "gifter", - "hpresource", - "inraid", - "isvalid", - "leftbehind", - "leveled", - "loadout", - "maxlvl", - "medkit", - "MEDSTATION", - "nextlvl", - "offraid", - "peacefullzryachiyevent", - "preparetoescape", - "prevexp", - "profileid", - "Protobuf", - "pscav", - "Ragfair", - "Regen", - "requestid", - "sanitise", - "Sanitised", - "scav", - "scavcase", - "scavs", - "Spawnpoint", - "spawnpoints", - "sptbear", - "sptdeveloper", - "spteasystart", - "sptusec", - "sptzerotohero", - "stackcount", - "statustimer", - "Tarkov", - "toggleable", - "tooshort", - "Ubgl", - "unrestartable", - "usec", - "userbuilds", - "weapongen", - "Wishlist" ] } } diff --git a/project/tests/CustomEnvironment.ts b/project/tests/CustomEnvironment.ts index 1f50af92..0307444e 100644 --- a/project/tests/CustomEnvironment.ts +++ b/project/tests/CustomEnvironment.ts @@ -1,20 +1,17 @@ import "reflect-metadata"; import { container, DependencyContainer, Lifecycle } from "tsyringe"; -// For the Vitest Custom Environment. -import type { Environment } from "vitest"; import { Container } from "@spt-aki/di/Container"; - -// Required for importing the database. -import path from "node:path"; import { IDatabaseTables } from "@spt-aki/models/spt/server/IDatabaseTables"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; import { ImporterUtil } from "@spt-aki/utils/ImporterUtil"; +import path from "node:path"; +import type { Environment } from "vitest"; -// Manually mock for the logger. +// Manually mock the logger. import { WinstonLogger } from "@tests/__mocks__/WinstonLogger.mock"; -export default { +export default { name: "spt-aki-server", transformMode: "ssr", async setup() @@ -24,16 +21,16 @@ export default { Container.registerListTypes(container); // Override registration to the container. - container.register("WinstonLogger", WinstonLogger, { lifecycle: Lifecycle.Singleton }); + container.register("WinstonLogger", WinstonLogger, {lifecycle: Lifecycle.Singleton}); // Import the database. await importDatabase(container); return { async teardown() - {} + {}, }; - } + }, }; /** diff --git a/project/tests/__factories__/ProfileInsurance.factory.ts b/project/tests/__factories__/ProfileInsurance.factory.ts index 991d7363..88e8d501 100644 --- a/project/tests/__factories__/ProfileInsurance.factory.ts +++ b/project/tests/__factories__/ProfileInsurance.factory.ts @@ -1,11 +1,12 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { format } from "date-fns"; -import { profileInsuranceFixture } from "@tests/__fixture__/profileInsurance.fixture"; -import { Insurance } from "@spt-aki/models/eft/profile/IAkiProfile"; -import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; -type DateInput = number | number[] | { [index: number]: number }; +import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; +import { Insurance } from "@spt-aki/models/eft/profile/IAkiProfile"; +import { profileInsuranceFixture } from "@tests/__fixture__/profileInsurance.fixture"; +import { format } from "date-fns"; + +type DateInput = number | number[] | {[index: number]: number;}; export class ProfileInsuranceFactory { @@ -61,7 +62,7 @@ export class ProfileInsuranceFactory this.profileInsuranceFixture = this.profileInsuranceFixture.map((insurance) => { - insurance.items = insurance.items.filter(item => !itemHelper.isAttachmentAttached(item)); + insurance.items = insurance.items.filter((item) => !itemHelper.isAttachmentAttached(item)); return insurance; }); @@ -78,8 +79,7 @@ export class ProfileInsuranceFactory this.profileInsuranceFixture = this.profileInsuranceFixture.map((insurance) => { - insurance.items = insurance.items.filter(item => itemHelper.isAttachmentAttached(item)); - + insurance.items = insurance.items.filter((item) => itemHelper.isAttachmentAttached(item)); return insurance; }); diff --git a/project/tests/__fixture__/profileInsurance.fixture.ts b/project/tests/__fixture__/profileInsurance.fixture.ts index cff789be..de0b4f19 100644 --- a/project/tests/__fixture__/profileInsurance.fixture.ts +++ b/project/tests/__fixture__/profileInsurance.fixture.ts @@ -2,1411 +2,1411 @@ import { Insurance } from "@spt-aki/models/eft/profile/IAkiProfile"; export const profileInsuranceFixture: Insurance[] = [ { - "scheduledTime": 1698945140, - "traderId": "54cb50c76803fa8b248b4571", // Prapor - "messageContent": { - "templateId": "58fe0e4586f774728248ca13 4", - "type": 8, - "maxStorageTime": 345600, - "text": "", - "profileChangeEvents": [], - "systemData": { - "date": "01.11.2023", - "time": "10:51", - "location": "factory4_day" - } + scheduledTime: 1698945140, + traderId: "54cb50c76803fa8b248b4571", // Prapor + messageContent: { + templateId: "58fe0e4586f774728248ca13 4", + type: 8, + maxStorageTime: 345600, + text: "", + profileChangeEvents: [], + systemData: { + date: "01.11.2023", + time: "10:51", + location: "factory4_day", + }, }, - "items": [ + items: [ { - "_id": "3679078e05f5b14466d6a730", - "_tpl": "5d6d3716a4b9361bc8618872", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 55, - "MaxDurability": 55 - } - } - }, - { - "_id": "911a0f04d5d9c7e239807ae0", - "_tpl": "5644bd2b4bdc2d3b4c8b4572", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 97.7862549, - "MaxDurability": 100 - } - } - }, - { - "_id": "695b13896108f765e8985698", - "_tpl": "5648a69d4bdc2ded0b8b457b", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "bb49d6ceb3e87d8563a06455", - "_tpl": "5df8a4d786f77412672a1e3b", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "631f8492de748dec852f7ddf", - "_tpl": "64abd93857958b4249003418", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 49.2865, - "MaxDurability": 60 - } - } - }, - { - "_id": "a2b0c716162c5e31ec28c55a", - "_tpl": "5a16b8a9fcdbcb00165aa6ca", - "parentId": "3679078e05f5b14466d6a730", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "dc565f750342cb2d19eeda06", - "_tpl": "5d6d3be5a4b9361bc73bc763", - "parentId": "3679078e05f5b14466d6a730", - "slotId": "mod_equipment_001", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 29.33, - "MaxDurability": 29.33 - } - } - }, - { - "_id": "e9ff62601669d9e2ea9c2fbb", - "_tpl": "5d6d3943a4b9360dbc46d0cc", - "parentId": "3679078e05f5b14466d6a730", - "slotId": "mod_equipment_002", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "ac134d7cf6c9d8e25edd0015", - "_tpl": "5c11046cd174af02a012e42b", - "parentId": "a2b0c716162c5e31ec28c55a", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "22274b895ecc80d51c3cba1c", - "_tpl": "5c110624d174af029e69734c", - "parentId": "ac134d7cf6c9d8e25edd0015", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 + _id: "3679078e05f5b14466d6a730", + _tpl: "5d6d3716a4b9361bc8618872", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 55, + MaxDurability: 55, }, - "Togglable": { - "On": true - } - } - }, - { - "_id": "c9278dd8251e99578bf7a274", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_gas_block", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "677c209ebb45445ebb42c405", - "_tpl": "5649ab884bdc2ded0b8b457f", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_muzzle", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "8ada5c9cc26585281577c6eb", - "_tpl": "5649ae4a4bdc2d1b2b8b4588", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_pistol_grip", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "4bd10f89836fd9f86aedcac1", - "_tpl": "5649af094bdc2df8348b4586", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_reciever", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "8b1327270791b142ac341b03", - "_tpl": "5649d9a14bdc2d79388b4580", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_sight_rear", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "566335b3df586f34b47f5e35", - "_tpl": "5649b2314bdc2d79388b4576", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "da8cde1b3024c336f6e06152", - "_tpl": "55d482194bdc2d1d4e8b456b", - "parentId": "911a0f04d5d9c7e239807ae0", - "slotId": "mod_magazine", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "1e0b177df108c0c117028812", - "_tpl": "57cffddc24597763133760c6", - "parentId": "c9278dd8251e99578bf7a274", - "slotId": "mod_handguard", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "bc041c0011d76f714b898400", - "_tpl": "57cffcd624597763133760c5", - "parentId": "1e0b177df108c0c117028812", - "slotId": "mod_mount_003", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "9f8d7880a6e0a47a211ec5d3", - "_tpl": "58491f3324597764bc48fa02", - "parentId": "8b1327270791b142ac341b03", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "402b4086535a50ef7d9cef88", - "_tpl": "5649be884bdc2d79388b4577", - "parentId": "566335b3df586f34b47f5e35", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "db2ef9442178910eba985b51", - "_tpl": "58d2946386f774496974c37e", - "parentId": "402b4086535a50ef7d9cef88", - "slotId": "mod_stock_000", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "3c32b7d47ad80e83749fa906", - "_tpl": "58d2912286f7744e27117493", - "parentId": "db2ef9442178910eba985b51", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "574a9b5535585255cde19570", - "_tpl": "55d482194bdc2d1d4e8b456b", - "parentId": "695b13896108f765e8985698", - "slotId": "1", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } }, { - "_id": "696835b2badfb96623ea887c", - "_tpl": "55d482194bdc2d1d4e8b456b", - "parentId": "695b13896108f765e8985698", - "slotId": "2", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "911a0f04d5d9c7e239807ae0", + _tpl: "5644bd2b4bdc2d3b4c8b4572", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 97.7862549, + MaxDurability: 100, + }, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } }, { - "_id": "c2d5e23c7886e8ff02010731", - "_tpl": "55d482194bdc2d1d4e8b456b", - "parentId": "695b13896108f765e8985698", - "slotId": "3", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "695b13896108f765e8985698", + _tpl: "5648a69d4bdc2ded0b8b457b", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } }, { - "_id": "306de2f475a559610a4f6f1d", - "_tpl": "55d482194bdc2d1d4e8b456b", - "parentId": "695b13896108f765e8985698", - "slotId": "4", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "bb49d6ceb3e87d8563a06455", + _tpl: "5df8a4d786f77412672a1e3b", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } }, { - "_id": "eb0445b49a97e84e27d47f3c", - "_tpl": "5aa2ba71e5b5b000137b758f", - "parentId": "695b13896108f765e8985698", - "slotId": "5", - "upd": { - "StackObjectsCount": 1 + _id: "631f8492de748dec852f7ddf", + _tpl: "64abd93857958b4249003418", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 49.2865, + MaxDurability: 60, + }, }, - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true - } }, { - "_id": "fad89a5bdfd23e3248123346", - "_tpl": "5fc5396e900b1d5091531e72", - "parentId": "695b13896108f765e8985698", - "slotId": "6", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "a2b0c716162c5e31ec28c55a", + _tpl: "5a16b8a9fcdbcb00165aa6ca", + parentId: "3679078e05f5b14466d6a730", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1 - } }, { - "_id": "b16c2a938954cd69c687c51a", - "_tpl": "5b4736b986f77405cb415c10", - "parentId": "695b13896108f765e8985698", - "slotId": "7", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "dc565f750342cb2d19eeda06", + _tpl: "5d6d3be5a4b9361bc73bc763", + parentId: "3679078e05f5b14466d6a730", + slotId: "mod_equipment_001", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 29.33, + MaxDurability: 29.33, + }, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } }, { - "_id": "a2b3019ac8d340eeb068d429", - "_tpl": "5ea18c84ecf1982c7712d9a2", - "parentId": "695b13896108f765e8985698", - "slotId": "10", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true + _id: "e9ff62601669d9e2ea9c2fbb", + _tpl: "5d6d3943a4b9360dbc46d0cc", + parentId: "3679078e05f5b14466d6a730", + slotId: "mod_equipment_002", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 29, - "MaxDurability": 33 - } - } }, { - "_id": "0b3c5d183e8b506d655f85c4", - "_tpl": "644a3df63b0b6f03e101e065", - "parentId": "fad89a5bdfd23e3248123346", - "slotId": "mod_tactical", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "757211a0b648fe27b0475ded", - "_tpl": "59f8a37386f7747af3328f06", - "parentId": "b16c2a938954cd69c687c51a", - "slotId": "mod_foregrip", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "870a887c63ca30fb15736b3d", - "_tpl": "62a1b7fbc30cfa1d366af586", - "parentId": "bb49d6ceb3e87d8563a06455", - "slotId": "main", - "upd": { - "StackObjectsCount": 1 + _id: "ac134d7cf6c9d8e25edd0015", + _tpl: "5c11046cd174af02a012e42b", + parentId: "a2b0c716162c5e31ec28c55a", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, }, - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true - } }, { - "_id": "f3de631a1bb2b74bd0160d9a", - "_tpl": "5d6d3be5a4b9361bc73bc763", - "parentId": "bb49d6ceb3e87d8563a06455", - "slotId": "main", - "location": { - "x": 5, - "y": 0, - "r": "Vertical", - "isSearched": true + _id: "22274b895ecc80d51c3cba1c", + _tpl: "5c110624d174af029e69734c", + parentId: "ac134d7cf6c9d8e25edd0015", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + Togglable: { + On: true, + }, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 22.41, - "MaxDurability": 22.41 - } - } }, { - "_id": "351180f3248d45c71cb2ebdc", - "_tpl": "57c44b372459772d2b39b8ce", - "parentId": "870a887c63ca30fb15736b3d", - "slotId": "main", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "c9278dd8251e99578bf7a274", + _tpl: "59c6633186f7740cf0493bb9", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_gas_block", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } }, { - "_id": "7237f722106866f2df8dc8d1", - "_tpl": "56e33680d2720be2748b4576", - "parentId": "870a887c63ca30fb15736b3d", - "slotId": "main", - "location": { - "x": 0, - "y": 3, - "r": "Horizontal", - "isSearched": true + _id: "677c209ebb45445ebb42c405", + _tpl: "5649ab884bdc2ded0b8b457f", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_muzzle", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1 - } }, { - "_id": "d0cf00aff56ea520cdd94330", - "_tpl": "57c44dd02459772d2e0ae249", - "parentId": "351180f3248d45c71cb2ebdc", - "slotId": "mod_muzzle", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "5119653b2c66d57ee219e26f", - "_tpl": "57c44f4f2459772d2c627113", - "parentId": "351180f3248d45c71cb2ebdc", - "slotId": "mod_reciever", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "ed1ac0183a8af587110aa74e", - "_tpl": "5a9e81fba2750c00164f6b11", - "parentId": "351180f3248d45c71cb2ebdc", - "slotId": "mod_magazine", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "310a7d1bb07ae0e522f3f8e3", - "_tpl": "5a69a2ed8dc32e000d46d1f1", - "parentId": "351180f3248d45c71cb2ebdc", - "slotId": "mod_pistol_grip", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "8a7e3489197b3b98126447fd", - "_tpl": "6130ca3fd92c473c77020dbd", - "parentId": "351180f3248d45c71cb2ebdc", - "slotId": "mod_charge", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "e818616e11ae07aa05388759", - "_tpl": "5dff8db859400025ea5150d4", - "parentId": "351180f3248d45c71cb2ebdc", - "slotId": "mod_mount_000", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "768812984debf2756bece089", - "_tpl": "57c44e7b2459772d28133248", - "parentId": "d0cf00aff56ea520cdd94330", - "slotId": "mod_sight_rear", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "67c610585ed668baf4604931", - "_tpl": "59eb7ebe86f7740b373438ce", - "parentId": "d0cf00aff56ea520cdd94330", - "slotId": "mod_mount_000", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "80e9dffa49bfe263ab0128c7", - "_tpl": "6267c6396b642f77f56f5c1c", - "parentId": "67c610585ed668baf4604931", - "slotId": "mod_tactical_000", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "dee323443ce23ba8c54b9f1c", - "_tpl": "5cc9c20cd7f00c001336c65d", - "parentId": "67c610585ed668baf4604931", - "slotId": "mod_tactical_001", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "3008088022dd55f1c99e5a32", - "_tpl": "5c1cd46f2e22164bef5cfedb", - "parentId": "67c610585ed668baf4604931", - "slotId": "mod_foregrip", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "71e9f8d005c72940d857fe64", - "_tpl": "59d790f486f77403cb06aec6", - "parentId": "80e9dffa49bfe263ab0128c7", - "slotId": "mod_flashlight", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "8c610c6cc67115a5fc1662ff", - "_tpl": "56eabf3bd2720b75698b4569", - "parentId": "310a7d1bb07ae0e522f3f8e3", - "slotId": "mod_stock_000", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "9bf01177f0c1e346b2d65373", - "_tpl": "58d2912286f7744e27117493", - "parentId": "8c610c6cc67115a5fc1662ff", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "7dd43ffa6e03c2da6cddc56e", - "_tpl": "6171407e50224f204c1da3c5", - "parentId": "e818616e11ae07aa05388759", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "fa9da4ccf3630cb173c293f9", - "_tpl": "5b3b99475acfc432ff4dcbee", - "parentId": "7dd43ffa6e03c2da6cddc56e", - "slotId": "mod_scope_000", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "6e2727806fb12e12123e9a57", - "_tpl": "616554fe50224f204c1da2aa", - "parentId": "7dd43ffa6e03c2da6cddc56e", - "slotId": "mod_scope_001", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "2c868d4676adc934f897e9a7", - "_tpl": "61605d88ffa6e502ac5e7eeb", - "parentId": "7dd43ffa6e03c2da6cddc56e", - "slotId": "mod_scope_002", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "1b159fdc14c350f8a4a7e19e", - "_tpl": "58d39b0386f77443380bf13c", - "parentId": "6e2727806fb12e12123e9a57", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "7691790ffc5290da292cab99", - "_tpl": "61657230d92c473c770213d7", - "parentId": "1b159fdc14c350f8a4a7e19e", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "012a11e7dcb1280a1ab9d2f6", - "_tpl": "618168b350224f204c1da4d8", - "parentId": "7237f722106866f2df8dc8d1", - "slotId": "main", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true + _id: "8ada5c9cc26585281577c6eb", + _tpl: "5649ae4a4bdc2d1b2b8b4588", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_pistol_grip", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1 - } }, { - "_id": "38ca7415a458c4d22ba2f3c3", - "_tpl": "6130c43c67085e45ef1405a1", - "parentId": "012a11e7dcb1280a1ab9d2f6", - "slotId": "mod_muzzle", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + _id: "4bd10f89836fd9f86aedcac1", + _tpl: "5649af094bdc2df8348b4586", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_reciever", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "c5a0621ebf856ce1b0945efc", - "_tpl": "61816fcad92c473c770215cc", - "parentId": "012a11e7dcb1280a1ab9d2f6", - "slotId": "mod_sight_front", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + _id: "8b1327270791b142ac341b03", + _tpl: "5649d9a14bdc2d79388b4580", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_sight_rear", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "a74677b17c1c49edc002df9b", - "_tpl": "5dfa3d2b0dee1b22f862eade", - "parentId": "38ca7415a458c4d22ba2f3c3", - "slotId": "mod_muzzle", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - } - ] + _id: "566335b3df586f34b47f5e35", + _tpl: "5649b2314bdc2d79388b4576", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_stock", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "da8cde1b3024c336f6e06152", + _tpl: "55d482194bdc2d1d4e8b456b", + parentId: "911a0f04d5d9c7e239807ae0", + slotId: "mod_magazine", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "1e0b177df108c0c117028812", + _tpl: "57cffddc24597763133760c6", + parentId: "c9278dd8251e99578bf7a274", + slotId: "mod_handguard", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "bc041c0011d76f714b898400", + _tpl: "57cffcd624597763133760c5", + parentId: "1e0b177df108c0c117028812", + slotId: "mod_mount_003", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "9f8d7880a6e0a47a211ec5d3", + _tpl: "58491f3324597764bc48fa02", + parentId: "8b1327270791b142ac341b03", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "402b4086535a50ef7d9cef88", + _tpl: "5649be884bdc2d79388b4577", + parentId: "566335b3df586f34b47f5e35", + slotId: "mod_stock", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "db2ef9442178910eba985b51", + _tpl: "58d2946386f774496974c37e", + parentId: "402b4086535a50ef7d9cef88", + slotId: "mod_stock_000", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "3c32b7d47ad80e83749fa906", + _tpl: "58d2912286f7744e27117493", + parentId: "db2ef9442178910eba985b51", + slotId: "mod_stock", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "574a9b5535585255cde19570", + _tpl: "55d482194bdc2d1d4e8b456b", + parentId: "695b13896108f765e8985698", + slotId: "1", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "696835b2badfb96623ea887c", + _tpl: "55d482194bdc2d1d4e8b456b", + parentId: "695b13896108f765e8985698", + slotId: "2", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "c2d5e23c7886e8ff02010731", + _tpl: "55d482194bdc2d1d4e8b456b", + parentId: "695b13896108f765e8985698", + slotId: "3", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "306de2f475a559610a4f6f1d", + _tpl: "55d482194bdc2d1d4e8b456b", + parentId: "695b13896108f765e8985698", + slotId: "4", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "eb0445b49a97e84e27d47f3c", + _tpl: "5aa2ba71e5b5b000137b758f", + parentId: "695b13896108f765e8985698", + slotId: "5", + upd: { + StackObjectsCount: 1, + }, + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + }, + { + _id: "fad89a5bdfd23e3248123346", + _tpl: "5fc5396e900b1d5091531e72", + parentId: "695b13896108f765e8985698", + slotId: "6", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "b16c2a938954cd69c687c51a", + _tpl: "5b4736b986f77405cb415c10", + parentId: "695b13896108f765e8985698", + slotId: "7", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "a2b3019ac8d340eeb068d429", + _tpl: "5ea18c84ecf1982c7712d9a2", + parentId: "695b13896108f765e8985698", + slotId: "10", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 29, + MaxDurability: 33, + }, + }, + }, + { + _id: "0b3c5d183e8b506d655f85c4", + _tpl: "644a3df63b0b6f03e101e065", + parentId: "fad89a5bdfd23e3248123346", + slotId: "mod_tactical", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "757211a0b648fe27b0475ded", + _tpl: "59f8a37386f7747af3328f06", + parentId: "b16c2a938954cd69c687c51a", + slotId: "mod_foregrip", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "870a887c63ca30fb15736b3d", + _tpl: "62a1b7fbc30cfa1d366af586", + parentId: "bb49d6ceb3e87d8563a06455", + slotId: "main", + upd: { + StackObjectsCount: 1, + }, + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + }, + { + _id: "f3de631a1bb2b74bd0160d9a", + _tpl: "5d6d3be5a4b9361bc73bc763", + parentId: "bb49d6ceb3e87d8563a06455", + slotId: "main", + location: { + x: 5, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 22.41, + MaxDurability: 22.41, + }, + }, + }, + { + _id: "351180f3248d45c71cb2ebdc", + _tpl: "57c44b372459772d2b39b8ce", + parentId: "870a887c63ca30fb15736b3d", + slotId: "main", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "7237f722106866f2df8dc8d1", + _tpl: "56e33680d2720be2748b4576", + parentId: "870a887c63ca30fb15736b3d", + slotId: "main", + location: { + x: 0, + y: 3, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "d0cf00aff56ea520cdd94330", + _tpl: "57c44dd02459772d2e0ae249", + parentId: "351180f3248d45c71cb2ebdc", + slotId: "mod_muzzle", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "5119653b2c66d57ee219e26f", + _tpl: "57c44f4f2459772d2c627113", + parentId: "351180f3248d45c71cb2ebdc", + slotId: "mod_reciever", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "ed1ac0183a8af587110aa74e", + _tpl: "5a9e81fba2750c00164f6b11", + parentId: "351180f3248d45c71cb2ebdc", + slotId: "mod_magazine", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "310a7d1bb07ae0e522f3f8e3", + _tpl: "5a69a2ed8dc32e000d46d1f1", + parentId: "351180f3248d45c71cb2ebdc", + slotId: "mod_pistol_grip", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "8a7e3489197b3b98126447fd", + _tpl: "6130ca3fd92c473c77020dbd", + parentId: "351180f3248d45c71cb2ebdc", + slotId: "mod_charge", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "e818616e11ae07aa05388759", + _tpl: "5dff8db859400025ea5150d4", + parentId: "351180f3248d45c71cb2ebdc", + slotId: "mod_mount_000", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "768812984debf2756bece089", + _tpl: "57c44e7b2459772d28133248", + parentId: "d0cf00aff56ea520cdd94330", + slotId: "mod_sight_rear", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "67c610585ed668baf4604931", + _tpl: "59eb7ebe86f7740b373438ce", + parentId: "d0cf00aff56ea520cdd94330", + slotId: "mod_mount_000", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "80e9dffa49bfe263ab0128c7", + _tpl: "6267c6396b642f77f56f5c1c", + parentId: "67c610585ed668baf4604931", + slotId: "mod_tactical_000", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "dee323443ce23ba8c54b9f1c", + _tpl: "5cc9c20cd7f00c001336c65d", + parentId: "67c610585ed668baf4604931", + slotId: "mod_tactical_001", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "3008088022dd55f1c99e5a32", + _tpl: "5c1cd46f2e22164bef5cfedb", + parentId: "67c610585ed668baf4604931", + slotId: "mod_foregrip", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "71e9f8d005c72940d857fe64", + _tpl: "59d790f486f77403cb06aec6", + parentId: "80e9dffa49bfe263ab0128c7", + slotId: "mod_flashlight", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "8c610c6cc67115a5fc1662ff", + _tpl: "56eabf3bd2720b75698b4569", + parentId: "310a7d1bb07ae0e522f3f8e3", + slotId: "mod_stock_000", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "9bf01177f0c1e346b2d65373", + _tpl: "58d2912286f7744e27117493", + parentId: "8c610c6cc67115a5fc1662ff", + slotId: "mod_stock", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "7dd43ffa6e03c2da6cddc56e", + _tpl: "6171407e50224f204c1da3c5", + parentId: "e818616e11ae07aa05388759", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "fa9da4ccf3630cb173c293f9", + _tpl: "5b3b99475acfc432ff4dcbee", + parentId: "7dd43ffa6e03c2da6cddc56e", + slotId: "mod_scope_000", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "6e2727806fb12e12123e9a57", + _tpl: "616554fe50224f204c1da2aa", + parentId: "7dd43ffa6e03c2da6cddc56e", + slotId: "mod_scope_001", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "2c868d4676adc934f897e9a7", + _tpl: "61605d88ffa6e502ac5e7eeb", + parentId: "7dd43ffa6e03c2da6cddc56e", + slotId: "mod_scope_002", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "1b159fdc14c350f8a4a7e19e", + _tpl: "58d39b0386f77443380bf13c", + parentId: "6e2727806fb12e12123e9a57", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "7691790ffc5290da292cab99", + _tpl: "61657230d92c473c770213d7", + parentId: "1b159fdc14c350f8a4a7e19e", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "012a11e7dcb1280a1ab9d2f6", + _tpl: "618168b350224f204c1da4d8", + parentId: "7237f722106866f2df8dc8d1", + slotId: "main", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "38ca7415a458c4d22ba2f3c3", + _tpl: "6130c43c67085e45ef1405a1", + parentId: "012a11e7dcb1280a1ab9d2f6", + slotId: "mod_muzzle", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "c5a0621ebf856ce1b0945efc", + _tpl: "61816fcad92c473c770215cc", + parentId: "012a11e7dcb1280a1ab9d2f6", + slotId: "mod_sight_front", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "a74677b17c1c49edc002df9b", + _tpl: "5dfa3d2b0dee1b22f862eade", + parentId: "38ca7415a458c4d22ba2f3c3", + slotId: "mod_muzzle", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + ], }, { - "scheduledTime": 1698945140, - "traderId": "54cb57776803fa99248b456e", // Therapist - "messageContent": { - "templateId": "58fe0e3486f77471f772c3f2 2", - "type": 8, - "maxStorageTime": 518400, - "text": "", - "profileChangeEvents": [], - "systemData": { - "date": "01.11.2023", - "time": "11:18", - "location": "factory4_day" - } + scheduledTime: 1698945140, + traderId: "54cb57776803fa99248b456e", // Therapist + messageContent: { + templateId: "58fe0e3486f77471f772c3f2 2", + type: 8, + maxStorageTime: 518400, + text: "", + profileChangeEvents: [], + systemData: { + date: "01.11.2023", + time: "11:18", + location: "factory4_day", + }, }, - "items": [ + items: [ { - "_id": "5ae1c2b99a0a339adc620148", - "_tpl": "5cebec38d7f00c00110a652a", - "parentId": "ad018df9da0cbf2726394ef1", - "slotId": "mod_mount_000", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "30f4bcb87bcc4604e27c02c1", - "_tpl": "5cc70146e4a949000d73bf6b", - "parentId": "ad018df9da0cbf2726394ef1", - "slotId": "mod_mount_001", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "ad018df9da0cbf2726394ef1", - "_tpl": "5cc70102e4a949035e43ba74", - "parentId": "3bc4ff5bd99f165dc75cbd25", - "slotId": "main", - "upd": { - "StackObjectsCount": 1 + _id: "5ae1c2b99a0a339adc620148", + _tpl: "5cebec38d7f00c00110a652a", + parentId: "ad018df9da0cbf2726394ef1", + slotId: "mod_mount_000", + upd: { + StackObjectsCount: 1, }, - "location": { - "x": 3, - "y": 0, - "r": "Horizontal", - "isSearched": true - } }, { - "_id": "12c243bd6b3e486e61325f81", - "_tpl": "5cc82d76e24e8d00134b4b83", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 99.93771, - "MaxDurability": 100 - } - } + _id: "30f4bcb87bcc4604e27c02c1", + _tpl: "5cc70146e4a949000d73bf6b", + parentId: "ad018df9da0cbf2726394ef1", + slotId: "mod_mount_001", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "760652d86ee78eed513e0ad7", - "_tpl": "5ab8f39486f7745cd93a1cca", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1 - } + _id: "ad018df9da0cbf2726394ef1", + _tpl: "5cc70102e4a949035e43ba74", + parentId: "3bc4ff5bd99f165dc75cbd25", + slotId: "main", + upd: { + StackObjectsCount: 1, + }, + location: { + x: 3, + y: 0, + r: "Horizontal", + isSearched: true, + }, }, { - "_id": "61ab4afefac354dfc64c7874", - "_tpl": "5b432d215acfc4771e1c6624", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 30, - "MaxDurability": 30 - } - } - }, - { - "_id": "285e9d9ae196ae4e336cd04f", - "_tpl": "5d5d87f786f77427997cfaef", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 75, - "MaxDurability": 80 - } - } - }, - { - "_id": "3bc4ff5bd99f165dc75cbd25", - "_tpl": "5f5e467b0bc58666c37e7821", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "6bf5d8ee81a3c9aec21bbbad", - "_tpl": "5d5fca1ea4b93635fd598c07", - "parentId": "5fe49444ae6628187a2e77b8", - "slotId": "hideout", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "2371438cf809b5e483bf5d85", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "12c243bd6b3e486e61325f81", - "slotId": "mod_magazine", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "7f890346ea5b2cbc68c3170f", - "_tpl": "5cc700b9e4a949000f0f0f25", - "parentId": "12c243bd6b3e486e61325f81", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "12fb79a9c4929009ff8d89e1", - "_tpl": "5cc700ede4a949033c734315", - "parentId": "12c243bd6b3e486e61325f81", - "slotId": "mod_reciever", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "d4c5274082ed716e19447f46", - "_tpl": "5cc701d7e4a94900100ac4e7", - "parentId": "12c243bd6b3e486e61325f81", - "slotId": "mod_barrel", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "d819dd4d2b13de10e9d6d805", - "_tpl": "5cc6ea85e4a949000e1ea3c3", - "parentId": "12c243bd6b3e486e61325f81", - "slotId": "mod_charge", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "fc9a664cacc477c4e725a81a", - "_tpl": "5cc700d4e4a949000f0f0f28", - "parentId": "7f890346ea5b2cbc68c3170f", - "slotId": "mod_stock_000", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "372891c593cf14e176b93ce2", - "_tpl": "5cc7012ae4a949001252b43e", - "parentId": "12fb79a9c4929009ff8d89e1", - "slotId": "mod_mount_000", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "bd196435a57bdc433df1e49d", - "_tpl": "5cc7012ae4a949001252b43e", - "parentId": "12fb79a9c4929009ff8d89e1", - "slotId": "mod_mount_001", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "ea3349d29797354d835c2192", - "_tpl": "58491f3324597764bc48fa02", - "parentId": "12fb79a9c4929009ff8d89e1", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "4ccf7c74ca7d2167deb0ae5c", - "_tpl": "626becf9582c3e319310b837", - "parentId": "372891c593cf14e176b93ce2", - "slotId": "mod_tactical", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "adfd3640fc93daf21c721ca6", - "_tpl": "5cc9c20cd7f00c001336c65d", - "parentId": "bd196435a57bdc433df1e49d", - "slotId": "mod_tactical", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "deeb36b1812790b0145d2532", - "_tpl": "5a16badafcdbcb001865f72d", - "parentId": "61ab4afefac354dfc64c7874", - "slotId": "mod_equipment_000", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 12, - "MaxDurability": 25 - } - } - }, - { - "_id": "4c0e0548df904c384569190c", - "_tpl": "5ea058e01dbce517f324b3e2", - "parentId": "61ab4afefac354dfc64c7874", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 3, - "MaxDurability": 39 - } - } - }, - { - "_id": "da82c293cabc705b30fef93a", - "_tpl": "5a398ab9c4a282000c5a9842", - "parentId": "61ab4afefac354dfc64c7874", - "slotId": "mod_mount", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "b8fc94611def6e9ba534a8b3", - "_tpl": "5a16b8a9fcdbcb00165aa6ca", - "parentId": "4c0e0548df904c384569190c", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "20d6193c1f399e6326ebbc10", - "_tpl": "5a16b93dfcdbcbcae6687261", - "parentId": "b8fc94611def6e9ba534a8b3", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - }, - { - "_id": "065c4f13b2bd8be266e1e809", - "_tpl": "57235b6f24597759bf5a30f1", - "parentId": "20d6193c1f399e6326ebbc10", - "slotId": "mod_nvg", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 + _id: "12c243bd6b3e486e61325f81", + _tpl: "5cc82d76e24e8d00134b4b83", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 99.93771, + MaxDurability: 100, }, - "Togglable": { - "On": true - } - } - }, - { - "_id": "1883b955ab202fa099809278", - "_tpl": "57d17c5e2459775a5c57d17d", - "parentId": "da82c293cabc705b30fef93a", - "slotId": "mod_flashlight", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "e3c9e50ce31900c950b4ff6f", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "1", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true }, - "upd": { - "StackObjectsCount": 1 - } }, { - "_id": "193259b5eb848af4d036bee5", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "2", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true + _id: "760652d86ee78eed513e0ad7", + _tpl: "5ab8f39486f7745cd93a1cca", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, }, - "upd": { - "StackObjectsCount": 1 - } }, { - "_id": "f97ce69443f63bbe8f8097a7", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "3", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "5d1c154a8abcfa934e477ac4", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "4", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "289f7af841690c5388095477", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "5", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "3e6d578165b61aef9865f677", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "6", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "338682523f8504f97f84f3ab", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "7", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "6d18ac01aa04b16e4f0d5d2f", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "8", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "ac4ed54d61daa0c5219f8522", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "9", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "2460460ef3d3df5c1ce07edb", - "_tpl": "5cc70093e4a949033c734312", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "10", - "location": { - "x": 0, - "y": 0, - "r": "Vertical", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "3aeb18aac0b532f34255f162", - "_tpl": "5cc70146e4a949000d73bf6b", - "parentId": "285e9d9ae196ae4e336cd04f", - "slotId": "11", - "upd": { - "StackObjectsCount": 1 - }, - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true - } - }, - { - "_id": "bdb46107abbf1d92edaaf14e", - "_tpl": "6272379924e29f06af4d5ecb", - "parentId": "3aeb18aac0b532f34255f162", - "slotId": "mod_tactical", - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "0caadd8507a36d9ea871e88e", - "_tpl": "5ab8f04f86f774585f4237d8", - "parentId": "3bc4ff5bd99f165dc75cbd25", - "slotId": "main", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1 - } - }, - { - "_id": "240046eebc9040c1d7e58611", - "_tpl": "5ac66d015acfc400180ae6e4", - "parentId": "0caadd8507a36d9ea871e88e", - "slotId": "main", - "location": { - "x": 0, - "y": 0, - "r": "Horizontal", - "isSearched": true - }, - "upd": { - "StackObjectsCount": 1, - "sptPresetId": "5acf7dfc86f774401e19c390", - "Repairable": { - "Durability": 32, - "MaxDurability": 59 + _id: "61ab4afefac354dfc64c7874", + _tpl: "5b432d215acfc4771e1c6624", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 30, + MaxDurability: 30, }, - "Foldable": { - "Folded": true - } - } + }, }, { - "_id": "70b23c628fa17699d9a71e94", - "_tpl": "59c6633186f7740cf0493bb9", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_gas_block", - "upd": { - "StackObjectsCount": 1, - "sptPresetId": "5acf7dfc86f774401e19c390", - "Repairable": { - "Durability": 32, - "MaxDurability": 59 - } - } + _id: "285e9d9ae196ae4e336cd04f", + _tpl: "5d5d87f786f77427997cfaef", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 75, + MaxDurability: 80, + }, + }, }, { - "_id": "7cc2e24dc6bc0716bdddc472", - "_tpl": "5943ee5a86f77413872d25ec", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_muzzle", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + _id: "3bc4ff5bd99f165dc75cbd25", + _tpl: "5f5e467b0bc58666c37e7821", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "7a51ebbad703082660d59d27", - "_tpl": "5649ade84bdc2d1b2b8b4587", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_pistol_grip", - "upd": { - "StackObjectsCount": 1, - "sptPresetId": "5acf7dfc86f774401e19c390", - "Repairable": { - "Durability": 32, - "MaxDurability": 59 - } - } + _id: "6bf5d8ee81a3c9aec21bbbad", + _tpl: "5d5fca1ea4b93635fd598c07", + parentId: "5fe49444ae6628187a2e77b8", + slotId: "hideout", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "b481bc57436ed9a0c3abe7f3", - "_tpl": "5d2c76ed48f03532f2136169", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_reciever", - "upd": { - "StackObjectsCount": 1 - } + _id: "2371438cf809b5e483bf5d85", + _tpl: "5cc70093e4a949033c734312", + parentId: "12c243bd6b3e486e61325f81", + slotId: "mod_magazine", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "5774ef80597c7f91bff40dbb", - "_tpl": "5ac50c185acfc400163398d4", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_stock", - "upd": { - "StackObjectsCount": 1, - "sptPresetId": "5acf7dfc86f774401e19c390", - "Repairable": { - "Durability": 32, - "MaxDurability": 59 - } - } + _id: "7f890346ea5b2cbc68c3170f", + _tpl: "5cc700b9e4a949000f0f0f25", + parentId: "12c243bd6b3e486e61325f81", + slotId: "mod_stock", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "8b7c8e6ba172ac390c99a2ae", - "_tpl": "5ac66c5d5acfc4001718d314", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_magazine", - "upd": { - "StackObjectsCount": 1 - } + _id: "12fb79a9c4929009ff8d89e1", + _tpl: "5cc700ede4a949033c734315", + parentId: "12c243bd6b3e486e61325f81", + slotId: "mod_reciever", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "1ed3a416b1fc7adbed1160df", - "_tpl": "6130ca3fd92c473c77020dbd", - "parentId": "240046eebc9040c1d7e58611", - "slotId": "mod_charge", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + _id: "d4c5274082ed716e19447f46", + _tpl: "5cc701d7e4a94900100ac4e7", + parentId: "12c243bd6b3e486e61325f81", + slotId: "mod_barrel", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "bbe087661947c0d9c1cde146", - "_tpl": "5648b1504bdc2d9d488b4584", - "parentId": "70b23c628fa17699d9a71e94", - "slotId": "mod_handguard", - "upd": { - "StackObjectsCount": 1, - "sptPresetId": "5acf7dfc86f774401e19c390", - "Repairable": { - "Durability": 32, - "MaxDurability": 59 - } - } + _id: "d819dd4d2b13de10e9d6d805", + _tpl: "5cc6ea85e4a949000e1ea3c3", + parentId: "12c243bd6b3e486e61325f81", + slotId: "mod_charge", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "724388f8110434efccd79b3a", - "_tpl": "544a3a774bdc2d3a388b4567", - "parentId": "b481bc57436ed9a0c3abe7f3", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } + _id: "fc9a664cacc477c4e725a81a", + _tpl: "5cc700d4e4a949000f0f0f28", + parentId: "7f890346ea5b2cbc68c3170f", + slotId: "mod_stock_000", + upd: { + StackObjectsCount: 1, + }, }, { - "_id": "8581038b0f795618a3d26c94", - "_tpl": "58d268fc86f774111273f8c2", - "parentId": "724388f8110434efccd79b3a", - "slotId": "mod_scope", - "upd": { - "StackObjectsCount": 1, - "Repairable": { - "Durability": 100, - "MaxDurability": 100 - } - } - } - ] - } + _id: "372891c593cf14e176b93ce2", + _tpl: "5cc7012ae4a949001252b43e", + parentId: "12fb79a9c4929009ff8d89e1", + slotId: "mod_mount_000", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "bd196435a57bdc433df1e49d", + _tpl: "5cc7012ae4a949001252b43e", + parentId: "12fb79a9c4929009ff8d89e1", + slotId: "mod_mount_001", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "ea3349d29797354d835c2192", + _tpl: "58491f3324597764bc48fa02", + parentId: "12fb79a9c4929009ff8d89e1", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "4ccf7c74ca7d2167deb0ae5c", + _tpl: "626becf9582c3e319310b837", + parentId: "372891c593cf14e176b93ce2", + slotId: "mod_tactical", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "adfd3640fc93daf21c721ca6", + _tpl: "5cc9c20cd7f00c001336c65d", + parentId: "bd196435a57bdc433df1e49d", + slotId: "mod_tactical", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "deeb36b1812790b0145d2532", + _tpl: "5a16badafcdbcb001865f72d", + parentId: "61ab4afefac354dfc64c7874", + slotId: "mod_equipment_000", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 12, + MaxDurability: 25, + }, + }, + }, + { + _id: "4c0e0548df904c384569190c", + _tpl: "5ea058e01dbce517f324b3e2", + parentId: "61ab4afefac354dfc64c7874", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 3, + MaxDurability: 39, + }, + }, + }, + { + _id: "da82c293cabc705b30fef93a", + _tpl: "5a398ab9c4a282000c5a9842", + parentId: "61ab4afefac354dfc64c7874", + slotId: "mod_mount", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "b8fc94611def6e9ba534a8b3", + _tpl: "5a16b8a9fcdbcb00165aa6ca", + parentId: "4c0e0548df904c384569190c", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "20d6193c1f399e6326ebbc10", + _tpl: "5a16b93dfcdbcbcae6687261", + parentId: "b8fc94611def6e9ba534a8b3", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "065c4f13b2bd8be266e1e809", + _tpl: "57235b6f24597759bf5a30f1", + parentId: "20d6193c1f399e6326ebbc10", + slotId: "mod_nvg", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + Togglable: { + On: true, + }, + }, + }, + { + _id: "1883b955ab202fa099809278", + _tpl: "57d17c5e2459775a5c57d17d", + parentId: "da82c293cabc705b30fef93a", + slotId: "mod_flashlight", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "e3c9e50ce31900c950b4ff6f", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "1", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "193259b5eb848af4d036bee5", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "2", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "f97ce69443f63bbe8f8097a7", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "3", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "5d1c154a8abcfa934e477ac4", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "4", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "289f7af841690c5388095477", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "5", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "3e6d578165b61aef9865f677", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "6", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "338682523f8504f97f84f3ab", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "7", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "6d18ac01aa04b16e4f0d5d2f", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "8", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "ac4ed54d61daa0c5219f8522", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "9", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "2460460ef3d3df5c1ce07edb", + _tpl: "5cc70093e4a949033c734312", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "10", + location: { + x: 0, + y: 0, + r: "Vertical", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "3aeb18aac0b532f34255f162", + _tpl: "5cc70146e4a949000d73bf6b", + parentId: "285e9d9ae196ae4e336cd04f", + slotId: "11", + upd: { + StackObjectsCount: 1, + }, + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + }, + { + _id: "bdb46107abbf1d92edaaf14e", + _tpl: "6272379924e29f06af4d5ecb", + parentId: "3aeb18aac0b532f34255f162", + slotId: "mod_tactical", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "0caadd8507a36d9ea871e88e", + _tpl: "5ab8f04f86f774585f4237d8", + parentId: "3bc4ff5bd99f165dc75cbd25", + slotId: "main", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "240046eebc9040c1d7e58611", + _tpl: "5ac66d015acfc400180ae6e4", + parentId: "0caadd8507a36d9ea871e88e", + slotId: "main", + location: { + x: 0, + y: 0, + r: "Horizontal", + isSearched: true, + }, + upd: { + StackObjectsCount: 1, + sptPresetId: "5acf7dfc86f774401e19c390", + Repairable: { + Durability: 32, + MaxDurability: 59, + }, + Foldable: { + Folded: true, + }, + }, + }, + { + _id: "70b23c628fa17699d9a71e94", + _tpl: "59c6633186f7740cf0493bb9", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_gas_block", + upd: { + StackObjectsCount: 1, + sptPresetId: "5acf7dfc86f774401e19c390", + Repairable: { + Durability: 32, + MaxDurability: 59, + }, + }, + }, + { + _id: "7cc2e24dc6bc0716bdddc472", + _tpl: "5943ee5a86f77413872d25ec", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_muzzle", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "7a51ebbad703082660d59d27", + _tpl: "5649ade84bdc2d1b2b8b4587", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_pistol_grip", + upd: { + StackObjectsCount: 1, + sptPresetId: "5acf7dfc86f774401e19c390", + Repairable: { + Durability: 32, + MaxDurability: 59, + }, + }, + }, + { + _id: "b481bc57436ed9a0c3abe7f3", + _tpl: "5d2c76ed48f03532f2136169", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_reciever", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "5774ef80597c7f91bff40dbb", + _tpl: "5ac50c185acfc400163398d4", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_stock", + upd: { + StackObjectsCount: 1, + sptPresetId: "5acf7dfc86f774401e19c390", + Repairable: { + Durability: 32, + MaxDurability: 59, + }, + }, + }, + { + _id: "8b7c8e6ba172ac390c99a2ae", + _tpl: "5ac66c5d5acfc4001718d314", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_magazine", + upd: { + StackObjectsCount: 1, + }, + }, + { + _id: "1ed3a416b1fc7adbed1160df", + _tpl: "6130ca3fd92c473c77020dbd", + parentId: "240046eebc9040c1d7e58611", + slotId: "mod_charge", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "bbe087661947c0d9c1cde146", + _tpl: "5648b1504bdc2d9d488b4584", + parentId: "70b23c628fa17699d9a71e94", + slotId: "mod_handguard", + upd: { + StackObjectsCount: 1, + sptPresetId: "5acf7dfc86f774401e19c390", + Repairable: { + Durability: 32, + MaxDurability: 59, + }, + }, + }, + { + _id: "724388f8110434efccd79b3a", + _tpl: "544a3a774bdc2d3a388b4567", + parentId: "b481bc57436ed9a0c3abe7f3", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + { + _id: "8581038b0f795618a3d26c94", + _tpl: "58d268fc86f774111273f8c2", + parentId: "724388f8110434efccd79b3a", + slotId: "mod_scope", + upd: { + StackObjectsCount: 1, + Repairable: { + Durability: 100, + MaxDurability: 100, + }, + }, + }, + ], + }, ]; diff --git a/project/tests/__mocks__/WinstonLogger.mock.ts b/project/tests/__mocks__/WinstonLogger.mock.ts index 8e4b2f35..5733d4d6 100644 --- a/project/tests/__mocks__/WinstonLogger.mock.ts +++ b/project/tests/__mocks__/WinstonLogger.mock.ts @@ -6,26 +6,30 @@ import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; export class WinstonLogger implements ILogger { writeToLogFile(data: string | Daum): void - { } + {} log(data: string | Record | Error, color: string, backgroundColor?: string): void - { } + {} - logWithColor(data: string | Record, textColor: LogTextColor, backgroundColor?: LogBackgroundColor): void - { } + logWithColor( + data: string | Record, + textColor: LogTextColor, + backgroundColor?: LogBackgroundColor, + ): void + {} error(data: string): void - { } + {} warning(data: string): void - { } + {} success(data: string): void - { } + {} info(data: string): void - { } + {} - debug(data: string| Record, onlyShowInConsole?: boolean): void - { } + debug(data: string | Record, onlyShowInConsole?: boolean): void + {} } diff --git a/project/tests/controllers/InsuranceController.test.ts b/project/tests/controllers/InsuranceController.test.ts index 97db6a71..70326f3e 100644 --- a/project/tests/controllers/InsuranceController.test.ts +++ b/project/tests/controllers/InsuranceController.test.ts @@ -1,16 +1,16 @@ /* eslint-disable @typescript-eslint/naming-convention */ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, afterEach, describe, expect, it, beforeEach } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { InsuranceController } from "@spt-aki/controllers/InsuranceController"; import { ProfileInsuranceFactory } from "@tests/__factories__/ProfileInsurance.factory"; -import { MessageType } from "@spt-aki/models/enums/MessageType"; +import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; import { TraderHelper } from "@spt-aki/helpers/TraderHelper"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; import { Insurance } from "@spt-aki/models/eft/profile/IAkiProfile"; -import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; +import { MessageType } from "@spt-aki/models/enums/MessageType"; describe("InsuranceController", () => { @@ -36,10 +36,12 @@ describe("InsuranceController", () => const session2 = "session2"; const profiles = { [session1]: {}, - [session2]: {} + [session2]: {}, }; const getProfilesSpy = vi.spyOn(insuranceController.saveServer, "getProfiles").mockReturnValue(profiles); - const processReturnByProfileSpy = vi.spyOn(insuranceController, "processReturnByProfile").mockReturnValue(vi.fn()); + const processReturnByProfileSpy = vi.spyOn(insuranceController, "processReturnByProfile").mockReturnValue( + vi.fn(), + ); // Execute the method. insuranceController.processReturn(); @@ -55,7 +57,8 @@ describe("InsuranceController", () => it("should not attempt to process profiles if no profiles exist", () => { - const processReturnByProfileSpy = vi.spyOn(insuranceController, "processReturnByProfile").mockImplementation(vi.fn()); + const processReturnByProfileSpy = vi.spyOn(insuranceController, "processReturnByProfile") + .mockImplementation(vi.fn()); // Execute the method. insuranceController.processReturn(); @@ -119,7 +122,9 @@ describe("InsuranceController", () => // Verify that the correct methods were called. expect(mockGetProfile).toBeCalledTimes(1); - expect(mockLoggerDebug).toBeCalledWith(`Found ${insuranceFixture.length} insurance packages in profile ${sessionID}`); + expect(mockLoggerDebug).toBeCalledWith( + `Found ${insuranceFixture.length} insurance packages in profile ${sessionID}`, + ); expect(insuredFiltered.length).toBe(insuranceFixture.length); }); @@ -141,7 +146,9 @@ describe("InsuranceController", () => // Verify that the correct methods were called. expect(mockGetProfile).toBeCalledTimes(1); - expect(mockLoggerDebug).toBeCalledWith(`Found ${insuranceFixture.length} insurance packages in profile ${sessionID}`); + expect(mockLoggerDebug).toBeCalledWith( + `Found ${insuranceFixture.length} insurance packages in profile ${sessionID}`, + ); expect(insuredFiltered.length).toBe(insuranceFixture.length - 1); // Should be 1 less than the original fixture. }); @@ -157,11 +164,16 @@ describe("InsuranceController", () => // Execute the method, passing in a time that's two hours in the past. The function should use this past // date as the target to judge if an insurance package is ready to be sent or not. - const insuredFiltered = insuranceController.filterInsuredItems(sessionID, Math.floor((Date.now() / 1000) - (2 * 60 * 60))); + const insuredFiltered = insuranceController.filterInsuredItems( + sessionID, + Math.floor((Date.now() / 1000) - (2 * 60 * 60)), + ); // Verify that the correct methods were called. expect(mockGetProfile).toBeCalledTimes(1); - expect(mockLoggerDebug).toBeCalledWith(`Found ${insuranceFixture.length} insurance packages in profile ${sessionID}`); + expect(mockLoggerDebug).toBeCalledWith( + `Found ${insuranceFixture.length} insurance packages in profile ${sessionID}`, + ); // Verify that the returned array is empty. expect(insuredFiltered.length).toBe(0); @@ -186,7 +198,11 @@ describe("InsuranceController", () => insuranceController.processInsuredItems(insuranceFixture, sessionId); // Verify that the log was written. - expect(mockLoggerDebug).toBeCalledWith(`Processing ${insuranceFixture.length} insurance packages, which includes a total of ${insuranceController.countAllInsuranceItems(insuranceFixture)} items, in profile ${sessionId}`); + expect(mockLoggerDebug).toBeCalledWith( + `Processing ${insuranceFixture.length} insurance packages, which includes a total of ${ + insuranceController.countAllInsuranceItems(insuranceFixture) + } items, in profile ${sessionId}`, + ); }); it("should call processing methods once per insurance package", () => @@ -195,11 +211,19 @@ describe("InsuranceController", () => const packageCount = insuranceFixture.length; // Spy on the processing methods. - const mockFindItemsToDelete = vi.spyOn(insuranceController, "findItemsToDelete").mockImplementation(vi.fn()); - const mockRemoveItemsFromInsurance = vi.spyOn(insuranceController, "removeItemsFromInsurance").mockImplementation(vi.fn()); - const mockAdoptOrphanedItems = vi.spyOn(insuranceController, "adoptOrphanedItems").mockImplementation(vi.fn()); + const mockFindItemsToDelete = vi.spyOn(insuranceController, "findItemsToDelete").mockImplementation( + vi.fn(), + ); + const mockRemoveItemsFromInsurance = vi.spyOn(insuranceController, "removeItemsFromInsurance") + .mockImplementation(vi.fn()); + const mockAdoptOrphanedItems = vi.spyOn(insuranceController, "adoptOrphanedItems").mockImplementation( + vi.fn(), + ); const mockSendMail = vi.spyOn(insuranceController, "sendMail").mockImplementation(vi.fn()); - const mockRemoveInsurancePackageFromProfile = vi.spyOn(insuranceController, "removeInsurancePackageFromProfile").mockImplementation(vi.fn()); + const mockRemoveInsurancePackageFromProfile = vi.spyOn( + insuranceController, + "removeInsurancePackageFromProfile", + ).mockImplementation(vi.fn()); // Execute the method. insuranceController.processInsuredItems(insuranceFixture, sessionId); @@ -219,22 +243,22 @@ describe("InsuranceController", () => { const insurance = [ { - "_id": "1", - "upd": 1234567890, - "items": [ - { "_id": "1", "parentId": "1", "slotId": "1" }, - { "_id": "2", "parentId": "1", "slotId": "2" } - ] + _id: "1", + upd: 1234567890, + items: [ + {_id: "1", parentId: "1", slotId: "1"}, + {_id: "2", parentId: "1", slotId: "2"}, + ], }, { - "_id": "2", - "upd": 1234567890, - "items": [ - { "_id": "3", "parentId": "2", "slotId": "1" }, - { "_id": "4", "parentId": "2", "slotId": "2" }, - { "_id": "5", "parentId": "2", "slotId": "3" } - ] - } + _id: "2", + upd: 1234567890, + items: [ + {_id: "3", parentId: "2", slotId: "1"}, + {_id: "4", parentId: "2", slotId: "2"}, + {_id: "5", parentId: "2", slotId: "3"}, + ], + }, ]; const expectedCount = 5; // 2 items in the first package + 3 items in the second package. @@ -261,15 +285,15 @@ describe("InsuranceController", () => { const insurance = [ { - "_id": "1", - "upd": 1234567890, - "items": [] + _id: "1", + upd: 1234567890, + items: [], }, { - "_id": "2", - "upd": 1234567890, - "items": [] - } + _id: "2", + upd: 1234567890, + items: [], + }, ]; const expectedCount = 0; @@ -289,7 +313,7 @@ describe("InsuranceController", () => const packageToRemove = { date: "01.11.2023", time: "10:51", - location: "factory4_day" + location: "factory4_day", }; const profile = { insurance: [ @@ -298,20 +322,20 @@ describe("InsuranceController", () => systemData: { date: "01.11.2023", time: "11:18", - location: "factory4_day" - } - } + location: "factory4_day", + }, + }, }, { // This one should be removed messageContent: { systemData: { date: "01.11.2023", time: "10:51", - location: "factory4_day" - } - } - } - ] + location: "factory4_day", + }, + }, + }, + ], }; // Mock the getProfile method to return the above profile. @@ -325,7 +349,7 @@ describe("InsuranceController", () => expect(profile.insurance[0].messageContent.systemData).toStrictEqual({ date: "01.11.2023", time: "11:18", - location: "factory4_day" + location: "factory4_day", }); }); @@ -335,7 +359,7 @@ describe("InsuranceController", () => const packageToRemove = { date: "01.11.2023", time: "10:51", - location: "factory4_day" + location: "factory4_day", }; const profile = { insurance: [ @@ -344,11 +368,11 @@ describe("InsuranceController", () => systemData: { date: "01.11.2023", time: "10:51", - location: "factory4_day" - } - } - } - ] + location: "factory4_day", + }, + }, + }, + ], }; // Mock the getProfile method to return the above profile. @@ -361,7 +385,9 @@ describe("InsuranceController", () => insuranceController.removeInsurancePackageFromProfile(sessionID, packageToRemove); // Verify that the log was written. - expect(mockLoggerDebug).toBeCalledWith(`Removed insurance package with date: ${packageToRemove.date}, time: ${packageToRemove.time}, and location: ${packageToRemove.location} from profile ${sessionID}. Remaining packages: ${profile.insurance.length}`); + expect(mockLoggerDebug).toBeCalledWith( + `Removed insurance package with date: ${packageToRemove.date}, time: ${packageToRemove.time}, and location: ${packageToRemove.location} from profile ${sessionID}. Remaining packages: ${profile.insurance.length}`, + ); }); it("should not remove any packages if the specified package is not found", () => @@ -370,7 +396,7 @@ describe("InsuranceController", () => const packageToRemove = { date: "01.11.2023", time: "10:51", - location: "factory4_day" + location: "factory4_day", }; const profile = { insurance: [ @@ -379,11 +405,11 @@ describe("InsuranceController", () => systemData: { date: "02.11.2023", time: "10:50", - location: "factory4_night" - } - } - } - ] + location: "factory4_night", + }, + }, + }, + ], }; // Mock the getProfile method to return the above profile. @@ -399,7 +425,6 @@ describe("InsuranceController", () => describe("findItemsToDelete", () => { - it("should handle an empty insurance package", () => { const insurancePackage = insuranceFixture[0]; @@ -423,12 +448,14 @@ describe("InsuranceController", () => const mockPopulateItemsMap = vi.spyOn(insuranceController, "populateItemsMap"); const mockPopulateParentAttachmentsMap = vi.spyOn(insuranceController, "populateParentAttachmentsMap"); const mockIsAttachmentAttached = vi.spyOn(insuranceController.itemHelper, "isAttachmentAttached"); - const mockProcessAttachments = vi.spyOn(insuranceController, "processAttachments").mockImplementation(vi.fn()); + const mockProcessAttachments = vi.spyOn(insuranceController, "processAttachments").mockImplementation( + vi.fn(), + ); // Add all items to the toDelete set. Not realistic, but it's fine for this test. const mockProcessRegularItems = vi.fn((insured, toDelete) => { - insured.items.forEach(item => toDelete.add(item._id)); + insured.items.forEach((item) => toDelete.add(item._id)); }); vi.spyOn(insuranceController, "processRegularItems").mockImplementation(mockProcessRegularItems); @@ -444,7 +471,7 @@ describe("InsuranceController", () => // Verify that the result is correct. expect(result.size).toBe(numberOfItems); - expect(result).toEqual(new Set(insured.items.map(item => item._id))); + expect(result).toEqual(new Set(insured.items.map((item) => item._id))); }); it("should ignore orphaned attachments", () => @@ -463,7 +490,9 @@ describe("InsuranceController", () => { return new Map(); }); - vi.spyOn(insuranceController, "populateParentAttachmentsMap").mockImplementation(mockPopulateParentAttachmentsMap); + vi.spyOn(insuranceController, "populateParentAttachmentsMap").mockImplementation( + mockPopulateParentAttachmentsMap, + ); // Execute the method. const result = insuranceController.findItemsToDelete(insured); @@ -491,12 +520,12 @@ describe("InsuranceController", () => // Add all items to the toDelete set. Not realistic, but it's fine for this test. const mockProcessRegularItems = vi.fn((insured, toDelete) => { - insured.items.forEach(item => toDelete.add(item._id)); + insured.items.forEach((item) => toDelete.add(item._id)); }); vi.spyOn(insuranceController, "processRegularItems").mockImplementation(mockProcessRegularItems); const mockProcessAttachments = vi.fn((parentAttachmentsMap, itemsMap, traderId, toDelete) => { - insured.items.forEach(item => toDelete.add(item._id)); + insured.items.forEach((item) => toDelete.add(item._id)); }); vi.spyOn(insuranceController, "processAttachments").mockImplementation(mockProcessAttachments); @@ -511,7 +540,7 @@ describe("InsuranceController", () => // Verify that the result is correct. expect(result.size).toBe(numberOfItems); - expect(result).toEqual(new Set(insured.items.map(item => item._id))); + expect(result).toEqual(new Set(insured.items.map((item) => item._id))); }); it("should return an empty set if no items are to be deleted", () => @@ -523,8 +552,12 @@ describe("InsuranceController", () => const mockPopulateParentAttachmentsMap = vi.spyOn(insuranceController, "populateParentAttachmentsMap"); // Don't add any items to the toDelete set. - const mockProcessRegularItems = vi.spyOn(insuranceController, "processRegularItems").mockImplementation(vi.fn()); - const mockProcessAttachments = vi.spyOn(insuranceController, "processAttachments").mockImplementation(vi.fn()); + const mockProcessRegularItems = vi.spyOn(insuranceController, "processRegularItems").mockImplementation( + vi.fn(), + ); + const mockProcessAttachments = vi.spyOn(insuranceController, "processAttachments").mockImplementation( + vi.fn(), + ); // Execute the method. const result = insuranceController.findItemsToDelete(insured); @@ -551,12 +584,12 @@ describe("InsuranceController", () => // Add all items to the toDelete set. Not realistic, but it's fine for this test. const mockProcessRegularItems = vi.fn((insured, toDelete) => { - insured.items.forEach(item => toDelete.add(item._id)); + insured.items.forEach((item) => toDelete.add(item._id)); }); vi.spyOn(insuranceController, "processRegularItems").mockImplementation(mockProcessRegularItems); const mockProcessAttachments = vi.fn((parentAttachmentsMap, itemsMap, traderId, toDelete) => { - insured.items.forEach(item => toDelete.add(item._id)); + insured.items.forEach((item) => toDelete.add(item._id)); }); vi.spyOn(insuranceController, "processAttachments").mockImplementation(mockProcessAttachments); @@ -595,12 +628,12 @@ describe("InsuranceController", () => "da8cde1b3024c336f6e06152", "bc041c0011d76f714b898400", "9f8d7880a6e0a47a211ec5d3", - "db2ef9442178910eba985b51" + "db2ef9442178910eba985b51", ]; - validAttachmentTemplates.forEach(value => + validAttachmentTemplates.forEach((value) => { // Verify that each template is present in the array of attachments. - expect(gun.some(item => item._id === value)).toBe(true); + expect(gun.some((item) => item._id === value)).toBe(true); }); }); @@ -625,11 +658,11 @@ describe("InsuranceController", () => "1e0b177df108c0c117028812", "c9278dd8251e99578bf7a274", "402b4086535a50ef7d9cef88", - "566335b3df586f34b47f5e35" + "566335b3df586f34b47f5e35", ]; - invalidAttachmentTemplates.forEach(value => + invalidAttachmentTemplates.forEach((value) => { - expect(gun.every(item => item._id !== value)).toBe(true); + expect(gun.every((item) => item._id !== value)).toBe(true); }); }); @@ -655,12 +688,12 @@ describe("InsuranceController", () => "dc565f750342cb2d19eeda06", "e9ff62601669d9e2ea9c2fbb", "ac134d7cf6c9d8e25edd0015", - "22274b895ecc80d51c3cba1c" + "22274b895ecc80d51c3cba1c", ]; - validAttachmentTemplates.forEach(value => + validAttachmentTemplates.forEach((value) => { // Verify that each template is present in the array of attachments. - expect(gun.some(item => item._id === value)).toBe(true); + expect(gun.some((item) => item._id === value)).toBe(true); }); }); @@ -678,7 +711,7 @@ describe("InsuranceController", () => expect(result.size).toBe(6); // There are 6 base-level items in this insurance package. const gun = result.get("351180f3248d45c71cb2ebdc"); - expect(insured.items.find(item => item._id === "351180f3248d45c71cb2ebdc").slotId).toBe("main"); + expect(insured.items.find((item) => item._id === "351180f3248d45c71cb2ebdc").slotId).toBe("main"); expect(gun.length).toBe(14); // This AS VAL has 14 valid attachments. }); @@ -727,7 +760,10 @@ describe("InsuranceController", () => // Mock helper methods. const mockIsAttachmentAttached = vi.spyOn(insuranceController.itemHelper, "isAttachmentAttached"); - const mockFindAndReturnChildrenAsItems = vi.spyOn(insuranceController.itemHelper, "findAndReturnChildrenAsItems"); + const mockFindAndReturnChildrenAsItems = vi.spyOn( + insuranceController.itemHelper, + "findAndReturnChildrenAsItems", + ); // Mock rollForDelete to return true for all items. Not realistic, but it's fine for this test. const mockRollForDelete = vi.spyOn(insuranceController, "rollForDelete").mockReturnValue(true); @@ -741,7 +777,7 @@ describe("InsuranceController", () => expect(mockRollForDelete).toHaveBeenCalledTimes(numberOfItems); // Verify that all items were added to the toDelete set. - expect(toDelete).toEqual(new Set(insured.items.map(item => item._id))); + expect(toDelete).toEqual(new Set(insured.items.map((item) => item._id))); }); it("should not roll attached attachments", () => @@ -783,7 +819,7 @@ describe("InsuranceController", () => insuranceController.processRegularItems(insured, toDelete); // Verify that all items were added to the toDelete set. - expect(toDelete).toEqual(new Set(insured.items.map(item => item._id))); + expect(toDelete).toEqual(new Set(insured.items.map((item) => item._id))); }); }); @@ -827,7 +863,9 @@ describe("InsuranceController", () => const parentItem = itemsMap.get(parentId); if (parentItem) { - const expectedMessage = `Processing attachments for parent item: ${itemHelper.getItemName(parentItem._tpl)}`; + const expectedMessage = `Processing attachments for parent item: ${ + itemHelper.getItemName(parentItem._tpl) + }`; expect(mockLoggerDebug).toHaveBeenCalledWith(expectedMessage); } } @@ -911,14 +949,16 @@ describe("InsuranceController", () => const attachments = parentToAttachmentMap.values().next().value; // Set the maxPrice of the first two attachments to null. - vi.spyOn(insuranceController.itemHelper, "getItemMaxPrice").mockReturnValueOnce(null).mockReturnValueOnce(null); + vi.spyOn(insuranceController.itemHelper, "getItemMaxPrice").mockReturnValueOnce(null).mockReturnValueOnce( + null, + ); // Execute the method. const sortedAttachments = insuranceController.sortAttachmentsByPrice(attachments); // Verify that the attachments with null maxPrice are at the bottom of the list const nullPriceAttachments = sortedAttachments.slice(-2); - nullPriceAttachments.forEach(attachment => + nullPriceAttachments.forEach((attachment) => { expect(attachment.maxPrice).toBeNull(); }); @@ -936,8 +976,8 @@ describe("InsuranceController", () => it("should log details for each attachment", () => { const attachments = [ - { _id: "item1", name: "Item 1", maxPrice: 100 }, - { _id: "item2", name: "Item 2", maxPrice: 200 } + {_id: "item1", name: "Item 1", maxPrice: 100}, + {_id: "item2", name: "Item 2", maxPrice: 200}, ]; // Mock the logger.debug function. @@ -1096,9 +1136,9 @@ describe("InsuranceController", () => insuranceController.removeItemsFromInsurance(insured, toDelete); // Ensure that the items in the toDelete set are not present in the insured items array. - toDelete.forEach(toDeleteId => + toDelete.forEach((toDeleteId) => { - expect(insured.items.some(item => item._id === toDeleteId)).toBe(false); + expect(insured.items.some((item) => item._id === toDeleteId)).toBe(false); }); }); @@ -1120,7 +1160,7 @@ describe("InsuranceController", () => const insured = insuranceFixture[0]; const originalCount = insured.items.length; const toDelete = new Set(); - insured.items.forEach(item => toDelete.add(item._id)); + insured.items.forEach((item) => toDelete.add(item._id)); // All of the items should be added to the toDelete set. expect(originalCount).toBe(toDelete.size); @@ -1146,7 +1186,9 @@ describe("InsuranceController", () => insured.items[0].slotId = "main"; // Should not be "hideout". // Iterate over the items and find an individual orphaned item. - const orphanedItem = insured.items.find(item => !insured.items.some(parent => parent._id === item.parentId)); + const orphanedItem = insured.items.find((item) => + !insured.items.some((parent) => parent._id === item.parentId) + ); // Setup tests to verify that the orphaned item we added is in fact orphaned. expect(orphanedItem.parentId).toBe(insured.items[0].parentId); @@ -1184,7 +1226,9 @@ describe("InsuranceController", () => insured.items[0].location = {x: 1, y: 2, r: 3, isSearched: true}; // Should be removed. // Iterate over the items and find an individual orphaned item. - const orphanedItem = insured.items.find(item => !insured.items.some(parent => parent._id === item.parentId)); + const orphanedItem = insured.items.find((item) => + !insured.items.some((parent) => parent._id === item.parentId) + ); // Setup tests to verify that the orphaned item we added is in fact orphaned. expect(orphanedItem.parentId).toBe(insured.items[0].parentId); @@ -1275,7 +1319,7 @@ describe("InsuranceController", () => insuranceFailedTpl, insurance.items, insurance.messageContent.maxStorageTime, - insurance.messageContent.systemData + insurance.messageContent.systemData, ); }); @@ -1309,7 +1353,7 @@ describe("InsuranceController", () => insurance.messageContent.templateId, insurance.items, insurance.messageContent.maxStorageTime, - insurance.messageContent.systemData + insurance.messageContent.systemData, ); }); }); @@ -1322,8 +1366,8 @@ describe("InsuranceController", () => const traderId = "54cb57776803fa99248b456e"; // Therapist (85% return chance) insuranceController.insuranceConfig = { returnChancePercent: { - [traderId]: 85 // Force 85% return chance - } + [traderId]: 85, // Force 85% return chance + }, }; // Execute the method. @@ -1339,8 +1383,8 @@ describe("InsuranceController", () => const traderId = "54cb57776803fa99248b456e"; // Therapist (85% return chance) insuranceController.insuranceConfig = { returnChancePercent: { - [traderId]: 85 // Force 85% return chance - } + [traderId]: 85, // Force 85% return chance + }, }; // Execute the method. @@ -1356,8 +1400,8 @@ describe("InsuranceController", () => const traderId = "54cb57776803fa99248b456e"; // Therapist (85% return chance) insuranceController.insuranceConfig = { returnChancePercent: { - [traderId]: 85 // Force 85% return chance - } + [traderId]: 85, // Force 85% return chance + }, }; // Execute the method. @@ -1394,7 +1438,13 @@ describe("InsuranceController", () => describe("insure", () => { - let pmcData: any, body: any, sessionId: string, insuranceController: any, mockGetPremium: any, mockPayMoney: any, mockGetOutput: any; + let pmcData: any, + body: any, + sessionId: string, + insuranceController: any, + mockGetPremium: any, + mockPayMoney: any, + mockGetOutput: any; beforeEach(() => { @@ -1404,15 +1454,15 @@ describe("InsuranceController", () => pmcData = { Inventory: { items: [ - { _id: "item1", otherProps: "value1" }, - { _id: "item2", otherProps: "value2" } - ] + {_id: "item1", otherProps: "value1"}, + {_id: "item2", otherProps: "value2"}, + ], }, - InsuredItems: [] + InsuredItems: [], }; body = { items: ["item1", "item2"], - tid: "someTraderId" + tid: "someTraderId", }; sessionId = "session-id"; @@ -1420,11 +1470,11 @@ describe("InsuranceController", () => mockGetPremium = vi.spyOn(insuranceController.insuranceService, "getPremium").mockReturnValue(100); mockPayMoney = vi.spyOn(insuranceController.paymentService, "payMoney").mockReturnValue({ warnings: [], - otherProperty: "property-value" + otherProperty: "property-value", }); mockGetOutput = vi.spyOn(insuranceController.eventOutputHolder, "getOutput").mockReturnValue({ warnings: [], - otherProperty: "property-value" + otherProperty: "property-value", }); }); @@ -1439,20 +1489,21 @@ describe("InsuranceController", () => pmcData, { scheme_items: [ - { id: "item1", count: 100 }, - { id: "item2", count: 100 } + {id: "item1", count: 100}, + {id: "item2", count: 100}, ], tid: "someTraderId", Action: "", type: "", item_id: "", count: 0, - scheme_id: 0 + scheme_id: 0, }, - sessionId, { + sessionId, + { warnings: [], - otherProperty: "property-value" - } + otherProperty: "property-value", + }, ); }); @@ -1479,15 +1530,15 @@ describe("InsuranceController", () => // Define the expected payment options structure based on the setup data. const expectedPaymentOptions = { scheme_items: [ - { id: "item1", count: 100 }, - { id: "item2", count: 100 } + {id: "item1", count: 100}, + {id: "item2", count: 100}, ], tid: body.tid, Action: "", type: "", item_id: "", count: 0, - scheme_id: 0 + scheme_id: 0, }; // Verify that the paymentService's payMoney method was called once with the expected parameters. @@ -1498,7 +1549,7 @@ describe("InsuranceController", () => pmcData, expectedPaymentOptions, sessionId, - mockGetOutput.mock.results[0].value + mockGetOutput.mock.results[0].value, ); }); @@ -1508,7 +1559,7 @@ describe("InsuranceController", () => insuranceController.insure(pmcData, body, sessionId); // Verify that the InsuredItems array has been populated with the correct items. - const insuredItemIds = pmcData.InsuredItems.map(insuredItem => insuredItem.itemId); + const insuredItemIds = pmcData.InsuredItems.map((insuredItem) => insuredItem.itemId); expect(insuredItemIds).toContain("item1"); expect(insuredItemIds).toContain("item2"); @@ -1523,9 +1574,9 @@ describe("InsuranceController", () => warnings: [{ index: 0, errmsg: "Not enough money to complete transaction", - code: 500 + code: 500, }], - otherProperty: "property-value" + otherProperty: "property-value", }; mockPayMoney.mockReturnValue(expectedPayMoneyReturn); @@ -1546,9 +1597,9 @@ describe("InsuranceController", () => warnings: [{ index: 0, errmsg: "Not enough money to complete transaction", - code: 500 + code: 500, }], - otherProperty: "property-value" + otherProperty: "property-value", }; mockPayMoney.mockReturnValue(expectedPayMoneyReturn); @@ -1573,17 +1624,17 @@ describe("InsuranceController", () => vi.spyOn(insuranceController.profileHelper, "getPmcProfile").mockReturnValue({ Inventory: { items: [ - { _id: "itemId1", _tpl: "itemTpl1", otherProperty: "property-value1" }, - { _id: "itemId2", _tpl: "itemTpl2", otherProperty: "property-value2" }, - { _id: "itemId3", _tpl: "itemTpl3", otherProperty: "property-value3" } - ] - } + {_id: "itemId1", _tpl: "itemTpl1", otherProperty: "property-value1"}, + {_id: "itemId2", _tpl: "itemTpl2", otherProperty: "property-value2"}, + {_id: "itemId3", _tpl: "itemTpl3", otherProperty: "property-value3"}, + ], + }, }); }); it("should return an empty object if no traders and items are specified", () => { - const request = { traders: [], items: [] }; + const request = {traders: [], items: []}; const expected = {}; const result = insuranceController.cost(request, sessionId); @@ -1593,8 +1644,8 @@ describe("InsuranceController", () => it("should return an empty object if no items are specified", () => { - const request = { traders: ["prapor"], items: [] }; - const expected = { prapor: {} }; + const request = {traders: ["prapor"], items: []}; + const expected = {prapor: {}}; const result = insuranceController.cost(request, sessionId); @@ -1603,7 +1654,7 @@ describe("InsuranceController", () => it("should return an empty object if no trader is specified but items are", () => { - const request = { traders: [], items: ["itemId1", "itemId2"] }; + const request = {traders: [], items: ["itemId1", "itemId2"]}; const expected = {}; const result = insuranceController.cost(request, sessionId); @@ -1615,11 +1666,11 @@ describe("InsuranceController", () => { const request = { traders: ["prapor", "therapist"], - items: ["itemId1", "itemId2", "itemId3"] + items: ["itemId1", "itemId2", "itemId3"], }; const expected = { - prapor: { itemTpl1: 100, itemTpl2: 200, itemTpl3: 300 }, - therapist: { itemTpl1: 150, itemTpl2: 250, itemTpl3: 350 } + prapor: {itemTpl1: 100, itemTpl2: 200, itemTpl3: 300}, + therapist: {itemTpl1: 150, itemTpl2: 250, itemTpl3: 350}, }; // Mock the InsuranceService.getPremium method to return the expected values. @@ -1643,11 +1694,11 @@ describe("InsuranceController", () => items: [ "itemId1", "itemId2", - "itemId4" // Doesn't exist in the player's inventory. - ] + "itemId4", // Doesn't exist in the player's inventory. + ], }; const expected = { - prapor: { itemTpl1: 100, itemTpl2: 200 } + prapor: {itemTpl1: 100, itemTpl2: 200}, }; // Mock the InsuranceService.getPremium method to return the expected values. diff --git a/project/tests/generators/BotGenerator.test.ts b/project/tests/generators/BotGenerator.test.ts index 381189c9..7545a69d 100644 --- a/project/tests/generators/BotGenerator.test.ts +++ b/project/tests/generators/BotGenerator.test.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/naming-convention */ import "reflect-metadata"; -import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; import { BotGenerator } from "@spt-aki/generators/BotGenerator"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; +import { container } from "tsyringe"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; describe("BotGenerator", () => { @@ -62,15 +62,15 @@ describe("BotGenerator", () => const mockPlayerProfile = { Info: { Nickname: "Player Nickname", - Level: 1 - } + Level: 1, + }, }; vi.spyOn(botGenerator.profileHelper, "getPmcProfile").mockReturnValue(mockPlayerProfile); const botJsonTemplate = { firstName: ["test"], - lastName: [] + lastName: [], }; const sessionId = "sessionId"; @@ -88,14 +88,14 @@ describe("BotGenerator", () => const mockPlayerProfile = { Info: { Nickname: "Player Nickname", - Level: 1 - } + Level: 1, + }, }; vi.spyOn(botGenerator.profileHelper, "getPmcProfile").mockReturnValue(mockPlayerProfile); const botJsonTemplate = { firstName: ["test"], - lastName: [] + lastName: [], }; const sessionId = "sessionId"; @@ -114,15 +114,15 @@ describe("BotGenerator", () => const mockPlayerProfile = { Info: { Nickname: "Player", - Level: 1 - } + Level: 1, + }, }; vi.spyOn(botGenerator.profileHelper, "getPmcProfile").mockReturnValue(mockPlayerProfile); vi.spyOn(botGenerator.localisationService, "getRandomTextThatMatchesPartialKey").mockReturnValue("test"); const botJsonTemplate = { firstName: ["Player"], - lastName: [] + lastName: [], }; const sessionId = "sessionId"; @@ -140,14 +140,14 @@ describe("BotGenerator", () => const mockPlayerProfile = { Info: { Nickname: "Player", - Level: 1 - } + Level: 1, + }, }; vi.spyOn(botGenerator.profileHelper, "getPmcProfile").mockReturnValue(mockPlayerProfile); const botJsonTemplate = { firstName: ["test"], - lastName: [] + lastName: [], }; const sessionId = "sessionId"; @@ -167,14 +167,14 @@ describe("BotGenerator", () => const mockPlayerProfile = { Info: { Nickname: "Player", - Level: 1 - } + Level: 1, + }, }; vi.spyOn(botGenerator.profileHelper, "getPmcProfile").mockReturnValue(mockPlayerProfile); const botJsonTemplate = { firstName: ["test"], - lastName: [] + lastName: [], }; const sessionId = "sessionId"; diff --git a/project/tests/generators/BotLevelGenerator.test.ts b/project/tests/generators/BotLevelGenerator.test.ts index 11a96e03..dc04eef4 100644 --- a/project/tests/generators/BotLevelGenerator.test.ts +++ b/project/tests/generators/BotLevelGenerator.test.ts @@ -1,6 +1,6 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { BotLevelGenerator } from "@spt-aki/generators/BotLevelGenerator"; import { MinMax } from "@spt-aki/models/common/MinMax"; @@ -29,7 +29,7 @@ describe("BotLevelGenerator", () => { const levelDetails: MinMax = { min: 5, - max: 10 + max: 10, }; const botGenerationDetails: BotGenerationDetails = { @@ -40,7 +40,7 @@ describe("BotLevelGenerator", () => botRelativeLevelDeltaMax: 0, botCountToGenerate: 0, botDifficulty: "", - isPlayerScav: false + isPlayerScav: false, }; const result = botLevelGenerator.generateBotLevel(levelDetails, botGenerationDetails, null); @@ -55,7 +55,7 @@ describe("BotLevelGenerator", () => { const levelDetails: MinMax = { min: 5, - max: 10 + max: 10, }; const expTable = databaseServer.getTables().globals.config.exp.level.exp_table; @@ -69,14 +69,19 @@ describe("BotLevelGenerator", () => { const levelDetails: MinMax = { min: 100, - max: 100 + max: 100, }; const expTable = databaseServer.getTables().globals.config.exp.level.exp_table; const playerLevel = 100; const relativeDeltaMax = 5; - const result = botLevelGenerator.getHighestRelativeBotLevel(playerLevel, relativeDeltaMax, levelDetails, expTable); + const result = botLevelGenerator.getHighestRelativeBotLevel( + playerLevel, + relativeDeltaMax, + levelDetails, + expTable, + ); expect(result).toBe(79); }); diff --git a/project/tests/helpers/BotHelper.test.ts b/project/tests/helpers/BotHelper.test.ts index f9a12537..9e48473b 100644 --- a/project/tests/helpers/BotHelper.test.ts +++ b/project/tests/helpers/BotHelper.test.ts @@ -1,6 +1,6 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { BotHelper } from "@spt-aki/helpers/BotHelper"; diff --git a/project/tests/helpers/HandbookHelper.test.ts b/project/tests/helpers/HandbookHelper.test.ts index bf1cb7bc..0747f1a7 100644 --- a/project/tests/helpers/HandbookHelper.test.ts +++ b/project/tests/helpers/HandbookHelper.test.ts @@ -1,6 +1,6 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { HandbookHelper } from "@spt-aki/helpers/HandbookHelper"; import { Money } from "@spt-aki/models/enums/Money"; diff --git a/project/tests/helpers/InRaidHelper.test.ts b/project/tests/helpers/InRaidHelper.test.ts index 091d430d..a6c65bd0 100644 --- a/project/tests/helpers/InRaidHelper.test.ts +++ b/project/tests/helpers/InRaidHelper.test.ts @@ -1,6 +1,6 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { InRaidHelper } from "@spt-aki/helpers/InRaidHelper"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; @@ -27,12 +27,12 @@ describe("InRaidHelper", () => const postRaidPlayerVictims = [ { Side: "Savage", - Role: "assault" + Role: "assault", }, { Side: "Savage", - Role: "assault" - } + Role: "assault", + }, ]; // Kills const databaseServer = container.resolve("DatabaseServer"); @@ -49,12 +49,12 @@ describe("InRaidHelper", () => const postRaidPlayerVictims = [ { Side: "Usec", - Role: "sptUsec" + Role: "sptUsec", }, { Side: "Bear", - Role: "sptBear" - } + Role: "sptBear", + }, ]; // Kills const databaseServer = container.resolve("DatabaseServer"); @@ -72,29 +72,32 @@ describe("InRaidHelper", () => const postRaidPlayerVictims = [ { Side: "Usec", - Role: "sptUsec" + Role: "sptUsec", }, { Side: "savage", - Role: "assault" + Role: "assault", }, { Side: "savage", - Role: "bossBoar" + Role: "bossBoar", }, { Side: "savage", - Role: "assault" - } + Role: "assault", + }, ]; // Kills const databaseServer = container.resolve("DatabaseServer"); const usecStandingChangeOnKill = databaseServer.getTables().bots.types.bear.experience.standingForKill; const scavStandingChangeOnKill = databaseServer.getTables().bots.types.assault.experience.standingForKill; - const bossBoarStandingChangeOnKill = databaseServer.getTables().bots.types.bossboar.experience.standingForKill; + const bossBoarStandingChangeOnKill = + databaseServer.getTables().bots.types.bossboar.experience.standingForKill; const result = inraidHelper.calculateFenceStandingChangeFromKills(fenceStanding, postRaidPlayerVictims); - expect(result).toBe(usecStandingChangeOnKill + (scavStandingChangeOnKill * 2) + bossBoarStandingChangeOnKill); + expect(result).toBe( + usecStandingChangeOnKill + (scavStandingChangeOnKill * 2) + bossBoarStandingChangeOnKill, + ); expect(result).lessThan(0); }); @@ -104,12 +107,14 @@ describe("InRaidHelper", () => const postRaidPlayerVictims = [ { Side: "savage", - Role: "testRole" - } + Role: "testRole", + }, ]; // Kills // Fake getFenceStandingChangeForKillAsScav() returning null - vi.spyOn(inraidHelper, "getFenceStandingChangeForKillAsScav").mockReturnValueOnce(null).mockReturnValueOnce(null); + vi.spyOn(inraidHelper, "getFenceStandingChangeForKillAsScav").mockReturnValueOnce(null).mockReturnValueOnce( + null, + ); const result = inraidHelper.calculateFenceStandingChangeFromKills(fenceStanding, postRaidPlayerVictims); expect(result).toBe(0); }); diff --git a/project/tests/helpers/ItemHelper.test.ts b/project/tests/helpers/ItemHelper.test.ts index 32d13ace..e86ae492 100644 --- a/project/tests/helpers/ItemHelper.test.ts +++ b/project/tests/helpers/ItemHelper.test.ts @@ -1,12 +1,12 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { ItemHelper } from "@spt-aki/helpers/ItemHelper"; import { Item, Repairable } from "@spt-aki/models/eft/common/tables/IItem"; +import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; import { HashUtil } from "@spt-aki/utils/HashUtil"; -import { ITemplateItem } from "@spt-aki/models/eft/common/tables/ITemplateItem"; describe("ItemHelper", () => { @@ -251,7 +251,7 @@ describe("ItemHelper", () => { const initialItem: Item = { _id: "", - _tpl: "" + _tpl: "", }; const fixedItem = itemHelper.fixItemStackCount(initialItem); @@ -264,7 +264,7 @@ describe("ItemHelper", () => const initialItem: Item = { _id: "", _tpl: "", - upd: {} + upd: {}, }; const fixedItem = itemHelper.fixItemStackCount(initialItem); @@ -278,8 +278,8 @@ describe("ItemHelper", () => _id: "", _tpl: "", upd: { - StackObjectsCount: 5 - } + StackObjectsCount: 5, + }, }; const fixedItem = itemHelper.fixItemStackCount(initialItem); @@ -324,7 +324,6 @@ describe("ItemHelper", () => // Restore the original behavior loggerWarningSpy.mockRestore(); }); - }); describe("getItems", () => @@ -420,7 +419,7 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const item: Item = { _id: itemId, - _tpl: "590c657e86f77412b013051d" // "Grizzly medical kit" + _tpl: "590c657e86f77412b013051d", // "Grizzly medical kit" }; const result = itemHelper.getItemQualityModifier(item); @@ -433,8 +432,8 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const item: Item = { _id: itemId, - _tpl: "590c657e86f77412b013051d", // "Grizzly medical kit" - upd: {} + _tpl: "590c657e86f77412b013051d", // "Grizzly medical kit" + upd: {}, }; const result = itemHelper.getItemQualityModifier(item); @@ -447,12 +446,12 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const item: Item = { _id: itemId, - _tpl: "590c657e86f77412b013051d", // "Grizzly medical kit" + _tpl: "590c657e86f77412b013051d", // "Grizzly medical kit" upd: { MedKit: { - HpResource: 900 // 1800 total - } - } + HpResource: 900, // 1800 total + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -460,7 +459,7 @@ describe("ItemHelper", () => expect(result).toBe(0.5); }); - it("should return correct value for a reparable helmet", () => + it("should return correct value for a repairable helmet", () => { const itemId = container.resolve("HashUtil").generate(); const item: Item = { @@ -469,9 +468,9 @@ describe("ItemHelper", () => upd: { Repairable: { Durability: 19, - MaxDurability: 38 - } - } + MaxDurability: 38, + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -488,9 +487,9 @@ describe("ItemHelper", () => upd: { Repairable: { Durability: 20, - MaxDurability: 100 - } - } + MaxDurability: 100, + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -506,9 +505,9 @@ describe("ItemHelper", () => _tpl: "5448fee04bdc2dbc018b4567", // "Bottle of water (0.6L)" upd: { FoodDrink: { - HpPercent: 30 // Not actually a percentage, but value of max 60. - } - } + HpPercent: 30, // Not actually a percentage, but value of max 60. + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -524,9 +523,9 @@ describe("ItemHelper", () => _tpl: "5780cf7f2459777de4559322", // "Dorm room 314 marked key" upd: { Key: { - NumberOfUsages: 5 - } - } + NumberOfUsages: 5, + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -543,9 +542,9 @@ describe("ItemHelper", () => upd: { Resource: { Value: 50, // How much fuel is left in the tank. - UnitsConsumed: 50 // How much fuel has been used in the generator. - } - } + UnitsConsumed: 50, // How much fuel has been used in the generator. + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -561,9 +560,9 @@ describe("ItemHelper", () => _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" upd: { RepairKit: { - Resource: 600 - } - } + Resource: 600, + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -579,9 +578,9 @@ describe("ItemHelper", () => _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" upd: { RepairKit: { - Resource: 0 - } - } + Resource: 0, + }, + }, }; const result = itemHelper.getItemQualityModifier(item); @@ -594,14 +593,14 @@ describe("ItemHelper", () => { it("should return the correct quality value for armor items", () => { - const armor = itemHelper.getItem("5648a7494bdc2d9d488b4583")[1]; // "PACA Soft Armor" + const armor = itemHelper.getItem("5648a7494bdc2d9d488b4583")[1]; // "PACA Soft Armor" const repairable: Repairable = { Durability: 25, - MaxDurability: 50 + MaxDurability: 50, }; const item: Item = { // Not used for armor, but required for the method. _id: "", - _tpl: "" + _tpl: "", }; // Cast the method to any to allow access to private/protected method. @@ -612,14 +611,14 @@ describe("ItemHelper", () => it("should not use the Repairable MaxDurability property for armor", () => { - const armor = itemHelper.getItem("5648a7494bdc2d9d488b4583")[1]; // "PACA Soft Armor" + const armor = itemHelper.getItem("5648a7494bdc2d9d488b4583")[1]; // "PACA Soft Armor" const repairable: Repairable = { Durability: 25, - MaxDurability: 1000 // This should be ignored. + MaxDurability: 1000, // This should be ignored. }; const item: Item = { // Not used for armor, but required for the method. _id: "", - _tpl: "" + _tpl: "", }; // Cast the method to any to allow access to private/protected method. @@ -630,14 +629,14 @@ describe("ItemHelper", () => it("should return the correct quality value for weapon items", () => { - const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" + const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" const repairable: Repairable = { Durability: 50, - MaxDurability: 100 + MaxDurability: 100, }; const item: Item = { _id: "", - _tpl: "" + _tpl: "", }; // Cast the method to any to allow access to private/protected method. @@ -648,15 +647,15 @@ describe("ItemHelper", () => it("should fall back to using Repairable MaxDurability for weapon items", () => { - const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" + const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" weapon._props.MaxDurability = undefined; // Remove the MaxDurability property. const repairable: Repairable = { Durability: 50, - MaxDurability: 200 // This should be used now. + MaxDurability: 200, // This should be used now. }; const item: Item = { _id: "", - _tpl: "" + _tpl: "", }; // Cast the method to any to allow access to private/protected method. @@ -667,15 +666,15 @@ describe("ItemHelper", () => it("should return 1 if durability value is invalid", () => { - const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" + const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" weapon._props.MaxDurability = undefined; // Remove the MaxDurability property. const repairable: Repairable = { Durability: 50, - MaxDurability: undefined // Remove the MaxDurability property value... Technically an invalid Type. + MaxDurability: undefined, // Remove the MaxDurability property value... Technically an invalid Type. }; const item: Item = { _id: "", - _tpl: "" + _tpl: "", }; // Mock the logger's error method to prevent it from being actually called. @@ -691,15 +690,15 @@ describe("ItemHelper", () => it("should not divide by zero", () => { - const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" + const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" weapon._props.MaxDurability = undefined; // Remove the MaxDurability property. const repairable: Repairable = { Durability: 50, - MaxDurability: 0 // This is a problem. + MaxDurability: 0, // This is a problem. }; const item: Item = { _id: "", - _tpl: "" + _tpl: "", }; // Cast the method to any to allow access to private/protected method. @@ -710,15 +709,15 @@ describe("ItemHelper", () => it("should log an error if durability is invalid", () => { - const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" + const weapon = itemHelper.getItem("5a38e6bac4a2826c6e06d79b")[1]; // "TOZ-106 20ga bolt-action shotgun" weapon._props.MaxDurability = undefined; // Remove the MaxDurability property. const repairable: Repairable = { Durability: 50, - MaxDurability: undefined // Remove the MaxDurability property value... Technically an invalid Type. + MaxDurability: undefined, // Remove the MaxDurability property value... Technically an invalid Type. }; const item: Item = { _id: "", - _tpl: "" + _tpl: "", }; const loggerErrorSpy = vi.spyOn((itemHelper as any).logger, "error"); @@ -735,9 +734,9 @@ describe("ItemHelper", () => it("should return an array containing only the parent ID when no children are found", () => { const items: Item[] = [ - { _id: "1", _tpl: "", parentId: null }, - { _id: "2", _tpl: "", parentId: null }, - { _id: "3", _tpl: "", parentId: "2" } + {_id: "1", _tpl: "", parentId: null}, + {_id: "2", _tpl: "", parentId: null}, + {_id: "3", _tpl: "", parentId: "2"}, ]; const result = itemHelper.findAndReturnChildrenByItems(items, "1"); expect(result).toEqual(["1"]); @@ -746,9 +745,9 @@ describe("ItemHelper", () => it("should return array of child IDs when single-level children are found", () => { const items: Item[] = [ - { _id: "1", _tpl: "", parentId: null }, - { _id: "2", _tpl: "", parentId: "1" }, - { _id: "3", _tpl: "", parentId: "1" } + {_id: "1", _tpl: "", parentId: null}, + {_id: "2", _tpl: "", parentId: "1"}, + {_id: "3", _tpl: "", parentId: "1"}, ]; const result = itemHelper.findAndReturnChildrenByItems(items, "1"); expect(result).toEqual(["2", "3", "1"]); @@ -757,10 +756,10 @@ describe("ItemHelper", () => it("should return array of child IDs when multi-level children are found", () => { const items: Item[] = [ - { _id: "1", _tpl: "", parentId: null }, - { _id: "2", _tpl: "", parentId: "1" }, - { _id: "3", _tpl: "", parentId: "2" }, - { _id: "4", _tpl: "", parentId: "3" } + {_id: "1", _tpl: "", parentId: null}, + {_id: "2", _tpl: "", parentId: "1"}, + {_id: "3", _tpl: "", parentId: "2"}, + {_id: "4", _tpl: "", parentId: "3"}, ]; const result = itemHelper.findAndReturnChildrenByItems(items, "1"); expect(result).toEqual(["4", "3", "2", "1"]); @@ -769,8 +768,8 @@ describe("ItemHelper", () => it("should return an array containing only the parent ID when parent ID does not exist in items", () => { const items: Item[] = [ - { _id: "1", _tpl: "", parentId: null }, - { _id: "2", _tpl: "", parentId: "1" } + {_id: "1", _tpl: "", parentId: null}, + {_id: "2", _tpl: "", parentId: "1"}, ]; const result = itemHelper.findAndReturnChildrenByItems(items, "3"); expect(result).toEqual(["3"]); @@ -785,7 +784,7 @@ describe("ItemHelper", () => const item: Item = { _id: itemId, _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" - upd: {} + upd: {}, }; const result = itemHelper.getItemStackSize(item); expect(result).toBe(1); @@ -796,7 +795,7 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const item: Item = { _id: itemId, - _tpl: "591094e086f7747caa7bb2ef" // "Body armor repair kit" + _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" }; const result = itemHelper.getItemStackSize(item); expect(result).toBe(1); @@ -809,8 +808,8 @@ describe("ItemHelper", () => _id: itemId, _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" upd: { - StackObjectsCount: 5 - } + StackObjectsCount: 5, + }, }; const result = itemHelper.getItemStackSize(item); expect(result).toBe(5); @@ -827,8 +826,8 @@ describe("ItemHelper", () => _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" upd: { BuyRestrictionCurrent: 0, - BuyRestrictionMax: 1 - } + BuyRestrictionMax: 1, + }, }; const result = itemHelper.hasBuyRestrictions(item); expect(result).toBe(true); @@ -840,7 +839,7 @@ describe("ItemHelper", () => const item: Item = { _id: itemId, _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" - upd: {} + upd: {}, }; const result = itemHelper.hasBuyRestrictions(item); expect(result).toBe(false); @@ -851,7 +850,7 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const item: Item = { _id: itemId, - _tpl: "591094e086f7747caa7bb2ef" // "Body armor repair kit" + _tpl: "591094e086f7747caa7bb2ef", // "Body armor repair kit" }; const result = itemHelper.hasBuyRestrictions(item); expect(result).toBe(false); @@ -881,12 +880,12 @@ describe("ItemHelper", () => describe("addCartridgesToAmmoBox", () => { - it("should return an array with 1xammoBox and 1xcartridge item", () => + it("should return an array with 1x ammoBox and 1x cartridge item", () => { const itemId = container.resolve("HashUtil").generate(); const ammoBox: Item[] = [{ _id: itemId, - _tpl: "5c12619186f7743f871c8a32" // "9x39mm SPP gs ammo pack (8 pcs)" + _tpl: "5c12619186f7743f871c8a32", // "9x39mm SPP gs ammo pack (8 pcs)" }]; const databaseServer = container.resolve("DatabaseServer"); @@ -897,12 +896,12 @@ describe("ItemHelper", () => expect(ammoBox[1].upd.StackObjectsCount).toBe(8); }); - it("should return an array with 1xammoBox and 2xcartridge items", () => + it("should return an array with 1x ammoBox and 2x cartridge items", () => { const itemId = container.resolve("HashUtil").generate(); const ammoBox: Item[] = [{ _id: itemId, - _tpl: "5737292724597765e5728562" // "5.45x39mm BP gs ammo pack (120 pcs)"" + _tpl: "5737292724597765e5728562", // "5.45x39mm BP gs ammo pack (120 pcs)"" }]; const databaseServer = container.resolve("DatabaseServer"); @@ -919,7 +918,7 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const ammoBox: Item[] = [{ _id: itemId, - _tpl: "5737292724597765e5728562" // "5.45x39mm BP gs ammo pack (120 pcs)"" + _tpl: "5737292724597765e5728562", // "5.45x39mm BP gs ammo pack (120 pcs)"" }]; const databaseServer = container.resolve("DatabaseServer"); @@ -934,7 +933,7 @@ describe("ItemHelper", () => const itemId = container.resolve("HashUtil").generate(); const ammoBox: Item[] = [{ _id: itemId, - _tpl: "5737292724597765e5728562" // "5.45x39mm BP gs ammo pack (120 pcs)"" + _tpl: "5737292724597765e5728562", // "5.45x39mm BP gs ammo pack (120 pcs)"" }]; const databaseServer = container.resolve("DatabaseServer"); @@ -1015,8 +1014,8 @@ describe("ItemHelper", () => _id: container.resolve("HashUtil").generate(), _tpl: "59e690b686f7746c9f75e848", // m995 upd: { - StackObjectsCount: 80 // Default is 60 - } + StackObjectsCount: 80, // Default is 60 + }, }; const result = itemHelper.splitStack(stackableItem); // "Roubles" @@ -1029,8 +1028,8 @@ describe("ItemHelper", () => _id: container.resolve("HashUtil").generate(), _tpl: "59e690b686f7746c9f75e848", // m995 upd: { - StackObjectsCount: 80 // Default is 60 - } + StackObjectsCount: 80, // Default is 60 + }, }; const result = itemHelper.splitStack(stackableItem); // "Roubles" const itemCount = result.reduce((sum, curr) => sum + curr.upd.StackObjectsCount, 0); @@ -1043,8 +1042,8 @@ describe("ItemHelper", () => _id: container.resolve("HashUtil").generate(), _tpl: "59e690b686f7746c9f75e848", // m995 upd: { - StackObjectsCount: 60 // Default is 60 - } + StackObjectsCount: 60, // Default is 60 + }, }; const result = itemHelper.splitStack(stackableItem); // "Roubles" const itemCount = result.reduce((sum, curr) => sum + curr.upd.StackObjectsCount, 0); @@ -1057,7 +1056,7 @@ describe("ItemHelper", () => const stackableItem: Item = { _id: container.resolve("HashUtil").generate(), _tpl: "59e690b686f7746c9f75e848", // m995 - upd: {} + upd: {}, }; const result = itemHelper.splitStack(stackableItem); // "Roubles" expect(result.length).toBe(1); @@ -1067,7 +1066,7 @@ describe("ItemHelper", () => { const stackableItem: Item = { _id: container.resolve("HashUtil").generate(), - _tpl: "59e690b686f7746c9f75e848" // m995 + _tpl: "59e690b686f7746c9f75e848", // m995 }; const result = itemHelper.splitStack(stackableItem); // "Roubles" expect(result.length).toBe(1); @@ -1085,7 +1084,7 @@ describe("ItemHelper", () => "5736026a245977644601dc61", "573603562459776430731618", "573603c924597764442bd9cb", - "5735fdcd2459776445391d61" + "5735fdcd2459776445391d61", ]; const mockTemplateItem = { _id: "571a29dc2459771fb2755a6a", @@ -1094,11 +1093,11 @@ describe("ItemHelper", () => Cartridges: [{ _props: { filters: [{ - Filter: validAmmoItems - }] - } - }] - } + Filter: validAmmoItems, + }], + }, + }], + }, }; vi.spyOn((itemHelper as any).randomUtil, "getArrayValue").mockReturnValue(validAmmoItems[0]); @@ -1113,9 +1112,9 @@ describe("ItemHelper", () => const fakeTemplateItem = { _props: { Cartridges: [ - {} - ] - } + {}, + ], + }, }; const result = itemHelper.getRandomCompatibleCaliberTemplateId(fakeTemplateItem as ITemplateItem); diff --git a/project/tests/services/ItemBaseClassService.test.ts b/project/tests/services/ItemBaseClassService.test.ts index d94f9503..d2dbe193 100644 --- a/project/tests/services/ItemBaseClassService.test.ts +++ b/project/tests/services/ItemBaseClassService.test.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/naming-convention */ import "reflect-metadata"; -import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; import { ItemBaseClassService } from "@spt-aki/services/ItemBaseClassService"; +import { container } from "tsyringe"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; describe("ItemBaseClassService", () => { @@ -64,7 +64,10 @@ describe("ItemBaseClassService", () => // Remove item from base cache delete itemBaseClassService.itemBaseClassesCache[salewaTpl]; - const result = itemBaseClassService.itemHasBaseClass(salewaTpl, ["543be5664bdc2dd4348b4569", "54009119af1c881c07000029"]); // "Meds" and "Item" type + const result = itemBaseClassService.itemHasBaseClass(salewaTpl, [ + "543be5664bdc2dd4348b4569", + "54009119af1c881c07000029", + ]); // "Meds" and "Item" type expect(result).toBe(true); }); diff --git a/project/tests/services/PaymentService.test.ts b/project/tests/services/PaymentService.test.ts index 8a5f8dd5..33275d68 100644 --- a/project/tests/services/PaymentService.test.ts +++ b/project/tests/services/PaymentService.test.ts @@ -1,16 +1,16 @@ /* eslint-disable @typescript-eslint/naming-convention */ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { PaymentService } from "@spt-aki/services/PaymentService"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; -import { IProcessBuyTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBuyTradeRequestData"; -import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; -import { HashUtil } from "@spt-aki/utils/HashUtil"; -import { ITraderBase } from "@spt-aki/models/eft/common/tables/ITrader"; import { Item } from "@spt-aki/models/eft/common/tables/IItem"; +import { ITraderBase } from "@spt-aki/models/eft/common/tables/ITrader"; +import { IItemEventRouterResponse } from "@spt-aki/models/eft/itemEvent/IItemEventRouterResponse"; +import { IProcessBuyTradeRequestData } from "@spt-aki/models/eft/trade/IProcessBuyTradeRequestData"; +import { HashUtil } from "@spt-aki/utils/HashUtil"; describe("PaymentService", () => { @@ -44,8 +44,8 @@ describe("PaymentService", () => _id: costItemId, _tpl: costItemTpl, upd: { - StackObjectsCount: costAmount * 4 // More than enough. - } + StackObjectsCount: costAmount * 4, // More than enough. + }, } as Item; // Object representing the player's PMC inventory. @@ -54,12 +54,12 @@ describe("PaymentService", () => [traderId]: { salesSum: 0, unlocked: true, - disabled: false - } + disabled: false, + }, }, Inventory: { - items: [moneyItem] - } + items: [moneyItem], + }, } as unknown as IPmcData; // Buy a factory map from Therapist... although it doesn't really matter what the item is as there's no @@ -74,9 +74,9 @@ describe("PaymentService", () => scheme_items: [ { id: costItemId, - count: costAmount - } - ] + count: costAmount, + }, + ], } as IProcessBuyTradeRequestData; // Inconsequential profile ID @@ -90,10 +90,10 @@ describe("PaymentService", () => items: { new: [], change: [], - del: [] - } - } - } + del: [], + }, + }, + }, } as unknown as IItemEventRouterResponse; // Mock the logger debug method to return void. @@ -101,13 +101,14 @@ describe("PaymentService", () => {}); // Mock the trader helper to return a trader with the currency of Roubles. - const traderHelperGetTraderSpy = vi.spyOn((paymentService as any).traderHelper, "getTrader").mockReturnValue({ - tid: traderId, - currency: "RUB" - } as unknown as ITraderBase); + const traderHelperGetTraderSpy = vi.spyOn((paymentService as any).traderHelper, "getTrader") + .mockReturnValue({ + tid: traderId, + currency: "RUB", + } as unknown as ITraderBase); // Mock the addPaymentToOutput method to subtract the item cost from the money stack. - const addPaymentToOutputSpy = vi.spyOn((paymentService as any), "addPaymentToOutput").mockImplementation(() => + const addPaymentToOutputSpy = vi.spyOn(paymentService as any, "addPaymentToOutput").mockImplementation(() => { moneyItem.upd.StackObjectsCount -= costAmount; return { @@ -115,18 +116,25 @@ describe("PaymentService", () => profileChanges: { [sessionID]: { items: { - change: [moneyItem] - } - } - } + change: [moneyItem], + }, + }, + }, }; }); // Mock the traderHelper lvlUp method to return void. - const traderHelperLvlUpSpy = vi.spyOn((paymentService as any).traderHelper, "lvlUp").mockImplementation(() => - {}); + const traderHelperLvlUpSpy = vi.spyOn((paymentService as any).traderHelper, "lvlUp").mockImplementation( + () => + {}, + ); - const output = paymentService.payMoney(pmcData, processBuyTradeRequestData, sessionID, itemEventRouterResponse); + const output = paymentService.payMoney( + pmcData, + processBuyTradeRequestData, + sessionID, + itemEventRouterResponse, + ); // Check for absence of output warnings. expect(output.warnings).toHaveLength(0); @@ -139,7 +147,13 @@ describe("PaymentService", () => // Check if mocked methods were called as expected. expect(traderHelperGetTraderSpy).toBeCalledTimes(1); - expect(addPaymentToOutputSpy).toBeCalledWith(expect.anything(), costItemTpl, costAmount, sessionID, expect.anything()); + expect(addPaymentToOutputSpy).toBeCalledWith( + expect.anything(), + costItemTpl, + costAmount, + sessionID, + expect.anything(), + ); expect(traderHelperLvlUpSpy).toBeCalledTimes(1); }); }); @@ -151,14 +165,14 @@ describe("PaymentService", () => const hashUtil = container.resolve("HashUtil"); const stashItem: Item = { _id: "stashid", - _tpl: "55d7217a4bdc2d86028b456d" // standard stash id + _tpl: "55d7217a4bdc2d86028b456d", // standard stash id }; const inventoryItemToFind: Item = { _id: hashUtil.generate(), _tpl: "544fb6cc4bdc2d34748b456e", // Slickers chocolate bar parentId: stashItem._id, - slotId: "hideout" + slotId: "hideout", }; const playerInventory = [stashItem, inventoryItemToFind]; @@ -172,20 +186,20 @@ describe("PaymentService", () => const hashUtil = container.resolve("HashUtil"); const stashItem: Item = { _id: "stashId", - _tpl: "55d7217a4bdc2d86028b456d" // standard stash id + _tpl: "55d7217a4bdc2d86028b456d", // standard stash id }; const foodBagToHoldItemToFind: Item = { _id: hashUtil.generate(), _tpl: "5c093db286f7740a1b2617e3", parentId: stashItem._id, - slotId: "hideout" + slotId: "hideout", }; const inventoryItemToFind: Item = { _id: hashUtil.generate(), _tpl: "544fb6cc4bdc2d34748b456e", // Slickers chocolate bar - parentId: foodBagToHoldItemToFind._id + parentId: foodBagToHoldItemToFind._id, }; const playerInventory = [stashItem, foodBagToHoldItemToFind, inventoryItemToFind]; @@ -199,14 +213,14 @@ describe("PaymentService", () => const hashUtil = container.resolve("HashUtil"); const stashItem: Item = { _id: "stashId", - _tpl: "55d7217a4bdc2d86028b456d" // standard stash id + _tpl: "55d7217a4bdc2d86028b456d", // standard stash id }; const inventoryItemToFind: Item = { _id: hashUtil.generate(), _tpl: "544fb6cc4bdc2d34748b456e", // Slickers chocolate bar parentId: stashItem._id, - slotId: "hideout" + slotId: "hideout", }; const playerInventory = [stashItem, inventoryItemToFind]; @@ -220,16 +234,16 @@ describe("PaymentService", () => const hashUtil = container.resolve("HashUtil"); const stashItem: Item = { _id: "stashId", - _tpl: "55d7217a4bdc2d86028b456d" // standard stash id + _tpl: "55d7217a4bdc2d86028b456d", // standard stash id }; const inventoryItemToFind: Item = { _id: hashUtil.generate(), _tpl: "544fb6cc4bdc2d34748b456e", // Slickers chocolate bar parentId: stashItem._id, - slotId: "hideout" + slotId: "hideout", }; - const playerInventory = [ inventoryItemToFind]; + const playerInventory = [inventoryItemToFind]; const result = paymentService.isInStash("notCorrectId", playerInventory, stashItem._id); diff --git a/project/tests/services/PlayerService.test.ts b/project/tests/services/PlayerService.test.ts index 1fb36d05..6c731861 100644 --- a/project/tests/services/PlayerService.test.ts +++ b/project/tests/services/PlayerService.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, beforeEach, afterEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { IPmcData } from "@spt-aki/models/eft/common/IPmcData"; import { PlayerService } from "@spt-aki/services/PlayerService"; @@ -26,8 +26,8 @@ describe("PlayerService", () => { const playerProfile = { Info: { - Experience: 0 // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels - } + Experience: 0, // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels + }, }; const result = playerService.calculateLevel(playerProfile as IPmcData); @@ -39,8 +39,8 @@ describe("PlayerService", () => { const playerProfile = { Info: { - Experience: 999 // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels - } + Experience: 999, // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels + }, }; const result = playerService.calculateLevel(playerProfile as IPmcData); @@ -52,8 +52,8 @@ describe("PlayerService", () => { const playerProfile = { Info: { - Experience: 609066 // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels - } + Experience: 609066, // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels + }, }; const result = playerService.calculateLevel(playerProfile as IPmcData); @@ -65,8 +65,8 @@ describe("PlayerService", () => { const playerProfile = { Info: { - Experience: 68206066 // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels - } + Experience: 68206066, // Via wiki: https://escapefromtarkov.fandom.com/wiki/Character_skills#Levels + }, }; const result = playerService.calculateLevel(playerProfile as IPmcData); diff --git a/project/tests/utils/TimeUtil.test.ts b/project/tests/utils/TimeUtil.test.ts index 112b0aa9..03e026b5 100644 --- a/project/tests/utils/TimeUtil.test.ts +++ b/project/tests/utils/TimeUtil.test.ts @@ -1,6 +1,6 @@ import "reflect-metadata"; import { container } from "tsyringe"; -import { vi, afterEach, describe, expect, it, beforeEach } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { TimeUtil } from "@spt-aki/utils/TimeUtil";