@@ -403,6 +403,66 @@ func TestHeartbeatReconcileHandlesCreateError(t *testing.T) {
403403 assert .String (t , "sync reason" , syncCond .Reason , "SyncFailed" )
404404}
405405
406+ func TestHeartbeatReconcileHandlesQuotaExceeded (t * testing.T ) {
407+ scheme := controllertest .NewScheme (t )
408+
409+ heartbeat := & monitoringv1alpha1.BetterStackHeartbeat {
410+ ObjectMeta : metav1.ObjectMeta {
411+ Name : "example" ,
412+ Namespace : "default" ,
413+ Generation : 4 ,
414+ Finalizers : []string {monitoringv1alpha1 .BetterStackHeartbeatFinalizer },
415+ },
416+ Spec : monitoringv1alpha1.BetterStackHeartbeatSpec {
417+ Name : "Example" ,
418+ PeriodSeconds : 60 ,
419+ BaseURL : "https://api.test" ,
420+ APITokenSecretRef : corev1.SecretKeySelector {
421+ LocalObjectReference : corev1.LocalObjectReference {Name : "api" },
422+ Key : "token" ,
423+ },
424+ },
425+ }
426+
427+ secret := & corev1.Secret {
428+ ObjectMeta : metav1.ObjectMeta {Name : "api" , Namespace : "default" },
429+ Data : map [string ][]byte {"token" : []byte ("abcd" )},
430+ }
431+
432+ service := & fakeHeartbeatService {
433+ createFn : func (ctx context.Context , req betterstack.HeartbeatCreateRequest ) (betterstack.Heartbeat , error ) {
434+ return betterstack.Heartbeat {}, & betterstack.APIError {StatusCode : http .StatusForbidden , Message : "Heartbeat quota reached. Please upgrade your account." }
435+ },
436+ }
437+ factory := & fakeBetterStackHeartbeatClientFactory {heartbeat : service }
438+
439+ client := fake .NewClientBuilder ().
440+ WithScheme (scheme ).
441+ WithStatusSubresource (heartbeat ).
442+ WithObjects (heartbeat .DeepCopy (), secret .DeepCopy ()).
443+ Build ()
444+
445+ r := & BetterStackHeartbeatReconciler {Client : client , Scheme : scheme , Clients : factory }
446+
447+ ctx := context .Background ()
448+ res , err := r .Reconcile (ctx , ctrl.Request {NamespacedName : types.NamespacedName {Name : heartbeat .Name , Namespace : heartbeat .Namespace }})
449+ assert .NoError (t , err , "reconcile" )
450+ assert .Equal (t , "requeueAfter" , res .RequeueAfter , requeueIntervalOnError )
451+
452+ updated := & monitoringv1alpha1.BetterStackHeartbeat {}
453+ assert .NoError (t , client .Get (ctx , types.NamespacedName {Name : heartbeat .Name , Namespace : heartbeat .Namespace }, updated ), "fetch updated heartbeat" )
454+ syncCond := controllertest .FindCondition (updated .Status .Conditions , monitoringv1alpha1 .ConditionSync )
455+ assert .NotNil (t , "sync condition" , syncCond )
456+ assert .Equal (t , "sync status" , syncCond .Status , metav1 .ConditionFalse )
457+ assert .String (t , "sync reason" , syncCond .Reason , ReasonHeartbeatQuotaExceeded )
458+ assert .String (t , "sync message" , syncCond .Message , "Better Stack heartbeat quota reached" )
459+ readyCond := controllertest .FindCondition (updated .Status .Conditions , monitoringv1alpha1 .ConditionReady )
460+ assert .NotNil (t , "ready condition" , readyCond )
461+ assert .Equal (t , "ready status" , readyCond .Status , metav1 .ConditionFalse )
462+ assert .String (t , "ready reason" , readyCond .Reason , ReasonHeartbeatQuotaExceeded )
463+ assert .String (t , "ready message" , readyCond .Message , "Better Stack heartbeat quota reached" )
464+ }
465+
406466func TestHeartbeatReconcileHandlesDeletion (t * testing.T ) {
407467 scheme := controllertest .NewScheme (t )
408468
0 commit comments