import User from '#models/user' import Organization from '#models/organization' import { provisionDefaultPlans } from '#services/default_plans' import db from '@adonisjs/lucid/services/db' let counter = 0 /** * Helper : crée une organisation + un user + provisionne les 4 plans * pré-fournis, dans une transaction. Retourne le user, l'org et un * access token Bearer prêt à être passé en header. * * `counter` rend les emails uniques entre les tests d'une même suite — * sans ça, les tests qui ne tombent pas dans une global tx risquent un * email_taken. */ export async function createTestUser(overrides: { email?: string password?: string fullName?: string orgName?: string } = {}) { counter += 1 const email = overrides.email ?? `test-${counter}-${Date.now()}@rubis.test` const password = overrides.password ?? 'password123' const fullName = overrides.fullName ?? `Test User ${counter}` const orgName = overrides.orgName ?? '' const { user, org } = await db.transaction(async (trx) => { const o = await Organization.create({ name: orgName }, { client: trx }) await provisionDefaultPlans(o.id, trx) const u = await User.create({ email, password, fullName, organizationId: o.id }, { client: trx }) return { user: u, org: o } }) const token = await User.accessTokens.create(user) // .release() consomme la valeur — on capture une seule fois. const accessToken = token.value!.release() return { user, org, plainPassword: password, accessToken, bearer: { Authorization: `Bearer ${accessToken}` }, } } /** * Variante : crée juste 2 users dans 2 orgs distinctes (pour les tests * cross-org : user A ne peut pas voir/modifier les ressources de B). */ export async function createTwoOrgs() { const a = await createTestUser({ orgName: 'Org A' }) const b = await createTestUser({ orgName: 'Org B' }) return { a, b } }