Files

100 lines
2.9 KiB
Go

package admission_test
import (
"testing"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/pkg/aggregator/apiserver/plugin/admission"
"github.com/stretchr/testify/require"
admissionv1 "k8s.io/api/admission/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func TestFromMutationResponse(t *testing.T) {
warnings := []string{"warning 1", "warning 2"}
exampleObj := []byte(`{"key": "value"}`)
result := &backend.StatusResult{
Status: "Failure",
Message: "message",
Reason: "reason",
Code: 200,
}
t.Run("should return expected patch", func(t *testing.T) {
response := &backend.MutationResponse{
Allowed: true,
Warnings: warnings,
ObjectBytes: []byte(`{"key": "value2"}`),
}
pt := admissionv1.PatchTypeJSONPatch
expectedAdmissionResponse := &admissionv1.AdmissionResponse{
Allowed: true,
Warnings: warnings,
Patch: []byte(`[{"op":"replace","path":"/key","value":"value2"}]`),
PatchType: &pt,
}
expectedAdmissionReview := &admissionv1.AdmissionReview{
Response: expectedAdmissionResponse,
}
actualAdmissionReview, err := admission.FromMutationResponse(exampleObj, response)
require.NoError(t, err)
require.Equal(t, expectedAdmissionReview, actualAdmissionReview)
})
t.Run("should error if MutationResponse has empty ObjectBytes", func(t *testing.T) {
response := &backend.MutationResponse{
Allowed: true,
Warnings: warnings,
}
_, err := admission.FromMutationResponse(exampleObj, response)
require.Error(t, err)
})
t.Run("should include Result in AdmissionResponse when not allowed", func(t *testing.T) {
response := &backend.MutationResponse{
Allowed: false,
Warnings: warnings,
Result: result,
}
expectedAdmissionResponse := &admissionv1.AdmissionResponse{
Allowed: false,
Warnings: warnings,
Result: &metav1.Status{
Status: result.Status,
Message: result.Message,
Reason: metav1.StatusReason(result.Reason),
Code: result.Code,
},
}
expectedAdmissionReview := &admissionv1.AdmissionReview{
Response: expectedAdmissionResponse,
}
actualAdmissionReview, err := admission.FromMutationResponse(exampleObj, response)
require.NoError(t, err)
require.Equal(t, expectedAdmissionReview, actualAdmissionReview)
})
t.Run("should handle nil Warnings and Result", func(t *testing.T) {
response := &backend.MutationResponse{
Allowed: false,
}
expectedAdmissionResponse := &admissionv1.AdmissionResponse{
Allowed: false,
Result: &metav1.Status{
Status: metav1.StatusFailure,
Message: "Internal error",
Reason: metav1.StatusReasonInternalError,
Code: 500,
},
}
expectedAdmissionReview := &admissionv1.AdmissionReview{
Response: expectedAdmissionResponse,
}
actualAdmissionReview, err := admission.FromMutationResponse(exampleObj, response)
require.NoError(t, err)
require.Equal(t, expectedAdmissionReview, actualAdmissionReview)
})
}