add tests for #10
This commit is contained in:
+2
-1
@@ -4,4 +4,5 @@ POSTGRES_USER="postgres"
|
|||||||
POSTGRES_PASSWORD="postgres"
|
POSTGRES_PASSWORD="postgres"
|
||||||
REDIS_USER="default"
|
REDIS_USER="default"
|
||||||
REDIS_PASSWORD=""
|
REDIS_PASSWORD=""
|
||||||
REDIS_URL="redis://awesome.redis.server:6379"
|
REDIS_URL="redis://awesome.redis.server:6379"
|
||||||
|
SERVERAUTH_TEST="1:f9f8fc8c-9185-47a8-8a99-9e3acf6ca007"
|
||||||
Vendored
+9
@@ -21,6 +21,15 @@
|
|||||||
"program": "${workspaceFolder}/src/clientMain.ts",
|
"program": "${workspaceFolder}/src/clientMain.ts",
|
||||||
"preLaunchTask": "tsc: build - tsconfig.json",
|
"preLaunchTask": "tsc: build - tsconfig.json",
|
||||||
"outFiles": ["${workspaceFolder}/out/**/*.js"]
|
"outFiles": ["${workspaceFolder}/out/**/*.js"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch Process API",
|
||||||
|
"skipFiles": ["<node_internals>/**"],
|
||||||
|
"program": "${workspaceFolder}/src/processMain.ts",
|
||||||
|
"preLaunchTask": "tsc: build - tsconfig.json",
|
||||||
|
"outFiles": ["${workspaceFolder}/out/**/*.js"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -1,3 +1,6 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
|
presets: [
|
||||||
|
['@babel/preset-env', { targets: { node: 'current' } }],
|
||||||
|
'@babel/preset-typescript'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+42
-4
@@ -18,6 +18,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.21.0",
|
"@babel/core": "^7.21.0",
|
||||||
"@babel/preset-env": "^7.20.2",
|
"@babel/preset-env": "^7.20.2",
|
||||||
|
"@babel/preset-typescript": "^7.21.4",
|
||||||
"@jest/globals": "^29.4.3",
|
"@jest/globals": "^29.4.3",
|
||||||
"@types/cors": "^2.8.13",
|
"@types/cors": "^2.8.13",
|
||||||
"@types/express": "^4.17.17",
|
"@types/express": "^4.17.17",
|
||||||
@@ -1071,12 +1072,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/plugin-syntax-jsx": {
|
"node_modules/@babel/plugin-syntax-jsx": {
|
||||||
"version": "7.18.6",
|
"version": "7.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz",
|
||||||
"integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
|
"integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-plugin-utils": "^7.18.6"
|
"@babel/helper-plugin-utils": "^7.20.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@@ -1687,6 +1688,24 @@
|
|||||||
"@babel/core": "^7.0.0-0"
|
"@babel/core": "^7.0.0-0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@babel/plugin-transform-typescript": {
|
||||||
|
"version": "7.21.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz",
|
||||||
|
"integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/helper-annotate-as-pure": "^7.18.6",
|
||||||
|
"@babel/helper-create-class-features-plugin": "^7.21.0",
|
||||||
|
"@babel/helper-plugin-utils": "^7.20.2",
|
||||||
|
"@babel/plugin-syntax-typescript": "^7.20.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.9.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@babel/core": "^7.0.0-0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@babel/plugin-transform-unicode-escapes": {
|
"node_modules/@babel/plugin-transform-unicode-escapes": {
|
||||||
"version": "7.18.10",
|
"version": "7.18.10",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
|
||||||
@@ -1832,6 +1851,25 @@
|
|||||||
"@babel/core": "^7.0.0-0"
|
"@babel/core": "^7.0.0-0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@babel/preset-typescript": {
|
||||||
|
"version": "7.21.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz",
|
||||||
|
"integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/helper-plugin-utils": "^7.20.2",
|
||||||
|
"@babel/helper-validator-option": "^7.21.0",
|
||||||
|
"@babel/plugin-syntax-jsx": "^7.21.4",
|
||||||
|
"@babel/plugin-transform-modules-commonjs": "^7.21.2",
|
||||||
|
"@babel/plugin-transform-typescript": "^7.21.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.9.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@babel/core": "^7.0.0-0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@babel/regjsgen": {
|
"node_modules/@babel/regjsgen": {
|
||||||
"version": "0.8.0",
|
"version": "0.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.21.0",
|
"@babel/core": "^7.21.0",
|
||||||
"@babel/preset-env": "^7.20.2",
|
"@babel/preset-env": "^7.20.2",
|
||||||
|
"@babel/preset-typescript": "^7.21.4",
|
||||||
"@jest/globals": "^29.4.3",
|
"@jest/globals": "^29.4.3",
|
||||||
"@types/cors": "^2.8.13",
|
"@types/cors": "^2.8.13",
|
||||||
"@types/express": "^4.17.17",
|
"@types/express": "^4.17.17",
|
||||||
|
|||||||
+9
-5
@@ -18,10 +18,14 @@ app.get('/', (req, res) => {
|
|||||||
|
|
||||||
app.use('/', client)
|
app.use('/', client)
|
||||||
|
|
||||||
dbReady().then((e) => {
|
export default
|
||||||
cacheReady().then((e) => {
|
new Promise((resolve, reject) => {
|
||||||
app.listen(port, '0.0.0.0', () => {
|
dbReady().then((e) => {
|
||||||
console.log(`Tone client api listening on port ${port}`)
|
cacheReady().then((e) => {
|
||||||
|
const listenServer = app.listen(port, '0.0.0.0', () => {
|
||||||
|
console.log(`Tone client api listening on port ${port}`)
|
||||||
|
resolve(listenServer)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
|
|||||||
+2
-1
@@ -1,8 +1,9 @@
|
|||||||
|
import * as dotenv from 'dotenv'
|
||||||
|
dotenv.config()
|
||||||
import { InsertObject, Kysely, PostgresDialect } from 'kysely'
|
import { InsertObject, Kysely, PostgresDialect } from 'kysely'
|
||||||
import { Pool } from 'pg'
|
import { Pool } from 'pg'
|
||||||
import migrateToLatest from './migrations'
|
import migrateToLatest from './migrations'
|
||||||
import Database, { KillTable } from './model'
|
import Database, { KillTable } from './model'
|
||||||
|
|
||||||
const migration = migrateToLatest()
|
const migration = migrateToLatest()
|
||||||
const db = new Kysely<Database>({
|
const db = new Kysely<Database>({
|
||||||
dialect: new PostgresDialect({
|
dialect: new PostgresDialect({
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import * as path from "path";
|
|||||||
import { Pool } from "pg";
|
import { Pool } from "pg";
|
||||||
import Database from "./model";
|
import Database from "./model";
|
||||||
|
|
||||||
console.log(process.env.POSTGRES_HOST);
|
|
||||||
async function migrateToLatest() {
|
async function migrateToLatest() {
|
||||||
const db = new Kysely<Database>({
|
const db = new Kysely<Database>({
|
||||||
dialect: new PostgresDialect({
|
dialect: new PostgresDialect({
|
||||||
|
|||||||
+6
-5
@@ -4,8 +4,9 @@ import { dbReady } from './db/db'
|
|||||||
import { cacheReady } from './cache/redis'
|
import { cacheReady } from './cache/redis'
|
||||||
import processAll from './client/process'
|
import processAll from './client/process'
|
||||||
|
|
||||||
dbReady().then((e) => {
|
async function startup() {
|
||||||
cacheReady().then((e) => {
|
await dbReady()
|
||||||
processAll()
|
await cacheReady()
|
||||||
})
|
await processAll()
|
||||||
})
|
}
|
||||||
|
export default startup()
|
||||||
+11
-4
@@ -2,7 +2,7 @@ import * as dotenv from 'dotenv'
|
|||||||
dotenv.config()
|
dotenv.config()
|
||||||
import express from 'express'
|
import express from 'express'
|
||||||
import cors from 'cors'
|
import cors from 'cors'
|
||||||
import { dbReady } from './db/db'
|
import db, { dbReady } from './db/db'
|
||||||
import server from './server/server'
|
import server from './server/server'
|
||||||
|
|
||||||
const app = express()
|
const app = express()
|
||||||
@@ -17,8 +17,15 @@ app.get('/', (req, res) => {
|
|||||||
|
|
||||||
app.use('/', server)
|
app.use('/', server)
|
||||||
|
|
||||||
dbReady().then((e) => {
|
export default new Promise((resolve, reject) => {
|
||||||
app.listen(port, '0.0.0.0', () => {
|
dbReady().then((e) => {
|
||||||
console.log(`Tone server api listening on port ${port}`)
|
const listenServer = app.listen(port, '0.0.0.0', () => {
|
||||||
|
console.log(`Tone server api listening on port ${port}`)
|
||||||
|
resolve(listenServer)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
app.on('close', () => {
|
||||||
|
|
||||||
|
})
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import { afterAll, beforeAll, describe, expect, test } from '@jest/globals'
|
||||||
|
import clientMain from '../src/clientMain'
|
||||||
|
import processMain from '../src/processMain'
|
||||||
|
import cache from '../src/cache/redis'
|
||||||
|
import db from "../src/db/db"
|
||||||
|
import * as dotenv from 'dotenv'
|
||||||
|
dotenv.config()
|
||||||
|
|
||||||
|
let listenServer
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
/*await cache.FLUSHDB()
|
||||||
|
await processMain
|
||||||
|
await cache.quit()
|
||||||
|
await db.destroy()
|
||||||
|
listenServer = await clientMain;*/
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('client', () => {
|
||||||
|
test('fetchServerList', () => {
|
||||||
|
expect(200).toBe(200)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll((done) => {
|
||||||
|
cache.quit().then(() => {
|
||||||
|
db.destroy().then(() => { done() })
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import { describe, expect, test } from '@jest/globals'
|
|
||||||
|
|
||||||
describe('registration', () => {
|
|
||||||
test('garbage body', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('incorrect data format', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('duplicate server', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('invisible server', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('wrong verification', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('masterserver unreachable', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('registration successful', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
test('server deletion', () => {
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -0,0 +1,130 @@
|
|||||||
|
import { afterAll, beforeAll, describe, expect, test } from '@jest/globals'
|
||||||
|
import serverMain from '../src/serverMain'
|
||||||
|
import db from "../src/db/db"
|
||||||
|
import * as dotenv from 'dotenv'
|
||||||
|
dotenv.config()
|
||||||
|
|
||||||
|
let listenServer
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
listenServer = await serverMain;
|
||||||
|
await db.deleteFrom('kill').where('attacker_id', '=', '0').orWhere('attacker_id', '=', '1').execute()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('server', () => {
|
||||||
|
test('server auth prefetch', async () => {
|
||||||
|
const response = await fetch(`http://127.0.0.1:3001/${process.env.SERVERAUTH_ID}`, {
|
||||||
|
method: "POST", // *GET, POST, PUT, DELETE, etc.
|
||||||
|
credentials: "same-origin", // include, *same-origin, omit
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
'Authorization': `Basic ${Buffer.from(process.env.SERVERAUTH_ID + ':' + process.env.SERVERAUTH_TOKEN).toString('base64')}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
expect(response.status).toBe(200)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('register a kill', async () => {
|
||||||
|
const data = {
|
||||||
|
attacker_weapon_1_mods: 0,
|
||||||
|
victim_id: '0',
|
||||||
|
victim_name: 'TestVictim',
|
||||||
|
victim_offhand_weapon_2: 0,
|
||||||
|
attacker_offhand_weapon_3: '0',
|
||||||
|
victim_weapon_3_mods: 0,
|
||||||
|
attacker_weapon_2_mods: 0,
|
||||||
|
attacker_offhand_weapon_1: 0,
|
||||||
|
attacker_weapon_3_mods: 0,
|
||||||
|
attacker_offhand_weapon_2: 0,
|
||||||
|
victim_offhand_weapon_3: '0',
|
||||||
|
victim_offhand_weapon_1: 0,
|
||||||
|
attacker_weapon_3: 'defender',
|
||||||
|
killstat_version: 'ks_3.0.0',
|
||||||
|
attacker_weapon_1: 'smr',
|
||||||
|
match_id: '31b1f34d',
|
||||||
|
distance: 0,
|
||||||
|
victim_current_weapon: 'smr',
|
||||||
|
cause_of_death: 'smr',
|
||||||
|
victim_weapon_2_mods: 0,
|
||||||
|
victim_current_weapon_mods: 0,
|
||||||
|
attacker_current_weapon_mods: 0,
|
||||||
|
game_time: 377.799,
|
||||||
|
player_count: 1,
|
||||||
|
attacker_current_weapon: 'smr',
|
||||||
|
attacker_id: '1',
|
||||||
|
game_mode: 'tdm',
|
||||||
|
map: 'thaw',
|
||||||
|
attacker_weapon_2: 'autopistol',
|
||||||
|
victim_weapon_1: 'smr',
|
||||||
|
victim_weapon_2: 'autopistol',
|
||||||
|
victim_weapon_1_mods: 0,
|
||||||
|
victim_weapon_3: 'defender',
|
||||||
|
attacker_name: 'TestAttacker'
|
||||||
|
}
|
||||||
|
const response = await fetch(`http://127.0.0.1:3001/${process.env.SERVERAUTH_ID}/kill`, {
|
||||||
|
method: "POST", // *GET, POST, PUT, DELETE, etc.
|
||||||
|
credentials: "same-origin", // include, *same-origin, omit
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
'Authorization': `Basic ${Buffer.from(process.env.SERVERAUTH_ID + ':' + process.env.SERVERAUTH_TOKEN).toString('base64')}`
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data), // body data type must match "Content-Type" header
|
||||||
|
});
|
||||||
|
expect(response.status).toBe(201)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
test('register a kill with missing data', async () => {
|
||||||
|
const data = {
|
||||||
|
attacker_weapon_1_mods: NaN,
|
||||||
|
victim_id: '0',
|
||||||
|
victim_name: 'TestVictim',
|
||||||
|
victim_offhand_weapon_2: NaN,
|
||||||
|
attacker_offhand_weapon_3: 'null',
|
||||||
|
victim_weapon_3_mods: 19,
|
||||||
|
attacker_weapon_2_mods: NaN,
|
||||||
|
attacker_offhand_weapon_1: NaN,
|
||||||
|
attacker_weapon_3_mods: NaN,
|
||||||
|
attacker_offhand_weapon_2: NaN,
|
||||||
|
victim_offhand_weapon_3: '0',
|
||||||
|
victim_offhand_weapon_1: 1,
|
||||||
|
attacker_weapon_3: 'null',
|
||||||
|
killstat_version: 'ks_3.0.0',
|
||||||
|
attacker_weapon_1: 'null',
|
||||||
|
match_id: '554fa7a3',
|
||||||
|
distance: 202,
|
||||||
|
victim_current_weapon: 'car',
|
||||||
|
cause_of_death: 'satchel',
|
||||||
|
victim_weapon_2_mods: NaN,
|
||||||
|
victim_current_weapon_mods: NaN,
|
||||||
|
attacker_current_weapon_mods: NaN,
|
||||||
|
game_time: 516.417,
|
||||||
|
player_count: 13,
|
||||||
|
attacker_current_weapon: 'null',
|
||||||
|
attacker_id: '1',
|
||||||
|
game_mode: 'ps',
|
||||||
|
map: 'grave',
|
||||||
|
attacker_weapon_2: 'null',
|
||||||
|
victim_weapon_1: 'car',
|
||||||
|
victim_weapon_2: 'autopistol',
|
||||||
|
victim_weapon_1_mods: NaN,
|
||||||
|
victim_weapon_3: 'arc_launcher',
|
||||||
|
attacker_name: 'TestAttacker'
|
||||||
|
}
|
||||||
|
const response = await fetch(`http://127.0.0.1:3001/${process.env.SERVERAUTH_ID}/kill`, {
|
||||||
|
method: "POST", // *GET, POST, PUT, DELETE, etc.
|
||||||
|
credentials: "same-origin", // include, *same-origin, omit
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
'Authorization': `Basic ${Buffer.from(process.env.SERVERAUTH_ID + ':' + process.env.SERVERAUTH_TOKEN).toString('base64')}`
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data), // body data type must match "Content-Type" header
|
||||||
|
});
|
||||||
|
expect(response.status).toBe(201)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll((done) => {
|
||||||
|
listenServer.close()
|
||||||
|
db.destroy().then(() => { done() })
|
||||||
|
})
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
import { describe, expect, test } from '@jest/globals'
|
|
||||||
|
|
||||||
describe('server', () => {
|
|
||||||
test('register a kill', () => {
|
|
||||||
const data = {
|
|
||||||
attacker_weapon_1_mods: 0,
|
|
||||||
victim_id: '1005930844007',
|
|
||||||
victim_name: 'Legonzaur',
|
|
||||||
victim_offhand_weapon_2: 0,
|
|
||||||
attacker_offhand_weapon_3: '0',
|
|
||||||
victim_weapon_3_mods: 0,
|
|
||||||
attacker_weapon_2_mods: 0,
|
|
||||||
attacker_offhand_weapon_1: 0,
|
|
||||||
attacker_weapon_3_mods: 0,
|
|
||||||
attacker_offhand_weapon_2: 0,
|
|
||||||
victim_offhand_weapon_3: '0',
|
|
||||||
victim_offhand_weapon_1: 0,
|
|
||||||
attacker_weapon_3: 'defender',
|
|
||||||
killstat_version: 'ks_3.0.0',
|
|
||||||
attacker_weapon_1: 'smr',
|
|
||||||
match_id: '31b1f34d',
|
|
||||||
distance: 0,
|
|
||||||
victim_current_weapon: 'smr',
|
|
||||||
cause_of_death: 'smr',
|
|
||||||
victim_weapon_2_mods: 0,
|
|
||||||
victim_current_weapon_mods: 0,
|
|
||||||
attacker_current_weapon_mods: 0,
|
|
||||||
game_time: 377.799,
|
|
||||||
player_count: 1,
|
|
||||||
attacker_current_weapon: 'smr',
|
|
||||||
attacker_id: '1005930844007',
|
|
||||||
game_mode: 'tdm',
|
|
||||||
map: 'thaw',
|
|
||||||
attacker_weapon_2: 'autopistol',
|
|
||||||
victim_weapon_1: 'smr',
|
|
||||||
victim_weapon_2: 'autopistol',
|
|
||||||
victim_weapon_1_mods: 0,
|
|
||||||
victim_weapon_3: 'defender',
|
|
||||||
attacker_name: 'Legonzaur'
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(3).toBe(3)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
Reference in New Issue
Block a user