mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2025-12-13 17:10:36 +00:00
266 lines
6.7 KiB
Markdown
266 lines
6.7 KiB
Markdown
# Integration Tests
|
|
|
|
This document describes how to run integration tests for ResolveSpec packages with a PostgreSQL database.
|
|
|
|
## Overview
|
|
|
|
Integration tests validate the full functionality of both `pkg/resolvespec` and `pkg/restheadspec` packages with an actual PostgreSQL database. These tests cover:
|
|
|
|
- CRUD operations (Create, Read, Update, Delete)
|
|
- Filtering and sorting
|
|
- Pagination
|
|
- Column selection
|
|
- Relationship preloading
|
|
- Metadata generation
|
|
- Query parameter parsing
|
|
- CORS handling
|
|
|
|
## Prerequisites
|
|
|
|
- Go 1.19 or later
|
|
- PostgreSQL 12 or later
|
|
- Docker and Docker Compose (optional, for easy setup)
|
|
|
|
## Quick Start with Docker
|
|
|
|
### 1. Start PostgreSQL with Docker Compose
|
|
|
|
```bash
|
|
docker-compose up -d postgres-test
|
|
```
|
|
|
|
This starts a PostgreSQL container with the following default settings:
|
|
- Host: localhost
|
|
- Port: 5432
|
|
- User: postgres
|
|
- Password: postgres
|
|
- Databases: resolvespec_test, restheadspec_test
|
|
|
|
### 2. Run Integration Tests
|
|
|
|
```bash
|
|
# Run all integration tests
|
|
go test -tags=integration ./pkg/resolvespec ./pkg/restheadspec -v
|
|
|
|
# Run only resolvespec integration tests
|
|
go test -tags=integration ./pkg/resolvespec -v
|
|
|
|
# Run only restheadspec integration tests
|
|
go test -tags=integration ./pkg/restheadspec -v
|
|
```
|
|
|
|
### 3. Stop PostgreSQL
|
|
|
|
```bash
|
|
docker-compose down
|
|
```
|
|
|
|
## Manual PostgreSQL Setup
|
|
|
|
If you prefer to use an existing PostgreSQL installation:
|
|
|
|
### 1. Create Test Databases
|
|
|
|
```sql
|
|
CREATE DATABASE resolvespec_test;
|
|
CREATE DATABASE restheadspec_test;
|
|
```
|
|
|
|
### 2. Set Environment Variable
|
|
|
|
```bash
|
|
# For resolvespec tests
|
|
export TEST_DATABASE_URL="host=localhost user=postgres password=yourpassword dbname=resolvespec_test port=5432 sslmode=disable"
|
|
|
|
# For restheadspec tests (uses same env var with different dbname)
|
|
export TEST_DATABASE_URL="host=localhost user=postgres password=yourpassword dbname=restheadspec_test port=5432 sslmode=disable"
|
|
```
|
|
|
|
### 3. Run Tests
|
|
|
|
```bash
|
|
go test -tags=integration ./pkg/resolvespec ./pkg/restheadspec -v
|
|
```
|
|
|
|
## Test Coverage
|
|
|
|
### pkg/resolvespec Integration Tests
|
|
|
|
| Test | Description |
|
|
|------|-------------|
|
|
| `TestIntegration_CreateOperation` | Tests creating new records via API |
|
|
| `TestIntegration_ReadOperation` | Tests reading all records with pagination |
|
|
| `TestIntegration_ReadWithFilters` | Tests filtering records (e.g., age > 25) |
|
|
| `TestIntegration_UpdateOperation` | Tests updating existing records |
|
|
| `TestIntegration_DeleteOperation` | Tests deleting records |
|
|
| `TestIntegration_MetadataOperation` | Tests retrieving table metadata |
|
|
| `TestIntegration_ReadWithPreload` | Tests eager loading relationships |
|
|
|
|
### pkg/restheadspec Integration Tests
|
|
|
|
| Test | Description |
|
|
|------|-------------|
|
|
| `TestIntegration_GetAllUsers` | Tests GET request to retrieve all records |
|
|
| `TestIntegration_GetUsersWithFilters` | Tests header-based filtering |
|
|
| `TestIntegration_GetUsersWithPagination` | Tests limit/offset pagination |
|
|
| `TestIntegration_GetUsersWithSorting` | Tests sorting by column |
|
|
| `TestIntegration_GetUsersWithColumnsSelection` | Tests selecting specific columns |
|
|
| `TestIntegration_GetUsersWithPreload` | Tests relationship preloading |
|
|
| `TestIntegration_GetMetadata` | Tests metadata endpoint |
|
|
| `TestIntegration_OptionsRequest` | Tests OPTIONS/CORS handling |
|
|
| `TestIntegration_QueryParamsOverHeaders` | Tests query param precedence |
|
|
| `TestIntegration_GetSingleRecord` | Tests retrieving single record by ID |
|
|
|
|
## Test Data
|
|
|
|
Integration tests use the following test models:
|
|
|
|
### TestUser
|
|
```go
|
|
type TestUser struct {
|
|
ID uint
|
|
Name string
|
|
Email string (unique)
|
|
Age int
|
|
Active bool
|
|
CreatedAt time.Time
|
|
Posts []TestPost
|
|
}
|
|
```
|
|
|
|
### TestPost
|
|
```go
|
|
type TestPost struct {
|
|
ID uint
|
|
UserID uint
|
|
Title string
|
|
Content string
|
|
Published bool
|
|
CreatedAt time.Time
|
|
User *TestUser
|
|
Comments []TestComment
|
|
}
|
|
```
|
|
|
|
### TestComment
|
|
```go
|
|
type TestComment struct {
|
|
ID uint
|
|
PostID uint
|
|
Content string
|
|
CreatedAt time.Time
|
|
Post *TestPost
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Connection Refused
|
|
|
|
If you see "connection refused" errors:
|
|
|
|
1. Check that PostgreSQL is running:
|
|
```bash
|
|
docker-compose ps
|
|
```
|
|
|
|
2. Verify connection parameters:
|
|
```bash
|
|
psql -h localhost -U postgres -d resolvespec_test
|
|
```
|
|
|
|
3. Check firewall settings if using remote PostgreSQL
|
|
|
|
### Permission Denied
|
|
|
|
Ensure the PostgreSQL user has necessary permissions:
|
|
|
|
```sql
|
|
GRANT ALL PRIVILEGES ON DATABASE resolvespec_test TO postgres;
|
|
GRANT ALL PRIVILEGES ON DATABASE restheadspec_test TO postgres;
|
|
```
|
|
|
|
### Tests Fail with "relation does not exist"
|
|
|
|
The tests automatically run migrations, but if you encounter this error:
|
|
|
|
1. Ensure your DATABASE_URL environment variable is correct
|
|
2. Check that the database exists
|
|
3. Verify the user has CREATE TABLE permissions
|
|
|
|
### Clean Database Between Runs
|
|
|
|
Each test automatically cleans up its data using `TRUNCATE`. If you need a fresh database:
|
|
|
|
```bash
|
|
# Stop and remove containers (removes data)
|
|
docker-compose down -v
|
|
|
|
# Restart
|
|
docker-compose up -d postgres-test
|
|
```
|
|
|
|
## CI/CD Integration
|
|
|
|
### GitHub Actions Example
|
|
|
|
```yaml
|
|
name: Integration Tests
|
|
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres:15
|
|
env:
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_DB: resolvespec_test
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
ports:
|
|
- 5432:5432
|
|
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v4
|
|
with:
|
|
go-version: '1.21'
|
|
|
|
- name: Run integration tests
|
|
env:
|
|
TEST_DATABASE_URL: "host=localhost user=postgres password=postgres dbname=resolvespec_test port=5432 sslmode=disable"
|
|
run: |
|
|
go test -tags=integration ./pkg/resolvespec -v
|
|
go test -tags=integration ./pkg/restheadspec -v
|
|
```
|
|
|
|
## Performance Considerations
|
|
|
|
- Integration tests are slower than unit tests due to database I/O
|
|
- Each test sets up and tears down test data
|
|
- Consider running integration tests separately from unit tests in CI/CD
|
|
- Use connection pooling for better performance
|
|
|
|
## Best Practices
|
|
|
|
1. **Isolation**: Each test cleans up its data using TRUNCATE
|
|
2. **Independent**: Tests don't depend on each other's state
|
|
3. **Idempotent**: Tests can be run multiple times safely
|
|
4. **Fast Setup**: Migrations run automatically
|
|
5. **Flexible**: Works with any PostgreSQL instance via environment variables
|
|
|
|
## Additional Resources
|
|
|
|
- [PostgreSQL Docker Image](https://hub.docker.com/_/postgres)
|
|
- [GORM Documentation](https://gorm.io/)
|
|
- [Testing in Go](https://golang.org/doc/tutorial/add-a-test)
|