@@ -4,6 +4,7 @@ import com.mitteloupe.cag.core.fake.FakeFileSystemBridge
44import com.mitteloupe.cag.core.generation.filesystem.FileCreator
55import com.mitteloupe.cag.core.generation.versioncatalog.DependencyConfiguration
66import com.mitteloupe.cag.core.generation.versioncatalog.LibraryConstants
7+ import com.mitteloupe.cag.core.generation.versioncatalog.LibraryConstants.TEST_MOCKITO_ANDROID
78import com.mitteloupe.cag.core.generation.versioncatalog.PluginConstants
89import com.mitteloupe.cag.core.generation.versioncatalog.SectionEntryRequirement.LibraryRequirement
910import com.mitteloupe.cag.core.generation.versioncatalog.SectionEntryRequirement.PluginRequirement
@@ -24,6 +25,145 @@ class VersionCatalogUpdaterTest {
2425 classUnderTest = VersionCatalogUpdater (FileCreator (FakeFileSystemBridge ()))
2526 }
2627
28+ @Test
29+ fun `Given libraries include library twice when createOrUpdateVersionCatalog then deduplicates` () {
30+ // Given
31+ val (projectRoot, catalogFile) =
32+ createProjectWithCatalog(
33+ initialContent =
34+ """
35+ [versions]
36+ kotlin = "2.2.10"
37+ compileSdk = "36"
38+ minSdk = "24"
39+ """ .trimIndent()
40+ )
41+
42+ val dependencyConfiguration =
43+ DependencyConfiguration (
44+ versions = emptyList(),
45+ libraries = listOf (TEST_MOCKITO_ANDROID , TEST_MOCKITO_ANDROID ),
46+ plugins = emptyList()
47+ )
48+ val expectedCatalog =
49+ """
50+ [versions]
51+ kotlin = "2.2.10"
52+ compileSdk = "36"
53+ minSdk = "24"
54+ mockitoAndroid = "2.28.6"
55+
56+ [libraries]
57+ test-mockito-android = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline", version.ref = "mockitoAndroid" }
58+
59+ """ .trimIndent()
60+
61+ // When
62+ classUnderTest.createOrUpdateVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
63+ val actualCatalog = catalogFile.readText()
64+
65+ // Then
66+ assertEquals(expectedCatalog, actualCatalog)
67+ }
68+
69+ @Test
70+ fun `Given plugins include plugin twice when createOrUpdateVersionCatalog then deduplicates` () {
71+ // Given
72+ val (projectRoot, catalogFile) =
73+ createProjectWithCatalog(
74+ initialContent =
75+ """
76+ [versions]
77+ kotlin = "2.2.10"
78+ compileSdk = "36"
79+ minSdk = "24"
80+ """ .trimIndent()
81+ )
82+
83+ val dependencyConfiguration =
84+ DependencyConfiguration (
85+ versions = emptyList(),
86+ libraries = emptyList(),
87+ plugins = listOf (PluginConstants .KOTLIN_JVM , PluginConstants .KOTLIN_JVM )
88+ )
89+ val expectedCatalog =
90+ """
91+ [versions]
92+ kotlin = "2.2.10"
93+ compileSdk = "36"
94+ minSdk = "24"
95+
96+ [plugins]
97+ kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
98+
99+ """ .trimIndent()
100+
101+ // When
102+ classUnderTest.createOrUpdateVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
103+ val actualCatalog = catalogFile.readText()
104+
105+ // Then
106+ assertEquals(expectedCatalog, actualCatalog)
107+ }
108+
109+ @Test
110+ fun `Given libraries include library twice when createOrReplaceVersionCatalog then deduplicates` () {
111+ // Given
112+ val projectRoot = createTempDirectory(prefix = " newCatalogDedupLib" ).toFile()
113+
114+ val dependencyConfiguration =
115+ DependencyConfiguration (
116+ versions = emptyList(),
117+ libraries = listOf (TEST_MOCKITO_ANDROID , TEST_MOCKITO_ANDROID ),
118+ plugins = emptyList()
119+ )
120+ val expectedCatalog =
121+ """
122+ [versions]
123+ mockitoAndroid = "2.28.6"
124+
125+ [libraries]
126+ test-mockito-android = { module = "com.linkedin.dexmaker:dexmaker-mockito-inline", version.ref = "mockitoAndroid" }
127+
128+ """ .trimIndent()
129+
130+ // When
131+ classUnderTest.createOrReplaceVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
132+ val actualCatalog = File (projectRoot, " gradle/libs.versions.toml" ).readText()
133+
134+ // Then
135+ assertEquals(expectedCatalog, actualCatalog)
136+ }
137+
138+ @Test
139+ fun `Given plugins include plugin twice when createOrReplaceVersionCatalog then deduplicates` () {
140+ // Given
141+ val projectRoot = createTempDirectory(prefix = " newCatalogDedupPlugin" ).toFile()
142+
143+ val dependencyConfiguration =
144+ DependencyConfiguration (
145+ versions = emptyList(),
146+ libraries = emptyList(),
147+ plugins = listOf (PluginConstants .KOTLIN_JVM , PluginConstants .KOTLIN_JVM )
148+ )
149+ val expectedCatalog =
150+ """
151+ [versions]
152+ kotlin = "2.2.10"
153+
154+ [plugins]
155+ kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
156+
157+ """ .trimIndent()
158+
159+ // When
160+ classUnderTest.createOrReplaceVersionCatalog(projectRootDir = projectRoot, dependencyConfiguration = dependencyConfiguration)
161+ val actualCatalog = File (projectRoot, " gradle/libs.versions.toml" ).readText()
162+
163+ // Then
164+ assertEquals(expectedCatalog, actualCatalog)
165+ }
166+
27167 @Test
28168 fun `Given no catalog file when createOrUpdateVersionCatalog then does nothing` () {
29169 // Given
0 commit comments