253 lines
6.4 KiB
Markdown
253 lines
6.4 KiB
Markdown
# Testing Guide
|
|
|
|
This document describes the test suite for the StreamRecorder application.
|
|
|
|
## Overview
|
|
|
|
The test suite provides comprehensive coverage of core application components without requiring external dependencies like video files, NAS connectivity, or FFmpeg. All tests are self-contained and clean up after themselves.
|
|
|
|
## Test Structure
|
|
|
|
### Unit Tests by Package
|
|
|
|
#### `pkg/config`
|
|
- **File**: `config_test.go`
|
|
- **Coverage**: Configuration loading, environment variable override, path validation, validation errors
|
|
- **Key Tests**:
|
|
- Default config loading
|
|
- Environment variable overrides
|
|
- Path resolution and creation
|
|
- Validation error scenarios
|
|
|
|
#### `pkg/utils`
|
|
- **File**: `paths_test.go`
|
|
- **Coverage**: Cross-platform path utilities, directory operations, validation
|
|
- **Key Tests**:
|
|
- Safe path joining
|
|
- Directory creation
|
|
- Path existence checking
|
|
- Path validation
|
|
- Write permission testing
|
|
|
|
#### `pkg/constants`
|
|
- **File**: `constants_test.go`
|
|
- **Coverage**: Constants values, configuration singleton, integration
|
|
- **Key Tests**:
|
|
- Constant value verification
|
|
- Singleton pattern testing
|
|
- Config integration
|
|
- Concurrent access safety
|
|
|
|
#### `pkg/httpClient`
|
|
- **File**: `error_test.go`
|
|
- **Coverage**: HTTP error handling, status code management
|
|
- **Key Tests**:
|
|
- HTTP error creation and formatting
|
|
- Error comparison and detection
|
|
- Status code extraction
|
|
- Error wrapping support
|
|
|
|
#### `pkg/media`
|
|
- **File**: `manifest_test.go`
|
|
- **Coverage**: Manifest generation, segment tracking, JSON serialization
|
|
- **Key Tests**:
|
|
- Manifest writer initialization
|
|
- Segment addition and updates
|
|
- Quality resolution logic
|
|
- JSON file generation
|
|
- Sorting and deduplication
|
|
|
|
#### `pkg/processing`
|
|
- **File**: `service_test.go`
|
|
- **Coverage**: Processing service logic, path resolution, FFmpeg handling
|
|
- **Key Tests**:
|
|
- Service initialization
|
|
- Event directory scanning
|
|
- Resolution detection
|
|
- Segment aggregation
|
|
- File concatenation list generation
|
|
- FFmpeg path resolution
|
|
|
|
## Running Tests
|
|
|
|
### Quick Test Run
|
|
```bash
|
|
make test
|
|
```
|
|
|
|
### Verbose Output
|
|
```bash
|
|
make test-verbose
|
|
```
|
|
|
|
### Coverage Report
|
|
```bash
|
|
make test-coverage
|
|
```
|
|
Generates `coverage.html` with detailed coverage report.
|
|
|
|
### Test Specific Package
|
|
```bash
|
|
make test-pkg PKG=./pkg/config
|
|
```
|
|
|
|
### Manual Test Execution
|
|
```bash
|
|
# Run custom test runner
|
|
go run test_runner.go
|
|
|
|
# Run standard go test
|
|
go test ./pkg/...
|
|
|
|
# Run with coverage
|
|
go test -coverprofile=coverage.out ./pkg/...
|
|
go tool cover -html=coverage.out
|
|
```
|
|
|
|
## Test Features
|
|
|
|
### ✅ Self-Contained
|
|
- No external file dependencies
|
|
- No network connections required
|
|
- No NAS or FFmpeg installation needed
|
|
|
|
### ✅ Automatic Cleanup
|
|
- All temporary files/directories removed after tests
|
|
- Original environment variables restored
|
|
- No side effects on host system
|
|
|
|
### ✅ Isolated Environment
|
|
- Tests use temporary directories
|
|
- Environment variables safely overridden
|
|
- Configuration isolated from production settings
|
|
|
|
### ✅ Cross-Platform
|
|
- Path handling tested on Windows/Unix
|
|
- Platform-specific behavior validated
|
|
- Cross-platform compatibility verified
|
|
|
|
### ✅ Comprehensive Coverage
|
|
- Configuration management
|
|
- Path utilities and validation
|
|
- Error handling patterns
|
|
- Data structures and serialization
|
|
- Business logic without external dependencies
|
|
|
|
## Test Environment
|
|
|
|
The test suite automatically:
|
|
|
|
1. **Creates Temporary Workspace**: Each test run uses a fresh temporary directory
|
|
2. **Sets Test Environment**: Overrides environment variables to use test settings
|
|
3. **Disables External Dependencies**: Sets flags to disable NAS transfer and processing
|
|
4. **Cleans Up Completely**: Removes all test artifacts and restores environment
|
|
|
|
### Environment Variables Set During Tests
|
|
- `LOCAL_OUTPUT_DIR`: Points to temp directory
|
|
- `PROCESS_OUTPUT_DIR`: Points to temp directory
|
|
- `ENABLE_NAS_TRANSFER`: Set to `false`
|
|
- `PROCESSING_ENABLED`: Set to `false`
|
|
|
|
## Extending Tests
|
|
|
|
### Adding New Test Cases
|
|
|
|
1. **Create test file**: `pkg/yourpackage/yourfile_test.go`
|
|
2. **Follow naming convention**: `TestFunctionName`
|
|
3. **Use temp directories**: Always clean up created files
|
|
4. **Mock external dependencies**: Avoid real file operations where possible
|
|
|
|
### Test Template
|
|
```go
|
|
package yourpackage
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
func TestYourFunction(t *testing.T) {
|
|
// Setup
|
|
tempDir, err := os.MkdirTemp("", "test_*")
|
|
if err != nil {
|
|
t.Fatalf("Setup failed: %v", err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Test logic
|
|
result := YourFunction()
|
|
|
|
// Assertions
|
|
if result != expected {
|
|
t.Errorf("Expected %v, got %v", expected, result)
|
|
}
|
|
}
|
|
```
|
|
|
|
### Best Practices
|
|
|
|
- **Always clean up**: Use `defer os.RemoveAll()` for temp directories
|
|
- **Test error cases**: Don't just test happy paths
|
|
- **Use table-driven tests**: For multiple similar test cases
|
|
- **Mock external dependencies**: Use echo/dummy commands instead of real tools
|
|
- **Validate cleanup**: Ensure tests don't leave artifacts
|
|
|
|
## CI/CD Integration
|
|
|
|
The test suite is designed for automated environments:
|
|
|
|
```bash
|
|
# Complete CI pipeline
|
|
make ci
|
|
|
|
# Just run tests in CI
|
|
make test
|
|
```
|
|
|
|
The custom test runner provides:
|
|
- ✅ Colored output for easy reading
|
|
- ✅ Test count and timing statistics
|
|
- ✅ Failure details and summaries
|
|
- ✅ Automatic environment management
|
|
- ✅ Exit codes for CI integration
|
|
|
|
## Troubleshooting
|
|
|
|
### Common Issues
|
|
|
|
**Tests fail with permission errors**
|
|
- Ensure write permissions in temp directory
|
|
- Check antivirus software isn't blocking file operations
|
|
|
|
**Config tests fail**
|
|
- Verify no conflicting environment variables are set
|
|
- Check that temp directories can be created
|
|
|
|
**Path tests fail on Windows**
|
|
- Confirm path separator handling is correct
|
|
- Verify Windows path validation logic
|
|
|
|
### Debug Mode
|
|
```bash
|
|
# Run with verbose output to see detailed failures
|
|
go test -v ./pkg/...
|
|
|
|
# Run specific failing test
|
|
go test -v -run TestSpecificFunction ./pkg/config
|
|
```
|
|
|
|
## Coverage Goals
|
|
|
|
Current test coverage targets:
|
|
- **Configuration**: 95%+ (critical for startup validation)
|
|
- **Path utilities**: 90%+ (cross-platform compatibility critical)
|
|
- **Constants**: 85%+ (verify all values and singleton behavior)
|
|
- **HTTP client**: 90%+ (error handling is critical)
|
|
- **Media handling**: 85%+ (core business logic)
|
|
- **Processing**: 70%+ (limited by external FFmpeg dependency)
|
|
|
|
Generate coverage report to verify:
|
|
```bash
|
|
make test-coverage
|
|
open coverage.html
|
|
``` |