npx skills add smithery/manastalukdar --skill mock-generate
manastalukdar/ai-devstudio
mock-generate
Generate mock data and test fixtures from schemas
Installation
npx skills add manastalukdar/ai-devstudio --skill mock-generate
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Browser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
810.4K installsDebug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe …
568.9K installsPre-deployment validation for Azure readiness. Run deep checks on configuration, infrastructure…
567.7K installsConfigure Azure API Management as an AI Gateway for AI models, MCP tools, and agents. WHEN: sem…
566.3K installsAzure VM/VMSS router. WHEN: create / provision / deploy / spin-up VM, recommend VM size, compar…
510K installsPostgres best practices maintained by Supabase, for Postgres running anywhere. Load this skill …
391.6K installsAlso in this package
Other skills from manastalukdar/ai-devstudio · top by installs.
npx skills add manastalukdar/ai-devstudio
More details
Agent compatibility
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Also listed on
Alternate registries and mirrors of this skill.
Repository health
main
Package contents
Files included with this skill beyond the listing page.
-
skill md
SKILL.md26,286 B -
docs
SUMMARY.md70 B
History
- First seen on skills.sh
- First recorded snapshot · 7 installs
SKILL.md
Mock Data Generator
I'll generate realistic mock data and test fixtures based on TypeScript types, JSON schemas, database schemas, or API specifications.
Data Sources:
- TypeScript interfaces and types
- JSON Schema definitions
- Database schemas (Prisma, TypeORM, Drizzle)
- OpenAPI/Swagger specifications
- GraphQL schemas
Token Optimization
This skill uses multiple optimization strategies to minimize token usage while maintaining realistic mock data generation:
1. Schema Detection Caching (500 token savings)
Pattern: Cache schema file locations and metadata to avoid repeated searches
# Cache file: .mock-generate-schemas.cache
# Format: schema_type:file_path (one per line)
# TTL: 1 hour (schemas change less frequently)
if [ -f ".mock-generate-schemas.cache" ] && [ $(($(date +%s) - $(stat -c %Y .mock-generate-schemas.cache))) -lt 3600 ]; then
# Read cached schema locations (100 tokens)
SCHEMAS=$(cat .mock-generate-schemas.cache)
else
# Full schema detection (600 tokens)
detect_schemas
echo "$SCHEMAS" > .mock-generate-schemas.cache
fi
Savings:
- Cached: ~100 tokens (read cache file)
- Uncached: ~600 tokens (find TypeScript types, JSON schemas, Prisma, OpenAPI, GraphQL)
- 500 token savings (83%) for subsequent runs
2. Grep-Based Type Discovery (800 token savings)
Pattern: Use Grep to find type definitions instead of reading all files
# Instead of: Read all TypeScript files (2,000+ tokens)
# Use: Grep for interface/type patterns (150 tokens)
# Find TypeScript interfaces
TS_TYPES=$(grep -r "^interface\|^type " \
--include="*.ts" \
! -path "*/node_modules/*" \
! -path "*/dist/*" \
-l . | head -20)
# Find specific interfaces by name
grep -r "^interface User\|^type User" --include="*.ts" -A 20 .
Savings:
- Grep approach: ~150 tokens (pattern matching only)
- Full file read: ~950 tokens (read all TypeScript files)
- 800 token savings (84%)
3. Template-Based Faker.js Generation (1,200 token savings)
Pattern: Use predefined Faker.js templates instead of LLM-generated mock functions
# Instead of: LLM-generated mock functions (1,500 tokens per type)
# Use: Template-based generation (300 tokens per type)
generate_mock_template() {
local interface_name="$1"
cat <<'EOF'
export function createMock${interface_name}(overrides?: Partial<${interface_name}>): ${interface_name} {
return {
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
createdAt: faker.date.past(),
...overrides,
};
}
export function createMock${interface_name}s(count: number = 10): ${interface_name}[] {
return Array.from({ length: count }, () => createMock${interface_name}());
}
EOF
}
Savings:
- Template-based: ~300 tokens (parameter substitution)
- LLM-generated: ~1,500 tokens (full generation with analysis)
- 1,200 token savings (80%) per type
4. Sample-Based Type Analysis (1,000 token savings)
Pattern: Generate mocks for first 10-20 types, not all at once
# Instead of: Process all 50+ types (7,500+ tokens)
# Process: First 10 types only (1,500 tokens)
SAMPLE_SIZE=10
echo "$TS_TYPES" | head -$SAMPLE_SIZE | while read file; do
# Extract first interface from file
interface_name=$(grep "^interface " "$file" | head -1 | awk '{print $2}')
generate_mock_template "$interface_name"
done
Savings:
- Full generation: ~7,500 tokens (50+ types)
- Sample generation: ~1,500 tokens (10 types)
- 1,000 token savings (87%) per batch
- Users can run multiple times for comprehensive coverage
5. Early Exit for Existing Mocks (90% savings)
Pattern: Check if mock files already exist before generating
# Quick check: Do mock files exist?
MOCK_DIR="src/__mocks__"
if [ -d "$MOCK_DIR" ] && [ $(find "$MOCK_DIR" -name "*.mock.ts" | wc -l) -gt 0 ]; then
echo "⚠️ Mock files already exist in $MOCK_DIR"
read -p "Regenerate mocks? (y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "✓ Using existing mocks"
exit 0 # 150 tokens total
fi
fi
# Otherwise: Full mock generation (3,000+ tokens)
Savings:
- Existing mocks: ~150 tokens (early exit)
- Full generation: ~3,000+ tokens
- 2,850+ token savings (95%) when mocks exist
6. Schema Snapshot Caching (600 token savings)
Pattern: Cache parsed schema structures to avoid re-parsing
# Cache file: .mock-generate-parsed-schemas.json
# Format: JSON with type definitions
# TTL: 5 minutes (during active development)
parse_schema_cached() {
local schema_file="$1"
local cache_file=".mock-generate-parsed-schemas.json"
local cache_key=$(echo "$schema_file" | md5sum | cut -d' ' -f1)
if [ -f "$cache_file" ]; then
cached_schema=$(jq -r ".\"$cache_key\"" "$cache_file" 2>/dev/null)
if [ "$cached_schema" != "null" ]; then
echo "$cached_schema" # 50 tokens
return
fi
fi
# Parse schema (650 tokens)
parsed=$(parse_schema "$schema_file")
jq -n --arg key "$cache_key" --arg val "$parsed" '{($key): $val}' > "$cache_file"
echo "$parsed"
}
Savings:
- Cached parse: ~50 tokens
- Fresh parse: ~650 tokens (TypeScript parsing, JSON Schema validation)
- 600 token savings (92%) for subsequent runs
7. Incremental Mock Generation (500 token savings)
Pattern: Track generated mock files to avoid regeneration
# Cache file: .mock-generate-completed.cache
# Format: type_name:mock_file_path (one per line)
# TTL: Session-based (cleared manually)
is_mock_generated() {
local type_name="$1"
grep -q "^$type_name:" .mock-generate-completed.cache 2>/dev/null
}
# Skip already generated mocks
if ! is_mock_generated "$interface_name"; then
generate_mock_file "$interface_name"
echo "$interface_name:$mock_file" >> .mock-generate-completed.cache
else
echo " ✓ Mock for $interface_name already exists"
fi
Savings:
- Skip generated: ~50 tokens (cache check)
- Generate new: ~550 tokens (template expansion and file write)
- 500 token savings (91%) for already generated mocks
8. Faker.js Method Mapping Cache (300 token savings)
Pattern: Cache type-to-Faker.js method mappings
# Cache file: .mock-generate-faker-mapping.json
# Format: {"string:email": "faker.internet.email()", ...}
# TTL: 24 hours (mapping rarely changes)
get_faker_method() {
local type="$1"
local format="$2"
local cache_file=".mock-generate-faker-mapping.json"
if [ -f "$cache_file" ]; then
method=$(jq -r ".\"$type:$format\"" "$cache_file" 2>/dev/null)
if [ "$method" != "null" ]; then
echo "$method" # 30 tokens
return
fi
fi
# Determine Faker method (330 tokens)
case "$type:$format" in
"string:email") method="faker.internet.email()" ;;
"string:uuid") method="faker.string.uuid()" ;;
"string:url") method="faker.internet.url()" ;;
# ... more mappings
esac
jq -n --arg key "$type:$format" --arg val "$method" '{($key): $val}' > "$cache_file"
echo "$method"
}
Savings:
- Cached mapping: ~30 tokens
- Fresh mapping: ~330 tokens (type analysis and method selection)
- 300 token savings (91%) per type field
9. Real-World Token Usage Distribution
Typical Scenarios:
- First Run - Large Project (2,500-4,000 tokens)
- Schema detection: 600 tokens - Grep for types: 150 tokens - Parse 10 schemas: 650 tokens - Generate 10 mock files: 300 tokens/type × 10 = 3,000 tokens - Faker mapping: 330 tokens - Total: ~4,730 tokens
- Subsequent Run - Same Project (800-1,200 tokens)
- Schema detection (cached): 100 tokens - Grep for types: 150 tokens - Parse schemas (cached): 50 tokens - Generate remaining mocks: 300 tokens/type × 10 = 3,000 tokens - Faker mapping (cached): 30 tokens - Skip existing: 50 tokens - Total: ~3,380 tokens
- Existing Mocks Present (100-200 tokens)
- Schema detection (cached): 100 tokens - Check existing mocks: 50 tokens - Early exit: 50 tokens - Total: ~200 tokens
- Small Project (1,000-1,800 tokens)
- Schema detection: 600 tokens - Grep for 3 types: 150 tokens - Parse 3 schemas: 650 tokens - Generate 3 mock files: 300 tokens/type × 3 = 900 tokens - Total: ~2,300 tokens
Expected Token Savings:
- Average 55% reduction from baseline (4,000 → 1,800 tokens)
- 95% reduction when mocks already exist
- Aggregate savings: 2,000-2,500 tokens per mock generation session
Optimization Summary
| Strategy | Savings | When Applied |
|---|---|---|
| Schema detection caching | 500 tokens (83%) | Subsequent runs |
| Grep-based type discovery | 800 tokens (84%) | Always |
| Template-based generation | 1,200 tokens (80%) | Per type |
| Sample-based type analysis | 1,000 tokens (87%) | Large projects |
| Early exit for existing mocks | 2,850 tokens (95%) | Mocks already exist |
| Schema snapshot caching | 600 tokens (92%) | Subsequent runs |
| Incremental mock generation | 500 tokens (91%) | Re-running |
| Faker mapping cache | 300 tokens (91%) | Per field type |
Key Insight: The combination of template-based generation, schema caching, and sample-based processing provides 55-65% token reduction while maintaining realistic mock data quality. Early exit patterns provide 95% savings when mocks already exist.
Phase 1: Schema Detection
#!/bin/bash
# Detect schemas for mock data generation
echo "=== Detecting Data Schemas ==="
echo ""
detect_schemas() {
echo "Searching for schema definitions..."
echo ""
# TypeScript types
TS_TYPES=$(find . -name "*.ts" -type f \
! -path "*/node_modules/*" \
! -path "*/dist/*" \
-exec grep -l "interface\|type.*=" {} \; 2>/dev/null | head -20)
if [ -n "$TS_TYPES" ]; then
echo "✓ TypeScript type definitions found:"
echo "$TS_TYPES" | sed 's/^/ /'
echo ""
fi
# JSON Schemas
JSON_SCHEMAS=$(find . -name "*.schema.json" -type f 2>/dev/null)
if [ -n "$JSON_SCHEMAS" ]; then
echo "✓ JSON Schema files found:"
echo "$JSON_SCHEMAS" | sed 's/^/ /'
echo ""
fi
# Prisma schema
if [ -f "prisma/schema.prisma" ]; then
echo "✓ Prisma schema found: prisma/schema.prisma"
echo ""
fi
# OpenAPI specs
OPENAPI_SPECS=$(find . -name "openapi*.yaml" -o -name "swagger*.json" 2>/dev/null)
if [ -n "$OPENAPI_SPECS" ]; then
echo "✓ OpenAPI specifications found:"
echo "$OPENAPI_SPECS" | sed 's/^/ /'
echo ""
fi
# GraphQL schemas
GRAPHQL_SCHEMAS=$(find . -name "*.graphql" -o -name "schema.gql" 2>/dev/null)
if [ -n "$GRAPHQL_SCHEMAS" ]; then
echo "✓ GraphQL schemas found:"
echo "$GRAPHQL_SCHEMAS" | sed 's/^/ /'
echo ""
fi
}
detect_schemas
# Check for Faker.js installation
check_faker() {
if [ -f "package.json" ]; then
if ! grep -q "@faker-js/faker" package.json; then
echo "⚠️ Faker.js not installed"
echo ""
read -p "Install @faker-js/faker for realistic data generation? (y/n): " install
if [ "$install" = "y" ]; then
npm install --save-dev @faker-js/faker
echo "✓ Faker.js installed"
fi
else
echo "✓ Faker.js already installed"
fi
fi
}
check_faker
Phase 2: Generate Mock Data from TypeScript Types
// Generated mock data from TypeScript types
import { faker } from '@faker-js/faker';
/**
* User interface
*/
interface User {
id: string;
email: string;
name: string;
age: number;
role: 'admin' | 'user' | 'guest';
isActive: boolean;
createdAt: Date;
profile?: UserProfile;
}
interface UserProfile {
bio?: string;
avatarUrl?: string;
location?: string;
socialLinks?: {
twitter?: string;
github?: string;
};
}
/**
* Generate a single mock user
*/
export function createMockUser(overrides?: Partial<User>): User {
return {
id: faker.string.uuid(),
email: faker.internet.email(),
name: faker.person.fullName(),
age: faker.number.int({ min: 18, max: 80 }),
role: faker.helpers.arrayElement(['admin', 'user', 'guest']),
isActive: faker.datatype.boolean(),
createdAt: faker.date.past(),
profile: createMockUserProfile(),
...overrides,
};
}
/**
* Generate mock user profile
*/
export function createMockUserProfile(
overrides?: Partial<UserProfile>
): UserProfile {
return {
bio: faker.lorem.paragraph(),
avatarUrl: faker.image.avatar(),
location: faker.location.city(),
socialLinks: {
twitter: `https://twitter.com/${faker.internet.userName()}`,
github: `https://github.com/${faker.internet.userName()}`,
},
...overrides,
};
}
/**
* Generate multiple mock users
*/
export function createMockUsers(count: number = 10): User[] {
return Array.from({ length: count }, () => createMockUser());
}
/**
* Generate users with specific characteristics
*/
export function createMockAdminUser(): User {
return createMockUser({
role: 'admin',
isActive: true,
});
}
export function createMockInactiveUser(): User {
return createMockUser({
isActive: false,
});
}
/**
* Post interface
*/
interface Post {
id: string;
title: string;
content: string;
authorId: string;
author: User;
tags: string[];
published: boolean;
viewCount: number;
createdAt: Date;
updatedAt: Date;
}
/**
* Generate a single mock post
*/
export function createMockPost(overrides?: Partial<Post>): Post {
return {
id: faker.string.uuid(),
title: faker.lorem.sentence(),
content: faker.lorem.paragraphs(3),
authorId: faker.string.uuid(),
author: createMockUser(),
tags: faker.helpers.arrayElements(
['javascript', 'typescript', 'react', 'node', 'testing'],
{ min: 1, max: 3 }
),
published: faker.datatype.boolean(),
viewCount: faker.number.int({ min: 0, max: 10000 }),
createdAt: faker.date.past(),
updatedAt: faker.date.recent(),
...overrides,
};
}
/**
* Generate multiple mock posts
*/
export function createMockPosts(count: number = 10): Post[] {
return Array.from({ length: count }, () => createMockPost());
}
/**
* API Response wrapper
*/
interface ApiResponse<T> {
data: T;
status: number;
message: string;
timestamp: Date;
}
/**
* Generate mock API response
*/
export function createMockApiResponse<T>(
data: T,
overrides?: Partial<ApiResponse<T>>
): ApiResponse<T> {
return {
data,
status: 200,
message: 'Success',
timestamp: new Date(),
...overrides,
};
}
/**
* Generate mock error response
*/
export function createMockErrorResponse(
message: string = 'An error occurred',
status: number = 500
): ApiResponse<null> {
return {
data: null,
status,
message,
timestamp: new Date(),
};
}
/**
* Paginated response
*/
interface PaginatedResponse<T> {
items: T[];
total: number;
page: number;
pageSize: number;
hasMore: boolean;
}
/**
* Generate mock paginated response
*/
export function createMockPaginatedResponse<T>(
items: T[],
page: number = 1,
pageSize: number = 10
): PaginatedResponse<T> {
const total = items.length;
const start = (page - 1) * pageSize;
const end = start + pageSize;
const paginatedItems = items.slice(start, end);
return {
items: paginatedItems,
total,
page,
pageSize,
hasMore: end < total,
};
}
Phase 3: Generate Mock Data from JSON Schema
// Generate mocks from JSON Schema
import Ajv from 'ajv';
import { faker } from '@faker-js/faker';
/**
* JSON Schema to mock data generator
*/
export class JsonSchemaMockGenerator {
private ajv: Ajv;
constructor() {
this.ajv = new Ajv();
}
/**
* Generate mock data from JSON schema
*/
generate(schema: any, count: number = 1): any[] {
return Array.from({ length: count }, () => this.generateSingle(schema));
}
/**
* Generate a single mock object from schema
*/
private generateSingle(schema: any): any {
if (schema.type === 'object') {
return this.generateObject(schema);
} else if (schema.type === 'array') {
return this.generateArray(schema);
} else {
return this.generatePrimitive(schema);
}
}
/**
* Generate object from schema
*/
private generateObject(schema: any): any {
const obj: any = {};
const properties = schema.properties || {};
for (const [key, propSchema] of Object.entries(properties)) {
// Check if property is required
const isRequired = schema.required?.includes(key);
if (isRequired || faker.datatype.boolean()) {
obj[key] = this.generateSingle(propSchema);
}
}
return obj;
}
/**
* Generate array from schema
*/
private generateArray(schema: any): any[] {
const minItems = schema.minItems || 1;
const maxItems = schema.maxItems || 5;
const length = faker.number.int({ min: minItems, max: maxItems });
return Array.from({ length }, () =>
this.generateSingle(schema.items || {})
);
}
/**
* Generate primitive value from schema
*/
private generatePrimitive(schema: any): any {
const format = schema.format;
const type = schema.type;
// Handle format-specific generation
if (format) {
return this.generateByFormat(format, schema);
}
// Handle type-specific generation
switch (type) {
case 'string':
if (schema.enum) {
return faker.helpers.arrayElement(schema.enum);
}
return faker.lorem.word();
case 'number':
case 'integer':
const min = schema.minimum || 0;
const max = schema.maximum || 1000;
return type === 'integer'
? faker.number.int({ min, max })
: faker.number.float({ min, max, precision: 0.01 });
case 'boolean':
return faker.datatype.boolean();
case 'null':
return null;
default:
return null;
}
}
/**
* Generate value based on format
*/
private generateByFormat(format: string, schema: any): any {
switch (format) {
case 'email':
return faker.internet.email();
case 'uri':
case 'url':
return faker.internet.url();
case 'uuid':
return faker.string.uuid();
case 'date':
return faker.date.past().toISOString().split('T')[0];
case 'date-time':
return faker.date.past().toISOString();
case 'time':
return faker.date.recent().toTimeString().split(' ')[0];
case 'ipv4':
return faker.internet.ipv4();
case 'ipv6':
return faker.internet.ipv6();
case 'hostname':
return faker.internet.domainName();
default:
return faker.lorem.word();
}
}
}
// Example usage
const userSchema = {
type: 'object',
required: ['id', 'email', 'name'],
properties: {
id: { type: 'string', format: 'uuid' },
email: { type: 'string', format: 'email' },
name: { type: 'string' },
age: { type: 'integer', minimum: 18, maximum: 100 },
role: { type: 'string', enum: ['admin', 'user', 'guest'] },
},
};
const generator = new JsonSchemaMockGenerator();
const mockUsers = generator.generate(userSchema, 10);
Phase 4: Generate Test Fixtures
// Test fixtures for different test frameworks
import { faker } from '@faker-js/faker';
/**
* Base fixture factory
*/
export abstract class FixtureFactory<T> {
/**
* Create a single fixture
*/
abstract create(overrides?: Partial<T>): T;
/**
* Create multiple fixtures
*/
createMany(count: number, overrides?: Partial<T>): T[] {
return Array.from({ length: count }, () => this.create(overrides));
}
/**
* Create with specific trait
*/
createWithTrait(trait: string, overrides?: Partial<T>): T {
const traitOverrides = this.getTraitOverrides(trait);
return this.create({ ...traitOverrides, ...overrides });
}
/**
* Get trait-specific overrides
*/
protected getTraitOverrides(trait: string): Partial<T> {
return {};
}
}
/**
* User fixture factory
*/
export class UserFixtureFactory extends FixtureFactory<User> {
create(overrides?: Partial<User>): User {
return {
id: faker.string.uuid(),
email: faker.internet.email(),
name: faker.person.fullName(),
age: faker.number.int({ min: 18, max: 80 }),
role: 'user',
isActive: true,
createdAt: faker.date.past(),
...overrides,
};
}
protected getTraitOverrides(trait: string): Partial<User> {
switch (trait) {
case 'admin':
return { role: 'admin' };
case 'inactive':
return { isActive: false };
case 'new':
return { createdAt: faker.date.recent() };
default:
return {};
}
}
}
// Usage in tests
describe('User Service', () => {
const userFactory = new UserFixtureFactory();
it('should create a user', () => {
const user = userFactory.create();
expect(user).toHaveProperty('id');
expect(user).toHaveProperty('email');
});
it('should create an admin user', () => {
const admin = userFactory.createWithTrait('admin');
expect(admin.role).toBe('admin');
});
it('should create multiple users', () => {
const users = userFactory.createMany(5);
expect(users).toHaveLength(5);
});
});
Phase 5: Database Seed Data
// Database seed data generation
import { PrismaClient } from '@prisma/client';
import { faker } from '@faker-js/faker';
const prisma = new PrismaClient();
/**
* Seed database with mock data
*/
async function seedDatabase() {
console.log('Seeding database...');
// Clear existing data
await prisma.post.deleteMany();
await prisma.user.deleteMany();
// Create users
const users = await Promise.all(
Array.from({ length: 10 }, async () => {
return prisma.user.create({
data: {
email: faker.internet.email(),
name: faker.person.fullName(),
role: faker.helpers.arrayElement(['admin', 'user', 'guest']),
},
});
})
);
console.log(`Created ${users.length} users`);
// Create posts
const posts = await Promise.all(
users.flatMap((user) =>
Array.from({ length: 3 }, async () => {
return prisma.post.create({
data: {
title: faker.lorem.sentence(),
content: faker.lorem.paragraphs(3),
authorId: user.id,
published: faker.datatype.boolean(),
},
});
})
)
);
console.log(`Created ${posts.length} posts`);
console.log('Seeding complete!');
}
seedDatabase()
.catch((error) => {
console.error('Seeding failed:', error);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
Phase 6: Generate Mock Files
echo ""
echo "=== Generating Mock Data Files ==="
echo ""
# Create mocks directory
mkdir -p src/__mocks__
mkdir -p src/__fixtures__
mkdir -p prisma/seeds
cat > src/__mocks__/data.ts << 'EOF'
// Auto-generated mock data
// Run: npm run generate:mocks to regenerate
import { faker } from '@faker-js/faker';
// Import generated mock functions
export { createMockUser, createMockUsers } from './user.mock';
export { createMockPost, createMockPosts } from './post.mock';
/**
* Reset faker seed for consistent mocks in tests
*/
export function resetMockSeed(seed: number = 12345) {
faker.seed(seed);
}
/**
* Generate complete test dataset
*/
export function generateTestDataset() {
resetMockSeed();
return {
users: createMockUsers(10),
posts: createMockPosts(30),
};
}
EOF
echo "✓ Created src/__mocks__/data.ts"
# Add npm scripts
cat >> package.json << 'EOF'
"scripts": {
"generate:mocks": "ts-node scripts/generate-mocks.ts",
"seed:db": "ts-node prisma/seeds/seed.ts"
}
EOF
echo "✓ Added mock generation scripts"
Summary
echo ""
echo "=== ✓ Mock Data Generation Complete ==="
echo ""
echo "📁 Created files:"
echo " - src/__mocks__/data.ts # Mock data generators"
echo " - src/__fixtures__/ # Test fixtures"
echo " - prisma/seeds/seed.ts # Database seed script"
echo ""
echo "🚀 Usage:"
echo ""
echo "# In tests:"
echo "import { createMockUser } from './__mocks__/data';"
echo ""
echo "const user = createMockUser();"
echo "const users = createMockUsers(10);"
echo ""
echo "# Generate with overrides:"
echo "const admin = createMockUser({ role: 'admin' });"
echo ""
echo "# Seed database:"
echo "npm run seed:db"
echo ""
echo "💡 Integration points:"
echo " - /test - Use mocks in test generation"
echo " - /seed-data - Populate databases"
echo " - /api-test-generate - Mock API responses"
Best Practices
Mock Data Quality:
- Use realistic data from Faker.js
- Match actual data constraints
- Include edge cases
- Support deterministic generation (seeds)
Test Fixtures:
- Create factory functions
- Support partial overrides
- Define common traits
- Keep fixtures DRY
Integration Points:
/test- Generate tests with mocks/seed-data- Database seeding/api-test-generate- API test mocks
What I'll Actually Do
- Detect schemas - Find type definitions
- Install dependencies - Faker.js if needed
- Generate mock functions - Type-safe generators
- Create fixtures - Test fixture factories
- Database seeds - Seed data scripts
- Document usage - Examples and patterns
Important: I will NEVER:
- Generate invalid data for schemas
- Hardcode sensitive data
- Create non-deterministic tests without seeds
- Add AI attribution
Credits: Mock data patterns based on Faker.js, factory-bot patterns, test fixture best practices, and database seeding strategies from Prisma, TypeORM, and Rails communities.