miinventario-backend-v2/test/utils/test-fixtures.ts
rckrdmrd 5a1c966ed2 Migración desde miinventario/backend - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:12:15 -06:00

156 lines
4.3 KiB
TypeScript

import { DataSource } from 'typeorm';
import { JwtService } from '@nestjs/jwt';
import * as bcrypt from 'bcrypt';
import { v4 as uuidv4 } from 'uuid';
export interface TestUser {
id: string;
phone: string;
name: string;
passwordHash: string;
accessToken?: string;
refreshToken?: string;
}
export interface TestStore {
id: string;
ownerId: string;
name: string;
giro: string;
address: string;
}
export async function createTestUser(
dataSource: DataSource,
jwtService: JwtService,
overrides: Partial<{ phone: string; name: string; password: string }> = {},
): Promise<TestUser> {
const id = uuidv4();
const phone = overrides.phone ?? `+52${Date.now().toString().slice(-10)}`;
const name = overrides.name ?? 'Test User';
const password = overrides.password ?? 'testpassword123';
const passwordHash = await bcrypt.hash(password, 10);
await dataSource.query(
`INSERT INTO users (id, phone, name, "passwordHash", role, "isActive")
VALUES ($1, $2, $3, $4, 'USER', true)`,
[id, phone, name, passwordHash],
);
// Create credit balance for user
await dataSource.query(
`INSERT INTO credit_balances (id, "userId", balance, "totalPurchased", "totalConsumed", "totalFromReferrals")
VALUES ($1, $2, 100, 100, 0, 0)`,
[uuidv4(), id],
);
// Generate tokens
const accessToken = jwtService.sign({ sub: id });
const refreshToken = jwtService.sign(
{ sub: id },
{ secret: 'test-refresh-secret', expiresIn: '7d' },
);
// Save refresh token
await dataSource.query(
`INSERT INTO refresh_tokens (id, "userId", token, "expiresAt", "isRevoked")
VALUES ($1, $2, $3, $4, false)`,
[uuidv4(), id, refreshToken, new Date(Date.now() + 7 * 24 * 60 * 60 * 1000)],
);
return {
id,
phone,
name,
passwordHash,
accessToken,
refreshToken,
};
}
export async function createTestStore(
dataSource: DataSource,
ownerId: string,
overrides: Partial<{ name: string; giro: string; address: string }> = {},
): Promise<TestStore> {
const id = uuidv4();
const name = overrides.name ?? 'Test Store';
const giro = overrides.giro ?? 'Abarrotes';
const address = overrides.address ?? 'Test Address 123';
await dataSource.query(
`INSERT INTO stores (id, "ownerId", name, giro, address, "isActive")
VALUES ($1, $2, $3, $4, $5, true)`,
[id, ownerId, name, giro, address],
);
return { id, ownerId, name, giro, address };
}
export async function createTestCreditPackages(
dataSource: DataSource,
): Promise<void> {
await dataSource.query(`
INSERT INTO credit_packages (id, name, description, credits, "priceMXN", "isPopular", "isActive", "sortOrder")
VALUES
(uuid_generate_v4(), 'Starter', 'Perfecto para probar', 10, 49.00, false, true, 1),
(uuid_generate_v4(), 'Basico', 'Para uso regular', 30, 129.00, false, true, 2),
(uuid_generate_v4(), 'Popular', 'El mas vendido', 75, 299.00, true, true, 3)
ON CONFLICT DO NOTHING;
`);
}
export async function createTestInventoryItem(
dataSource: DataSource,
storeId: string,
overrides: Partial<{
name: string;
brand: string;
quantity: number;
price: number;
}> = {},
): Promise<string> {
const id = uuidv4();
const name = overrides.name ?? 'Test Product';
const brand = overrides.brand ?? 'Test Brand';
const quantity = overrides.quantity ?? 10;
const price = overrides.price ?? 99.99;
await dataSource.query(
`INSERT INTO inventory_items (id, "storeId", name, brand, quantity, "unitPrice", "isActive")
VALUES ($1, $2, $3, $4, $5, $6, true)`,
[id, storeId, name, brand, quantity, price],
);
return id;
}
export async function createTestNotification(
dataSource: DataSource,
userId: string,
overrides: Partial<{
type: string;
title: string;
body: string;
isRead: boolean;
}> = {},
): Promise<string> {
const id = uuidv4();
const type = overrides.type ?? 'SYSTEM';
const title = overrides.title ?? 'Test Notification';
const body = overrides.body ?? 'This is a test notification';
const isRead = overrides.isRead ?? false;
await dataSource.query(
`INSERT INTO notifications (id, "userId", type, title, body, "isRead")
VALUES ($1, $2, $3, $4, $5, $6)`,
[id, userId, type, title, body, isRead],
);
return id;
}
export function authHeader(token: string): { Authorization: string } {
return { Authorization: `Bearer ${token}` };
}