add tests for #10

This commit is contained in:
2023-04-08 19:03:27 +02:00
parent eb1b2a78ca
commit 00336c592a
14 changed files with 245 additions and 94 deletions
+1
View File
@@ -5,3 +5,4 @@ POSTGRES_PASSWORD="postgres"
REDIS_USER="default"
REDIS_PASSWORD=""
REDIS_URL="redis://awesome.redis.server:6379"
SERVERAUTH_TEST="1:f9f8fc8c-9185-47a8-8a99-9e3acf6ca007"
+9
View File
@@ -21,6 +21,15 @@
"program": "${workspaceFolder}/src/clientMain.ts",
"preLaunchTask": "tsc: build - tsconfig.json",
"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
View File
@@ -1,3 +1,6 @@
module.exports = {
presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
presets: [
['@babel/preset-env', { targets: { node: 'current' } }],
'@babel/preset-typescript'
]
}
+42 -4
View File
@@ -18,6 +18,7 @@
"devDependencies": {
"@babel/core": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@babel/preset-typescript": "^7.21.4",
"@jest/globals": "^29.4.3",
"@types/cors": "^2.8.13",
"@types/express": "^4.17.17",
@@ -1071,12 +1072,12 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
"integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz",
"integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6"
"@babel/helper-plugin-utils": "^7.20.2"
},
"engines": {
"node": ">=6.9.0"
@@ -1687,6 +1688,24 @@
"@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": {
"version": "7.18.10",
"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"
}
},
"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": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+1
View File
@@ -13,6 +13,7 @@
"devDependencies": {
"@babel/core": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@babel/preset-typescript": "^7.21.4",
"@jest/globals": "^29.4.3",
"@types/cors": "^2.8.13",
"@types/express": "^4.17.17",
+7 -3
View File
@@ -18,10 +18,14 @@ app.get('/', (req, res) => {
app.use('/', client)
dbReady().then((e) => {
export default
new Promise((resolve, reject) => {
dbReady().then((e) => {
cacheReady().then((e) => {
app.listen(port, '0.0.0.0', () => {
const listenServer = app.listen(port, '0.0.0.0', () => {
console.log(`Tone client api listening on port ${port}`)
resolve(listenServer)
})
})
})
})
})
+2 -1
View File
@@ -1,8 +1,9 @@
import * as dotenv from 'dotenv'
dotenv.config()
import { InsertObject, Kysely, PostgresDialect } from 'kysely'
import { Pool } from 'pg'
import migrateToLatest from './migrations'
import Database, { KillTable } from './model'
const migration = migrateToLatest()
const db = new Kysely<Database>({
dialect: new PostgresDialect({
-1
View File
@@ -9,7 +9,6 @@ import * as path from "path";
import { Pool } from "pg";
import Database from "./model";
console.log(process.env.POSTGRES_HOST);
async function migrateToLatest() {
const db = new Kysely<Database>({
dialect: new PostgresDialect({
+6 -5
View File
@@ -4,8 +4,9 @@ import { dbReady } from './db/db'
import { cacheReady } from './cache/redis'
import processAll from './client/process'
dbReady().then((e) => {
cacheReady().then((e) => {
processAll()
})
})
async function startup() {
await dbReady()
await cacheReady()
await processAll()
}
export default startup()
+10 -3
View File
@@ -2,7 +2,7 @@ import * as dotenv from 'dotenv'
dotenv.config()
import express from 'express'
import cors from 'cors'
import { dbReady } from './db/db'
import db, { dbReady } from './db/db'
import server from './server/server'
const app = express()
@@ -17,8 +17,15 @@ app.get('/', (req, res) => {
app.use('/', server)
dbReady().then((e) => {
app.listen(port, '0.0.0.0', () => {
export default new Promise((resolve, reject) => {
dbReady().then((e) => {
const listenServer = app.listen(port, '0.0.0.0', () => {
console.log(`Tone server api listening on port ${port}`)
resolve(listenServer)
})
})
})
app.on('close', () => {
})
+29
View File
@@ -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() })
})
})
-28
View File
@@ -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)
})
})
+130
View File
@@ -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() })
})
-44
View File
@@ -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)
})
})