grafana/apps/provisioning/pkg/controller/job_test.go

86 lines
2.6 KiB
Go

package controller
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
provisioning "github.com/grafana/grafana/apps/provisioning/pkg/apis/provisioning/v0alpha1"
provisioningfake "github.com/grafana/grafana/apps/provisioning/pkg/generated/clientset/versioned/fake"
provisioninginformers "github.com/grafana/grafana/apps/provisioning/pkg/generated/informers/externalversions"
)
func TestJobController_New(t *testing.T) {
client := provisioningfake.NewSimpleClientset()
informerFactory := provisioninginformers.NewSharedInformerFactory(client, time.Second)
jobInformer := informerFactory.Provisioning().V0alpha1().Jobs()
controller, err := NewJobController(jobInformer)
require.NoError(t, err)
assert.NotNil(t, controller)
assert.NotNil(t, controller.notifications)
}
func TestJobController_InsertNotifications(t *testing.T) {
client := provisioningfake.NewSimpleClientset()
informerFactory := provisioninginformers.NewSharedInformerFactory(client, time.Second)
jobInformer := informerFactory.Provisioning().V0alpha1().Jobs()
controller, err := NewJobController(jobInformer)
require.NoError(t, err)
notifications := controller.InsertNotifications()
assert.NotNil(t, notifications)
// Test that notification is sent
controller.sendNotification()
select {
case <-notifications:
// Success - notification received
case <-time.After(time.Second):
t.Fatal("Expected notification but didn't receive one")
}
}
func TestJobController_NotificationOnJobCreate(t *testing.T) {
client := provisioningfake.NewSimpleClientset()
informerFactory := provisioninginformers.NewSharedInformerFactory(client, time.Second)
jobInformer := informerFactory.Provisioning().V0alpha1().Jobs()
controller, err := NewJobController(jobInformer)
require.NoError(t, err)
// Start informer and wait for cache sync
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
informerFactory.Start(ctx.Done())
informerFactory.WaitForCacheSync(ctx.Done())
// Get notifications channel
notifications := controller.InsertNotifications()
// Create a job - this should trigger a notification
_, err = client.ProvisioningV0alpha1().Jobs("default").Create(ctx, &provisioning.Job{
ObjectMeta: metav1.ObjectMeta{
Name: "test-job",
Namespace: "default",
},
}, metav1.CreateOptions{})
require.NoError(t, err)
// Wait for notification
select {
case <-notifications:
// Success - notification received
case <-time.After(time.Second * 2):
t.Fatal("Expected notification but didn't receive one")
}
}