Permit integration - part 1 * WIP permit integration * slim down build * Merge branch 'main' of bitbucket.org:aarete/query-orchestration into feature/permit-integration-1 * omit swagger from auth * clean build * comment * part 1 completed this is the initial permitio parts and tests without integration. Also testing.md since we have a new test target `task test:permitio` * feature flag for no jwt validation * permit integration * fix ci unit tests * ci fix * build fix * fix home handler * fix redirect * test fix * update docs for auth
7.6 KiB
Testing Documentation
This document describes all available test targets in the Task build system and their specific purposes.
Primary Test Suites
task test:functional
Default comprehensive test suite with intelligent incremental testing
- Purpose: Main test runner that adapts behavior based on context
- Unique Features:
- Incremental Mode (default): Only tests packages affected by changes since
origin/main - Coverage Merging: Maintains cumulative coverage across incremental runs
- Full Fallback: Automatically runs full suite if no baseline exists or git branch issues
- Incremental Mode (default): Only tests packages affected by changes since
- Coverage: 80% total threshold, 60% function threshold
- Parallelism: Minimal settings to avoid resource contention (GOMAXPROCS=2, -p 1, -parallel 2)
- Use Case: Development workflow, pre-commit checks
task test:functional:full
Complete test suite with coverage reset
- Purpose: Run all tests from scratch, ignoring previous coverage
- Unique Features:
- Deletes existing coverage file before running
- Forces full test execution regardless of git changes
- Use Case: Clean slate testing, debugging coverage issues, release validation
task fullsuite:ci
CI/CD optimized complete workflow
- Purpose: Full build, lint, and test pipeline for continuous integration
- Unique Features:
- Forces
INCREMENTAL=falseto ensure all tests run - Includes generation, building, linting, and testing
- No shortcuts or incremental optimizations
- Forces
- Use Case: CI/CD pipelines, release builds, comprehensive validation
Specialized Test Types
task test:race
Race condition detection
- Purpose: Detect data races and concurrency issues
- Unique Features: Uses Go's
-raceflag to detect race conditions - Use Case: Debugging concurrency issues, ensuring thread safety
task test:unit:short
Fast unit tests only
- Purpose: Quick feedback loop for development
- Unique Features:
- Uses
-shortflag to skip long-running tests - Focuses on
./internal/...and./api/...packages only - Generates mocks automatically before running
- Uses
- Use Case: Rapid development feedback, pre-commit quick checks
task test:permitio
Permit.io integration tests
- Purpose: Run tests that require local Permit.io PDP service
- Unique Features:
- Uses
-tags=permitioto include only tagged integration tests - Requires
PERMIT_IO_API_KEYenvironment variable - Requires local PDP running on port 7766
- Provides clear error messages about requirements
- Uses
- Use Case: Testing authorization integration, local development with full Permit.io stack
task test:bench
Benchmark testing
- Purpose: Performance testing and optimization
- Unique Features:
- Runs only benchmark functions (
-run ^Benchmark) - Uses
benchstatfor statistical analysis of results - Outputs performance metrics to
out/bench.out
- Runs only benchmark functions (
- Use Case: Performance optimization, regression testing for speed
Performance Analysis
task test:perf
Performance profiling and slowest test identification
- Purpose: Identify performance bottlenecks in the test suite
- Unique Features:
- Reports top 5 slowest packages
- Reports top 5 slowest individual tests
- Deep-dives into slowest package for detailed analysis
- Uses JSON output for precise timing analysis
- Use Case: Test suite optimization, CI performance tuning
task test:mem
Memory usage analysis
- Purpose: Monitor memory consumption across test packages
- Unique Features:
- Runs tests with memory profiling for each package
- Ranks packages by memory usage (top 5)
- Provides total memory consumption summary
- Individual timeout protection (120s per package)
- Use Case: Memory optimization, resource planning, leak detection
task test:timeline
Visual test execution timeline
- Purpose: Visualize test execution flow and timing
- Unique Features:
- Uses JSON output piped to visual timeline generator
- Shows parallel execution patterns
- Helps identify bottlenecks and optimization opportunities
- Use Case: Understanding test execution patterns, optimization planning
Test Infrastructure
task test:mocks:generate
Mock generation for testing
- Purpose: Generate test mocks from interfaces
- Unique Features:
- Uses mockery tool to auto-generate mocks
- Clears existing mocks before regeneration
- Runs only once per task execution cycle
- Use Case: Maintaining test isolation, dependency mocking
task test:wait
Test environment preparation
- Purpose: Ensure clean test environment before running tests
- Unique Features:
- Waits for testcontainers cleanup (Ryuk containers)
- Prunes Docker containers and volumes
- Prevents resource conflicts between test runs
- Use Case: Test environment hygiene, CI stability
task test:prune
Docker resource cleanup
- Purpose: Clean up Docker resources left by tests
- Unique Features:
- Force removes unused containers and volumes
- Prevents disk space issues from accumulated test artifacts
- Use Case: Resource management, CI environment maintenance
Visualization and Analysis
task test:graph
Resource usage visualization during testing
- Purpose: Monitor system resources during test execution
- Unique Features:
- Uses
psrecordto track CPU/memory duringtest:functional - Generates visual plots of resource usage
- Includes child processes in monitoring
- Uses
- Use Case: Performance analysis, resource optimization
task fullsuite:graph
Complete build and test resource monitoring
- Purpose: Monitor resources during entire build and test cycle
- Unique Features: Same as
test:graphbut for the completefullsuiteworkflow - Use Case: End-to-end performance analysis, CI optimization
Test Execution Patterns
Incremental Testing Logic
The test:functional target implements sophisticated incremental testing:
-
Full Mode Triggers:
INCREMENTAL=falseexplicitly set- No existing coverage file found
- Cannot find
origin/mainbranch reference
-
Incremental Mode:
- Compares against
origin/mainbranch - Only tests packages with changed Go files
- Merges coverage with existing baseline
- Skips testing if no Go files changed
- Compares against
-
Coverage Merging:
- Preserves existing coverage for unchanged packages
- Adds new coverage for changed packages
- Maintains comprehensive coverage metrics
Parallelism Settings
All test targets use conservative parallelism to avoid resource contention:
- GOMAXPROCS: 2 (fixed minimal value)
- Package Parallelism: 1 (single package at a time)
- Test Parallelism: 2 (minimal test parallelism)
This ensures stable execution in resource-constrained environments like CI.
Usage Recommendations
- Development: Use
task test:functionalfor normal development workflow - Pre-commit: Use
task test:unit:shortfor quick feedback - CI/CD: Use
task fullsuite:cifor comprehensive validation - Performance: Use
task test:perfandtask test:memfor optimization - Debugging: Use
task test:racefor concurrency issues - Clean Slate: Use
task test:functional:fullwhen coverage gets corrupted - Permit.io Integration: Use
task test:permitiofor testing authorization features with local PDP
Integration with Build Tags
Some tests may use build tags to control execution:
- Tests requiring external services (like Permit.io PDP) may be tagged
- Use
-tags=tagnamewithgo testcommands to include tagged tests - CI typically excludes integration tests that require external dependencies