Skip to content

Commit 33a4d6f

Browse files
r-vasquezgene-redpanda
authored andcommitted
[tests] Add acl utils function golden tests
This will catch any change in the proto file to the existing acl types. The code should handle this gracefully, but this will allow us to communicate properly when a new addition or breaking change is being introduced.
1 parent 6db89e7 commit 33a4d6f

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed

redpanda/resources/acl/acl_test.go

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package acl
2+
3+
import (
4+
"testing"
5+
6+
dataplanev1alpha1 "github.com/redpanda-data/terraform-provider-redpanda/proto/gen/go/redpanda/api/dataplane/v1alpha1"
7+
)
8+
9+
// These are golden tests, to ensure we parse properly and the string types
10+
// does not change during the proto file updates.
11+
12+
func Test_stringToACLResourceType(t *testing.T) {
13+
for _, tt := range []struct {
14+
name string
15+
input string
16+
exp dataplanev1alpha1.ACL_ResourceType
17+
expErr bool
18+
}{
19+
{"unspecified", "UNSPECIFIED", dataplanev1alpha1.ACL_RESOURCE_TYPE_UNSPECIFIED, false},
20+
{"any", "ANY", dataplanev1alpha1.ACL_RESOURCE_TYPE_ANY, false},
21+
{"topic", "TOPIC", dataplanev1alpha1.ACL_RESOURCE_TYPE_TOPIC, false},
22+
{"group", "GROUP", dataplanev1alpha1.ACL_RESOURCE_TYPE_GROUP, false},
23+
{"transactional", "TRANSACTIONAL_ID", dataplanev1alpha1.ACL_RESOURCE_TYPE_TRANSACTIONAL_ID, false},
24+
{"delegation token", "DELEGATION_TOKEN", dataplanev1alpha1.ACL_RESOURCE_TYPE_DELEGATION_TOKEN, false},
25+
{"user", "USER", dataplanev1alpha1.ACL_RESOURCE_TYPE_USER, false},
26+
{"user", "CLUSTER", dataplanev1alpha1.ACL_RESOURCE_TYPE_CLUSTER, false},
27+
{"wrong input", "WRONG_INPUT", 0, true},
28+
} {
29+
t.Run(tt.name, func(t *testing.T) {
30+
got, err := stringToACLResourceType(tt.input)
31+
if err != nil {
32+
if tt.expErr {
33+
return
34+
}
35+
t.Errorf("unexpected error: %v", err)
36+
return
37+
}
38+
if got != tt.exp {
39+
t.Errorf("got = %v, want = %v", got, tt.exp)
40+
}
41+
})
42+
}
43+
}
44+
45+
func Test_aclResourceTypeToString(t *testing.T) {
46+
for _, tt := range []struct {
47+
name string
48+
input dataplanev1alpha1.ACL_ResourceType
49+
exp string
50+
}{
51+
{"unspecified", dataplanev1alpha1.ACL_RESOURCE_TYPE_UNSPECIFIED, "UNSPECIFIED"},
52+
{"any", dataplanev1alpha1.ACL_RESOURCE_TYPE_ANY, "ANY"},
53+
{"topic", dataplanev1alpha1.ACL_RESOURCE_TYPE_TOPIC, "TOPIC"},
54+
{"group", dataplanev1alpha1.ACL_RESOURCE_TYPE_GROUP, "GROUP"},
55+
{"transactional", dataplanev1alpha1.ACL_RESOURCE_TYPE_TRANSACTIONAL_ID, "TRANSACTIONAL_ID"},
56+
{"delegation token", dataplanev1alpha1.ACL_RESOURCE_TYPE_DELEGATION_TOKEN, "DELEGATION_TOKEN"},
57+
{"user", dataplanev1alpha1.ACL_RESOURCE_TYPE_USER, "USER"},
58+
{"user", dataplanev1alpha1.ACL_RESOURCE_TYPE_CLUSTER, "CLUSTER"},
59+
{"wrong input", 123, "UNKNOWN"},
60+
} {
61+
t.Run(tt.name, func(t *testing.T) {
62+
got := aclResourceTypeToString(tt.input)
63+
if got != tt.exp {
64+
t.Errorf("got = %v, want = %v", got, tt.exp)
65+
}
66+
})
67+
}
68+
}
69+
70+
func Test_stringToACLResourcePatternType(t *testing.T) {
71+
for _, tt := range []struct {
72+
name string
73+
input string
74+
exp dataplanev1alpha1.ACL_ResourcePatternType
75+
expErr bool
76+
}{
77+
{"unspecified", "UNSPECIFIED", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_UNSPECIFIED, false},
78+
{"any", "ANY", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_ANY, false},
79+
{"match", "MATCH", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_MATCH, false},
80+
{"literal", "LITERAL", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_LITERAL, false},
81+
{"prefixed", "PREFIXED", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_PREFIXED, false},
82+
{"wrong input", "WRONG_INPUT", 0, true},
83+
} {
84+
t.Run(tt.name, func(t *testing.T) {
85+
got, err := stringToACLResourcePatternType(tt.input)
86+
if err != nil {
87+
if tt.expErr {
88+
return
89+
}
90+
t.Errorf("unexpected error: %v", err)
91+
return
92+
}
93+
if got != tt.exp {
94+
t.Errorf("got = %v, want = %v", got, tt.exp)
95+
}
96+
})
97+
}
98+
}
99+
100+
func Test_aclResourcePatternTypeToString(t *testing.T) {
101+
for _, tt := range []struct {
102+
name string
103+
input dataplanev1alpha1.ACL_ResourcePatternType
104+
exp string
105+
}{
106+
{"unspecified", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_UNSPECIFIED, "UNSPECIFIED"},
107+
{"any", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_ANY, "ANY"},
108+
{"match", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_MATCH, "MATCH"},
109+
{"literal", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_LITERAL, "LITERAL"},
110+
{"prefixed", dataplanev1alpha1.ACL_RESOURCE_PATTERN_TYPE_PREFIXED, "PREFIXED"},
111+
{"wrong input", 123, "UNKNOWN"},
112+
} {
113+
t.Run(tt.name, func(t *testing.T) {
114+
got := aclResourcePatternTypeToString(tt.input)
115+
if got != tt.exp {
116+
t.Errorf("got = %v, want = %v", got, tt.exp)
117+
}
118+
})
119+
}
120+
}
121+
122+
func Test_stringToACLPermissionType(t *testing.T) {
123+
for _, tt := range []struct {
124+
name string
125+
input string
126+
exp dataplanev1alpha1.ACL_PermissionType
127+
expErr bool
128+
}{
129+
{"unspecified", "UNSPECIFIED", dataplanev1alpha1.ACL_PERMISSION_TYPE_UNSPECIFIED, false},
130+
{"any", "ANY", dataplanev1alpha1.ACL_PERMISSION_TYPE_ANY, false},
131+
{"match", "DENY", dataplanev1alpha1.ACL_PERMISSION_TYPE_DENY, false},
132+
{"literal", "ALLOW", dataplanev1alpha1.ACL_PERMISSION_TYPE_ALLOW, false},
133+
{"wrong input", "WRONG_INPUT", 0, true},
134+
} {
135+
t.Run(tt.name, func(t *testing.T) {
136+
got, err := stringToACLPermissionType(tt.input)
137+
if err != nil {
138+
if tt.expErr {
139+
return
140+
}
141+
t.Errorf("unexpected error: %v", err)
142+
return
143+
}
144+
if got != tt.exp {
145+
t.Errorf("got = %v, want = %v", got, tt.exp)
146+
}
147+
})
148+
}
149+
}
150+
151+
func Test_stringToACLOperation(t *testing.T) {
152+
for _, tt := range []struct {
153+
name string
154+
input string
155+
exp dataplanev1alpha1.ACL_Operation
156+
expErr bool
157+
}{
158+
{"unspecified", "UNSPECIFIED", dataplanev1alpha1.ACL_OPERATION_UNSPECIFIED, false},
159+
{"any", "ANY", dataplanev1alpha1.ACL_OPERATION_ANY, false},
160+
{"all", "ALL", dataplanev1alpha1.ACL_OPERATION_ALL, false},
161+
{"read", "READ", dataplanev1alpha1.ACL_OPERATION_READ, false},
162+
{"write", "WRITE", dataplanev1alpha1.ACL_OPERATION_WRITE, false},
163+
{"create", "CREATE", dataplanev1alpha1.ACL_OPERATION_CREATE, false},
164+
{"delete", "DELETE", dataplanev1alpha1.ACL_OPERATION_DELETE, false},
165+
{"alter", "ALTER", dataplanev1alpha1.ACL_OPERATION_ALTER, false},
166+
{"describe", "DESCRIBE", dataplanev1alpha1.ACL_OPERATION_DESCRIBE, false},
167+
{"cluster action", "CLUSTER_ACTION", dataplanev1alpha1.ACL_OPERATION_CLUSTER_ACTION, false},
168+
{"describe configs", "DESCRIBE_CONFIGS", dataplanev1alpha1.ACL_OPERATION_DESCRIBE_CONFIGS, false},
169+
{"alter configs", "ALTER_CONFIGS", dataplanev1alpha1.ACL_OPERATION_ALTER_CONFIGS, false},
170+
{"idempotent write", "IDEMPOTENT_WRITE", dataplanev1alpha1.ACL_OPERATION_IDEMPOTENT_WRITE, false},
171+
{"create tokens", "CREATE_TOKENS", dataplanev1alpha1.ACL_OPERATION_CREATE_TOKENS, false},
172+
{"describe tokens", "DESCRIBE_TOKENS", dataplanev1alpha1.ACL_OPERATION_DESCRIBE_TOKENS, false},
173+
{"wrong input", "WRONG_INPUT", 0, true},
174+
} {
175+
t.Run(tt.name, func(t *testing.T) {
176+
got, err := stringToACLOperation(tt.input)
177+
if err != nil {
178+
if tt.expErr {
179+
return
180+
}
181+
t.Errorf("unexpected error: %v", err)
182+
return
183+
}
184+
if got != tt.exp {
185+
t.Errorf("got = %v, want = %v", got, tt.exp)
186+
}
187+
})
188+
}
189+
}

0 commit comments

Comments
 (0)