Skip to content

Commit d8ffb48

Browse files
committed
Improve httpapp
1 parent cf8db67 commit d8ffb48

File tree

2 files changed

+109
-3
lines changed

2 files changed

+109
-3
lines changed

pkg/appx/httpapp/value.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,17 @@ type Value struct {
1313
Router chi.Router // The HTTP router.
1414
}
1515

16-
func MustGetService(value interface{}) interface{} {
17-
return value.(*Value).Service
16+
func GetService(value interface{}) (interface{}, error) {
17+
val, ok := value.(*Value)
18+
if !ok {
19+
return nil, fmt.Errorf("value %#v cannot be converted to *httpapp.Value", value)
20+
}
21+
22+
if val == nil || val.Service == nil {
23+
return nil, fmt.Errorf("value %#v holds no service", val)
24+
}
25+
26+
return val.Service, nil
1827
}
1928

2029
func GetRouter(value interface{}) (chi.Router, error) {
@@ -57,5 +66,15 @@ func R(ctx appx.Context) *RequiredServiceGetter {
5766
}
5867

5968
func (g *RequiredServiceGetter) MustGet(name string) interface{} {
60-
return MustGetService(g.ctx.Required[name].Value)
69+
app, ok := g.ctx.Required[name]
70+
if !ok {
71+
panic(fmt.Errorf("app %q is not a required application", name))
72+
}
73+
74+
svc, err := GetService(app.Value)
75+
if err != nil {
76+
panic(err)
77+
}
78+
79+
return svc
6180
}

pkg/appx/httpapp/value_test.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package httpapp
2+
3+
import (
4+
"errors"
5+
"reflect"
6+
"testing"
7+
8+
"github.com/go-chi/chi"
9+
)
10+
11+
func TestGetService(t *testing.T) {
12+
svc := struct{}{}
13+
cases := []struct {
14+
in interface{}
15+
wantSvc interface{}
16+
wantErr error
17+
}{
18+
{
19+
in: nil,
20+
wantSvc: nil,
21+
wantErr: errors.New("value <nil> cannot be converted to *httpapp.Value"),
22+
},
23+
{
24+
in: (*Value)(nil),
25+
wantSvc: nil,
26+
wantErr: errors.New("value (*httpapp.Value)(nil) holds no service"),
27+
},
28+
{
29+
in: &Value{},
30+
wantSvc: nil,
31+
wantErr: errors.New("value &httpapp.Value{Service:interface {}(nil), Router:chi.Router(nil)} holds no service"),
32+
},
33+
{
34+
in: &Value{Service: svc},
35+
wantSvc: svc,
36+
wantErr: nil,
37+
},
38+
}
39+
for _, c := range cases {
40+
svc, err := GetService(c.in)
41+
if svc != c.wantSvc {
42+
t.Fatalf("Service: got (%#v), want (%#v)", svc, c.wantSvc)
43+
}
44+
if !reflect.DeepEqual(err, c.wantErr) {
45+
t.Fatalf("Error: got (%#v), want (%#v)", err, c.wantErr)
46+
}
47+
}
48+
}
49+
50+
func TestGetRouter(t *testing.T) {
51+
router := chi.NewRouter()
52+
cases := []struct {
53+
in interface{}
54+
wantRouter interface{}
55+
wantErr error
56+
}{
57+
{
58+
in: nil,
59+
wantRouter: nil,
60+
wantErr: errors.New("value <nil> cannot be converted to *httpapp.Value"),
61+
},
62+
{
63+
in: (*Value)(nil),
64+
wantRouter: nil,
65+
wantErr: errors.New("value (*httpapp.Value)(nil) is not routable"),
66+
},
67+
{
68+
in: &Value{},
69+
wantRouter: nil,
70+
wantErr: errors.New("value &httpapp.Value{Service:interface {}(nil), Router:chi.Router(nil)} is not routable"),
71+
},
72+
{
73+
in: &Value{Router: router},
74+
wantRouter: router,
75+
wantErr: nil,
76+
},
77+
}
78+
for _, c := range cases {
79+
router, err := GetRouter(c.in)
80+
if router != c.wantRouter {
81+
t.Fatalf("Router: got (%#v), want (%#v)", router, c.wantRouter)
82+
}
83+
if !reflect.DeepEqual(err, c.wantErr) {
84+
t.Fatalf("Error: got (%#v), want (%#v)", err, c.wantErr)
85+
}
86+
}
87+
}

0 commit comments

Comments
 (0)