# Testing

This document describes how to run and write tests for Bookhoard.

## Test Users and Email Domains

### Test Email Domain

All integration tests use the email domain **`@tests.bookhoard.internal`** for test users. This domain is reserved exclusively for testing and will never be used in production.

**Why this domain?**

- Clear indication it's for testing only
- Won't conflict with real user emails (which use real domains like `@gmail.com`, `@example.com`, etc.)
- Safe cleanup: Tests can delete all users with this domain without risk to production data
- If a real user somehow uses `@tests.bookhoard.internal`, they are explicitly opting into test data deletion

### Standard Test Users

The test suite creates these standard users:

1. **Admin User**
   - Email: `testuser@tests.bookhoard.internal`
   - Username: `testuser`
   - Password: `Test@Pass123!`
   - Role: `admin`

2. **Regular User**
   - Email: `testregularuser@tests.bookhoard.internal`
   - Username: `testregularuser`
   - Password: `Test@Pass123!`
   - Role: `user`

### Test Lifecycle and Cleanup

Each test run:

1. **Deletes** all existing users with `@tests.bookhoard.internal` email
2. **Creates** fresh standard test users
3. **Runs** the test with clean state
4. **Cleans up** via `t.Cleanup()` to delete users created during the test

This ensures complete test isolation - no state leaks between tests.

### Writing Tests

When writing new tests:

**✅ DO:**

- Use the standard test users from `setupTestServer(t)`
- Use `createRegularUserOnce(t, setup.DB)` for additional test users
- Let the test framework handle cleanup
- Use the `@tests.bookhoard.internal` domain if creating custom test users

**❌ DON'T:**

- Use real email domains like `@example.com` or `@gmail.com`
- Manually manage test user deletion (unless absolutely necessary)
- Assume test users persist between test runs
- Hardcode user IDs (always look up by email/username)

## Running Tests

### Run All Tests

```bash
make test
```

### Run Integration Tests Only

```bash
make test-integration
```

### Run Specific Test

```bash
go test -v -run TestUpdateProfile ./cmd/server/tests/
```

### Run with Race Detection

```bash
go test -race ./cmd/server/tests/
```

## Test Organization

Tests are located in `cmd/server/tests/`:

- `test_helpers.go` - Test utilities and setup functions
- `*_test.go` - Test files organized by feature
  - `user_test.go` - User management tests
  - `auth_test.go` - Authentication tests
  - `media_test.go` - Media item tests
  - etc.

### Key Test Helpers

- `setupTestServer(t *testing.T)` - Creates test server with clean DB state
- `createTestUserOnce(t, db)` - Gets/creates standard admin user
- `createRegularUserOnce(t, db)` - Gets/creates additional test users
- `loginWithCredentials(t, server, email, password)` - Returns auth token

## Bruno API Tests

API integration tests in `bruno/` also use the test email domain:

- Login test: `testuser@tests.bookhoard.internal`
- Register test: `testuser@tests.bookhoard.internal`
- Profile update test: `updated@tests.bookhoard.internal`

See: [Bruno Documentation](https://docs.usebruno.com/)
