-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathchain_test.go
More file actions
97 lines (80 loc) · 3.35 KB
/
chain_test.go
File metadata and controls
97 lines (80 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package cosy
import (
"testing"
)
// simple model for generic Ctx[T]
type testModel struct {
ID int
}
// Test full lifecycle order and that nil stages are skipped.
func TestProcessChain_CreateOrModify_FullLifecycle(t *testing.T) {
ctx := &Ctx[testModel]{}
order := make([]string, 0, 7)
appendOrder := func(s string) { order = append(order, s) }
pc := NewProcessChain[testModel](ctx)
pc.SetPrepare(func(ctx *Ctx[testModel]) { appendOrder("prepare") })
pc.SetBeforeDecode(func(ctx *Ctx[testModel]) { appendOrder("beforeDecode") })
pc.SetDecode(func(ctx *Ctx[testModel]) { appendOrder("decode") })
pc.SetBeforeExecute(func(ctx *Ctx[testModel]) { appendOrder("beforeExecute") })
pc.SetGormAction(func(ctx *Ctx[testModel]) { appendOrder("gormAction") })
pc.SetExecuted(func(ctx *Ctx[testModel]) { appendOrder("executed") })
pc.SetResponse(func(ctx *Ctx[testModel]) { appendOrder("response") })
pc.CreateOrModify()
expected := []string{"prepare", "beforeDecode", "decode", "beforeExecute", "gormAction", "executed", "response"}
if len(order) != len(expected) {
t.Fatalf("unexpected length: got %d want %d, order=%v", len(order), len(expected), order)
}
for i, step := range expected {
if order[i] != step {
t.Fatalf("unexpected step at %d: got %q want %q", i, order[i], step)
}
}
}
// Test that aborting in the middle stops further stages.
func TestProcessChain_CreateOrModify_AbortStopsExecution(t *testing.T) {
ctx := &Ctx[testModel]{}
order := make([]string, 0, 7)
appendOrder := func(s string) { order = append(order, s) }
pc := NewProcessChain[testModel](ctx)
pc.SetPrepare(func(ctx *Ctx[testModel]) { appendOrder("prepare") })
pc.SetBeforeDecode(func(ctx *Ctx[testModel]) {
appendOrder("beforeDecode")
ctx.abort = true
})
pc.SetDecode(func(ctx *Ctx[testModel]) { appendOrder("decode") })
pc.SetBeforeExecute(func(ctx *Ctx[testModel]) { appendOrder("beforeExecute") })
pc.SetGormAction(func(ctx *Ctx[testModel]) { appendOrder("gormAction") })
pc.SetExecuted(func(ctx *Ctx[testModel]) { appendOrder("executed") })
pc.SetResponse(func(ctx *Ctx[testModel]) { appendOrder("response") })
pc.CreateOrModify()
expected := []string{"prepare", "beforeDecode"}
if len(order) != len(expected) {
t.Fatalf("unexpected length after abort: got %d want %d, order=%v", len(order), len(expected), order)
}
for i, step := range expected {
if order[i] != step {
t.Fatalf("unexpected step at %d: got %q want %q", i, order[i], step)
}
}
}
// Test that missing (nil) stages are safely skipped and remaining run.
func TestProcessChain_CreateOrModify_SkipNilStages(t *testing.T) {
ctx := &Ctx[testModel]{}
order := make([]string, 0, 3)
appendOrder := func(s string) { order = append(order, s) }
pc := NewProcessChain(ctx)
// Intentionally skip SetPrepare and SetDecode
pc.SetBeforeDecode(func(ctx *Ctx[testModel]) { appendOrder("beforeDecode") })
pc.SetBeforeExecute(func(ctx *Ctx[testModel]) { appendOrder("beforeExecute") })
pc.SetResponse(func(ctx *Ctx[testModel]) { appendOrder("response") })
pc.CreateOrModify()
expected := []string{"beforeDecode", "beforeExecute", "response"}
if len(order) != len(expected) {
t.Fatalf("unexpected length with nil stages: got %d want %d, order=%v", len(order), len(expected), order)
}
for i, step := range expected {
if order[i] != step {
t.Fatalf("unexpected step at %d: got %q want %q", i, order[i], step)
}
}
}