Skip to content

Commit 0ed159a

Browse files
committed
Add empty handler test for secrets
- also breaks out the tests for the api handler into their own file to make it easier to find them. Signed-off-by: Alex Ellis (VMware) <[email protected]>
1 parent bf790d0 commit 0ed159a

File tree

2 files changed

+158
-128
lines changed

2 files changed

+158
-128
lines changed

handlers/secrets_api_test.go

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package handlers
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/ioutil"
7+
"net/http"
8+
"net/http/httptest"
9+
"strings"
10+
"testing"
11+
12+
"github.com/openfaas/faas/gateway/requests"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
testclient "k8s.io/client-go/kubernetes/fake"
15+
)
16+
17+
func Test_SecretsHandler(t *testing.T) {
18+
namespace := "of-fnc"
19+
kube := testclient.NewSimpleClientset()
20+
secretsHandler := MakeSecretHandler(namespace, kube).ServeHTTP
21+
22+
secretName := "testsecret"
23+
24+
t.Run("create managed secrets", func(t *testing.T) {
25+
secretValue := "testsecretvalue"
26+
payload := fmt.Sprintf(`{"name": "%s", "value": "%s"}`, secretName, secretValue)
27+
req := httptest.NewRequest("POST", "http://example.com/foo", strings.NewReader(payload))
28+
w := httptest.NewRecorder()
29+
30+
secretsHandler(w, req)
31+
32+
resp := w.Result()
33+
if resp.StatusCode != http.StatusAccepted {
34+
t.Errorf("expected status code '%d', got '%d'", http.StatusAccepted, resp.StatusCode)
35+
}
36+
37+
actualSecret, err := kube.CoreV1().Secrets(namespace).Get("testsecret", metav1.GetOptions{})
38+
if err != nil {
39+
t.Errorf("error validting secret: %s", err)
40+
}
41+
42+
if actualSecret.Name != "testsecret" {
43+
t.Errorf("expected secret with name: 'testsecret', got: '%s'", actualSecret.Name)
44+
}
45+
46+
managedBy := actualSecret.Labels[secretLabel]
47+
if managedBy != secretLabelValue {
48+
t.Errorf("expected secret to be managed by '%s', got: '%s'", secretLabelValue, managedBy)
49+
}
50+
51+
actualValue := actualSecret.StringData[secretName]
52+
if actualValue != secretValue {
53+
t.Errorf("expected secret value: '%s', got: '%s'", secretValue, actualValue)
54+
}
55+
})
56+
57+
t.Run("update managed secrets", func(t *testing.T) {
58+
newSecretValue := "newtestsecretvalue"
59+
payload := fmt.Sprintf(`{"name": "%s", "value": "%s"}`, secretName, newSecretValue)
60+
req := httptest.NewRequest("PUT", "http://example.com/foo", strings.NewReader(payload))
61+
w := httptest.NewRecorder()
62+
63+
secretsHandler(w, req)
64+
65+
resp := w.Result()
66+
if resp.StatusCode != http.StatusAccepted {
67+
t.Errorf("expected status code '%d', got '%d'", http.StatusAccepted, resp.StatusCode)
68+
}
69+
70+
actualSecret, err := kube.CoreV1().Secrets(namespace).Get("testsecret", metav1.GetOptions{})
71+
if err != nil {
72+
t.Errorf("error validting secret: %s", err)
73+
}
74+
75+
if actualSecret.Name != "testsecret" {
76+
t.Errorf("expected secret with name: 'testsecret', got: '%s'", actualSecret.Name)
77+
}
78+
79+
managedBy := actualSecret.Labels[secretLabel]
80+
if managedBy != secretLabelValue {
81+
t.Errorf("expected secret to be managed by '%s', got: '%s'", secretLabelValue, managedBy)
82+
}
83+
84+
actualValue := actualSecret.StringData[secretName]
85+
if actualValue != newSecretValue {
86+
t.Errorf("expected secret value: '%s', got: '%s'", newSecretValue, actualValue)
87+
}
88+
})
89+
90+
t.Run("list managed secrets only", func(t *testing.T) {
91+
req := httptest.NewRequest("GET", "http://example.com/foo", nil)
92+
w := httptest.NewRecorder()
93+
94+
secretsHandler(w, req)
95+
96+
resp := w.Result()
97+
if resp.StatusCode != http.StatusOK {
98+
t.Errorf("expected status code '%d', got '%d'", http.StatusOK, resp.StatusCode)
99+
}
100+
101+
decoder := json.NewDecoder(resp.Body)
102+
103+
secretList := []requests.Secret{}
104+
err := decoder.Decode(&secretList)
105+
if err != nil {
106+
t.Error(err)
107+
}
108+
109+
if len(secretList) != 1 {
110+
t.Errorf("expected 1 secret, got %d", len(secretList))
111+
}
112+
113+
actualSecret := secretList[0]
114+
if actualSecret.Name != secretName {
115+
t.Errorf("expected secret name: '%s', got: '%s'", secretName, actualSecret.Name)
116+
}
117+
})
118+
119+
t.Run("delete managed secrets", func(t *testing.T) {
120+
secretName := "testsecret"
121+
payload := fmt.Sprintf(`{"name": "%s"}`, secretName)
122+
req := httptest.NewRequest("DELETE", "http://example.com/foo", strings.NewReader(payload))
123+
w := httptest.NewRecorder()
124+
125+
secretsHandler(w, req)
126+
127+
resp := w.Result()
128+
if resp.StatusCode != http.StatusAccepted {
129+
t.Errorf("expected status code '%d', got '%d'", http.StatusAccepted, resp.StatusCode)
130+
}
131+
132+
actualSecret, err := kube.CoreV1().Secrets(namespace).Get("testsecret", metav1.GetOptions{})
133+
if err == nil {
134+
t.Errorf("expected not found error, got secret payload '%s'", actualSecret)
135+
}
136+
})
137+
}
138+
139+
func Test_SecretsHandler_ListEmpty(t *testing.T) {
140+
namespace := "of-fnc"
141+
kube := testclient.NewSimpleClientset()
142+
secretsHandler := MakeSecretHandler(namespace, kube).ServeHTTP
143+
144+
req := httptest.NewRequest("GET", "http://example.com/foo", nil)
145+
w := httptest.NewRecorder()
146+
147+
secretsHandler(w, req)
148+
149+
resp := w.Result()
150+
if resp.StatusCode != http.StatusOK {
151+
t.Errorf("expected status code '%d', got '%d'", http.StatusOK, resp.StatusCode)
152+
}
153+
body, _ := ioutil.ReadAll(resp.Body)
154+
155+
if len(body) == 0 {
156+
t.Errorf(`want empty list to be valid json "[]", but was empty string.`)
157+
}
158+
}

handlers/secrets_test.go

Lines changed: 0 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
package handlers
22

33
import (
4-
"encoding/json"
54
"fmt"
6-
"net/http"
7-
"net/http/httptest"
8-
"strings"
95
"testing"
106

117
"github.com/openfaas/faas/gateway/requests"
128
apiv1 "k8s.io/api/core/v1"
139
v1beta1 "k8s.io/api/extensions/v1beta1"
14-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15-
testclient "k8s.io/client-go/kubernetes/fake"
1610
)
1711

1812
func Test_UpdateSecrets_DoesNotAddVolumeIfRequestSecretsIsNil(t *testing.T) {
@@ -232,128 +226,6 @@ func Test_UpdateSecrets_RemovesSecretsVolumeIfRequestSecretsIsEmptyOrNil(t *test
232226
validateEmptySecretVolumesAndMounts(t, deployment)
233227
}
234228

235-
func Test_SecretsHandler(t *testing.T) {
236-
namespace := "of-fnc"
237-
kube := testclient.NewSimpleClientset()
238-
secretsHandler := MakeSecretHandler(namespace, kube).ServeHTTP
239-
240-
secretName := "testsecret"
241-
242-
t.Run("create managed secrets", func(t *testing.T) {
243-
secretValue := "testsecretvalue"
244-
payload := fmt.Sprintf(`{"name": "%s", "value": "%s"}`, secretName, secretValue)
245-
req := httptest.NewRequest("POST", "http://example.com/foo", strings.NewReader(payload))
246-
w := httptest.NewRecorder()
247-
248-
secretsHandler(w, req)
249-
250-
resp := w.Result()
251-
if resp.StatusCode != http.StatusAccepted {
252-
t.Errorf("expected status code '%d', got '%d'", http.StatusAccepted, resp.StatusCode)
253-
}
254-
255-
actualSecret, err := kube.CoreV1().Secrets(namespace).Get("testsecret", metav1.GetOptions{})
256-
if err != nil {
257-
t.Errorf("error validting secret: %s", err)
258-
}
259-
260-
if actualSecret.Name != "testsecret" {
261-
t.Errorf("expected secret with name: 'testsecret', got: '%s'", actualSecret.Name)
262-
}
263-
264-
managedBy := actualSecret.Labels[secretLabel]
265-
if managedBy != secretLabelValue {
266-
t.Errorf("expected secret to be managed by '%s', got: '%s'", secretLabelValue, managedBy)
267-
}
268-
269-
actualValue := actualSecret.StringData[secretName]
270-
if actualValue != secretValue {
271-
t.Errorf("expected secret value: '%s', got: '%s'", secretValue, actualValue)
272-
}
273-
})
274-
275-
t.Run("update managed secrets", func(t *testing.T) {
276-
newSecretValue := "newtestsecretvalue"
277-
payload := fmt.Sprintf(`{"name": "%s", "value": "%s"}`, secretName, newSecretValue)
278-
req := httptest.NewRequest("PUT", "http://example.com/foo", strings.NewReader(payload))
279-
w := httptest.NewRecorder()
280-
281-
secretsHandler(w, req)
282-
283-
resp := w.Result()
284-
if resp.StatusCode != http.StatusAccepted {
285-
t.Errorf("expected status code '%d', got '%d'", http.StatusAccepted, resp.StatusCode)
286-
}
287-
288-
actualSecret, err := kube.CoreV1().Secrets(namespace).Get("testsecret", metav1.GetOptions{})
289-
if err != nil {
290-
t.Errorf("error validting secret: %s", err)
291-
}
292-
293-
if actualSecret.Name != "testsecret" {
294-
t.Errorf("expected secret with name: 'testsecret', got: '%s'", actualSecret.Name)
295-
}
296-
297-
managedBy := actualSecret.Labels[secretLabel]
298-
if managedBy != secretLabelValue {
299-
t.Errorf("expected secret to be managed by '%s', got: '%s'", secretLabelValue, managedBy)
300-
}
301-
302-
actualValue := actualSecret.StringData[secretName]
303-
if actualValue != newSecretValue {
304-
t.Errorf("expected secret value: '%s', got: '%s'", newSecretValue, actualValue)
305-
}
306-
})
307-
308-
t.Run("list managed secrets only", func(t *testing.T) {
309-
req := httptest.NewRequest("GET", "http://example.com/foo", nil)
310-
w := httptest.NewRecorder()
311-
312-
secretsHandler(w, req)
313-
314-
resp := w.Result()
315-
if resp.StatusCode != http.StatusOK {
316-
t.Errorf("expected status code '%d', got '%d'", http.StatusOK, resp.StatusCode)
317-
}
318-
319-
decoder := json.NewDecoder(resp.Body)
320-
321-
secretList := []requests.Secret{}
322-
err := decoder.Decode(&secretList)
323-
if err != nil {
324-
t.Error(err)
325-
}
326-
327-
if len(secretList) != 1 {
328-
t.Errorf("expected 1 secret, got %d", len(secretList))
329-
}
330-
331-
actualSecret := secretList[0]
332-
if actualSecret.Name != secretName {
333-
t.Errorf("expected secret name: '%s', got: '%s'", secretName, actualSecret.Name)
334-
}
335-
})
336-
337-
t.Run("delete managed secrets", func(t *testing.T) {
338-
secretName := "testsecret"
339-
payload := fmt.Sprintf(`{"name": "%s"}`, secretName)
340-
req := httptest.NewRequest("DELETE", "http://example.com/foo", strings.NewReader(payload))
341-
w := httptest.NewRecorder()
342-
343-
secretsHandler(w, req)
344-
345-
resp := w.Result()
346-
if resp.StatusCode != http.StatusAccepted {
347-
t.Errorf("expected status code '%d', got '%d'", http.StatusAccepted, resp.StatusCode)
348-
}
349-
350-
actualSecret, err := kube.CoreV1().Secrets(namespace).Get("testsecret", metav1.GetOptions{})
351-
if err == nil {
352-
t.Errorf("expected not found error, got secret payload '%s'", actualSecret)
353-
}
354-
})
355-
}
356-
357229
func validateEmptySecretVolumesAndMounts(t *testing.T, deployment *v1beta1.Deployment) {
358230
numVolumes := len(deployment.Spec.Template.Spec.Volumes)
359231
if numVolumes != 0 {

0 commit comments

Comments
 (0)