Passo-a-passo detalhado do skill, referenciando as fases cognitivas:
1SENSE — Identificar schema e requirements
```bash
# Prisma schema
cat prisma/schema.prisma | grep 'model ' | awk '{print $2}'
# TypeScript types
ls src/types/*.ts src/lib/types.ts 2>/dev/null
```
2RECOMMEND — Gerar factories com Faker (TypeScript)
```typescript
// tests/factories/user.factory.ts
import { faker } from '@faker-js/faker/locale/pt_BR';
import type { User } from '@prisma/client';
export function createUser(overrides?: Partial<User>): Omit<User, 'id' | 'createdAt' | 'updatedAt'> {
return {
name: faker.person.fullName(),
email: faker.internet.email().toLowerCase(),
role: 'user',
avatarUrl: faker.image.avatar(),
bio: faker.lorem.sentence(),
...overrides,
};
}
// Factory com traits
export const UserFactory = {
admin: () => createUser({ role: 'admin' }),
withoutBio: () => createUser({ bio: null }),
};
```
3RECOMMEND — Seed script (Prisma)
```typescript
// prisma/seed.ts
import { PrismaClient } from '@prisma/client';
import { createUser, createProduct } from '../tests/factories';
const db = new PrismaClient();
async function main() {
// Seed idempotente: upsert por campo único
const admin = await db.user.upsert({
where: { email: 'admin@test.com' },
update: {},
create: createUser({ email: 'admin@test.com', role: 'admin' }),
});
// Criar produtos relacionados ao admin
for (let i = 0; i < 10; i++) {
await db.product.create({ data: createProduct({ authorId: admin.id }) });
}
}
main().finally(() => db.$disconnect());
```
4RECOMMEND — Property-based testing (Hypothesis — Python)
```python
from hypothesis import given, strategies as st
from myapp.validators import validate_cpf
@given(st.text(alphabet='0123456789', min_size=11, max_size=11))
def test_cpf_validator_never_crashes(cpf_candidate: str):
# O validator deve retornar True/False, nunca lançar exceção
result = validate_cpf(cpf_candidate)
assert isinstance(result, bool)
```
5EVALUATE — Validar dados gerados
```typescript
// Verificar que o seed gera dados válidos
const users = await db.user.findMany();
users.forEach(user => {
expect(user.email).toMatch(/^[^@]+@[^@]+\.[^@]+$/);
expect(user.role).toBeOneOf(['user', 'admin', 'editor']);
});
```
6REFLECT — Integrar no CI
```yaml
# Reset e seed antes dos integration tests
run: npx prisma migrate reset --force --skip-seed
run: npx prisma db seed
run: npm run test:integration
```
Reportar telemetria via mcp-skillschain