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 }