@@ -19,11 +19,14 @@ import (
1919 "net/http/httptest"
2020 "strings"
2121 "testing"
22+ "time"
2223
24+ corev1 "k8s.io/api/core/v1"
2325 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426 "k8s.io/apimachinery/pkg/runtime"
2527 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2628 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
29+ k8sfake "k8s.io/client-go/kubernetes/fake"
2730 ctrl "sigs.k8s.io/controller-runtime"
2831 "sigs.k8s.io/controller-runtime/pkg/client"
2932 "sigs.k8s.io/controller-runtime/pkg/client/fake"
@@ -333,6 +336,119 @@ go_goroutines 5
333336 }
334337}
335338
339+ func TestAPIHandler_Events_AllInNamespace (t * testing.T ) {
340+ now := metav1 .NewTime (time .Now ())
341+ ev1 := & corev1.Event {
342+ ObjectMeta : metav1.ObjectMeta {Name : "ev1" , Namespace : "default" },
343+ Type : "Normal" ,
344+ Reason : "ConfigMapCreated" ,
345+ Message : "Created ConfigMap test-cm" ,
346+ InvolvedObject : corev1.ObjectReference {
347+ Kind : "DataFlow" ,
348+ Name : "my-flow" ,
349+ Namespace : "default" ,
350+ },
351+ LastTimestamp : now ,
352+ }
353+ fakeK8s := k8sfake .NewSimpleClientset (ev1 )
354+
355+ scheme := runtime .NewScheme ()
356+ utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
357+ utilruntime .Must (dataflowv1 .AddToScheme (scheme ))
358+ fakeClient := fake .NewClientBuilder ().WithScheme (scheme ).Build ()
359+
360+ server := & Server {
361+ client : fakeClient ,
362+ k8sClient : fakeK8s ,
363+ logger : ctrl .Log .WithName ("test" ),
364+ }
365+ handler := NewAPIHandler (server )
366+
367+ req := httptest .NewRequest ("GET" , "/events?namespace=default" , nil )
368+ w := httptest .NewRecorder ()
369+ handler .ServeHTTP (w , req )
370+
371+ if w .Code != http .StatusOK {
372+ t .Errorf ("Expected 200, got %d: %s" , w .Code , w .Body .String ())
373+ }
374+
375+ var events []corev1.Event
376+ if err := json .NewDecoder (w .Body ).Decode (& events ); err != nil {
377+ t .Fatalf ("Failed to decode: %v" , err )
378+ }
379+ if len (events ) != 1 {
380+ t .Errorf ("Expected 1 event, got %d" , len (events ))
381+ }
382+ if events [0 ].Reason != "ConfigMapCreated" {
383+ t .Errorf ("Expected reason ConfigMapCreated, got %s" , events [0 ].Reason )
384+ }
385+ }
386+
387+ func TestAPIHandler_Events_FilterByManifest (t * testing.T ) {
388+ now := metav1 .NewTime (time .Now ())
389+ ev1 := & corev1.Event {
390+ ObjectMeta : metav1.ObjectMeta {Name : "ev1" , Namespace : "default" },
391+ Type : "Normal" ,
392+ Reason : "ConfigMapCreated" ,
393+ Message : "Created ConfigMap" ,
394+ InvolvedObject : corev1.ObjectReference {
395+ Kind : "DataFlow" , Name : "flow-a" , Namespace : "default" ,
396+ },
397+ LastTimestamp : now ,
398+ }
399+ ev2 := & corev1.Event {
400+ ObjectMeta : metav1.ObjectMeta {Name : "ev2" , Namespace : "default" },
401+ Type : "Warning" ,
402+ Reason : "DeploymentFailed" ,
403+ Message : "Failed" ,
404+ InvolvedObject : corev1.ObjectReference {
405+ Kind : "DataFlow" , Name : "flow-b" , Namespace : "default" ,
406+ },
407+ LastTimestamp : now ,
408+ }
409+ fakeK8s := k8sfake .NewSimpleClientset (ev1 , ev2 )
410+
411+ scheme := runtime .NewScheme ()
412+ utilruntime .Must (clientgoscheme .AddToScheme (scheme ))
413+ utilruntime .Must (dataflowv1 .AddToScheme (scheme ))
414+ fakeClient := fake .NewClientBuilder ().WithScheme (scheme ).Build ()
415+
416+ server := & Server {
417+ client : fakeClient ,
418+ k8sClient : fakeK8s ,
419+ logger : ctrl .Log .WithName ("test" ),
420+ }
421+ handler := NewAPIHandler (server )
422+
423+ req := httptest .NewRequest ("GET" , "/events?namespace=default&name=flow-a" , nil )
424+ w := httptest .NewRecorder ()
425+ handler .ServeHTTP (w , req )
426+
427+ if w .Code != http .StatusOK {
428+ t .Errorf ("Expected 200, got %d: %s" , w .Code , w .Body .String ())
429+ }
430+
431+ var events []corev1.Event
432+ if err := json .NewDecoder (w .Body ).Decode (& events ); err != nil {
433+ t .Fatalf ("Failed to decode: %v" , err )
434+ }
435+ // Fake clientset may not filter by field selector; at minimum we get valid response
436+ if len (events ) == 0 {
437+ t .Errorf ("Expected at least 1 event, got 0" )
438+ }
439+ // If filtering works, we get only flow-a; otherwise we may get both
440+ foundFlowA := false
441+ for _ , e := range events {
442+ if e .InvolvedObject .Name == "flow-a" {
443+ foundFlowA = true
444+ break
445+ }
446+ }
447+ if ! foundFlowA {
448+ t .Errorf ("Expected at least one event for flow-a, got %v" , events )
449+ }
450+ }
451+
336452// TestScannerReadsLongLogLine verifies that a scanner with an increased buffer
337453// reads lines longer than 64 KB without "token too long" error.
338454func TestScannerReadsLongLogLine (t * testing.T ) {
0 commit comments