Code changes: - main.go: Update cache directory path - sidecar.go: Update file extension (.bookmann.json → .bookhoard.json) - security.go: Update CORS example URLs - queue_test.go: Update test database name - feed_test.go: Update test assertions - phase1_integration_test.go: Update test email addresses - TEST_COVERAGE.md: Update project references Part of project rename to Bookhoard.
394 lines
9.5 KiB
Markdown
394 lines
9.5 KiB
Markdown
# Test Coverage Report
|
|
|
|
This document provides a comprehensive overview of all test scenarios covering possible failure points in the Bookhoard application.
|
|
|
|
## Test Files
|
|
|
|
### 1. registration_test.go
|
|
**Tests for User Registration Endpoint (`POST /api/auth/register`)**
|
|
|
|
#### Success Cases:
|
|
- Valid registration with all fields
|
|
- Valid registration with only required fields
|
|
- Registration with role specified
|
|
|
|
#### Validation Errors:
|
|
- Invalid email format
|
|
- Email already exists
|
|
- Username already exists
|
|
- Username too short (< 3 characters)
|
|
- Username too long (> 50 characters)
|
|
- Password too short (< 6 characters)
|
|
- Missing required fields (email, username, password)
|
|
- Invalid JSON payload
|
|
- Invalid role value
|
|
- Empty email, username, or password
|
|
- Whitespace-only username
|
|
- Empty JSON request body
|
|
|
|
---
|
|
|
|
### 2. login_test.go (Included in registration_test.go)
|
|
**Tests for User Login Endpoint (`POST /api/auth/login`)**
|
|
|
|
#### Success Cases:
|
|
- Valid login with email
|
|
- Valid login with username
|
|
|
|
#### Authentication Errors:
|
|
- Invalid password
|
|
- User not found (invalid credentials)
|
|
|
|
#### Validation Errors:
|
|
- Missing login field
|
|
- Missing password field
|
|
- Empty login or password
|
|
- Invalid JSON payload
|
|
- Empty request body
|
|
|
|
---
|
|
|
|
### 3. ebook_test.go
|
|
**Tests for Ebook and Media Item Endpoints**
|
|
|
|
#### Ebook Endpoints (`/api/ebooks`):
|
|
- `GET /api/ebooks` - List ebooks (with/without auth, pagination)
|
|
- `GET /api/ebooks/:id` - Get specific ebook (invalid UUID, non-existent)
|
|
- `POST /api/ebooks` - Create ebook (admin only, validation)
|
|
- `PUT /api/ebooks/:id` - Update ebook (admin only)
|
|
- `DELETE /api/ebooks/:id` - Delete ebook (admin only)
|
|
|
|
#### Media Item Endpoints (`/api/media-items`):
|
|
- `GET /api/media-items` - List items (with/without library filter, invalid library_id)
|
|
- `GET /api/media-items/:id` - Get specific item (non-existent)
|
|
|
|
#### Reading Progress (`/api/ebooks/:id/progress`):
|
|
- `GET` - Get progress (without auth)
|
|
- `PUT` - Update progress (invalid page numbers, invalid total pages)
|
|
- `DELETE` - Delete progress
|
|
|
|
#### Ratings (`/api/ebooks/:id/rating`):
|
|
- Create rating with invalid scores (0, 11, valid range 1-10)
|
|
- Valid ratings (1, 5, 10)
|
|
|
|
---
|
|
|
|
### 4. user_test.go
|
|
**Tests for User Profile and Account Management**
|
|
|
|
#### Profile Management:
|
|
- `GET /api/auth/profile` - Get profile (without auth, with auth)
|
|
- `PUT /api/auth/profile` - Update profile (without auth, valid data)
|
|
|
|
#### Field Updates:
|
|
- `PUT /api/auth/email`:
|
|
- Update to existing email (conflict)
|
|
- Invalid email format
|
|
- Empty email value
|
|
- `PUT /api/auth/username`:
|
|
- Update to existing username (conflict)
|
|
- Invalid length (too short, too long)
|
|
- `PUT /api/auth/password`:
|
|
- Wrong current password
|
|
- Mismatched passwords
|
|
- New password too short
|
|
- `PUT /api/auth/theme`:
|
|
- Update theme (valid)
|
|
- Empty theme value
|
|
|
|
#### Account Deletion (`DELETE /api/auth/account`):
|
|
- Delete without auth
|
|
- Delete as last admin (forbidden)
|
|
- Delete successfully
|
|
- Admin delete another user
|
|
- Non-admin tries to delete another user (forbidden)
|
|
|
|
#### Admin-Only Endpoints:
|
|
- `GET /api/auth/users` - List users (without admin role, with admin role)
|
|
|
|
#### Scan Settings (`/api/library/scan-settings`):
|
|
- `GET` - Get settings (without auth)
|
|
- `PUT` - Update settings:
|
|
- Invalid frequency (too low, too high)
|
|
- Valid frequency update
|
|
|
|
---
|
|
|
|
### 5. library_test_comprehensive.go
|
|
**Tests for Library Management**
|
|
|
|
#### Library Operations (`/api/libraries`):
|
|
- `POST` - Create library:
|
|
- Without admin role (forbidden)
|
|
- Invalid library type
|
|
- Missing required fields
|
|
- `GET /:id`:
|
|
- Invalid UUID
|
|
- Non-existent library
|
|
- `PUT /:id`:
|
|
- Without admin role (forbidden)
|
|
- `DELETE /:id`:
|
|
- Without admin role (forbidden)
|
|
- Invalid UUID
|
|
|
|
#### Library Folders (`/api/libraries/:id/folders`):
|
|
- `POST` - Add folder:
|
|
- Without admin role
|
|
- Invalid library ID
|
|
- Missing folder path
|
|
- `GET` - Get folders:
|
|
- Without admin role
|
|
- `DELETE` - Delete folder:
|
|
- Without admin role
|
|
|
|
#### Library Visibility (`/api/libraries/visibility`):
|
|
- `POST` - Set visibility:
|
|
- Without auth
|
|
- Invalid library ID
|
|
- Successful update
|
|
- `GET /visible` - Get visible libraries:
|
|
- Without auth
|
|
- With auth
|
|
|
|
#### Library Statistics (`/api/libraries/:id/stats`):
|
|
- `GET`:
|
|
- Without admin role
|
|
- Invalid library ID
|
|
- Successful retrieval
|
|
|
|
#### Library Types (`/api/libraries/types`):
|
|
- `GET` - Get all library types
|
|
|
|
---
|
|
|
|
### 6. edge_cases_test.go
|
|
**Tests for Edge Cases and Special Scenarios**
|
|
|
|
#### Scanner Endpoints (`/api/scanner`):
|
|
- `POST /scan`:
|
|
- Without admin role
|
|
- Without folder paths
|
|
- Invalid folder paths
|
|
- Successful scan
|
|
- `POST /start`:
|
|
- Without admin role
|
|
- Successful start
|
|
- `POST /stop`:
|
|
- Without admin role
|
|
- Successful stop
|
|
|
|
#### Edge Cases:
|
|
- Empty request body
|
|
- Malformed JSON
|
|
- Very large payload
|
|
- SQL injection attempt
|
|
- XSS attempt in fields
|
|
- Rate limiting simulation
|
|
|
|
#### HTMX-Specific Responses:
|
|
- Registration with HTMX header (HTML response with script)
|
|
- Registration error with HTMX header (HTML error message)
|
|
|
|
#### Concurrent Requests:
|
|
- Multiple concurrent requests (basic load testing)
|
|
|
|
#### JWT Validation:
|
|
- Valid JWT format
|
|
- No Bearer prefix
|
|
- Malformed JWT
|
|
|
|
#### Pagination and Filtering:
|
|
- Negative limit
|
|
- Negative offset
|
|
- Very large limit
|
|
- Valid pagination parameters
|
|
|
|
---
|
|
|
|
### 7. auth_test.go (Existing)
|
|
**Tests for Authentication Middleware**
|
|
|
|
#### JWT Middleware:
|
|
- Missing JWT header
|
|
- Invalid JWT format
|
|
- Valid JWT format
|
|
|
|
#### Library Access Control:
|
|
- Library creation without admin (unauthorized)
|
|
- Library creation with valid admin
|
|
- Library types response
|
|
- User visible libraries
|
|
- Media items list with filtering
|
|
- JSON validation
|
|
- Error handling
|
|
|
|
---
|
|
|
|
### 8. notes_highlights_test.go (Existing)
|
|
**Tests for Media Notes and Highlights**
|
|
|
|
#### Notes (`/api/media-items/:id/notes`):
|
|
- GET without auth
|
|
- POST validation (empty content)
|
|
- Valid note creation payload
|
|
|
|
#### Highlights (`/api/media-items/:id/highlights`):
|
|
- GET without auth
|
|
- POST validation (empty selection)
|
|
- Valid highlight creation
|
|
- Color validation
|
|
|
|
#### Backward Compatibility (`/api/ebooks/:id/notes` and `/highlights`):
|
|
- GET without auth for both
|
|
|
|
---
|
|
|
|
### 9. library_test.go (Existing)
|
|
**Tests for Library Features**
|
|
|
|
#### Comprehensive Library Tests:
|
|
- Auth middleware variations
|
|
- Library creation authorization
|
|
- Library types response
|
|
- User library visibility
|
|
- Media items list
|
|
- JSON validation scenarios
|
|
- Error handling scenarios
|
|
|
|
---
|
|
|
|
### 10. setup_test.go, main_test.go, testrunner_test.go (Existing)
|
|
**Test Infrastructure**
|
|
|
|
- Basic test setup verification
|
|
- Test runner verification
|
|
- Simple setup tests
|
|
|
|
---
|
|
|
|
## Summary of Test Coverage by Component
|
|
|
|
### Authentication & Authorization
|
|
✅ Registration (all validation cases)
|
|
✅ Login (authentication failures)
|
|
✅ JWT validation (format, expiration, etc.)
|
|
✅ Role-based access control (admin vs user)
|
|
✅ Profile management
|
|
✅ Password updates
|
|
✅ Account deletion (including last admin protection)
|
|
|
|
### User Management
|
|
✅ Email updates (validation, conflicts)
|
|
✅ Username updates (validation, conflicts)
|
|
✅ Theme updates
|
|
✅ Admin-only endpoints
|
|
✅ User list (admin only)
|
|
✅ Scan settings management
|
|
|
|
### Library Management
|
|
✅ Create/Read/Update/Delete libraries (admin only)
|
|
✅ Library types
|
|
✅ Library folder management
|
|
✅ Library visibility controls
|
|
✅ Library statistics
|
|
✅ Invalid UUID handling
|
|
|
|
### Media/Ebook Management
|
|
✅ List media items (with filtering)
|
|
✅ Create/Update/Delete ebooks (admin only)
|
|
✅ Reading progress (CRUD operations)
|
|
✅ Ratings (validation, CRUD operations)
|
|
✅ Invalid UUID handling
|
|
✅ Non-existent resource handling
|
|
|
|
### Notes & Highlights
|
|
✅ Notes CRUD operations
|
|
✅ Highlights CRUD operations
|
|
✅ Content validation
|
|
✅ Color validation
|
|
✅ Backward compatibility with ebook endpoints
|
|
|
|
### Scanner Operations
|
|
✅ Scan operations (admin only)
|
|
✅ Start/stop scanner (admin only)
|
|
✅ Invalid folder path handling
|
|
✅ Missing folder path validation
|
|
|
|
### Security & Edge Cases
|
|
✅ SQL injection attempts
|
|
✅ XSS attempts
|
|
✅ Rate limiting
|
|
✅ Large payload handling
|
|
✅ Malformed JSON
|
|
✅ Empty request bodies
|
|
✅ Concurrent requests
|
|
|
|
### API Behavior
|
|
✅ HTMX-specific responses
|
|
✅ JSON validation
|
|
✅ Pagination (negative, too large, valid)
|
|
✅ Query parameter validation
|
|
✅ Error response formats
|
|
|
|
---
|
|
|
|
## Areas for Further Testing
|
|
|
|
### Integration Tests (Not Yet Implemented)
|
|
- Full user flow: Register → Login → Create library → Scan → Read
|
|
- End-to-end database operations
|
|
- File system operations (scanner)
|
|
|
|
### Performance Tests (Not Yet Implemented)
|
|
- Large dataset handling
|
|
- Concurrent user load
|
|
- Memory usage under load
|
|
|
|
### Database Tests (Not Yet Implemented)
|
|
- Database connection failures
|
|
- Query timeouts
|
|
- Constraint violations
|
|
- Transaction rollback scenarios
|
|
|
|
### File System Tests (Not Yet Implemented)
|
|
- Scanner with real ebook files
|
|
- Cover image handling
|
|
- File permission errors
|
|
- Disk space errors
|
|
|
|
---
|
|
|
|
## Running Tests
|
|
|
|
### Run all tests:
|
|
```bash
|
|
go test ./cmd/server/tests/...
|
|
```
|
|
|
|
### Run specific test file:
|
|
```bash
|
|
go test -v ./cmd/server/tests/registration_test.go
|
|
```
|
|
|
|
### Run with coverage:
|
|
```bash
|
|
go test -cover ./cmd/server/tests/...
|
|
```
|
|
|
|
### Run specific test case:
|
|
```bash
|
|
go test -v -run TestRegistration/Invalid_email_format ./cmd/server/tests/...
|
|
```
|
|
|
|
---
|
|
|
|
## Notes
|
|
|
|
- All tests follow the AAA (Arrange, Act, Assert) pattern
|
|
- Tests use httptest for HTTP handler testing
|
|
- Mock handlers simulate actual application behavior
|
|
- Both positive and negative test cases are covered
|
|
- Security scenarios (SQL injection, XSS) are tested
|
|
- Role-based access is thoroughly tested
|
|
- Input validation is comprehensively covered
|