-
Notifications
You must be signed in to change notification settings - Fork 0
/
grouter_test.go
130 lines (119 loc) · 3.5 KB
/
grouter_test.go
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package grouter_test
import (
"net/http"
"os"
"testing"
"text/template"
"github.com/SharkFourSix/grouter"
"github.com/SharkFourSix/grouter/routers/at" // include africastalking implementation
)
func TestMain(t *testing.T) {
e, err := grouter.NewRouterEngine(
grouter.DebugMode,
grouter.WithRouter(at.RouterName),
grouter.WithTemplateFS(os.DirFS("./testdata/templates"), ".", template.FuncMap{}),
)
if err != nil {
t.Fatal(err)
return
}
e.MenuOptions(
grouter.NewMenuOption("", welcomeScreen, "welcomeScreen",
grouter.NewMenuOption("1", showAccount, "accountMenu",
grouter.NewMenuOption("1", accountBalance, "accountBalance",
grouter.NewMenuOption("#", showAccount, "accountMenu"),
),
grouter.NewMenuOption("2", miniStatement, "miniStatement",
grouter.NewMenuOption("#", showAccount, "accountMenu"),
),
grouter.NewMenuOption("3", makeTransfer, "makeTransfer",
grouter.NewMenuOption("#", showAccount, "accountMenu"),
),
grouter.NewMenuOption("#", welcomeScreen, "welcomeScreen"),
),
grouter.NewMenuOption("#", endSession, "endSession"),
),
)
http.Handle("/ussd", e)
http.ListenAndServe(":1234", nil)
}
type transferStep int
const (
ReadAccount transferStep = iota
ReadAmount
ConfirmTransfer
)
func makeTransfer(req grouter.UssdRequest) bool {
var step transferStep
if sif, ok := req.Session().Get("transferStep"); ok {
step = sif.(transferStep)
} else {
step = ReadAccount
}
switch step {
case ReadAccount:
if req.Input() == "" {
req.Prompt("Enter recipient account number")
} else {
req.Session().Set("transferAccount", req.Input())
req.Session().Set("transferStep", ReadAmount)
req.Prompt("Enter amount to transfer")
}
case ReadAmount:
if req.Input() == "" {
req.Prompt("Enter amount to transfer")
} else {
req.Session().Set("transferAmount", req.Input())
req.Session().Set("transferStep", ConfirmTransfer)
req.PromptWithTemplate(
"transfer/confirm.tmpl", grouter.TemplateValues{
"Account": req.Session().MustGet("transferAccount"),
"Amount": req.Session().MustGet("transferAmount"),
},
)
}
case ConfirmTransfer:
if req.Input() == "" {
req.PromptWithTemplate(
"transfer/confirm.tmpl", grouter.TemplateValues{
"Account": req.Session().MustGet("transferAccount"),
"Amount": req.Session().MustGet("transferAmount"),
},
)
} else {
switch req.Input() {
case "1":
req.End(
"🤙 You transferred %s to %s.",
req.Session().MustGet("transferAmount"),
req.Session().MustGet("transferAccount"),
)
case "#":
req.End("Transfer cancelled. Thank you. Come again")
case "3":
req.End("You entered a wrong option! Pay attention")
}
}
}
return true // retain the scrren context for the duration of the interaction
}
func showAccount(req grouter.UssdRequest) bool {
req.ContinueWithTemplate("account.tmpl", grouter.TemplateValues{"Phone": req.MSISDN()})
return false
}
func accountBalance(req grouter.UssdRequest) bool {
req.ContinueWithTemplate("balance.tmpl", grouter.TemplateValues{"Phone": req.MSISDN()})
return false
}
func miniStatement(req grouter.UssdRequest) bool {
req.ContinueWithTemplate("statement.tmpl", grouter.TemplateValues{"Phone": req.MSISDN()})
return false
}
func welcomeScreen(req grouter.UssdRequest) bool {
req.ContinueWithTemplate("main.tmpl", grouter.TemplateValues{"Phone": req.MSISDN()})
return false
}
func endSession(req grouter.UssdRequest) bool {
req.End("Thank you %s. Please come again!", req.MSISDN())
return false
}