Skip to content

Commit 5676dcd

Browse files
committed
Add unit tests for ServiceExport controller (using mocks for K8s and Cloud Map clients)
1 parent b3f6a18 commit 5676dcd

File tree

8 files changed

+278
-9
lines changed

8 files changed

+278
-9
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
vendor/
22
bin/
33
testbin/
4+
cover.out
45

56
# Files generated by JetBrains IDEs, e.g. IntelliJ IDEA
67
.idea/
78
*.iml
89

910
# OSX trash
1011
.DS_Store
12+
13+
#mocks generated by mockgen
14+
mocks/

Makefile

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ vet: ## Run go vet against code.
5050
go vet ./...
5151

5252
ENVTEST_ASSETS_DIR=$(shell pwd)/testbin
53-
test: manifests generate fmt vet ## Run tests.
53+
test: manifests generate generate-mocks fmt vet ## Run tests.
5454
mkdir -p ${ENVTEST_ASSETS_DIR}
5555
test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.7.2/hack/setup-envtest.sh
5656
source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.out
@@ -84,6 +84,9 @@ deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in
8484
undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config.
8585
$(KUSTOMIZE) build config/default | kubectl delete -f -
8686

87+
MOCKS_DESTINATION=mocks
88+
generate-mocks: mockgen
89+
$(MOCKGEN) --source pkg/cloudmap/client.go --destination $(MOCKS_DESTINATION)/pkg/cloudmap/client_mock.go --package cloudmap
8790

8891
CONTROLLER_GEN = $(shell pwd)/bin/controller-gen
8992
controller-gen: ## Download controller-gen locally if necessary.
@@ -93,6 +96,11 @@ KUSTOMIZE = $(shell pwd)/bin/kustomize
9396
kustomize: ## Download kustomize locally if necessary.
9497
$(call go-get-tool,$(KUSTOMIZE),sigs.k8s.io/kustomize/kustomize/[email protected])
9598

99+
MOCKGEN = $(shell pwd)/bin/mockgen
100+
mockgen: ## Download mockgen
101+
$(call go-get-tool,$(MOCKGEN),github.com/golang/mock/[email protected])
102+
103+
96104
# go-get-tool will 'go get' any package $2 and install it to $1.
97105
PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
98106
define go-get-tool

cover.out

Lines changed: 0 additions & 7 deletions
This file was deleted.

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ go 1.15
44

55
require (
66
github.com/go-logr/logr v0.3.0
7+
github.com/golang/mock v1.6.0
78
github.com/onsi/ginkgo v1.14.1
89
github.com/onsi/gomega v1.10.2
10+
gotest.tools v2.2.0+incompatible
911
k8s.io/api v0.19.2
1012
k8s.io/apimachinery v0.19.2
1113
k8s.io/client-go v0.19.2

go.sum

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,10 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF
169169
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
170170
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
171171
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
172+
github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
172173
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
174+
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
175+
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
173176
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
174177
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
175178
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -355,6 +358,7 @@ github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv
355358
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
356359
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
357360
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
361+
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
358362
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
359363
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
360364
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
@@ -410,7 +414,10 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG
410414
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
411415
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
412416
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
417+
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
413418
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
419+
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
420+
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
414421
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
415422
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
416423
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -436,6 +443,8 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
436443
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
437444
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
438445
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
446+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
447+
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
439448
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
440449
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
441450
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -447,6 +456,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
447456
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
448457
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
449458
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
459+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
450460
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
451461
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
452462
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -476,6 +486,11 @@ golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7w
476486
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
477487
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
478488
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
489+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
490+
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
491+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
492+
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
493+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
479494
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
480495
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
481496
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -515,11 +530,16 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn
515530
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
516531
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
517532
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
533+
golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 h1:HHeAlu5H9b71C+Fx0K+1dGgVFN1DM1/wz4aoGOA5qS8=
518534
golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
535+
golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
536+
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
519537
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
520538
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
521539
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
522540
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
541+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
542+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
523543
gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k=
524544
gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
525545
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
@@ -532,6 +552,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
532552
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
533553
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
534554
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
555+
google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
535556
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
536557
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
537558
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -584,6 +605,7 @@ gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
584605
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
585606
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
586607
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
608+
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
587609
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
588610
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
589611
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package controllers
2+
3+
import (
4+
"context"
5+
cloudmapmock "github.com/aws/aws-k8s-mcs-controller/mocks/pkg/cloudmap"
6+
"github.com/aws/aws-k8s-mcs-controller/pkg/api/v1alpha1"
7+
"github.com/aws/aws-k8s-mcs-controller/pkg/cloudmap"
8+
"github.com/aws/aws-k8s-mcs-controller/pkg/model"
9+
testing2 "github.com/go-logr/logr/testing"
10+
"github.com/golang/mock/gomock"
11+
"gotest.tools/assert"
12+
v1 "k8s.io/api/core/v1"
13+
discovery "k8s.io/api/discovery/v1beta1"
14+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15+
"k8s.io/apimachinery/pkg/runtime"
16+
"k8s.io/apimachinery/pkg/types"
17+
ctrl "sigs.k8s.io/controller-runtime"
18+
"sigs.k8s.io/controller-runtime/pkg/client"
19+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
20+
"testing"
21+
)
22+
23+
func TestServiceExportReconciler_Reconcile_NewServiceExport(t *testing.T) {
24+
mockController := gomock.NewController(t)
25+
defer mockController.Finish()
26+
27+
expectedService := model.Service{
28+
Namespace: "my-namespace",
29+
Name: "exported-service",
30+
Endpoints: []*model.Endpoint{{
31+
Id: "1_1_1_1",
32+
IP: "1.1.1.1",
33+
Port: 80,
34+
}},
35+
}
36+
37+
cloudmapMock := cloudmapmock.NewMockClient(mockController)
38+
39+
// expected interactions with the Cloud Map client
40+
cloudmapMock.EXPECT().GetService(gomock.Any(), gomock.Any()).Return(nil, nil)
41+
cloudmapMock.EXPECT().CreateService(gomock.Any()).Return(nil).Times(1)
42+
cloudmapMock.EXPECT().RegisterEndpoints(gomock.Eq(&expectedService)).Return(nil).Times(1)
43+
44+
reconciler := setupServiceExportReconciler(t, cloudmapMock)
45+
46+
request := ctrl.Request{
47+
NamespacedName: types.NamespacedName{
48+
Namespace: "my-namespace",
49+
Name: "exported-service",
50+
},
51+
}
52+
53+
got, err := reconciler.Reconcile(context.Background(), request)
54+
if err != nil {
55+
t.Errorf("Reconcile() error = %v", err)
56+
return
57+
}
58+
assert.Equal(t, ctrl.Result{}, got, "Result should be empty")
59+
}
60+
61+
func TestServiceExportReconciler_Reconcile_ExistingServiceNewEndpoint(t *testing.T) {
62+
mockController := gomock.NewController(t)
63+
defer mockController.Finish()
64+
65+
emptyService := model.Service{
66+
Namespace: "my-namespace",
67+
Name: "exported-service",
68+
}
69+
70+
expectedService := model.Service{
71+
Namespace: "my-namespace",
72+
Name: "exported-service",
73+
Endpoints: []*model.Endpoint{{
74+
Id: "1_1_1_1",
75+
IP: "1.1.1.1",
76+
Port: 80,
77+
}},
78+
}
79+
80+
cloudmapMock := cloudmapmock.NewMockClient(mockController)
81+
82+
// expected interactions with the Cloud Map client
83+
cloudmapMock.EXPECT().GetService(gomock.Any(), gomock.Any()).Return(&emptyService, nil)
84+
cloudmapMock.EXPECT().RegisterEndpoints(gomock.Eq(&expectedService)).Return(nil).Times(1)
85+
86+
request := ctrl.Request{
87+
NamespacedName: types.NamespacedName{
88+
Namespace: "my-namespace",
89+
Name: "exported-service",
90+
},
91+
}
92+
93+
reconciler := setupServiceExportReconciler(t, cloudmapMock)
94+
95+
got, err := reconciler.Reconcile(context.Background(), request)
96+
if err != nil {
97+
t.Errorf("Reconcile() error = %v", err)
98+
return
99+
}
100+
assert.Equal(t, ctrl.Result{}, got, "Result should be empty")
101+
}
102+
103+
func setupServiceExportReconciler(t *testing.T, cloudmapMock cloudmap.Client) *ServiceExportReconciler {
104+
k8sClient := setupK8sClient()
105+
106+
return &ServiceExportReconciler{
107+
Client: k8sClient,
108+
Log: testing2.TestLogger{T: t},
109+
Scheme: k8sClient.Scheme(),
110+
Cloudmap: cloudmapMock,
111+
}
112+
}
113+
114+
func setupK8sClient() client.Client {
115+
// ServiceExport object
116+
serviceExport := &v1alpha1.ServiceExport{
117+
ObjectMeta: metav1.ObjectMeta{
118+
Name: "exported-service",
119+
Namespace: "my-namespace",
120+
},
121+
}
122+
123+
// Service object
124+
service := &v1.Service{
125+
ObjectMeta: metav1.ObjectMeta{
126+
Name: "exported-service",
127+
Namespace: "my-namespace",
128+
},
129+
}
130+
131+
// EndpointSlice object
132+
port := int32(80)
133+
endpointSlice := &discovery.EndpointSlice{
134+
ObjectMeta: metav1.ObjectMeta{
135+
Namespace: "my-namespace",
136+
Name: "slice-id",
137+
Labels: map[string]string{discovery.LabelServiceName: "exported-service"},
138+
},
139+
AddressType: discovery.AddressTypeIPv4,
140+
Endpoints: []discovery.Endpoint{{
141+
Addresses: []string{"1.1.1.1"},
142+
}},
143+
Ports: []discovery.EndpointPort{{Port: &port}},
144+
}
145+
endpointSliceList := &discovery.EndpointSliceList{
146+
Items: []discovery.EndpointSlice{*endpointSlice},
147+
}
148+
149+
scheme := runtime.NewScheme()
150+
scheme.AddKnownTypes(v1alpha1.GroupVersion, serviceExport)
151+
scheme.AddKnownTypes(v1.SchemeGroupVersion, service)
152+
scheme.AddKnownTypes(discovery.SchemeGroupVersion, endpointSlice)
153+
scheme.AddKnownTypes(discovery.SchemeGroupVersion, endpointSliceList)
154+
155+
return fake.NewClientBuilder().
156+
WithScheme(scheme).
157+
WithObjects(serviceExport, service).
158+
WithLists(endpointSliceList).
159+
Build()
160+
}

pkg/controllers/suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ var _ = BeforeSuite(func() {
5454

5555
By("bootstrapping test environment")
5656
testEnv = &envtest.Environment{
57-
CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")},
57+
CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
5858
ErrorIfCRDPathMissing: true,
5959
}
6060

0 commit comments

Comments
 (0)