Add the domain-level outbox processor implementation required by existing domain tests, and add regression coverage for compensation worker cancellation behavior. Verified with a fresh go test run for ./internal/domain before commit.
66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package domain
|
||
|
||
import (
|
||
"context"
|
||
"testing"
|
||
"time"
|
||
)
|
||
|
||
// TestCompensationProcessor_StartBackgroundWorker_Cancel
|
||
// TDD: 验证 StopBackgroundWorker 能够正确取消后台 worker
|
||
func TestCompensationProcessor_StartBackgroundWorker_Cancel(t *testing.T) {
|
||
store := &mockCompensationStore{}
|
||
executor := &mockOperationExecutor{}
|
||
stats := &mockCompensationStats{}
|
||
processor := NewCompensationProcessor(store, executor, stats)
|
||
|
||
ctx, cancel := context.WithCancel(context.Background())
|
||
defer cancel()
|
||
|
||
// 启动 worker
|
||
workerCtx := processor.StartBackgroundWorker(ctx, 100*time.Millisecond)
|
||
|
||
// 验证 worker context 不是已经取消的
|
||
select {
|
||
case <-workerCtx.Done():
|
||
t.Fatal("workerCtx should not be cancelled immediately")
|
||
default:
|
||
}
|
||
|
||
// 停止 worker
|
||
processor.StopBackgroundWorker()
|
||
|
||
// 验证 worker context 已被取消
|
||
select {
|
||
case <-workerCtx.Done():
|
||
// 预期:context 应该在 Stop 后被取消
|
||
default:
|
||
t.Fatal("workerCtx should be cancelled after StopBackgroundWorker")
|
||
}
|
||
}
|
||
|
||
// TestCompensationProcessor_WorkerStopsOnParentContext
|
||
// TDD: 验证当父 context 取消时,worker 应该停止
|
||
func TestCompensationProcessor_WorkerStopsOnParentContext(t *testing.T) {
|
||
store := &mockCompensationStore{}
|
||
executor := &mockOperationExecutor{}
|
||
stats := &mockCompensationStats{}
|
||
processor := NewCompensationProcessor(store, executor, stats)
|
||
|
||
ctx, cancel := context.WithCancel(context.Background())
|
||
|
||
// 启动 worker
|
||
workerCtx := processor.StartBackgroundWorker(ctx, 100*time.Millisecond)
|
||
|
||
// 取消父 context
|
||
cancel()
|
||
|
||
// 验证 worker context 已被取消
|
||
select {
|
||
case <-workerCtx.Done():
|
||
// 预期:父 context 取消后 worker 应该停止
|
||
default:
|
||
t.Fatal("workerCtx should be cancelled after parent context is cancelled")
|
||
}
|
||
}
|