1
+ /* ******************************************************************************
2
+ * Copyright (c) 2025 Red Hat, Inc.
3
+ * Distributed under license by Red Hat, Inc. All rights reserved.
4
+ * This program is made available under the terms of the
5
+ * Eclipse Public License v2.0 which accompanies this distribution,
6
+ * and is available at http://www.eclipse.org/legal/epl-v20.html
7
+ *
8
+ * Contributors:
9
+ * Red Hat, Inc. - initial API and implementation
10
+ ******************************************************************************/
11
+ package com.redhat.devtools.intellij.kubernetes.editor
12
+
13
+ import com.intellij.json.JsonFileType
14
+ import com.intellij.openapi.fileTypes.PlainTextFileType
15
+ import com.redhat.devtools.intellij.kubernetes.model.mocks.ClientMocks.resource
16
+ import com.redhat.devtools.intellij.kubernetes.model.util.ResourceException
17
+ import io.fabric8.kubernetes.api.model.Pod
18
+ import io.fabric8.kubernetes.client.utils.Serialization
19
+ import org.assertj.core.api.Assertions.assertThat
20
+ import org.assertj.core.api.Assertions.assertThatThrownBy
21
+ import org.jetbrains.yaml.YAMLFileType
22
+ import org.junit.Test
23
+
24
+ class EditorResourceSerializationTest {
25
+
26
+ @Test
27
+ fun `#deserialize return empty list if it is given null yaml` () {
28
+ // given
29
+ // when
30
+ val result = EditorResourceSerialization .deserialize(null , YAMLFileType .YML , " dagobah" )
31
+ // then
32
+ assertThat(result).isEmpty()
33
+ }
34
+
35
+ @Test
36
+ fun `#deserialize returns a list of resources if given multi-resource YAML` () {
37
+ // given
38
+ val yaml = """
39
+ apiVersion: v1
40
+ kind: Pod
41
+ metadata:
42
+ name: yoda
43
+ ---
44
+ apiVersion: v1
45
+ kind: Service
46
+ metadata:
47
+ name: luke
48
+ """ .trimIndent()
49
+ // when
50
+ val result = EditorResourceSerialization .deserialize(yaml, YAMLFileType .YML , " dagobah" )
51
+ // then
52
+ assertThat(result)
53
+ .hasSize(2 )
54
+ .extracting(" kind" )
55
+ .containsExactly(" Pod" , " Service" )
56
+ }
57
+
58
+ @Test
59
+ fun `#deserialize throws if given multiple json resources` () {
60
+ // given
61
+ val json = """
62
+ {"apiVersion": "v1", "kind": "Pod"}
63
+ ---
64
+ {"apiVersion": "v1", "kind": "Service"}
65
+ """ .trimIndent()
66
+
67
+ assertThatThrownBy {
68
+ // when
69
+ EditorResourceSerialization .deserialize(json, JsonFileType .INSTANCE , " test" )
70
+ // then
71
+ }.isInstanceOf(ResourceException ::class .java)
72
+ }
73
+
74
+ @Test
75
+ fun `#deserialize returns a list with a single resource if given valid JSON with a single resource` () {
76
+ // given
77
+ val json = """
78
+ {
79
+ "apiVersion": "v1",
80
+ "kind": "Pod",
81
+ "metadata": {
82
+ "name": "obiwan"
83
+ }
84
+ }
85
+ """ .trimIndent()
86
+ // when
87
+ val result = EditorResourceSerialization .deserialize(json, JsonFileType .INSTANCE , " test" )
88
+ // then
89
+ assertThat(result)
90
+ .singleElement()
91
+ .extracting(" kind" )
92
+ .isEqualTo(" Pod" )
93
+ }
94
+
95
+ @Test
96
+ fun `#deserialize sets the current namespace to the resulting resource if it has no namespace` () {
97
+ // given
98
+ val yaml = """
99
+ apiVersion: v1
100
+ kind: Pod
101
+ metadata:
102
+ name: has-no-namespace
103
+ """ .trimIndent()
104
+ // when
105
+ val result = EditorResourceSerialization .deserialize(yaml, YAMLFileType .YML , " namespace-that-should-be-set" )
106
+ // then
107
+ assertThat(result)
108
+ .first()
109
+ .extracting { it.metadata.namespace }
110
+ .isEqualTo(" namespace-that-should-be-set" )
111
+ }
112
+
113
+ @Test
114
+ fun `#deserialize only sets the current namespace to the resources that have no namespace` () {
115
+ // given
116
+ val yaml = """
117
+ apiVersion: v1
118
+ kind: Pod
119
+ metadata:
120
+ name: has-no-namespace
121
+ ---
122
+ apiVersion: v1
123
+ kind: Pod
124
+ metadata:
125
+ name: has-a-namespace
126
+ namespace: alderaan
127
+ """ .trimIndent()
128
+ // when
129
+ val result = EditorResourceSerialization .deserialize(
130
+ yaml, YAMLFileType .YML , " namespace-that-should-be-set"
131
+ )
132
+ // then
133
+ assertThat(result)
134
+ .satisfiesExactly(
135
+ { assertThat(it.metadata.namespace).isEqualTo(" namespace-that-should-be-set" ) }, // namespace set
136
+ { assertThat(it.metadata.namespace).isEqualTo(" alderaan" ) } // no namespace set
137
+ )
138
+ }
139
+
140
+ @Test
141
+ fun `#deserialize does not change namespace in the resulting resource if it has a namespace` () {
142
+ // given
143
+ val yaml = """
144
+ apiVersion: v1
145
+ kind: Pod
146
+ metadata:
147
+ name: yoda
148
+ namespace: has-a-namespace
149
+ """ .trimIndent()
150
+ // when
151
+ val result = EditorResourceSerialization .deserialize(yaml, YAMLFileType .YML , null ) // no namespace provided
152
+ // then
153
+ assertThat(result)
154
+ .first()
155
+ .extracting { it.metadata.namespace }
156
+ .isEqualTo(" has-a-namespace" )
157
+ }
158
+
159
+ @Test
160
+ fun `#deserialize throws if given invalid yaml` () {
161
+ // given
162
+ val invalidYaml = """
163
+ apiVersion: v1
164
+ kind: Pod
165
+ metadata: invalid
166
+ """ .trimIndent()
167
+ assertThatThrownBy {
168
+ // when
169
+ EditorResourceSerialization .deserialize(invalidYaml, YAMLFileType .YML , " dagobah" )
170
+ // then
171
+ }.isInstanceOf(ResourceException ::class .java)
172
+ }
173
+
174
+ @Test
175
+ fun `#serialize returns null if given null file type` () {
176
+ // given
177
+ val resource = resource<Pod >(" darth vader" )
178
+ // when
179
+ val result = EditorResourceSerialization .serialize(listOf (resource), null )
180
+ // then
181
+ assertThat(result)
182
+ .isNull()
183
+ }
184
+
185
+ @Test
186
+ fun `#serialize throws if given multiple resources and non-YAML file type` () {
187
+ // given
188
+ val resources = listOf (
189
+ resource<Pod >(" darth vader" ),
190
+ resource<Pod >(" emperor" )
191
+ )
192
+ assertThatThrownBy {
193
+ // when
194
+ EditorResourceSerialization .serialize(resources, JsonFileType .INSTANCE )
195
+ // then
196
+ }.isInstanceOf(UnsupportedOperationException ::class .java)
197
+ }
198
+
199
+ @Test
200
+ fun `#serialize returns correct YAML if given single resource and YAML file type` () {
201
+ // given
202
+ val resource = resource<Pod >(" obiwan" )
203
+ val expected = Serialization .asYaml(resource).trim()
204
+ // when
205
+ val result = EditorResourceSerialization .serialize(listOf (resource), YAMLFileType .YML )
206
+ // then
207
+ assertThat(result)
208
+ .isEqualTo(expected)
209
+ }
210
+
211
+ @Test
212
+ fun `#serialize returns multiple YAML resources joined with newline if given 2 resources and YAML file type` () {
213
+ // given
214
+ val resources = listOf (
215
+ resource<Pod >(" leia" ),
216
+ resource<Pod >(" luke" )
217
+ )
218
+ val expected = resources
219
+ .joinToString(" \n " ) {
220
+ Serialization .asYaml(it).trim()
221
+ }
222
+ // when
223
+ val result = EditorResourceSerialization .serialize(resources, YAMLFileType .YML )
224
+ // then
225
+ assertThat(result)
226
+ .isEqualTo(expected)
227
+ }
228
+
229
+ @Test
230
+ fun `#serialize returns JSON if given JSON file type` () {
231
+ // given
232
+ val resource = resource<Pod >(" obiwan" )
233
+ val expected = Serialization .asJson(resource).trim()
234
+ // when
235
+ val result = EditorResourceSerialization .serialize(listOf (resource), JsonFileType .INSTANCE )
236
+ // then
237
+ assertThat(result)
238
+ .isEqualTo(expected)
239
+ }
240
+
241
+ @Test
242
+ fun `#serialize returns null if given unsupported file type` () {
243
+ // given
244
+ val resource = resource<Pod >(" leia" )
245
+ // when
246
+ val result = EditorResourceSerialization .serialize(listOf (resource), PlainTextFileType .INSTANCE )
247
+ // then
248
+ assertThat(result)
249
+ .isEqualTo(" " )
250
+ }
251
+
252
+ }
0 commit comments