@@ -158,3 +158,149 @@ pub fn build(
158158 pod_disruption_budgets,
159159 } )
160160}
161+
162+ #[ cfg( test) ]
163+ mod tests {
164+ use stackable_operator:: kube:: Resource ;
165+
166+ use super :: build;
167+ use crate :: controller:: {
168+ ValidatedCluster ,
169+ test_support:: { minimal_kafka, validated_cluster} ,
170+ } ;
171+
172+ /// Sorted `metadata.name`s of the given resources, for order-independent assertions.
173+ fn sorted_names ( resources : & [ impl Resource ] ) -> Vec < & str > {
174+ let mut names: Vec < & str > = resources
175+ . iter ( )
176+ . filter_map ( |resource| resource. meta ( ) . name . as_deref ( ) )
177+ . collect ( ) ;
178+ names. sort ( ) ;
179+ names
180+ }
181+
182+ /// A KRaft cluster with one `broker` and one `controller` role group, resolved through the real
183+ /// validate step (mirroring the other build fixtures), since [`ValidatedCluster`] carries
184+ /// several resolved types that are impractical to construct by hand.
185+ fn kraft_cluster ( ) -> ValidatedCluster {
186+ let kafka = minimal_kafka (
187+ r#"
188+ apiVersion: kafka.stackable.tech/v1alpha1
189+ kind: KafkaCluster
190+ metadata:
191+ name: simple-kafka
192+ namespace: default
193+ uid: 12345678-1234-1234-1234-123456789012
194+ spec:
195+ image:
196+ productVersion: 3.9.2
197+ clusterConfig:
198+ metadataManager: kraft
199+ controllers:
200+ roleGroups:
201+ default:
202+ replicas: 3
203+ brokers:
204+ roleGroups:
205+ default:
206+ replicas: 3
207+ "# ,
208+ ) ;
209+ validated_cluster ( & kafka)
210+ }
211+
212+ /// A ZooKeeper-mode cluster with a single `broker` role group (no controllers).
213+ fn zookeeper_cluster ( ) -> ValidatedCluster {
214+ let kafka = minimal_kafka (
215+ r#"
216+ apiVersion: kafka.stackable.tech/v1alpha1
217+ kind: KafkaCluster
218+ metadata:
219+ name: simple-kafka
220+ namespace: default
221+ uid: 12345678-1234-1234-1234-123456789012
222+ spec:
223+ image:
224+ productVersion: 3.9.2
225+ clusterConfig:
226+ zookeeperConfigMapName: xyz
227+ brokers:
228+ roleGroups:
229+ default:
230+ replicas: 1
231+ "# ,
232+ ) ;
233+ validated_cluster ( & kafka)
234+ }
235+
236+ #[ test]
237+ fn build_produces_expected_resource_names ( ) {
238+ let cluster = kraft_cluster ( ) ;
239+ let resources = build ( & cluster, "simple-kafka-serviceaccount" ) . expect ( "build succeeds" ) ;
240+
241+ // One StatefulSet per role group.
242+ assert_eq ! (
243+ sorted_names( & resources. stateful_sets) ,
244+ [
245+ "simple-kafka-broker-default" ,
246+ "simple-kafka-controller-default"
247+ ]
248+ ) ;
249+ // One rolegroup ConfigMap per role group.
250+ assert_eq ! (
251+ sorted_names( & resources. config_maps) ,
252+ [
253+ "simple-kafka-broker-default" ,
254+ "simple-kafka-controller-default"
255+ ]
256+ ) ;
257+ // One headless and one metrics Service per role group.
258+ assert_eq ! (
259+ sorted_names( & resources. services) ,
260+ [
261+ "simple-kafka-broker-default-headless" ,
262+ "simple-kafka-broker-default-metrics" ,
263+ "simple-kafka-controller-default-headless" ,
264+ "simple-kafka-controller-default-metrics" ,
265+ ]
266+ ) ;
267+ // Only broker role groups get a bootstrap Listener.
268+ assert_eq ! (
269+ sorted_names( & resources. listeners) ,
270+ [ "simple-kafka-broker-default-bootstrap" ]
271+ ) ;
272+ // A default PodDisruptionBudget per role.
273+ assert_eq ! (
274+ sorted_names( & resources. pod_disruption_budgets) ,
275+ [ "simple-kafka-broker" , "simple-kafka-controller" ]
276+ ) ;
277+ }
278+
279+ /// ZooKeeper mode has no `controller` role, so `build()` emits no controller resources while
280+ /// still producing the broker's bootstrap Listener.
281+ #[ test]
282+ fn build_zookeeper_mode_has_no_controller_resources ( ) {
283+ let cluster = zookeeper_cluster ( ) ;
284+ let resources = build ( & cluster, "simple-kafka-serviceaccount" ) . expect ( "build succeeds" ) ;
285+
286+ assert_eq ! (
287+ sorted_names( & resources. stateful_sets) ,
288+ [ "simple-kafka-broker-default" ]
289+ ) ;
290+ assert_eq ! (
291+ sorted_names( & resources. services) ,
292+ [
293+ "simple-kafka-broker-default-headless" ,
294+ "simple-kafka-broker-default-metrics" ,
295+ ]
296+ ) ;
297+ assert_eq ! (
298+ sorted_names( & resources. listeners) ,
299+ [ "simple-kafka-broker-default-bootstrap" ]
300+ ) ;
301+ assert_eq ! (
302+ sorted_names( & resources. pod_disruption_budgets) ,
303+ [ "simple-kafka-broker" ]
304+ ) ;
305+ }
306+ }
0 commit comments