@@ -2,103 +2,118 @@ package colony
2
2
3
3
import (
4
4
"context"
5
+ "encoding/json"
6
+ "errors"
7
+ "fmt"
8
+ "net"
5
9
"net/http"
6
10
"net/http/httptest"
11
+ "reflect"
7
12
"testing"
8
13
)
9
14
10
- func createServer (t * testing.T , path string , fn http.HandlerFunc ) * httptest.Server {
11
- t .Helper ()
12
- mux := http .NewServeMux ()
13
- mux .HandleFunc (path , fn )
14
- return httptest .NewServer (mux )
15
- }
15
+ const (
16
+ testValidToken = "super-duper-valid-token"
17
+ )
16
18
17
- func Test_ValidateAPIKey (t * testing.T ) {
18
- t .Run ("full request flow" , func (t * testing.T ) {
19
- fakeToken := "my-super-secret"
19
+ func TestAPI_ValidateApiKey (t * testing.T ) {
20
+ t .Run ("valid API key" , func (t * testing.T ) {
21
+ response := map [string ]interface {}{
22
+ "isValid" : true ,
23
+ }
20
24
21
- srv := createServer (t , validateAPIKeyURL , func (w http.ResponseWriter , r * http.Request ) {
22
- if r .Header .Get ("Authorization" ) != "Bearer " + fakeToken {
23
- t .Fatalf ("unexpected Authorization header: %s" , r .Header .Get ("Authorization" ))
24
- }
25
+ mockServer := createServer (t , response , validateEndpoint )
25
26
26
- w .WriteHeader (http .StatusOK )
27
- w .Write ([]byte (`{"isValid": true}` ))
28
- })
29
- defer srv .Close ()
27
+ defer mockServer .Close ()
30
28
31
- ctx := context .Background ()
32
- api := New (srv .URL , fakeToken )
29
+ api := New (mockServer .URL , testValidToken )
33
30
34
- if err := api .ValidateAPIKey (ctx ); err != nil {
35
- t .Fatalf ("unexpected error: %v" , err )
31
+ err := api .ValidateAPIKey (context .TODO ())
32
+ if err != nil {
33
+ t .Fatalf ("expected nil but got: %s" , err )
36
34
}
37
35
})
38
36
39
- t .Run ("malformed URL" , func (t * testing.T ) {
40
- baseURL := ":"
41
- api := New (baseURL , "token" )
37
+ t .Run ("invalid API key" , func (t * testing.T ) {
38
+ mockServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
39
+ fmt .Fprintln (w , `{"isValid": false}` )
40
+ }))
42
41
43
- err := api .ValidateAPIKey (context .Background ())
44
- if err == nil {
45
- t .Fatal ("expected error, got nil" )
42
+ defer mockServer .Close ()
43
+
44
+ api := New (mockServer .URL , testValidToken )
45
+
46
+ err := api .ValidateAPIKey (context .TODO ())
47
+ if ! errors .Is (err , errInvalidKey ) {
48
+ t .Fatalf ("expected %s, but got: %s" , errInvalidKey , err )
46
49
}
47
50
})
51
+ }
48
52
49
- t .Run ("unable to connect" , func (t * testing.T ) {
50
- srv := httptest .NewServer (nil )
51
- srv .Close ()
53
+ func TestAPI_GetSystemTemplates (t * testing.T ) {
54
+ t .Run ("valid response" , func (t * testing.T ) {
55
+ response := []Template {{
56
+ ID : "k1" ,
57
+ Name : "name" ,
58
+ Label : "label" ,
59
+ IsTinkTemplate : true ,
60
+ IsSystem : true ,
61
+ Template : "template_data" ,
62
+ }}
52
63
53
- api := New ( srv . URL , "token" )
64
+ mockServer := createServer ( t , response , templateEndpoint )
54
65
55
- err := api .ValidateAPIKey (context .Background ())
56
- if err == nil {
57
- t .Fatal ("expected error, got nil" )
58
- }
59
- })
66
+ defer mockServer .Close ()
60
67
61
- t .Run ("invalid status code" , func (t * testing.T ) {
62
- srv := createServer (t , validateAPIKeyURL , func (w http.ResponseWriter , r * http.Request ) {
63
- w .WriteHeader (http .StatusNotFound )
64
- })
65
- defer srv .Close ()
68
+ api := New (mockServer .URL , testValidToken )
66
69
67
- api := New (srv .URL , "token" )
70
+ templates , err := api .GetSystemTemplates (context .TODO ())
71
+ if err != nil {
72
+ t .Fatalf ("expected nil but got: %s" , err )
73
+ }
68
74
69
- err := api .ValidateAPIKey (context .Background ())
70
- if err == nil {
71
- t .Fatal ("expected error, got nil" )
75
+ if ! reflect .DeepEqual (response , templates ) {
76
+ t .Fatalf ("expected %#v got %#v" , response , templates )
72
77
}
73
78
})
74
79
75
- t .Run ("invalid response body" , func (t * testing.T ) {
76
- srv := createServer (t , validateAPIKeyURL , func (w http.ResponseWriter , r * http.Request ) {
77
- w .WriteHeader (http .StatusOK )
78
- w .Write ([]byte (`not JSON` ))
79
- })
80
- defer srv .Close ()
80
+ t .Run ("connection reset by peer" , func (t * testing.T ) {
81
+ myListener , err := net .Listen ("tcp" , "localhost:0" )
82
+ if err != nil {
83
+ t .Fatalf ("error creating listener %s" , err )
84
+ }
85
+ address := myListener .Addr ().String ()
86
+
87
+ go func () {
88
+ for {
89
+ con , err := myListener .Accept ()
90
+ if err != nil {
91
+ t .Log (err )
92
+ }
93
+ con .Close ()
94
+ }
95
+ }()
81
96
82
- api := New (srv . URL , "token" )
97
+ api := New (address , testValidToken )
83
98
84
- err : = api .ValidateAPIKey (context .Background ())
99
+ _ , err = api .GetSystemTemplates (context .TODO ())
85
100
if err == nil {
86
- t .Fatal ("expected error, got nil " )
101
+ t .Fatal ("was expecting error but got none " )
87
102
}
88
103
})
104
+ }
89
105
90
- t .Run ("invalid API key" , func (t * testing.T ) {
91
- srv := createServer (t , validateAPIKeyURL , func (w http.ResponseWriter , r * http.Request ) {
92
- w .WriteHeader (http .StatusOK )
93
- w .Write ([]byte (`{"isValid": false}` ))
94
- })
95
- defer srv .Close ()
96
-
97
- api := New (srv .URL , "token" )
106
+ func createServer (t * testing.T , response interface {}, apiEndpoint string ) * httptest.Server {
107
+ t .Helper ()
98
108
99
- err := api .ValidateAPIKey (context .Background ())
100
- if err == nil {
101
- t .Fatal ("expected error, got nil" )
109
+ mux := http .NewServeMux ()
110
+ mux .HandleFunc ("GET " + apiEndpoint , func (w http.ResponseWriter , r * http.Request ) {
111
+ if r .Header .Get ("Authorization" ) != fmt .Sprintf ("Bearer %s" , testValidToken ) {
112
+ t .Fatalf ("expected to get a bearer token %s but got: %s" , fmt .Sprintf ("Bearer %s" , testValidToken ), r .Header .Get ("Authorization" ))
102
113
}
114
+
115
+ json .NewEncoder (w ).Encode (response )
103
116
})
117
+
118
+ return httptest .NewServer (mux )
104
119
}
0 commit comments