const fetch = require("node-fetch") const MAX_RUNTIME_SEC = 600 const HOST = "http://localhost:10000" const TENANT_ID = "default" const RATE_MS = 500 let API_KEY = process.argv[2] let STATS = { iterations: 0, error: 0, success: 0, } if (!API_KEY) { console.error("Must specify API key as first run command!") process.exit(-1) } const USERS = [ { email: "loadtest1@test.com", password: "test", }, { email: "loadtest2@example.com", password: "test", }, { email: "loadtest3@example.com", password: "test", }, { email: "loadtest4@example.com", password: "test", }, { email: "loadtest5@example.com", password: "test", }, { email: "loadtest6@example.com", password: "test", }, { email: "loadtest7@example.com", password: "test", }, ] const REQUESTS = [ { endpoint: `/api/global/self`, method: "GET", }, ] function timeout() { return new Promise(resolve => { setTimeout(() => { resolve() }, MAX_RUNTIME_SEC * 1000) }) } async function preTest() { // check if the user exists or not const response = await fetch(`${HOST}/api/global/users`, { method: "GET", headers: { "x-budibase-api-key": API_KEY, }, }) if (response.status !== 200) { throw new Error("Unable to retrieve users") } const users = await response.json() for (let user of USERS) { if (users.find(u => u.email === user.email)) { continue } const response = await fetch(`${HOST}/api/global/users`, { method: "POST", headers: { "x-budibase-api-key": API_KEY, "Content-Type": "application/json", }, body: JSON.stringify({ ...user, roles: {}, status: "active", }), }) if (response.status !== 200) { throw new Error( `Unable to create user ${user.email}, reason: ${await response.text()}` ) } } } async function requests(user) { let response = await fetch(`${HOST}/api/global/auth/${TENANT_ID}/login`, { method: "POST", body: JSON.stringify({ username: user.email, password: user.password, }), headers: { "Content-Type": "application/json", }, }) // unable to login if (response.status !== 200) { STATS.error++ return } else { STATS.success++ } const cookie = response.headers.get("set-cookie") let promises = [] for (let request of REQUESTS) { const headers = { cookie, } if (request.body) { headers["Content-Type"] = "application/json" } promises.push( fetch(`${HOST}${request.endpoint}`, { method: request.method, headers: { cookie, }, }) ) } const responses = await Promise.all(promises) for (let resp of responses) { if (resp.status !== 200) { console.error(await resp.text()) STATS.error++ } else { STATS.success++ } } } async function run() { await preTest() setInterval(async () => { let promises = [] for (let user of USERS) { promises.push(requests(user)) } await Promise.all(promises) console.log( `Iteration ${STATS.iterations++} - errors: ${STATS.error}, success: ${ STATS.success }` ) }, RATE_MS) await timeout() console.log( `Max runtime of ${MAX_RUNTIME_SEC} seconds has been reached - stopping.` ) process.exit(0) } run().catch(err => { console.error("Failed to run - ", err) })