Skip to content

Commit 198d508

Browse files
committed
impl: add UTs for installed IDEs filtering
1 parent 1c2ae9f commit 198d508

File tree

1 file changed

+336
-0
lines changed

1 file changed

+336
-0
lines changed

src/test/kotlin/com/coder/gateway/models/WorkspaceProjectIDETest.kt

+336
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
package com.coder.gateway.models
22

3+
import com.jetbrains.gateway.ssh.AvailableIde
4+
import com.jetbrains.gateway.ssh.Download
5+
import com.jetbrains.gateway.ssh.InstalledIdeUIEx
6+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct
7+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct.GOIDE
8+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct.IDEA
9+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct.IDEA_IC
10+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct.PYCHARM
11+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct.RUBYMINE
12+
import com.jetbrains.gateway.ssh.IntelliJPlatformProduct.RUSTROVER
13+
import com.jetbrains.gateway.ssh.ReleaseType
14+
import com.jetbrains.gateway.ssh.ReleaseType.EAP
15+
import com.jetbrains.gateway.ssh.ReleaseType.NIGHTLY
16+
import com.jetbrains.gateway.ssh.ReleaseType.PREVIEW
17+
import com.jetbrains.gateway.ssh.ReleaseType.RC
18+
import com.jetbrains.gateway.ssh.ReleaseType.RELEASE
19+
import org.junit.jupiter.api.DisplayName
320
import java.net.URL
421
import kotlin.test.Test
522
import kotlin.test.assertContains
@@ -125,4 +142,323 @@ internal class WorkspaceProjectIDETest {
125142
},
126143
)
127144
}
145+
146+
@Test
147+
@DisplayName("test that installed IDEs filter returns an empty list when there are available IDEs but none are installed")
148+
fun testFilterOutWhenNoIdeIsInstalledButAvailableIsPopulated() {
149+
assertEquals(
150+
emptyList(), emptyList<InstalledIdeUIEx>().filterOutAvailableReleasedIdes(
151+
listOf(
152+
availableIde(IDEA, "242.23726.43", EAP),
153+
availableIde(IDEA_IC, "251.23726.43", RELEASE)
154+
)
155+
)
156+
)
157+
}
158+
159+
@Test
160+
@DisplayName("test that unreleased installed IDEs are not filtered out when available list of IDEs is empty")
161+
fun testFilterOutAvailableReleaseIdesWhenAvailableIsEmpty() {
162+
// given an eap installed ide
163+
val installedEAPs = listOf(installedIde(IDEA, "242.23726.43", EAP))
164+
165+
// expect
166+
assertEquals(installedEAPs, installedEAPs.filterOutAvailableReleasedIdes(emptyList()))
167+
168+
// given an RC installed ide
169+
val installedRCs = listOf(installedIde(RUSTROVER, "243.63726.48", RC))
170+
171+
// expect
172+
assertEquals(installedRCs, installedRCs.filterOutAvailableReleasedIdes(emptyList()))
173+
174+
// given a preview installed ide
175+
val installedPreviews = listOf(installedIde(IDEA_IC, "244.63726.48", ReleaseType.PREVIEW))
176+
177+
// expect
178+
assertEquals(installedPreviews, installedPreviews.filterOutAvailableReleasedIdes(emptyList()))
179+
180+
// given a nightly installed ide
181+
val installedNightlys = listOf(installedIde(RUBYMINE, "244.63726.48", NIGHTLY))
182+
183+
// expect
184+
assertEquals(installedNightlys, installedNightlys.filterOutAvailableReleasedIdes(emptyList()))
185+
}
186+
187+
@Test
188+
@DisplayName("test that unreleased EAP ides are superseded by available RELEASED ides with the same or higher build number")
189+
fun testUnreleasedAndInstalledEAPIdesAreSupersededByAvailableReleasedWithSameOrHigherBuildNr() {
190+
// given an eap installed ide
191+
val installedEapIdea = installedIde(IDEA, "242.23726.43", EAP)
192+
val installedReleasedRustRover = installedIde(RUSTROVER, "251.55667.23", RELEASE)
193+
// and a released idea with same build number
194+
val availableReleasedIdeaWithSameBuild = availableIde(IDEA, "242.23726.43", RELEASE)
195+
196+
// expect the installed eap idea to be filtered out
197+
assertEquals(
198+
listOf(installedReleasedRustRover),
199+
listOf(installedEapIdea, installedReleasedRustRover).filterOutAvailableReleasedIdes(
200+
listOf(
201+
availableReleasedIdeaWithSameBuild
202+
)
203+
)
204+
)
205+
206+
// given a released idea with higher build number
207+
val availableIdeaWithHigherBuild = availableIde(IDEA, "243.21726.43", RELEASE)
208+
209+
// expect the installed eap idea to be filtered out
210+
assertEquals(
211+
listOf(installedReleasedRustRover),
212+
listOf(installedEapIdea, installedReleasedRustRover).filterOutAvailableReleasedIdes(
213+
listOf(
214+
availableIdeaWithHigherBuild
215+
)
216+
)
217+
)
218+
}
219+
220+
@Test
221+
@DisplayName("test that unreleased RC ides are superseded by available RELEASED ides with the same or higher build number")
222+
fun testUnreleasedAndInstalledRCIdesAreSupersededByAvailableReleasedWithSameOrHigherBuildNr() {
223+
// given an RC installed ide
224+
val installedRCRustRover = installedIde(RUSTROVER, "242.23726.43", RC)
225+
val installedReleasedGoLand = installedIde(GOIDE, "251.55667.23", RELEASE)
226+
// and a released idea with same build number
227+
val availableReleasedRustRoverWithSameBuild = availableIde(RUSTROVER, "242.23726.43", RELEASE)
228+
229+
// expect the installed RC rust rover to be filtered out
230+
assertEquals(
231+
listOf(installedReleasedGoLand),
232+
listOf(installedRCRustRover, installedReleasedGoLand).filterOutAvailableReleasedIdes(
233+
listOf(
234+
availableReleasedRustRoverWithSameBuild
235+
)
236+
)
237+
)
238+
239+
// given a released rust rover with higher build number
240+
val availableRustRoverWithHigherBuild = availableIde(RUSTROVER, "243.21726.43", RELEASE)
241+
242+
// expect the installed RC rust rover to be filtered out
243+
assertEquals(
244+
listOf(installedReleasedGoLand),
245+
listOf(installedRCRustRover, installedReleasedGoLand).filterOutAvailableReleasedIdes(
246+
listOf(
247+
availableRustRoverWithHigherBuild
248+
)
249+
)
250+
)
251+
}
252+
253+
@Test
254+
@DisplayName("test that unreleased PREVIEW ides are superseded by available RELEASED ides with the same or higher build number")
255+
fun testUnreleasedAndInstalledPreviewIdesAreSupersededByAvailableReleasedWithSameOrHigherBuildNr() {
256+
// given a PREVIEW installed ide
257+
val installedPreviewRubyMine = installedIde(RUBYMINE, "242.23726.43", PREVIEW)
258+
val installedReleasedIntelliJCommunity = installedIde(IDEA_IC, "251.55667.23", RELEASE)
259+
// and a released ruby mine with same build number
260+
val availableReleasedRubyMineWithSameBuild = availableIde(RUBYMINE, "242.23726.43", RELEASE)
261+
262+
// expect the installed PREVIEW idea to be filtered out
263+
assertEquals(
264+
listOf(installedReleasedIntelliJCommunity),
265+
listOf(installedPreviewRubyMine, installedReleasedIntelliJCommunity).filterOutAvailableReleasedIdes(
266+
listOf(
267+
availableReleasedRubyMineWithSameBuild
268+
)
269+
)
270+
)
271+
272+
// given a released ruby mine with higher build number
273+
val availableRubyMineWithHigherBuild = availableIde(RUBYMINE, "243.21726.43", RELEASE)
274+
275+
// expect the installed PREVIEW ruby mine to be filtered out
276+
assertEquals(
277+
listOf(installedReleasedIntelliJCommunity),
278+
listOf(installedPreviewRubyMine, installedReleasedIntelliJCommunity).filterOutAvailableReleasedIdes(
279+
listOf(
280+
availableRubyMineWithHigherBuild
281+
)
282+
)
283+
)
284+
}
285+
286+
@Test
287+
@DisplayName("test that unreleased NIGHTLY ides are superseded by available RELEASED ides with the same or higher build number")
288+
fun testUnreleasedAndInstalledNightlyIdesAreSupersededByAvailableReleasedWithSameOrHigherBuildNr() {
289+
// given a NIGHTLY installed ide
290+
val installedNightlyPyCharm = installedIde(PYCHARM, "242.23726.43", NIGHTLY)
291+
val installedReleasedRubyMine = installedIde(RUBYMINE, "251.55667.23", RELEASE)
292+
// and a released pycharm with same build number
293+
val availableReleasedPyCharmWithSameBuild = availableIde(PYCHARM, "242.23726.43", RELEASE)
294+
295+
// expect the installed NIGHTLY pycharm to be filtered out
296+
assertEquals(
297+
listOf(installedReleasedRubyMine),
298+
listOf(installedNightlyPyCharm, installedReleasedRubyMine).filterOutAvailableReleasedIdes(
299+
listOf(
300+
availableReleasedPyCharmWithSameBuild
301+
)
302+
)
303+
)
304+
305+
// given a released pycharm with higher build number
306+
val availablePyCharmWithHigherBuild = availableIde(PYCHARM, "243.21726.43", RELEASE)
307+
308+
// expect the installed NIGHTLY pycharm to be filtered out
309+
assertEquals(
310+
listOf(installedReleasedRubyMine),
311+
listOf(installedNightlyPyCharm, installedReleasedRubyMine).filterOutAvailableReleasedIdes(
312+
listOf(
313+
availablePyCharmWithHigherBuild
314+
)
315+
)
316+
)
317+
}
318+
319+
@Test
320+
@DisplayName("test that unreleased installed ides are NOT superseded by available unreleased IDEs with higher build numbers")
321+
fun testUnreleasedIdesAreNotSupersededByAvailableUnreleasedIdesWithHigherBuildNr() {
322+
// given installed and unreleased ides
323+
val installedEap = listOf(installedIde(RUSTROVER, "203.87675.5", EAP))
324+
val installedRC = listOf(installedIde(RUSTROVER, "203.87675.5", RC))
325+
val installedPreview = listOf(installedIde(RUSTROVER, "203.87675.5", PREVIEW))
326+
val installedNightly = listOf(installedIde(RUSTROVER, "203.87675.5", NIGHTLY))
327+
328+
// and available unreleased ides
329+
val availableHigherAndUnreleasedIdes = listOf(
330+
availableIde(RUSTROVER, "204.34567.1", EAP),
331+
availableIde(RUSTROVER, "205.45678.2", RC),
332+
availableIde(RUSTROVER, "206.24667.3", PREVIEW),
333+
availableIde(RUSTROVER, "207.24667.4", NIGHTLY),
334+
)
335+
336+
assertEquals(
337+
installedEap,
338+
installedEap.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
339+
)
340+
assertEquals(
341+
installedRC,
342+
installedRC.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
343+
)
344+
assertEquals(
345+
installedPreview,
346+
installedPreview.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
347+
)
348+
assertEquals(
349+
installedNightly,
350+
installedNightly.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
351+
)
352+
}
353+
354+
@Test
355+
@DisplayName("test that unreleased installed ides are NOT superseded by available unreleased IDEs with same major number but higher minor build numbers")
356+
fun testUnreleasedIdesAreNotSupersededByAvailableUnreleasedIdesWithSameMajorButHigherMinorBuildNr() {
357+
// given installed and unreleased ides
358+
val installedEap = listOf(installedIde(RUSTROVER, "203.12345.5", EAP))
359+
val installedRC = listOf(installedIde(RUSTROVER, "203.12345.5", RC))
360+
val installedPreview = listOf(installedIde(RUSTROVER, "203.12345.5", PREVIEW))
361+
val installedNightly = listOf(installedIde(RUSTROVER, "203.12345.5", NIGHTLY))
362+
363+
// and available unreleased ides
364+
val availableHigherAndUnreleasedIdes = listOf(
365+
availableIde(RUSTROVER, "203.34567.1", EAP),
366+
availableIde(RUSTROVER, "203.45678.2", RC),
367+
availableIde(RUSTROVER, "203.24667.3", PREVIEW),
368+
availableIde(RUSTROVER, "203.24667.4", NIGHTLY),
369+
)
370+
371+
assertEquals(
372+
installedEap,
373+
installedEap.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
374+
)
375+
assertEquals(
376+
installedRC,
377+
installedRC.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
378+
)
379+
assertEquals(
380+
installedPreview,
381+
installedPreview.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
382+
)
383+
assertEquals(
384+
installedNightly,
385+
installedNightly.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
386+
)
387+
}
388+
389+
@Test
390+
@DisplayName("test that unreleased installed ides are NOT superseded by available unreleased IDEs with same major and minor number but higher patch numbers")
391+
fun testUnreleasedIdesAreNotSupersededByAvailableUnreleasedIdesWithSameMajorAndMinorButHigherPatchNr() {
392+
// given installed and unreleased ides
393+
val installedEap = listOf(installedIde(RUSTROVER, "203.12345.1", EAP))
394+
val installedRC = listOf(installedIde(RUSTROVER, "203.12345.1", RC))
395+
val installedPreview = listOf(installedIde(RUSTROVER, "203.12345.1", PREVIEW))
396+
val installedNightly = listOf(installedIde(RUSTROVER, "203.12345.1", NIGHTLY))
397+
398+
// and available unreleased ides
399+
val availableHigherAndUnreleasedIdes = listOf(
400+
availableIde(RUSTROVER, "203.12345.2", EAP),
401+
availableIde(RUSTROVER, "203.12345.3", RC),
402+
availableIde(RUSTROVER, "203.12345.4", PREVIEW),
403+
availableIde(RUSTROVER, "203.12345.5", NIGHTLY),
404+
)
405+
406+
assertEquals(
407+
installedEap,
408+
installedEap.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
409+
)
410+
assertEquals(
411+
installedRC,
412+
installedRC.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
413+
)
414+
assertEquals(
415+
installedPreview,
416+
installedPreview.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
417+
)
418+
assertEquals(
419+
installedNightly,
420+
installedNightly.filterOutAvailableReleasedIdes(availableHigherAndUnreleasedIdes)
421+
)
422+
}
423+
424+
companion object {
425+
private val fakeDownload = Download(
426+
"https://download.jetbrains.com/idea/ideaIU-2024.1.7.tar.gz",
427+
1328462259,
428+
"https://download.jetbrains.com/idea/ideaIU-2024.1.7.tar.gz.sha256"
429+
)
430+
431+
private fun installedIde(
432+
product: IntelliJPlatformProduct,
433+
buildNumber: String,
434+
releaseType: ReleaseType
435+
): InstalledIdeUIEx {
436+
return InstalledIdeUIEx(
437+
product,
438+
buildNumber,
439+
"/home/coder/.cache/JetBrains/",
440+
toPresentableVersion(buildNumber) + " " + releaseType.toString()
441+
)
442+
}
443+
444+
private fun availableIde(
445+
product: IntelliJPlatformProduct,
446+
buildNumber: String,
447+
releaseType: ReleaseType
448+
): AvailableIde {
449+
return AvailableIde(
450+
product,
451+
buildNumber,
452+
fakeDownload,
453+
toPresentableVersion(buildNumber) + " " + releaseType.toString(),
454+
null,
455+
releaseType
456+
)
457+
}
458+
459+
private fun toPresentableVersion(buildNr: String): String {
460+
461+
return "20" + buildNr.substring(0, 2) + "." + buildNr.substring(2, 3)
462+
}
463+
}
128464
}

0 commit comments

Comments
 (0)