Files
psf-bch-api/dev-docs/test-plan-for-rest2nostr.plan.md
T

161 lines
5.8 KiB
Markdown
Raw Permalink Normal View History

2025-11-09 16:16:37 -08:00
# Test Plan for REST2NOSTR Application
## Overview
Create unit and integration tests for the REST2NOSTR Express.js application following patterns from `tests/testing-example-code/`. Tests will use mocha, chai, and sinon, and cover all code paths exercised by the examples in `/app/examples/`.
## Test Structure
Create test directory structure:
- `app/test/unit/` - Unit tests with mocked dependencies
- `app/test/integration/` - Integration tests with real dependencies
- `app/test/unit/mocks/` - Mock data for unit tests
## Unit Tests
### 1. Entity Tests (`test/unit/entities/`)
- **event-unit.js**: Test Event entity validation and serialization
- Test `isValid()` with valid events
- Test `isValid()` with invalid events (missing fields, wrong types, wrong lengths)
- Test `toJSON()` serialization
- Use mock event data from `mocks/event-mocks.js`
### 2. Use Case Tests (`test/unit/use-cases/`)
- **publish-event-unit.js**: Test PublishEventUseCase
- Mock NostrRelayAdapter.sendEvent()
- Test successful event publishing
- Test invalid event rejection
- Test adapter error handling
- Use mocks from `mocks/nostr-relay-mocks.js`
- **query-events-unit.js**: Test QueryEventsUseCase
- Mock NostrRelayAdapter.sendReq() and sendClose()
- Test successful query with events returned
- Test query timeout handling
- Test CLOSED message handling
- Test EOSE handling
- **manage-subscription-unit.js**: Test ManageSubscriptionUseCase
- Mock NostrRelayAdapter.sendReq() and sendClose()
- Test subscription creation
- Test subscription closure
- Test duplicate subscription prevention
- Test handler callbacks (onEvent, onEose, onClosed)
### 3. Controller Tests (`test/unit/controllers/`)
- **event-controller-unit.js**: Test EventRESTControllerLib
- Mock UseCases.publishEvent.execute()
- Test POST /event with valid event data
- Test POST /event with missing event data
- Test error handling
- Use Express request/response mocks
- **req-controller-unit.js**: Test ReqRESTControllerLib
- Mock UseCases.queryEvents.execute() and manageSubscription methods
- Test GET /req/:subId with filters (JSON string and parsed)
- Test GET /req/:subId with individual query params
- Test POST /req/:subId for SSE subscription
- Test DELETE /req/:subId for closing subscription
- Test error handling for invalid filters
- Test missing subscription ID validation
### 4. Adapter Tests (`test/unit/adapters/`)
- **nostr-relay-unit.js**: Test NostrRelayAdapter
- Mock WebSocket connections
- Test connection establishment
- Test sendEvent() and OK response handling
- Test sendReq() and EVENT/EOSE/CLOSED message handling
- Test sendClose()
- Test message queuing when disconnected
- Test reconnection logic
- Test error handling
### 5. Server Tests (`test/unit/bin/`)
- **server-unit.js**: Test Server class
- Mock Express app, Controllers, and adapters
- Test server initialization
- Test middleware attachment
- Test route attachment
- Test error handling
- Test health check endpoint
## Integration Tests
### 1. API Endpoint Tests (`test/integration/api/`)
- **event-integration.js**: Test POST /event endpoint
- Create a test server instance
- Test publishing kind 0 event (profile metadata) - covers example 01
- Test publishing kind 1 event (text post) - covers example 03
- Test publishing kind 3 event (follow list) - covers example 06
- Test publishing kind 7 event (reaction/like) - covers example 07
- Test invalid event rejection
- Use real Nostr relay connection (may need test relay or mock relay)
- **req-integration.js**: Test GET /req/:subId endpoint
- Create a test server instance
- Test querying kind 1 events (posts) - covers examples 02, 04
- Test querying kind 3 events (follow list) - covers example 05
- Test with various filter combinations
- Test with filters as JSON string query param
- Test with individual query params
- Test error handling
- **subscription-integration.js**: Test POST /req/:subId SSE subscription
- Create a test server instance
- Test SSE subscription creation
- Test event streaming
- Test EOSE handling
- Test subscription closure
- Test DELETE /req/:subId endpoint
### 2. Use Case Integration Tests (`test/integration/use-cases/`)
- **publish-event-integration.js**: Test PublishEventUseCase with real adapter
- **query-events-integration.js**: Test QueryEventsUseCase with real adapter
- **manage-subscription-integration.js**: Test ManageSubscriptionUseCase with real adapter
## Mock Data Files
Create mock data files in `test/unit/mocks/`:
- **event-mocks.js**: Mock event data for various event kinds (0, 1, 3, 7)
- **nostr-relay-mocks.js**: Mock responses from Nostr relay (OK, EVENT, EOSE, CLOSED)
- **controller-mocks.js**: Mock Express request/response objects
## Key Considerations
1. **ES Modules**: The app uses ES modules (import/export) while the example uses CommonJS. Tests should use ES modules with `.js` extension and proper import syntax.
2. **Test Environment**: Integration tests will need a running Nostr relay. Consider:
- Using a test relay URL from config
- Or creating a mock WebSocket server for integration tests
- Or documenting that tests require a relay URL in environment
3. **Test Coverage**: Ensure tests cover:
- All endpoints used by examples (POST /event, GET /req/:subId)
- All event kinds (0, 1, 3, 7)
- Error paths and edge cases
- Validation logic
4. **Test Data**: Use the same test keys and data patterns from examples where applicable (e.g., Alice's private key, Bob's public key)
5. **Async Handling**: Properly handle async/await in tests, especially for WebSocket operations and SSE streams
6. **Cleanup**: Ensure proper cleanup of WebSocket connections and subscriptions in tests
## Test Execution
Tests will run using existing npm scripts:
- `npm test` - Runs unit tests with linting and coverage
- `npm run test:integration` - Runs integration tests with extended timeout
- `npm run coverage` - Generates coverage report