# 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
```