Testing Methodology
137 end-to-end tests validate every generated SQL query matches Prisma's output exactly
আমরা correctness কীভাবে validate করি
Generated SQL যেন Prisma-এর মতোই ফল দেয়—এটা নিশ্চিত করতে প্রতিটি test একটি কঠোর 5-step process অনুসরণ করে
Prisma query থেকে SQL generate করুন
Prisma query arguments parse করে একই models ও schema ব্যবহার করে equivalent SQL generate করুন। Generated SQL security ও performance-এর জন্য parameterized queries ব্যবহার করে।
দুটি query parallel-এ execute করুন
postgres.js বা better-sqlite3 দিয়ে generated SQL direct চালান, এবং একই query Prisma দিয়ে চালান। দুটোই একই database state hit করে।
Results normalize করুন
Type differences (BigInt vs Number, Decimal precision, Date serialization) handle করুন এবং fair comparison-এর জন্য object key ordering normalize করুন।
Deep equality check
Results একদম একই কিনা যাচাই করুন: row count, field values, nested relations, ordering। mismatch হলে test fail।
Performance benchmark
5 warmup runs, তারপর প্রতি test-এ 10–50 iterations average করে execution time মাপুন। Prisma v6, Prisma v7, এবং Drizzle ORM-এর সাথে compare করুন।
Advanced validation techniques
Data type normalization
- • BigInt conversion: JavaScript BigInt → Number for comparison
- • Decimal handling: Prisma Decimal → Float with 10-digit precision
- • Date normalization: All DateTime values → null (focus on data, not timestamps)
- • JSON parsing: Automatic detection and parsing of JSON strings
- • Object key sorting: Alphabetical ordering for consistent comparison
Performance benchmarking
- • Warmup phase: 5 iterations to prime caches and JIT
- • Adaptive iterations: 5-50 runs based on query complexity
- • Isolated measurement: Each query type measured independently
- • Multi-ORM comparison: Prisma v6, v7, Drizzle, Generated SQL
- • SQL generation time: Separate timing for query generation overhead
Comprehensive test coverage
Tests cover every Prisma read operation across multiple complexity levels
Query operations
- findMany with complex filters
- findFirst with skip & pagination
- findUnique by ID & unique fields
- count with WHERE conditions
- aggregate (sum, avg, min, max)
- groupBy with HAVING clauses
Complex scenarios
- Nested includes (4 levels deep)
- Relation filters (some/every/none)
- Distinct with window functions
- Cursor pagination
- Select + include combined
- Relation counts (_count)
Filter types
- Comparison (lt/lte/gt/gte)
- Logical (AND/OR/NOT)
- String ops (contains/startsWith)
- NULL checks (is/isNot)
- IN/NOT IN arrays
- Case sensitivity modes
PostgreSQL testing
- ✓ ILIKE case-insensitive searches
- ✓ JSON/JSONB operations
- ✓ Array field handling
- ✓ Composite type support
- ✓ Window function validation
- ✓ Transaction isolation testing
SQLite testing
- ✓ LIKE pattern matching
- ✓ JSON1 extension validation
- ✓ Window function emulation
- ✓ DISTINCT optimization
- ✓ Subquery correlation
- ✓ Text affinity handling
Example test case
Relation filters সহ একটি complex nested query আমরা কীভাবে validate করি দেখুন
it('nested relation filter', () =>
runParityTest(
db,
benchmarkResults,
'findMany nested relation',
'Organization',
{
method: 'findMany',
where: {
projects: {
some: {
tasks: { some: { status: 'DONE' } }
}
}
}
},
() => db.prisma.organization.findMany({
where: {
projects: {
some: {
tasks: { some: { status: 'DONE' } }
}
}
},
orderBy: { id: 'asc' }
}),
)
)
// runParityTest internally:
// 1. Calls generateSQL() with the args
// 2. Executes generated SQL directly
// 3. Executes Prisma query
// 4. Normalizes both results
// 5. Deep equality check - fails if any difference
// 6. Benchmarks execution time Test execution চলাকালে কী ঘটে
1. Query generation (Microseconds)
generateSQL() Prisma args parse করে parameterized SQL তৈরি করে। এই step আলাদাভাবে benchmark করা হয় query generation overhead মাপতে।
2. Parallel execution (Milliseconds)
Promise.all() দিয়ে দুটো query একসাথে একই database state hit করে—fair comparison ও identical data conditions নিশ্চিত করে।
3. Deep normalization
Results recursive normalization পায়: BigInt→Number, Decimal→Float(10), Date→null, JSON parse, key sorting। এতে byte-for-byte comparison accuracy নিশ্চিত হয়।
4. Strict equality
Zero tolerance সহ JSON stringify comparison। row count, field values, nested objects বা ordering-এ কোনো mismatch হলে detailed diff output সহ fail।
5. Performance measurement
Validation-এর পরে, 5–50 iterations average execution time মাপে। ফলাফল: Prisma v6, Prisma v7, Drizzle ORM, Generated SQL, এবং SQL generation overhead।
Multi-version validation
Compatibility নিশ্চিত করতে প্রতিটি test Prisma v6 ও v7 দুটোর বিরুদ্ধেই চলে:
Prisma v6 (6.16.3)
- • Direct PrismaClient usage
- • Legacy engine architecture
- • Baseline performance metrics
Prisma v7 (7.2.0)
- • Adapter-based architecture
- • @prisma/adapter-pg & adapter-better-sqlite3
- • New engine optimizations
Automated benchmark reports
সব benchmark results স্বয়ংক্রিয়ভাবে generate হয়ে JSON ফাইল হিসেবে সংরক্ষিত থাকে পূর্ণ transparency-র জন্য:
benchmark-results/v6-postgres-latest.json benchmark-results/v7-postgres-latest.json benchmark-results/v6-sqlite-latest.json benchmark-results/v7-sqlite-latest.json প্রতি ফাইলে থাকে: test name, Prisma execution time, generated SQL time, Drizzle time, speedup ratios, এবং ISO timestamp।
Full test suite explore করুন
সব 137 tests open source। Test code, benchmarks, এবং validation logic review করুন।