github.com/kubeshop/testkube@v1.17.23/internal/common/crd_test.go (about)

     1  package common
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  
    12  	testsv3 "github.com/kubeshop/testkube-operator/api/tests/v3"
    13  )
    14  
    15  var (
    16  	time1    = time.Now().UTC()
    17  	testBare = testsv3.Test{
    18  		TypeMeta: metav1.TypeMeta{},
    19  		ObjectMeta: metav1.ObjectMeta{
    20  			Name: "test-name",
    21  		},
    22  		Spec: testsv3.TestSpec{
    23  			Description: "some-description",
    24  		},
    25  	}
    26  	testWithCreationTimestamp = testsv3.Test{
    27  		TypeMeta: metav1.TypeMeta{},
    28  		ObjectMeta: metav1.ObjectMeta{
    29  			Name:              "test-name",
    30  			CreationTimestamp: metav1.Time{Time: time1},
    31  		},
    32  		Spec: testsv3.TestSpec{
    33  			Description: "some-description",
    34  		},
    35  	}
    36  	testWrongOrder = testsv3.Test{
    37  		TypeMeta: metav1.TypeMeta{},
    38  		ObjectMeta: metav1.ObjectMeta{
    39  			Name: "test-name",
    40  		},
    41  		// Use keys that are not alphabetically ordered
    42  		Spec: testsv3.TestSpec{
    43  			Schedule:    "abc",
    44  			Name:        "example-name",
    45  			Description: "some-description",
    46  		},
    47  	}
    48  	testMessyData = testsv3.Test{
    49  		TypeMeta: metav1.TypeMeta{},
    50  		ObjectMeta: metav1.ObjectMeta{
    51  			Name: "test-name",
    52  			ManagedFields: []metav1.ManagedFieldsEntry{
    53  				{
    54  					Manager:     "some-manager",
    55  					Operation:   "some-operation",
    56  					APIVersion:  "v1",
    57  					FieldsType:  "blah",
    58  					Subresource: "meh",
    59  				},
    60  			},
    61  		},
    62  		// Use keys that are not alphabetically ordered
    63  		Spec: testsv3.TestSpec{
    64  			Description: "some-description",
    65  		},
    66  	}
    67  )
    68  
    69  func TestSerializeCRDNoMutations(t *testing.T) {
    70  	value := testBare.DeepCopy()
    71  	_, _ = SerializeCRD(value, SerializeOptions{
    72  		CleanMeta:             true,
    73  		OmitCreationTimestamp: true,
    74  		Kind:                  "Test",
    75  		GroupVersion:          &testsv3.GroupVersion,
    76  	})
    77  
    78  	assert.Equal(t, value.TypeMeta, testBare.TypeMeta)
    79  	assert.Equal(t, value.ObjectMeta, testBare.ObjectMeta)
    80  }
    81  
    82  func TestSerializeCRD(t *testing.T) {
    83  	b, err := SerializeCRD(testBare.DeepCopy(), SerializeOptions{})
    84  	b2, err2 := SerializeCRD(testWithCreationTimestamp.DeepCopy(), SerializeOptions{OmitCreationTimestamp: true})
    85  	want := strings.TrimSpace(`
    86  metadata:
    87    name: test-name
    88  spec:
    89    description: some-description
    90  status: {}
    91  `)
    92  	assert.NoError(t, err)
    93  	assert.Equal(t, want+"\n", string(b))
    94  	assert.NoError(t, err2)
    95  	assert.Equal(t, want+"\n", string(b2))
    96  }
    97  
    98  func TestSerializeCRDWithCreationTimestamp(t *testing.T) {
    99  	b, err := SerializeCRD(testWithCreationTimestamp.DeepCopy(), SerializeOptions{})
   100  	want := strings.TrimSpace(`
   101  metadata:
   102    name: test-name
   103    creationTimestamp: "%s"
   104  spec:
   105    description: some-description
   106  status: {}
   107  `)
   108  	want = fmt.Sprintf(want, time1.Format(time.RFC3339))
   109  	assert.NoError(t, err)
   110  	assert.Equal(t, want+"\n", string(b))
   111  }
   112  
   113  func TestSerializeCRDWithMessyData(t *testing.T) {
   114  	b, err := SerializeCRD(testMessyData.DeepCopy(), SerializeOptions{})
   115  	b2, err2 := SerializeCRD(testMessyData.DeepCopy(), SerializeOptions{CleanMeta: true})
   116  	want := strings.TrimSpace(`
   117  metadata:
   118    name: test-name
   119    managedFields:
   120    - manager: some-manager
   121      operation: some-operation
   122      apiVersion: v1
   123      fieldsType: blah
   124      subresource: meh
   125  spec:
   126    description: some-description
   127  status: {}
   128  `)
   129  	want2 := strings.TrimSpace(`
   130  metadata:
   131    name: test-name
   132  spec:
   133    description: some-description
   134  status: {}
   135  `)
   136  	assert.NoError(t, err)
   137  	assert.Equal(t, want+"\n", string(b))
   138  	assert.NoError(t, err2)
   139  	assert.Equal(t, want2+"\n", string(b2))
   140  }
   141  
   142  func TestSerializeCRDKeepOrder(t *testing.T) {
   143  	b, err := SerializeCRD(*testWrongOrder.DeepCopy(), SerializeOptions{})
   144  	want := strings.TrimSpace(`
   145  metadata:
   146    name: test-name
   147  spec:
   148    name: example-name
   149    description: some-description
   150    schedule: abc
   151  status: {}
   152  `)
   153  	assert.NoError(t, err)
   154  	assert.Equal(t, want+"\n", string(b))
   155  }
   156  
   157  func TestSerializeCRDs(t *testing.T) {
   158  	b, err := SerializeCRDs([]testsv3.Test{
   159  		*testWrongOrder.DeepCopy(),
   160  		*testBare.DeepCopy(),
   161  	}, SerializeOptions{})
   162  	want := strings.TrimSpace(`
   163  metadata:
   164    name: test-name
   165  spec:
   166    name: example-name
   167    description: some-description
   168    schedule: abc
   169  status: {}
   170  ---
   171  metadata:
   172    name: test-name
   173  spec:
   174    description: some-description
   175  status: {}
   176  `)
   177  	assert.NoError(t, err)
   178  	assert.Equal(t, want+"\n", string(b))
   179  }
   180  
   181  func TestSerializeCRDsFullCleanup(t *testing.T) {
   182  	list := testsv3.TestList{
   183  		Items: []testsv3.Test{
   184  			*testWrongOrder.DeepCopy(),
   185  			*testBare.DeepCopy(),
   186  			*testWithCreationTimestamp.DeepCopy(),
   187  		},
   188  	}
   189  	b, err := SerializeCRDs(list.Items, SerializeOptions{
   190  		CleanMeta:             true,
   191  		OmitCreationTimestamp: true,
   192  		Kind:                  "Test",
   193  		GroupVersion:          &testsv3.GroupVersion,
   194  	})
   195  	want := strings.TrimSpace(`
   196  kind: Test
   197  apiVersion: tests.testkube.io/v3
   198  metadata:
   199    name: test-name
   200  spec:
   201    name: example-name
   202    description: some-description
   203    schedule: abc
   204  status: {}
   205  ---
   206  kind: Test
   207  apiVersion: tests.testkube.io/v3
   208  metadata:
   209    name: test-name
   210  spec:
   211    description: some-description
   212  status: {}
   213  ---
   214  kind: Test
   215  apiVersion: tests.testkube.io/v3
   216  metadata:
   217    name: test-name
   218  spec:
   219    description: some-description
   220  status: {}
   221  `)
   222  	assert.NoError(t, err)
   223  	assert.Equal(t, want+"\n", string(b))
   224  }