56 lines
3.1 KiB
Markdown
56 lines
3.1 KiB
Markdown
---
|
|
id: redis-adapter-tests
|
|
name: Write tests for Redis event target adapter
|
|
status: completed
|
|
depends_on: [core-pubsub-tests]
|
|
scope: moderate
|
|
risk: medium
|
|
impact: component
|
|
level: implementation
|
|
---
|
|
|
|
## Description
|
|
|
|
The Redis event target adapter (`event-target-redis.ts`) is implemented but has zero tests. The architecture doc lists 7 specific test scenarios. Tests need a running Redis instance or a mock. Since this is a dev dependency, we can use `ioredis-mock` or start a Redis container in CI. The test strategy needs to handle the Redis dependency.
|
|
|
|
The architecture specifies these test scenarios:
|
|
1. Publish path — dispatchEvent sends to Redis with correct channel and serialized envelope
|
|
2. Subscribe path — addEventListener subscribes to Redis, onMessage dispatches to local listeners
|
|
3. Unsubscribe — removeEventListener unsubscribes from Redis when no listeners remain for a topic
|
|
4. Topic scoping — type:id topics are correctly formed
|
|
5. Envelope serialization — full `{ type, id, payload }` round-trips through JSON
|
|
6. Multiple listeners — multiple listeners on same topic, single Redis subscribe
|
|
7. Error propagation — what happens on connection failure
|
|
|
|
Note: test 7 (error propagation) is partially blocked by the missing error handling in the current implementation (tracked in task `redis-channel-prefix-and-error-handling`). The test should exist but may need to be adjusted once error handling is added.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- [x] `test/event-target-redis.test.ts` exists and passes
|
|
- [x] Test approach for Redis dependency is decided (mock, container, or ioredis-mock)
|
|
- [x] Test: dispatchEvent publishes correct channel and serialized envelope
|
|
- [x] Test: addEventListener subscribes to Redis and dispatches to local listeners
|
|
- [x] Test: removeEventListener unsubscribes from Redis when no listeners remain
|
|
- [x] Test: type:id topic scoping works correctly
|
|
- [x] Test: EventEnvelope round-trips through JSON serialization
|
|
- [x] Test: multiple listeners on same topic result in single Redis subscribe
|
|
- [x] Test: custom serializer option works
|
|
|
|
## References
|
|
|
|
- docs/architecture/event-targets/redis.md
|
|
- src/event-target-redis.ts
|
|
|
|
## Notes
|
|
|
|
Test approach: Manual Redis mock (no external dependencies). The `createMockRedis()` helper creates a lightweight mock that tracks `publish`/`subscribe`/`unsubscribe` calls and provides `simulateMessage()` to trigger the `message` event handler. This avoids needing `ioredis-mock` or a running Redis instance.
|
|
|
|
Test 7 (error propagation) is not included because the current implementation lacks error handling — tracked in `redis-channel-prefix-and-error-handling` task.
|
|
|
|
## Summary
|
|
|
|
Implemented comprehensive tests for the Redis event target adapter using a manual mock approach (no external dependencies needed).
|
|
|
|
- Created: `test/event-target-redis.test.ts` (17 tests across 7 describe blocks)
|
|
- Tests: 17, all passing
|
|
- Coverage: dispatchEvent/publish path, addEventListener/subscribe path, removeEventListener/unsubscribe path, topic scoping, envelope round-trip serialization, multiple listeners (single Redis subscribe), custom serializer, EventListenerObject support |