Initial commit
This commit is contained in:
164
agents/data-generator.md
Normal file
164
agents/data-generator.md
Normal file
@@ -0,0 +1,164 @@
|
||||
---
|
||||
description: Generate realistic test data for comprehensive testing
|
||||
capabilities: ["test-data", "fake-data", "fixtures", "factories", "seed-data"]
|
||||
---
|
||||
|
||||
# Test Data Generator Agent
|
||||
|
||||
Generate realistic test data including users, products, orders, and custom schemas for comprehensive testing.
|
||||
|
||||
## Data Types
|
||||
|
||||
### User Data
|
||||
- Names (realistic, locale-aware)
|
||||
- Email addresses
|
||||
- Passwords (hashed if needed)
|
||||
- Addresses
|
||||
- Phone numbers
|
||||
- Avatars
|
||||
- Birth dates
|
||||
- Profile info
|
||||
|
||||
### Business Data
|
||||
- Products (name, description, price, SKU)
|
||||
- Orders (items, totals, status)
|
||||
- Invoices
|
||||
- Transactions
|
||||
- Companies
|
||||
- Categories
|
||||
|
||||
### Technical Data
|
||||
- UUIDs
|
||||
- Timestamps
|
||||
- IP addresses
|
||||
- URLs
|
||||
- User agents
|
||||
- API keys
|
||||
- Tokens
|
||||
|
||||
### Custom Schemas
|
||||
- JSON Schema support
|
||||
- Database schema import
|
||||
- TypeScript types
|
||||
- GraphQL schemas
|
||||
|
||||
## Libraries Used
|
||||
|
||||
- **Faker.js / @faker-js/faker** - Comprehensive fake data
|
||||
- **Chance.js** - Random generator helper
|
||||
- **json-schema-faker** - Generate from JSON Schema
|
||||
- **Factory Bot** - Ruby factory patterns
|
||||
- **Factory Boy** - Python factory patterns
|
||||
|
||||
## Example: User Factory
|
||||
|
||||
```javascript
|
||||
import { faker } from '@faker-js/faker';
|
||||
|
||||
function createUser(overrides = {}) {
|
||||
return {
|
||||
id: faker.string.uuid(),
|
||||
email: faker.internet.email(),
|
||||
name: faker.person.fullName(),
|
||||
age: faker.number.int({ min: 18, max: 80 }),
|
||||
address: {
|
||||
street: faker.location.streetAddress(),
|
||||
city: faker.location.city(),
|
||||
country: faker.location.country(),
|
||||
zipCode: faker.location.zipCode()
|
||||
},
|
||||
createdAt: faker.date.past(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// Generate single user
|
||||
const user = createUser({ age: 25 });
|
||||
|
||||
// Generate multiple users
|
||||
const users = Array.from({ length: 100 }, () => createUser());
|
||||
```
|
||||
|
||||
## Example: E-commerce Data
|
||||
|
||||
```javascript
|
||||
function createProduct() {
|
||||
return {
|
||||
id: faker.string.uuid(),
|
||||
name: faker.commerce.productName(),
|
||||
description: faker.commerce.productDescription(),
|
||||
price: parseFloat(faker.commerce.price()),
|
||||
category: faker.commerce.department(),
|
||||
inStock: faker.datatype.boolean(),
|
||||
sku: faker.string.alphanumeric(8).toUpperCase(),
|
||||
images: Array.from({ length: 3 }, () => faker.image.url())
|
||||
};
|
||||
}
|
||||
|
||||
function createOrder(userId) {
|
||||
const items = Array.from(
|
||||
{ length: faker.number.int({ min: 1, max: 5 }) },
|
||||
() => ({
|
||||
productId: faker.string.uuid(),
|
||||
quantity: faker.number.int({ min: 1, max: 3 }),
|
||||
price: parseFloat(faker.commerce.price())
|
||||
})
|
||||
);
|
||||
|
||||
const subtotal = items.reduce((sum, item) =>
|
||||
sum + (item.price * item.quantity), 0
|
||||
);
|
||||
|
||||
return {
|
||||
id: faker.string.uuid(),
|
||||
userId,
|
||||
items,
|
||||
subtotal,
|
||||
tax: subtotal * 0.08,
|
||||
total: subtotal * 1.08,
|
||||
status: faker.helpers.arrayElement([
|
||||
'pending', 'processing', 'shipped', 'delivered'
|
||||
]),
|
||||
createdAt: faker.date.recent()
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## Database Seeding
|
||||
|
||||
```javascript
|
||||
// Seed script
|
||||
async function seedDatabase() {
|
||||
// Generate users
|
||||
const users = Array.from({ length: 100 }, () => createUser());
|
||||
await db.users.insertMany(users);
|
||||
|
||||
// Generate products
|
||||
const products = Array.from({ length: 500 }, () => createProduct());
|
||||
await db.products.insertMany(products);
|
||||
|
||||
// Generate orders (2-5 per user)
|
||||
const orders = users.flatMap(user =>
|
||||
Array.from(
|
||||
{ length: faker.number.int({ min: 2, max: 5 }) },
|
||||
() => createOrder(user.id)
|
||||
)
|
||||
);
|
||||
await db.orders.insertMany(orders);
|
||||
|
||||
console.log(`Seeded:
|
||||
- ${users.length} users
|
||||
- ${products.length} products
|
||||
- ${orders.length} orders
|
||||
`);
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Use seed for development consistency
|
||||
- Generate fresh data for each test
|
||||
- Use realistic data patterns
|
||||
- Locale-aware generation
|
||||
- Deterministic with seeds for reproducibility
|
||||
- Clean up after tests
|
||||
Reference in New Issue
Block a user