-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathflux_flights_ext_test.go
117 lines (95 loc) · 2.14 KB
/
flux_flights_ext_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
package flux_test
import (
"testing"
"fmt"
"github.com/dave/flux"
"github.com/dave/ktest/assert"
)
type Flights struct {
Dispatcher *flux.Dispatcher
Country *CountryStore
City *CityStore
Price *PriceStore
}
func TestFlights(t *testing.T) {
a := &Flights{}
a.Country = &CountryStore{app: a}
a.City = &CityStore{app: a}
a.Price = &PriceStore{app: a}
a.Dispatcher = flux.NewDispatcher(nil, a.Country, a.City, a.Price)
done := a.Dispatcher.Dispatch(&UpdateCountryAction{Country: "France"})
<-done
assert.Equal(t, "France", a.Country.GetCountry())
assert.Equal(t, "Paris", a.City.GetCity())
assert.Equal(t, "€100", a.Price.GetPrice())
}
type UpdateCity struct {
City string
}
type CityStore struct {
app *Flights
city string
}
func (m *CityStore) Handle(payload *flux.Payload) (finished bool) {
switch action := payload.Action.(type) {
case *UpdateCity:
m.city = action.City
case *UpdateCountryAction:
payload.Wait(m.app.Country)
m.city = getCapital(m.app.Country.GetCountry())
}
return true
}
func getCapital(country string) string {
switch country {
case "UK":
return "London"
case "France":
return "Paris"
}
return fmt.Sprint("Capital of ", country)
}
func (m *CityStore) GetCity() string {
return m.city
}
type UpdateCountryAction struct {
Country string
}
type CountryStore struct {
app *Flights
country string
}
func (m *CountryStore) Handle(payload *flux.Payload) (finished bool) {
switch action := payload.Action.(type) {
case *UpdateCountryAction:
m.country = action.Country
}
return true
}
func (m *CountryStore) GetCountry() string {
return m.country
}
type PriceStore struct {
app *Flights
price string
}
func (m *PriceStore) Handle(payload *flux.Payload) (finished bool) {
switch payload.Action.(type) {
case *UpdateCountryAction, *UpdateCity:
payload.Wait(m.app.City)
m.price = calculatePrice(m.app.Country.GetCountry(), m.app.City.GetCity())
}
return true
}
func (m *PriceStore) GetPrice() string {
return m.price
}
func calculatePrice(country string, city string) string {
switch country {
case "UK":
return "£100"
case "France":
return "€100"
}
return "$100"
}