diff --git a/package.json b/package.json index bfcc522..4d84162 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "build": "rimraf ./dist && tsc && cp-cli ./src/templates ./dist/templates && cp-cli ./src/locales ./dist/locales", "licenses:export": "license-exporter --markdown", "release": "release-it --only-version", - "translations:sort": "node sort_translations.js" + "translations:sort": "node sort_translations.js", + "test:speed": "start-server-and-test dev http://localhost:4010/docs/openapi.json test:speed:run", + "test:speed:run": "ts-node src/tests/speedtest.ts" }, "repository": { "type": "git", @@ -66,9 +68,11 @@ "@types/node": "^14.14.22", "@types/puppeteer": "^5.4.3", "cp-cli": "^2.0.0", + "faker": "^5.3.1", "nodemon": "^2.0.7", "release-it": "^14.2.2", "rimraf": "^3.0.2", + "start-server-and-test": "^1.12.0", "ts-node": "^9.1.1", "typescript": "^4.1.3" }, @@ -85,4 +89,4 @@ "publish": false } } -} +} \ No newline at end of file diff --git a/src/tests/speedtest.ts b/src/tests/speedtest.ts new file mode 100644 index 0000000..c016204 --- /dev/null +++ b/src/tests/speedtest.ts @@ -0,0 +1,79 @@ +import axios from "axios" +import faker from "faker" +import { Runner } from '../models/Runner' +import { RunnerGroup } from '../models/RunnerGroup' + +const baseurl = "http://localhost:4010" + +axios.interceptors.request.use((config) => { + config.headers['request-startTime'] = process.hrtime() + return config +}) + +axios.interceptors.response.use((response) => { + const start = response.config.headers['request-startTime'] + const end = process.hrtime(start) + const milliseconds = Math.round((end[0] * 1000) + (end[1] / 1000000)) + response.headers['request-duration'] = milliseconds + return response +}) + +function generateRunners(amount: number): Runner[] { + let runners: Runner[] = new Array(); + let group = new RunnerGroup(); + let runner = new Runner(); + for (var i = 0; i < amount; i++) { + group.name = faker.company.bsBuzz(); + group.id = Math.floor(Math.random() * (9999999 - 1) + 1); + runner.firstname = faker.name.firstName(); + runner.lastname = faker.name.lastName(); + runner.id = Math.floor(Math.random() * (9999999 - 1) + 1); + runners.push(runner); + } + return runners; +} + +async function postContracts(runners: Runner[]): Promise { + const res = await axios.post(`${baseurl}/contracts`, runners); + return new Measurement("contract", runners.length, parseInt(res.headers['request-duration'])) +} + +async function testContracts(sizes): Promise { + let measurements = new Array(); + console.log("#### Testing contracts ####"); + + for (let size of sizes) { + const m = await postContracts(generateRunners(size)); + console.log(m.toString()); + measurements.push(m); + } + return measurements; +} + +async function main() { + const sizes = [0, 1, 10, 50, 100, 200, 500, 1000] + console.log("########### Speedtest ###########"); + console.log(`Document server version (according to the api): ${(await axios.get("http://localhost:4010/version")).data.version}`); + console.log("####### Running tests #######"); + const contractResults = await testContracts(sizes); + console.log("####### Results #######"); + console.table(contractResults); +} + +main(); + +class Measurement { + public type: string; + public inputcount: number; + public responsetime: number; + + constructor(type: string, input: number, time: number) { + this.type = type; + this.inputcount = input; + this.responsetime = time; + } + + public toString(): string { + return `It took ${this.responsetime}ms to generate ${this.inputcount} pdfs for the type ${this.type}.` + } +} \ No newline at end of file