From c56161f2214adb41d02f127d9e71ac7c65ca5ed3 Mon Sep 17 00:00:00 2001 From: Maxim Date: Sun, 26 Apr 2026 21:32:27 +0300 Subject: [PATCH 1/3] feat(load-test): rename seed script and update script name in package.json --- infra/k6/scripts/{seed-users.ts => db-seed.ts} | 0 package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename infra/k6/scripts/{seed-users.ts => db-seed.ts} (100%) diff --git a/infra/k6/scripts/seed-users.ts b/infra/k6/scripts/db-seed.ts similarity index 100% rename from infra/k6/scripts/seed-users.ts rename to infra/k6/scripts/db-seed.ts diff --git a/package.json b/package.json index 6be9d11..c54cbc4 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "k6:board": "pnpm --filter @project/performance-tests test:board", "k6:tasks": "pnpm --filter @project/performance-tests test:tasks", "k6:smoke": "pnpm --filter @project/performance-tests smoke", - "k6:seed-users": "npx tsx infra/k6/scripts/seed-users.ts" + "k6:db-seed": "npx tsx infra/k6/scripts/db-seed.ts" }, "dependencies": { "@aws-sdk/client-s3": "^3.1029.0", From 677279e361b9b444fd4dc468c59e481f0b95b37e Mon Sep 17 00:00:00 2001 From: Maxim Date: Sun, 26 Apr 2026 21:39:46 +0300 Subject: [PATCH 2/3] feat(load-test): move sign-in logic into separate module for reusability --- infra/k6/scenarios/auth.js | 20 ++------------------ infra/k6/shared/sign-in.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 infra/k6/shared/sign-in.js diff --git a/infra/k6/scenarios/auth.js b/infra/k6/scenarios/auth.js index f5e8052..e6a38da 100644 --- a/infra/k6/scenarios/auth.js +++ b/infra/k6/scenarios/auth.js @@ -1,6 +1,7 @@ import { SharedArray } from 'k6/data'; import http from 'k6/http'; import { check, sleep } from 'k6'; +import signIn from '../shared/sign-in.js'; const users = new SharedArray('test users', function () { return JSON.parse(open('../data/users.json')); @@ -28,26 +29,9 @@ export const options = { export default function () { const user = users[(__VU - 1) % users.length]; - const params = { - headers: { - 'Content-Type': 'application/json', - }, - }; // --- SIGN-IN --- - const signInRes = http.post( - `${BASE_URL}/auth/sign-in`, - JSON.stringify({ email: user.email, password: user.password }), - Object.assign({}, params, { tags: { name: 'sign-in' } }), - ); - - const signInToken = signInRes.json().token; - const signInCookie = signInRes.cookies.refresh ? signInRes.cookies.refresh[0].value : 'MISSING'; - - check(signInRes, { - 'login: status is 201': (r) => r.status === 201, - 'login: has access token': (r) => r.json().token !== undefined, - }); + const { signInToken, signInCookie } = signIn(BASE_URL, user); sleep(1); diff --git a/infra/k6/shared/sign-in.js b/infra/k6/shared/sign-in.js new file mode 100644 index 0000000..9f86a90 --- /dev/null +++ b/infra/k6/shared/sign-in.js @@ -0,0 +1,29 @@ +import http from 'k6/http'; +import { check } from 'k6'; + +export default function signIn(baseUrl, user) { + const params = { + headers: { + 'Content-Type': 'application/json', + }, + }; + + const signInRes = http.post( + `${baseUrl}/auth/sign-in`, + JSON.stringify({ email: user.email, password: user.password }), + Object.assign({}, params, { tags: { name: 'sign-in' } }), + ); + + const signInToken = signInRes.json().token; + const signInCookie = signInRes.cookies.refresh ? signInRes.cookies.refresh[0].value : 'MISSING'; + + check(signInRes, { + 'sign-in: status is 201': (r) => r.status === 201, + 'sign-in: has access token': (r) => r.json().token !== undefined, + }); + + return { + signInToken, + signInCookie, + }; +} From c2d4ee493d0a2c8660f7589b0d862623eb1a1350 Mon Sep 17 00:00:00 2001 From: Maxim Date: Mon, 27 Apr 2026 12:31:33 +0300 Subject: [PATCH 3/3] feat(load-test): add scenarios for user endpoints and update seeding --- infra/k6/data/user-avatar.png | Bin 0 -> 66680 bytes infra/k6/package.json | 2 +- infra/k6/scenarios/users.js | 187 ++++++++++++++++++++++++++++++++++ infra/k6/scripts/db-seed.ts | 25 ++++- infra/k6/shared/sign-in.js | 1 + package.json | 2 +- 6 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 infra/k6/data/user-avatar.png create mode 100644 infra/k6/scenarios/users.js diff --git a/infra/k6/data/user-avatar.png b/infra/k6/data/user-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..2386e31d3c24e8b3daa993f585ad2e72a542366f GIT binary patch literal 66680 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
; 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

=Vf@E?~r;Q5L@cqLiGI#|ezlezSd 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 M3Yx%XIje~O0rLFZG5`Po literal 0 HcmV?d00001 diff --git a/infra/k6/package.json b/infra/k6/package.json index b59aa50..ee27805 100644 --- a/infra/k6/package.json +++ b/infra/k6/package.json @@ -7,7 +7,7 @@ "test:auth": "k6 run scenarios/auth.js", "test:team": "k6 run scenarios/team.js", "test:projects": "k6 run scenarios/projects.js", - "test:user": "k6 run scenarios/user.js", + "test:users": "k6 run scenarios/users.js", "test:board": "k6 run scenarios/board-full.js", "test:tasks": "k6 run scenarios/tasks.js", "smoke": "k6 run smoke.js" diff --git a/infra/k6/scenarios/users.js b/infra/k6/scenarios/users.js new file mode 100644 index 0000000..bdb87ae --- /dev/null +++ b/infra/k6/scenarios/users.js @@ -0,0 +1,187 @@ +import { SharedArray } from 'k6/data'; +import http from 'k6/http'; +import { check, sleep } from 'k6'; +import { FormData } from 'https://jslib.k6.io/formdata/0.0.2/index.js'; +import signIn from '../shared/sign-in.js'; + +const users = new SharedArray('test users', function () { + return JSON.parse(open('../data/users.json')); +}); + +const BASE_URL = __ENV.BASE_URL; +const VUS = parseInt(__ENV.VUS); +const DURATION = __ENV.DURATION; + +const LOGIN_WINDOW = `${Math.ceil(VUS * 0.15)}s`; + +export const options = { + thresholds: { + 'http_req_duration{name:get-me}': ['p(95)<150'], + 'http_req_duration{name:get-activity}': ['p(95)<250'], + 'http_req_duration{name:patch-me}': ['p(95)<300'], + 'http_req_duration{name:post-avatar}': ['p(95)<300'], + 'http_req_duration{name:patch-notifications}': ['p(95)<300'], + http_req_failed: ['rate<0.1'], + }, + scenarios: { + login_phase: { + executor: 'per-vu-iterations', + vus: VUS, + iterations: 1, + maxDuration: LOGIN_WINDOW, + gracefulStop: '0s', + }, + users_load_test: { + executor: 'constant-vus', + vus: VUS, + duration: DURATION, + startTime: LOGIN_WINDOW, + gracefulStop: '0s', + }, + }, +}; + +const avatar = open('../data/user-avatar.png', 'b'); +const randomBool = () => Math.random() < 0.5; +const randomStr = (len = 8) => + Math.random() + .toString(36) + .substring(2, 2 + len); +let authContext = null; + +export default function () { + const user = users[(__VU - 1) % users.length]; + + if (!authContext) { + const loginDelay = (__VU - 1) * 0.1; + sleep(loginDelay); + + const { signInToken, signInCookie, signInStatus } = signIn(BASE_URL, user); + + if (signInStatus !== 201) { + console.error(`VU ${__VU} failed to login: Status ${signInStatus}`); + sleep(1); + return; + } + + authContext = { + token: signInToken, + cookie: signInCookie, + }; + } + + if (authContext && __ITER > 0) { + const params = { + headers: { + Authorization: `Bearer ${authContext.token}`, + 'Content-Type': 'application/json', + }, + cookies: { refresh: authContext.cookie }, + }; + + // --- GET /me --- + const meRes = http.get( + `${BASE_URL}/users/me`, + Object.assign({}, params, { + tags: { name: 'get-me' }, + }), + ); + + check(meRes, { + 'get | me: status is 200': (r) => r.status === 200, + 'get | me: has id': (r) => r.json().id !== undefined, + }); + + sleep(1); + + // --- GET /me/activity --- + const randomPage = Math.floor(Math.random() * 5) + 1; + const randomLimit = Math.floor(Math.random() * 15) + 5; + + const activityRes = http.get( + `${BASE_URL}/users/me/activity?page=${randomPage}&limit=${randomLimit}`, + Object.assign({}, params, { + tags: { name: 'get-activity' }, + }), + ); + + if (activityRes.status !== 200) { + console.log(`Activity failed: Status ${activityRes.status}, Body: ${activityRes.body}`); + } + + check(activityRes, { + 'get | me/activity: status is 200': (r) => r.status === 200, + }); + + sleep(1); + + // --- PATCH /me --- + const meBody = JSON.stringify({ + firstName: `Name_${randomStr(5)}`, + lastName: `Surname_${randomStr(5)}`, + bio: `Testing bio with random data: ${randomStr(30)}`, + language: Math.random() > 0.5 ? 'ru' : 'en', + }); + const updateProfileRes = http.patch( + `${BASE_URL}/users/me`, + meBody, + Object.assign({}, params, { + tags: { name: 'patch-me' }, + }), + ); + + check(updateProfileRes, { + 'patch | me: status is 200': (r) => r.status === 200, + 'patch | me: success in response': (r) => r.json().success === true, + }); + + sleep(1); + + // --- POST /me/avatar --- + const fd = new FormData(); + fd.append('file', http.file(avatar, 'avatar.png', 'image/png')); + + const avatarRes = http.post(`${BASE_URL}/users/me/avatar`, fd.body(), { + headers: { + Authorization: `Bearer ${authContext.token}`, + 'Content-Type': `multipart/form-data; boundary=${fd.boundary}`, + }, + tags: { name: 'post-avatar' }, + }); + + check(avatarRes, { + 'post | me/avatar: status is 201': (r) => r.status === 201, + 'post | me/avatar: success in response': (r) => r.json().success === true, + }); + + sleep(1); + + // --- PATCH /me/notifications --- + const notificationsBody = JSON.stringify({ + email: { + task_assigned: randomBool(), + mentions: randomBool(), + daily_summary: randomBool(), + }, + push: { + task_assigned: randomBool(), + reminders: randomBool(), + }, + }); + + const notificationsRes = http.patch( + `${BASE_URL}/users/me/notifications`, + notificationsBody, + Object.assign({}, params, { + tags: { name: 'patch-notifications' }, + }), + ); + + check(notificationsRes, { + 'patch | me/notifications: status is 200': (r) => r.status === 200, + 'patch | me/notifications: success in response': (r) => r.json().success === true, + }); + + sleep(1); + } +} diff --git a/infra/k6/scripts/db-seed.ts b/infra/k6/scripts/db-seed.ts index 2017391..20e7268 100644 --- a/infra/k6/scripts/db-seed.ts +++ b/infra/k6/scripts/db-seed.ts @@ -14,7 +14,7 @@ async function seed() { const DB_URL = process.env.DATABASE_URL; if (!DB_URL) throw new Error('DATABASE_URL is not defined in .env'); - const COUNT = 500; + const COUNT = 1000; const OUT_FILE = resolve(process.cwd(), 'infra/k6/data/users.json'); console.log(`Start seeding ${COUNT} users using pg driver...`); @@ -28,6 +28,7 @@ async function seed() { const usersToInsert = []; const securityToInsert = []; const notificationsToInsert = []; + const activitiesToInsert = []; const k6Data = []; for (let i = 0; i < COUNT; i++) { @@ -48,6 +49,21 @@ async function seed() { notificationsToInsert.push({ userId }); k6Data.push({ email, password }); + + for (let j = 0; j < 10; j++) { + activitiesToInsert.push({ + id: createId(), + userId: userId, + eventType: 'SIGN_IN', + entityId: userId, + metadata: { + description: `K6 Load Test Iteration ${j}`, + ip: '127.0.0.1', + userAgent: 'k6-test-agent', + }, + createdAt: new Date(Date.now() - j * 1000 * 60 * 60), + }); + } } console.log('Cleaning up ONLY k6 test users...'); @@ -61,6 +77,13 @@ async function seed() { await tx.insert(sc.users).values(usersToInsert); await tx.insert(sc.userSecurity).values(securityToInsert); await tx.insert(sc.userNotifications).values(notificationsToInsert); + + const chunkSize = 1000; + for (let i = 0; i < activitiesToInsert.length; i += chunkSize) { + const chunk = activitiesToInsert.slice(i, i + chunkSize); + console.log(`Inserting activities chunk: ${i} to ${i + chunkSize}...`); + await tx.insert(sc.userActivity).values(chunk); + } }); mkdirSync(dirname(OUT_FILE), { recursive: true }); diff --git a/infra/k6/shared/sign-in.js b/infra/k6/shared/sign-in.js index 9f86a90..8e2c310 100644 --- a/infra/k6/shared/sign-in.js +++ b/infra/k6/shared/sign-in.js @@ -25,5 +25,6 @@ export default function signIn(baseUrl, user) { return { signInToken, signInCookie, + signInStatus: signInRes.status, }; } diff --git a/package.json b/package.json index c54cbc4..85573ad 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "k6:auth": "pnpm --filter @project/performance-tests test:auth", "k6:team": "pnpm --filter @project/performance-tests test:team", "k6:projects": "pnpm --filter @project/performance-tests test:projects", - "k6:user": "pnpm --filter @project/performance-tests test:user", + "k6:users": "pnpm --filter @project/performance-tests test:users", "k6:board": "pnpm --filter @project/performance-tests test:board", "k6:tasks": "pnpm --filter @project/performance-tests test:tasks", "k6:smoke": "pnpm --filter @project/performance-tests smoke",