Skip to content

Commit ff67a59

Browse files
authored
Fix: tests for gateway (#106)
On-behalf-of: @SAP [email protected] Signed-off-by: Artem Shcherbatiuk <[email protected]>
1 parent 4fb35ab commit ff67a59

29 files changed

+825
-1065
lines changed

.github/workflows/pipeline.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ jobs:
1919
useTask: true
2020
useLocalCoverageConfig: true
2121
imageTagName: ghcr.io/openmfp/kubernetes-graphql-gateway
22-
coverageThreasholdFile: 0
23-
coverageThresholdPackage: 0
24-
coverageThreasholdTotal: 49
22+
coverageThreasholdFile: 49
23+
coverageThresholdPackage: 65
24+
coverageThreasholdTotal: 62
25+
2526

.mockery.yaml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,11 @@ packages:
77
dir: gateway/resolver/mocks
88
outpkg: mocks
99
interfaces:
10-
WithWatch:
10+
WithWatch:
11+
net/http:
12+
config:
13+
dir: gateway/manager/mocks
14+
outpkg: mocks
15+
interfaces:
16+
RoundTripper:
17+

.testcoverage.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ exclude:
33
- main.go
44
- cmd
55
- tests
6-
- gateway/config/config.go
7-
- listener/*
6+
- common/config/config.go
87
- deprecated/*
8+
- mocks
9+
# the following files should be excluded from coverage later
10+
- listener/apischema/*
11+
- listener/controller/*

gateway/manager/mocks/mock_RoundTripper.go

Lines changed: 94 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gateway/manager/roundtripper_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package manager_test
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"net/http/httptest"
7+
"testing"
8+
9+
"github.com/golang-jwt/jwt/v5"
10+
"github.com/openmfp/golang-commons/logger"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/mock"
13+
"github.com/stretchr/testify/require"
14+
"k8s.io/client-go/transport"
15+
16+
"github.com/openmfp/kubernetes-graphql-gateway/gateway/manager"
17+
"github.com/openmfp/kubernetes-graphql-gateway/gateway/manager/mocks"
18+
)
19+
20+
func TestRoundTripper_RoundTrip(t *testing.T) {
21+
tests := []struct {
22+
name string
23+
token string
24+
impersonate bool
25+
expectedUser string
26+
}{
27+
{
28+
name: "success",
29+
token: createTestToken(t, jwt.MapClaims{"sub": "test-user"}),
30+
impersonate: true,
31+
expectedUser: "test-user",
32+
},
33+
{
34+
name: "no_token_in_context",
35+
impersonate: false,
36+
},
37+
{
38+
name: "token_present_impersonate_false",
39+
token: "valid-token",
40+
impersonate: false,
41+
},
42+
{
43+
name: "failed_to_parse_token",
44+
token: "invalid-token",
45+
impersonate: true,
46+
},
47+
{
48+
name: "user_claim_not_found",
49+
token: createTestToken(t, jwt.MapClaims{}),
50+
impersonate: true,
51+
},
52+
{
53+
name: "user_claim_is_not_a_string",
54+
token: createTestToken(t, jwt.MapClaims{"sub": 123}),
55+
impersonate: true,
56+
},
57+
}
58+
59+
for _, tt := range tests {
60+
t.Run(tt.name, func(t *testing.T) {
61+
mockRoundTripper := &mocks.MockRoundTripper{}
62+
63+
mockRoundTripper.EXPECT().
64+
RoundTrip(mock.Anything).
65+
Return(&http.Response{StatusCode: http.StatusOK}, nil)
66+
67+
if tt.expectedUser != "" {
68+
mockRoundTripper.EXPECT().
69+
RoundTrip(mock.MatchedBy(func(req *http.Request) bool {
70+
return req.Header.Get(transport.ImpersonateUserHeader) == tt.expectedUser
71+
})).
72+
Return(&http.Response{StatusCode: http.StatusOK}, nil)
73+
}
74+
75+
log, err := logger.New(logger.DefaultConfig())
76+
require.NoError(t, err)
77+
78+
rt := manager.NewRoundTripper(log, mockRoundTripper, "sub", tt.impersonate)
79+
80+
req := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
81+
if tt.token != "" {
82+
ctx := context.WithValue(req.Context(), manager.TokenKey{}, tt.token)
83+
req = req.WithContext(ctx)
84+
}
85+
86+
resp, err := rt.RoundTrip(req)
87+
require.NoError(t, err)
88+
require.NotNil(t, resp)
89+
assert.Equal(t, http.StatusOK, resp.StatusCode)
90+
91+
mockRoundTripper.AssertExpectations(t)
92+
})
93+
}
94+
}
95+
96+
func createTestToken(t *testing.T, claims jwt.MapClaims) string {
97+
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
98+
signedToken, err := token.SignedString([]byte("test-secret"))
99+
require.NoError(t, err)
100+
return signedToken
101+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package resolver
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"testing"
6+
)
7+
8+
func TestSanitizeGroupName(t *testing.T) {
9+
r := &Service{
10+
groupNames: make(map[string]string),
11+
}
12+
13+
tests := []struct {
14+
name string
15+
input string
16+
expected string
17+
}{
18+
{"empty_string", "", "core"},
19+
{"valid_group_name", "validName", "validName"},
20+
{"hyphen_to_underscore", "group-name", "group_name"},
21+
{"special_char_to_underscore", "group@name", "group_name"},
22+
{"invalid_start_with_prepend", "!invalidStart", "_invalidStart"},
23+
{"leading_underscore", "_leadingUnderscore", "_leadingUnderscore"},
24+
{"start_with_number", "123startWithNumber", "_123startWithNumber"},
25+
}
26+
27+
for _, tt := range tests {
28+
t.Run(tt.name, func(t *testing.T) {
29+
result := r.SanitizeGroupName(tt.input)
30+
assert.Equal(t, tt.expected, result)
31+
assert.Equal(t, tt.input, r.groupNames[result], "The original group name should be stored correctly")
32+
})
33+
}
34+
}
35+
36+
func TestGetOriginalGroupName(t *testing.T) {
37+
r := &Service{
38+
groupNames: map[string]string{
39+
"group1": "originalGroup1",
40+
"group2": "originalGroup2",
41+
},
42+
}
43+
44+
tests := []struct {
45+
name string
46+
input string
47+
expected string
48+
}{
49+
{"existing_group", "group1", "originalGroup1"},
50+
{"non_existing_group", "group3", "group3"},
51+
}
52+
53+
for _, tt := range tests {
54+
t.Run(tt.name, func(t *testing.T) {
55+
result := r.getOriginalGroupName(tt.input)
56+
assert.Equal(t, tt.expected, result)
57+
})
58+
}
59+
}

0 commit comments

Comments
 (0)