@@ -990,6 +990,144 @@ func TestAbsorbAll(t *testing.T) {
990990 t , strings .Contains (err .Error (), "behavior must be merge or replace" ))
991991}
992992
993+ func TestAbsorbAllMergeSecretStringData (t * testing.T ) {
994+ tests := []struct {
995+ name string
996+ existing string
997+ incoming string
998+ expected string
999+ }{
1000+ {
1001+ name : "core v1 Secret normalizes stringData" ,
1002+ existing : `
1003+ apiVersion: v1
1004+ data:
1005+ dataOnly: ZGF0YQ==
1006+ generatorWins: b2xkLWRhdGE=
1007+ stringWins: b2xkLWRhdGE=
1008+ kind: Secret
1009+ metadata:
1010+ name: test
1011+ stringData:
1012+ generatorWins: string
1013+ long: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
1014+ multiline: |
1015+ line one
1016+ line two
1017+ stringOnly: string
1018+ stringWins: string
1019+ type: Opaque
1020+ ` ,
1021+ incoming : `
1022+ apiVersion: v1
1023+ data:
1024+ generatedOnly: Z2VuZXJhdGVk
1025+ generatorWins: Z2VuZXJhdGVk
1026+ kind: Secret
1027+ metadata:
1028+ name: test
1029+ type: Opaque
1030+ ` ,
1031+ expected : `
1032+ apiVersion: v1
1033+ data:
1034+ dataOnly: ZGF0YQ==
1035+ generatedOnly: Z2VuZXJhdGVk
1036+ generatorWins: Z2VuZXJhdGVk
1037+ long: |
1038+ YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWj
1039+ AxMjM0NTY3ODk=
1040+ multiline: bGluZSBvbmUKbGluZSB0d28K
1041+ stringOnly: c3RyaW5n
1042+ stringWins: c3RyaW5n
1043+ kind: Secret
1044+ metadata:
1045+ name: test
1046+ type: Opaque
1047+ ` ,
1048+ },
1049+ {
1050+ name : "custom resource does not normalize stringData" ,
1051+ existing : `
1052+ apiVersion: example.com/v1
1053+ data:
1054+ oldOnly: b2xk
1055+ kind: Secret
1056+ metadata:
1057+ name: test
1058+ stringData:
1059+ customOnly: plain
1060+ ` ,
1061+ incoming : `
1062+ apiVersion: example.com/v1
1063+ data:
1064+ generatedOnly: Z2VuZXJhdGVk
1065+ kind: Secret
1066+ metadata:
1067+ name: test
1068+ ` ,
1069+ expected : `
1070+ apiVersion: example.com/v1
1071+ data:
1072+ generatedOnly: Z2VuZXJhdGVk
1073+ oldOnly: b2xk
1074+ kind: Secret
1075+ metadata:
1076+ name: test
1077+ ` ,
1078+ },
1079+ }
1080+
1081+ for _ , tc := range tests {
1082+ t .Run (tc .name , func (t * testing.T ) {
1083+ existing , err := rmF .NewResMapFromBytes ([]byte (tc .existing ))
1084+ require .NoError (t , err )
1085+ incoming , err := rmF .NewResMapFromBytes ([]byte (tc .incoming ))
1086+ require .NoError (t , err )
1087+ incoming .Resources ()[0 ].SetBehavior (types .BehaviorMerge )
1088+ expected , err := rmF .NewResMapFromBytes ([]byte (tc .expected ))
1089+ require .NoError (t , err )
1090+
1091+ require .NoError (t , existing .AbsorbAll (incoming ))
1092+ existing .RemoveBuildAnnotations ()
1093+ require .NoError (t , expected .ErrorIfNotEqualLists (existing ))
1094+ })
1095+ }
1096+ }
1097+
1098+ func TestAbsorbAllRejectsNonScalarSecretStringData (t * testing.T ) {
1099+ existing , err := rmF .NewResMapFromBytes ([]byte (`
1100+ apiVersion: v1
1101+ kind: Secret
1102+ metadata:
1103+ name: test
1104+ stringData:
1105+ invalid:
1106+ nested: value
1107+ type: Opaque
1108+ ` ))
1109+ require .NoError (t , err )
1110+ incoming , err := rmF .NewResMapFromBytes ([]byte (`
1111+ apiVersion: v1
1112+ data:
1113+ generated: Z2VuZXJhdGVk
1114+ kind: Secret
1115+ metadata:
1116+ name: test
1117+ type: Opaque
1118+ ` ))
1119+ require .NoError (t , err )
1120+ incoming .Resources ()[0 ].SetBehavior (types .BehaviorMerge )
1121+ before , err := existing .AsYaml ()
1122+ require .NoError (t , err )
1123+
1124+ err = existing .AbsorbAll (incoming )
1125+ require .ErrorContains (t , err , `stringData value for key "invalid" must be a scalar` )
1126+ after , yamlErr := existing .AsYaml ()
1127+ require .NoError (t , yamlErr )
1128+ assert .Equal (t , before , after )
1129+ }
1130+
9931131func TestToRNodeSlice (t * testing.T ) {
9941132 input := `apiVersion: rbac.authorization.k8s.io/v1
9951133kind: ClusterRole
0 commit comments