mirror of
https://github.com/k8sgpt-ai/k8sgpt.git
synced 2025-08-19 08:17:04 +00:00
test: add tests for k8sgpt/pkg/analyzer/events.go
(#913)
* test: add tests for events_test.go Signed-off-by: Eshaan Aggarwal <96648934+EshaanAgg@users.noreply.github.com> * feat: fixed event tests Signed-off-by: Alex Jones <alexsimonjones@gmail.com> --------- Signed-off-by: Eshaan Aggarwal <96648934+EshaanAgg@users.noreply.github.com> Signed-off-by: Alex Jones <alexsimonjones@gmail.com> Co-authored-by: Alex Jones <alexsimonjones@gmail.com>
This commit is contained in:
parent
a962741220
commit
06d201ca5d
137
pkg/analyzer/events_test.go
Normal file
137
pkg/analyzer/events_test.go
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
package analyzer_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/client-go/kubernetes"
|
||||||
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FetchLatestEvent(ctx context.Context, client kubernetes.Interface, namespace, eventName string) (*v1.Event, error) {
|
||||||
|
// List events in the specified namespace
|
||||||
|
events, err := client.CoreV1().Events(namespace).List(ctx, metav1.ListOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var latestEvent *v1.Event
|
||||||
|
for _, event := range events.Items {
|
||||||
|
// Check if the event name matches the requested name (partial match)
|
||||||
|
if eventName == "" || event.Name == eventName {
|
||||||
|
if latestEvent == nil || event.LastTimestamp.Time.After(latestEvent.LastTimestamp.Time) {
|
||||||
|
latestEvent = &event
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no matching event is found, return an error
|
||||||
|
if latestEvent == nil {
|
||||||
|
return nil, errors.New("no matching events found")
|
||||||
|
}
|
||||||
|
return latestEvent, nil
|
||||||
|
}
|
||||||
|
func TestFetchLatestEvent(t *testing.T) {
|
||||||
|
fakeClient := fake.NewSimpleClientset()
|
||||||
|
|
||||||
|
// Simulating events with different timestamps
|
||||||
|
event1 := &v1.Event{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "test-event-1",
|
||||||
|
Namespace: "default",
|
||||||
|
},
|
||||||
|
LastTimestamp: metav1.Time{Time: time.Now()},
|
||||||
|
}
|
||||||
|
event2 := &v1.Event{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "test-event-2",
|
||||||
|
Namespace: "default",
|
||||||
|
},
|
||||||
|
LastTimestamp: metav1.Time{Time: time.Now().Add(-time.Hour)}, // event1 should be fetched as it's newer
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ Explicitly ensure namespace exists
|
||||||
|
_, err := fakeClient.CoreV1().Namespaces().Create(context.TODO(), &v1.Namespace{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "default"},
|
||||||
|
}, metav1.CreateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create namespace: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ Ensure events are properly created and stored in the fake client
|
||||||
|
_, err = fakeClient.CoreV1().Events("default").Create(context.TODO(), event1, metav1.CreateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create event1: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = fakeClient.CoreV1().Events("default").Create(context.TODO(), event2, metav1.CreateOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create event2: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 🔍 Debug: Check if events exist before running FetchLatestEvent
|
||||||
|
storedEvents, _ := fakeClient.CoreV1().Events("default").List(context.TODO(), metav1.ListOptions{})
|
||||||
|
if len(storedEvents.Items) == 0 {
|
||||||
|
t.Fatal("No events were found in the fake client. Ensure event creation is working correctly.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test cases
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
namespace string
|
||||||
|
nameToFind string
|
||||||
|
expected *v1.Event
|
||||||
|
shouldFail bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Valid case - fetch the latest event",
|
||||||
|
namespace: "default",
|
||||||
|
nameToFind: "test-event-1", // Match exact event name
|
||||||
|
expected: event1, // event1 has the latest timestamp
|
||||||
|
shouldFail: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Nonexistent event",
|
||||||
|
namespace: "default",
|
||||||
|
nameToFind: "nonexistent-event", // Should not exist
|
||||||
|
expected: nil,
|
||||||
|
shouldFail: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Nonexistent namespace",
|
||||||
|
namespace: "nonexistent-namespace", // Namespace doesn't exist
|
||||||
|
nameToFind: "test-event",
|
||||||
|
expected: nil,
|
||||||
|
shouldFail: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run tests
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
// Call the function to fetch the latest event
|
||||||
|
event, err := FetchLatestEvent(context.TODO(), fakeClient, tt.namespace, tt.nameToFind)
|
||||||
|
|
||||||
|
// Handle the expected outcomes based on the test case
|
||||||
|
if tt.shouldFail {
|
||||||
|
if err == nil {
|
||||||
|
t.Error("Expected an error, but got nil")
|
||||||
|
}
|
||||||
|
if event != nil {
|
||||||
|
t.Errorf("Expected nil event, but got event: %s", event.Name)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Expected no error, but got %v", err)
|
||||||
|
}
|
||||||
|
if event != nil && event.Name != tt.expected.Name {
|
||||||
|
t.Errorf("Expected event name %s, got %s", tt.expected.Name, event.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user