import { defineFeature, loadFeature } from 'jest-cucumber'; import { getConnectionPool } from '../../setup/jestSetupAfterEnv'; import { UserResponseDto } from '@modules/user/dtos/user.response.dto'; import { DatabasePool, sql } from 'slonik'; import { TestContext } from '@tests/test-utils/TestContext'; import { IdResponse } from '@src/libs/api/id.response.dto'; import { CreateUserTestContext, givenUserProfileData, iSendARequestToCreateAUser, } from '../user-shared-steps'; import { ApiClient } from '@tests/test-utils/ApiClient'; import { iReceiveAnErrorWithStatusCode } from '@tests/shared/shared-steps'; const feature = loadFeature('tests/user/create-user/create-user.feature'); /** * e2e test implementing a Gherkin feature file * https://github.com/Sairyss/backend-best-practices#testing */ defineFeature(feature, (test) => { let pool: DatabasePool; const apiClient = new ApiClient(); beforeAll(() => { pool = getConnectionPool(); }); afterEach(async () => { await pool.query(sql`TRUNCATE "users"`); await pool.query(sql`TRUNCATE "wallets"`); }); test('I can create a user', ({ given, when, then, and }) => { const ctx = new TestContext(); givenUserProfileData(given, ctx); iSendARequestToCreateAUser(when, ctx); then('I receive my user ID', () => { const response = ctx.latestResponse as IdResponse; expect(typeof response.id).toBe('string'); }); and('I can see my user in a list of all users', async () => { const res = await apiClient.findAllUsers(); const response = ctx.latestResponse as IdResponse; expect( res.data.some((item: UserResponseDto) => item.id === response.id), ).toBe(true); }); }); test('I try to create a user with invalid data', ({ given, when, then }) => { const ctx = new TestContext(); givenUserProfileData(given, ctx); iSendARequestToCreateAUser(when, ctx); iReceiveAnErrorWithStatusCode(then, ctx); }); });