UNPKG

agentic-qe

Version:

Agentic Quality Engineering Fleet System - AI-driven quality management platform

452 lines 11.4 kB
/** * TestDataArchitectAgent - Realistic test data generation specialist * * Implements schema-aware data generation with referential integrity preservation, * PII anonymization (GDPR compliance), edge case coverage, realistic data synthesis * using Faker.js patterns, and high-speed generation (10,000+ records/second). * * Based on SPARC methodology and AQE Fleet specification */ import { BaseAgent, BaseAgentConfig } from './BaseAgent'; import { QETask } from '../types'; export interface TestDataArchitectAgentConfig extends BaseAgentConfig { databases?: Array<'postgresql' | 'mysql' | 'mongodb' | 'sqlite'>; generationRate?: number; referentialIntegrity?: boolean; piiAnonymization?: boolean; gdprCompliant?: boolean; edgeCaseGeneration?: boolean; fakerLocale?: string; seedValue?: number; batchSize?: number; parallelGeneration?: boolean; } export interface DatabaseSchema { name: string; tables: TableSchema[]; relationships: Relationship[]; indexes: Index[]; constraints: Constraint[]; } export interface TableSchema { name: string; fields: FieldSchema[]; primaryKey: string[]; uniqueConstraints: string[][]; checkConstraints: CheckConstraint[]; foreignKeys: ForeignKey[]; } export interface FieldSchema { name: string; type: FieldType; nullable: boolean; defaultValue?: any; maxLength?: number; precision?: number; scale?: number; constraints: FieldConstraint[]; format?: SemanticFormat; sensitive?: boolean; generator?: DataGenerator; } export declare enum FieldType { STRING = "string", INTEGER = "integer", FLOAT = "float", DECIMAL = "decimal", BOOLEAN = "boolean", DATE = "date", DATETIME = "datetime", TIMESTAMP = "timestamp", UUID = "uuid", JSON = "json", ARRAY = "array", BINARY = "binary", TEXT = "text", ENUM = "enum" } export declare enum SemanticFormat { UUID = "uuid", EMAIL = "email", PHONE = "phone", URL = "url", NAME = "name", ADDRESS = "address", CITY = "city", COUNTRY = "country", ZIPCODE = "zipcode", CREDIT_CARD = "credit_card", SSN = "ssn", IP_ADDRESS = "ip_address", MAC_ADDRESS = "mac_address", USER_AGENT = "user_agent", PRICE = "price", CURRENCY = "currency", COMPANY = "company", JOB_TITLE = "job_title", PRODUCT_NAME = "product_name", DESCRIPTION = "description", LATITUDE = "latitude", LONGITUDE = "longitude", COLOR = "color" } export interface FieldConstraint { type: 'min' | 'max' | 'length' | 'pattern' | 'enum' | 'unique' | 'not_null'; value: any; } export interface CheckConstraint { name: string; expression: string; } export interface ForeignKey { column: string; referencedTable: string; referencedColumn: string; onDelete?: 'CASCADE' | 'SET_NULL' | 'RESTRICT'; onUpdate?: 'CASCADE' | 'SET_NULL' | 'RESTRICT'; } export interface Relationship { from: string; to: string; type: 'one-to-one' | 'one-to-many' | 'many-to-many'; foreignKey: string; } export interface Index { name: string; table: string; columns: string[]; unique: boolean; } export interface Constraint { name: string; table: string; type: 'PRIMARY_KEY' | 'FOREIGN_KEY' | 'UNIQUE' | 'CHECK'; definition: string; } export interface DataGenerationRequest { schema: DatabaseSchema | TableSchema; count: number; includeEdgeCases?: boolean; preserveIntegrity?: boolean; anonymizePII?: boolean; seedValue?: number; format?: 'json' | 'sql' | 'csv'; } export interface DataGenerationResult { id: string; schema: string; recordsGenerated: number; duration: number; generationRate: number; data: GeneratedDataset; edgeCases?: GeneratedDataset; validationResult: ValidationResult; metadata: GenerationMetadata; } export interface GeneratedDataset { tables?: Record<string, any[]>; records?: any[]; format: 'json' | 'sql' | 'csv'; size: number; } export interface ValidationResult { valid: boolean; violations: ConstraintViolation[]; warnings: string[]; integrityChecks: IntegrityCheck[]; } export interface ConstraintViolation { type: 'NOT_NULL' | 'UNIQUE' | 'CHECK' | 'FOREIGN_KEY' | 'DATA_TYPE'; field: string; table?: string; value?: any; message: string; severity: 'ERROR' | 'WARNING'; } export interface IntegrityCheck { type: 'FOREIGN_KEY' | 'UNIQUE' | 'PRIMARY_KEY'; table: string; status: 'PASS' | 'FAIL'; details?: string; } export interface GenerationMetadata { timestamp: Date; generator: string; version: string; config: any; statistics: DataStatistics; } export interface DataStatistics { nullCount: Record<string, number>; uniqueValues: Record<string, number>; dataDistribution: Record<string, Distribution>; edgeCasePercentage?: number; } export interface Distribution { min?: number; max?: number; mean?: number; median?: number; stdDev?: number; percentiles?: Record<string, number>; } export interface AnonymizationConfig { strategy: AnonymizationStrategy; preserveFormat?: boolean; preserveStatistics?: boolean; salt?: string; kAnonymity?: number; } export declare enum AnonymizationStrategy { MASK = "mask", HASH = "hash", TOKENIZE = "tokenize", GENERALIZE = "generalize", SUBSTITUTE = "substitute", SYNTHETIC = "synthetic" } export interface AnonymizationResult { originalRecords: number; anonymizedRecords: number; fieldsAnonymized: string[]; strategy: AnonymizationStrategy; statisticalValidation: StatisticalValidation; gdprCompliant: boolean; } export interface StatisticalValidation { correlationPreserved: boolean; distributionSimilarity: number; deviationFromOriginal: number; } export type DataGenerator = () => any; export declare class TestDataArchitectAgent extends BaseAgent { private readonly config; private schemaCache; private generatedDatasets; private tokenMap; private faker; constructor(config: TestDataArchitectAgentConfig); protected initializeComponents(): Promise<void>; protected performTask(task: QETask): Promise<any>; protected loadKnowledge(): Promise<void>; protected cleanup(): Promise<void>; /** * Introspect database schema from various sources */ introspectSchema(config: { source: 'postgresql' | 'mysql' | 'mongodb' | 'sqlite' | 'openapi' | 'graphql' | 'typescript'; connectionString?: string; schemaFile?: string; tables?: string[]; }): Promise<DatabaseSchema>; /** * Introspect SQL database schema (PostgreSQL, MySQL, SQLite) */ private introspectSQLDatabase; /** * Introspect MongoDB schema */ private introspectMongoDatabase; /** * Introspect OpenAPI schema */ private introspectOpenAPISchema; /** * Introspect GraphQL schema */ private introspectGraphQLSchema; /** * Introspect TypeScript schema */ private introspectTypeScriptSchema; /** * Generate test data based on schema */ generateData(request: DataGenerationRequest): Promise<DataGenerationResult>; /** * Generate data with referential integrity preserved */ private generateWithIntegrity; /** * Generate data for a single table */ private generateTableData; /** * Generate a batch of records */ private generateBatch; /** * Topological sort for dependency resolution */ private topologicalSort; /** * Generate edge case data */ generateEdgeCases(config: { schema: TableSchema | DatabaseSchema; comprehensive?: boolean; }): Promise<any[]>; /** * Generate edge cases for entire schema */ private generateEdgeCasesForSchema; /** * Generate edge cases for a table */ private generateEdgeCasesForTable; /** * Generate edge cases for a field */ private generateFieldEdgeCases; /** * Anonymize PII data */ anonymizeData(config: { data: any[]; schema: TableSchema; strategy?: AnonymizationStrategy; preserveStatistics?: boolean; }): Promise<AnonymizationResult>; /** * Anonymize dataset */ private anonymizeDataset; /** * Anonymize a single field value */ private anonymizeField; /** * Mask a value (show first and last char) */ private maskValue; /** * Hash a value (deterministic) */ private hashValue; /** * Tokenize a value (consistent replacement) */ private tokenizeValue; /** * Generalize a value (reduce precision) */ private generalizeValue; /** * Substitute with random value */ private substituteValue; /** * Validate generated data */ validateData(config: { data: any[]; schema: TableSchema | DatabaseSchema; }): Promise<ValidationResult>; /** * Validate generated dataset */ private validateGeneratedData; /** * Evaluate a check constraint */ private evaluateCheckConstraint; /** * Analyze production data patterns */ analyzeProductionPatterns(config: { data: any[]; schema: TableSchema; }): Promise<any>; /** * Calculate distribution statistics */ private calculateDistribution; /** * Create a data version */ createDataVersion(config: { datasetId: string; version: string; description?: string; tags?: string[]; }): Promise<any>; /** * Calculate checksum for dataset */ private calculateChecksum; /** * Seed database with generated data */ seedDatabase(config: { datasetId: string; database: 'postgresql' | 'mysql' | 'mongodb' | 'sqlite'; connectionString: string; truncate?: boolean; }): Promise<any>; /** * Initialize Faker.js */ private initializeFaker; /** * Load schema templates */ private loadSchemaTemplates; /** * Create data generator function */ private createGenerator; /** * Generate field value */ private generateFieldValue; /** * Calculate statistics for dataset */ private calculateStatistics; /** * Generate UUID */ private generateUUID; /** * Generate email */ private generateEmail; /** * Generate name */ private generateName; /** * Generate age */ private generateAge; /** * Generate integer */ private generateInteger; /** * Generate float */ private generateFloat; /** * Generate price */ private generatePrice; /** * Generate string */ private generateString; /** * Select random element from array */ private selectRandom; /** * Generate dataset ID */ private generateDatasetId; /** * Generate version ID */ private generateVersionId; } export default TestDataArchitectAgent; //# sourceMappingURL=TestDataArchitectAgent.d.ts.map