diff --git a/docs/developer/testing.md b/docs/developer/testing.md new file mode 100644 index 0000000..3f97794 --- /dev/null +++ b/docs/developer/testing.md @@ -0,0 +1,107 @@ +# 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/)