Skip to content

Commit c095010

Browse files
committed
add mock tests
1 parent 4af016f commit c095010

File tree

8 files changed

+771
-34
lines changed

8 files changed

+771
-34
lines changed

Makefile

+10-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ tidy:
1616
go mod tidy
1717

1818
# Run tests
19-
test: tidy fmt vet
19+
test: mocks tidy fmt vet
2020
go test ./... -coverprofile=coverage.out
2121
go tool cover -func=coverage.out
2222

@@ -30,6 +30,15 @@ release: semver
3030
test-release:
3131
goreleaser --skip-publish --snapshot --rm-dist
3232

33+
mocks: mockgen
34+
mockgen -destination pkg/mocks/core/mock.go --package core k8s.io/client-go/kubernetes/typed/core/v1 CoreV1Interface,SecretInterface
35+
mockgen -destination pkg/mocks/ssclient/mock.go --package ssclient github.com/bitnami-labs/sealed-secrets/pkg/client/clientset/versioned/typed/sealed-secrets/v1alpha1 BitnamiV1alpha1Interface,SealedSecretInterface
36+
37+
mockgen:
38+
ifeq (, $(shell which mockgen))
39+
$(shell go get github.com/golang/mock/[email protected])
40+
endif
41+
3342
semver:
3443
ifeq (, $(shell which semver))
3544
$(shell go get -u github.com/bakito/semver)

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ go 1.16
55
require (
66
github.com/bitnami-labs/sealed-secrets v0.16.0
77
github.com/gin-gonic/gin v1.7.4
8+
github.com/golang/mock v1.6.0
9+
github.com/google/uuid v1.3.0
810
github.com/onsi/ginkgo v1.16.4
911
github.com/onsi/gomega v1.16.0
1012
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
13+
k8s.io/api v0.16.8
1114
k8s.io/apimachinery v0.16.8
1215
k8s.io/client-go v0.16.8
1316
)

go.sum

+12-1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4er
132132
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
133133
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
134134
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
135+
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
136+
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
135137
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
136138
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
137139
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -165,6 +167,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI
165167
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
166168
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
167169
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
170+
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
171+
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
168172
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
169173
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
170174
github.com/googleapis/gnostic v0.0.0-20171211024024-933c109c13ce h1:9OQbEQGOP6g+SBg45QvDPjTv3YS1oHtu84Jk6AdPfjQ=
@@ -388,6 +392,7 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb
388392
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
389393
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
390394
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
395+
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
391396
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
392397
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
393398
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
@@ -425,6 +430,7 @@ golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU
425430
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
426431
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
427432
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
433+
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
428434
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
429435
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
430436
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -446,6 +452,7 @@ golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLL
446452
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
447453
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
448454
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
455+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
449456
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
450457
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
451458
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -459,6 +466,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
459466
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
460467
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
461468
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
469+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
462470
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
463471
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
464472
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -492,8 +500,10 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
492500
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
493501
golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
494502
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
495-
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
503+
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
496504
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
505+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
506+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
497507
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
498508
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
499509
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -528,6 +538,7 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn
528538
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
529539
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
530540
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
541+
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
531542
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
532543
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
533544
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

main.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ import (
1919
"github.com/bakito/sealed-secrets-web/pkg/seal"
2020
"github.com/bakito/sealed-secrets-web/pkg/secrets"
2121
"github.com/bakito/sealed-secrets-web/pkg/version"
22+
ssClient "github.com/bitnami-labs/sealed-secrets/pkg/client/clientset/versioned/typed/sealed-secrets/v1alpha1"
2223
"github.com/gin-gonic/gin"
24+
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
2325
_ "k8s.io/client-go/plugin/pkg/client/auth"
2426
"k8s.io/client-go/tools/clientcmd"
2527
)
@@ -65,19 +67,25 @@ func main() {
6567
return
6668
}
6769

70+
coreClient, ssClient, err := secrets.BuildClients(clientConfig, *disableLoadSecrets)
71+
if err != nil {
72+
log.Fatalf("Could build k8s clients:%v", err.Error())
73+
}
74+
6875
log.Printf("Running sealed secrets web (%s) on port %d", version.Version, *port)
69-
_ = setupRouter().Run(fmt.Sprintf(":%d", *port))
76+
_ = setupRouter(coreClient, ssClient).Run(fmt.Sprintf(":%d", *port))
7077
}
7178

72-
func setupRouter() *gin.Engine {
79+
func setupRouter(coreClient corev1.CoreV1Interface, ssClient ssClient.BitnamiV1alpha1Interface) *gin.Engine {
7380
m := marshal.For(*outputFormat)
7481
sealer := seal.New(*kubesealArgs)
7582

7683
indexHTML, err := renderIndexHTML(*outputFormat, *disableLoadSecrets, *webExternalUrl)
7784
if err != nil {
7885
log.Fatalf("Could not render the index html template: %s", err.Error())
7986
}
80-
sHandler, err := secrets.NewHandler(clientConfig, *outputFormat, *disableLoadSecrets)
87+
88+
sHandler, err := secrets.NewHandler(coreClient, ssClient, *outputFormat, *disableLoadSecrets)
8189
if err != nil {
8290
log.Fatalf("Could not initialize secrets handler: %s", err.Error())
8391
}

main_test.go

+57-7
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,51 @@
11
package main
22

33
import (
4+
"fmt"
45
"net/http"
56
"net/http/httptest"
67
"strings"
78

89
. "github.com/onsi/ginkgo"
910
. "github.com/onsi/gomega"
1011

12+
"github.com/bakito/sealed-secrets-web/pkg/mocks/core"
13+
"github.com/bakito/sealed-secrets-web/pkg/mocks/ssclient"
14+
"github.com/bitnami-labs/sealed-secrets/pkg/apis/sealed-secrets/v1alpha1"
1115
"github.com/gin-gonic/gin"
16+
"github.com/golang/mock/gomock"
17+
"github.com/google/uuid"
18+
corev1 "k8s.io/api/core/v1"
19+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1220
)
1321

1422
var _ = Describe("Main", func() {
1523

1624
Context("the router is initialized successfully", func() {
1725
var (
18-
w *httptest.ResponseRecorder
19-
router *gin.Engine
26+
name string
27+
namespace string
28+
w *httptest.ResponseRecorder
29+
router *gin.Engine
30+
mock *gomock.Controller
31+
alpha1Client *ssclient.MockBitnamiV1alpha1Interface
32+
ssClient *ssclient.MockSealedSecretInterface
33+
coreClient *core.MockCoreV1Interface
34+
secrets *core.MockSecretInterface
2035
)
2136

2237
BeforeEach(func() {
38+
name = uuid.NewString()
39+
namespace = uuid.NewString()
2340
w = httptest.NewRecorder()
2441
format := "yaml"
2542
outputFormat = &format
26-
disabled := true
27-
disableLoadSecrets = &disabled
28-
router = setupRouter()
43+
mock = gomock.NewController(GinkgoT())
44+
alpha1Client = ssclient.NewMockBitnamiV1alpha1Interface(mock)
45+
ssClient = ssclient.NewMockSealedSecretInterface(mock)
46+
coreClient = core.NewMockCoreV1Interface(mock)
47+
secrets = core.NewMockSecretInterface(mock)
48+
router = setupRouter(coreClient, alpha1Client)
2949
})
3050
It("return OK on health", func() {
3151
req, _ := http.NewRequest("GET", "/_health", nil)
@@ -67,11 +87,41 @@ var _ = Describe("Main", func() {
6787
Ω(w.Body.String()).Should(Equal(encodeBody))
6888
})
6989

70-
It("decode secrets endpoints are disabled", func() {
90+
It("list sealed secrets", func() {
91+
alpha1Client.EXPECT().SealedSecrets("").Return(ssClient)
92+
ssClient.EXPECT().List(gomock.Any()).Return(&v1alpha1.SealedSecretList{
93+
Items: []v1alpha1.SealedSecret{
94+
{
95+
ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name},
96+
Spec: v1alpha1.SealedSecretSpec{Template: v1alpha1.SecretTemplateSpec{}},
97+
},
98+
},
99+
}, nil)
100+
req, _ := http.NewRequest("GET", "/api/secrets", nil)
101+
router.ServeHTTP(w, req)
102+
Ω(w.Code).Should(Equal(200))
103+
Ω(w.Body.String()).Should(Equal(fmt.Sprintf(`{"%s":"%s"}`, name, namespace)))
104+
})
105+
106+
It("list secret of namespace", func() {
107+
coreClient.EXPECT().Secrets(namespace).Return(secrets)
108+
secrets.EXPECT().Get(name, gomock.Any()).Return(&corev1.Secret{
109+
ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name},
110+
}, nil)
111+
req, _ := http.NewRequest("GET", fmt.Sprintf("/api/secret/%s/%s", namespace, name), nil)
112+
router.ServeHTTP(w, req)
113+
Ω(w.Code).Should(Equal(200))
114+
Ω(w.Body.String()).Should(Equal(fmt.Sprintf(`{"secret":"apiVersion: v1\nkind: Secret\nmetadata:\n creationTimestamp: null\n name: %s\n namespace: %s\n"}`, name, namespace)))
115+
})
116+
117+
It("secrets endpoints are disabled", func() {
118+
disabled := true
119+
disableLoadSecrets = &disabled
120+
router = setupRouter(coreClient, alpha1Client)
71121
req, _ := http.NewRequest("GET", "/api/secrets", nil)
72122
router.ServeHTTP(w, req)
73123
Ω(w.Code).Should(Equal(403))
74-
req, _ = http.NewRequest("GET", "/api/secrets/namespace/name", nil)
124+
req, _ = http.NewRequest("GET", "/api/secret/namespace/name", nil)
75125
router.ServeHTTP(w, req)
76126
Ω(w.Code).Should(Equal(403))
77127
})

0 commit comments

Comments
 (0)