@@ -8,12 +8,38 @@ import (
88 "time"
99
1010 "github.com/google/go-cmp/cmp"
11+ "github.com/stretchr/testify/assert"
12+ "github.com/stretchr/testify/require"
13+ "github.com/twmb/franz-go/pkg/kadm"
14+ "github.com/twmb/franz-go/pkg/kerr"
1115 "k8s.io/apimachinery/pkg/util/json"
1216
1317 "github.com/crossplane-contrib/provider-kafka/apis/v1alpha1"
1418 "github.com/crossplane-contrib/provider-kafka/internal/clients/kafka"
1519)
1620
21+ // fakeACLAdmin is an in-process implementation of adminClient for unit tests.
22+ type fakeACLAdmin struct {
23+ createResults kadm.CreateACLsResults
24+ createErr error
25+ describeResults kadm.DescribeACLsResults
26+ describeErr error
27+ deleteResults kadm.DeleteACLsResults
28+ deleteErr error
29+ }
30+
31+ func (f * fakeACLAdmin ) CreateACLs (_ context.Context , _ * kadm.ACLBuilder ) (kadm.CreateACLsResults , error ) {
32+ return f .createResults , f .createErr
33+ }
34+
35+ func (f * fakeACLAdmin ) DescribeACLs (_ context.Context , _ * kadm.ACLBuilder ) (kadm.DescribeACLsResults , error ) {
36+ return f .describeResults , f .describeErr
37+ }
38+
39+ func (f * fakeACLAdmin ) DeleteACLs (_ context.Context , _ * kadm.ACLBuilder ) (kadm.DeleteACLsResults , error ) {
40+ return f .deleteResults , f .deleteErr
41+ }
42+
1743var dataTesting = []byte (os .Getenv ("KAFKA_CONFIG" ))
1844
1945var baseACL = AccessControlList {
@@ -477,6 +503,69 @@ func TestList(t *testing.T) {
477503 }
478504}
479505
506+ // --- Unit tests for broker-level error propagation (no real Kafka needed) ---
507+
508+ func TestCreateBrokerError (t * testing.T ) {
509+ t .Parallel ()
510+ cl := & fakeACLAdmin {
511+ createResults : kadm.CreateACLsResults {
512+ {Principal : "User:alice" , Err : kerr .ClusterAuthorizationFailed },
513+ },
514+ }
515+ err := Create (context .Background (), cl , & baseACL )
516+ require .Error (t , err )
517+ }
518+
519+ func TestCreateEmptyResponse (t * testing.T ) {
520+ t .Parallel ()
521+ cl := & fakeACLAdmin {createResults : kadm.CreateACLsResults {}}
522+ err := Create (context .Background (), cl , & baseACL )
523+ require .Error (t , err )
524+ }
525+
526+ func TestListBrokerError (t * testing.T ) {
527+ t .Parallel ()
528+ cl := & fakeACLAdmin {
529+ describeResults : kadm.DescribeACLsResults {
530+ {Err : kerr .ClusterAuthorizationFailed },
531+ },
532+ }
533+ got , err := List (context .Background (), cl , & baseACL )
534+ require .Error (t , err )
535+ assert .Nil (t , got )
536+ }
537+
538+ func TestListNotFound (t * testing.T ) {
539+ t .Parallel ()
540+ cl := & fakeACLAdmin {
541+ describeResults : kadm.DescribeACLsResults {
542+ {Described : kadm.DescribedACLs {}},
543+ },
544+ }
545+ got , err := List (context .Background (), cl , & baseACL )
546+ require .NoError (t , err )
547+ assert .Nil (t , got )
548+ }
549+
550+ func TestListEmptyResponse (t * testing.T ) {
551+ t .Parallel ()
552+ cl := & fakeACLAdmin {describeResults : kadm.DescribeACLsResults {}}
553+ got , err := List (context .Background (), cl , & baseACL )
554+ require .NoError (t , err )
555+ assert .Nil (t , got )
556+ }
557+
558+ func TestDeleteBrokerError (t * testing.T ) {
559+ t .Parallel ()
560+ cl := & fakeACLAdmin {
561+ deleteResults : kadm.DeleteACLsResults {
562+ {Err : kerr .ClusterAuthorizationFailed },
563+ },
564+ }
565+ err := Delete (context .Background (), cl , & baseACL )
566+ require .Error (t , err )
567+ }
568+
480569// TestListAtProviderNotFound verifies that List returns nil when the ACL does not exist.
481570func TestListAtProviderNotFound (t * testing.T ) {
482571 if len (dataTesting ) == 0 {
0 commit comments