package expo.modules.plugin import com.google.common.truth.Truth.assertThat import org.gradle.testfixtures.ProjectBuilder import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder import java.io.File class FixManifestMaxSdkTaskTest { @get:Rule val tempFolder = TemporaryFolder() private lateinit var blameReportFile: File private lateinit var mergedManifestIn: File private lateinit var modifiedManifestOut: File private lateinit var manifest1: File private lateinit var manifest2: File @Before fun setup() { val projectDir = tempFolder.root blameReportFile = File(projectDir, "blame-report.txt") mergedManifestIn = File(projectDir, "merged-manifest-in.xml") modifiedManifestOut = File(projectDir, "modified-manifest-out.xml") val manifestDir1 = File(projectDir, "lib1/src/main").apply { mkdirs() } val manifestDir2 = File(projectDir, "app/src/main").apply { mkdirs() } manifest1 = File(manifestDir1, "AndroidManifest.xml") manifest1.writeText(""" """.trimIndent()) manifest2 = File(manifestDir2, "AndroidManifest.xml") manifest2.writeText(""" """.trimIndent()) blameReportFile.writeText(""" uses-permission#android.permission.READ_CONTACTS MERGED from ${manifest2.absolutePath}:5:3-33 MERGED from ${manifest1.absolutePath}:3:3-83 android:maxSdkVersion ADDED from ${manifest1.absolutePath}:4:7-34 """.trimIndent()) mergedManifestIn.writeText(""" """.trimIndent()) } @Test fun `task removes maxSdkVersion from conflicting permission`() { val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build() val task = project.tasks.register("testFixTask", FixManifestMaxSdkTask::class.java).get() task.blameReportFile.set(blameReportFile) task.mergedManifestIn.set(mergedManifestIn) task.modifiedManifestOut.set(modifiedManifestOut) task.taskAction() val outputContent = modifiedManifestOut.readText() assertThat(outputContent).contains("") assertThat(outputContent).doesNotContain("maxSdkVersion") assertThat(outputContent).contains("") } @Test fun `task copies file directly if no conflicts are found`() { val project = ProjectBuilder.builder().withProjectDir(tempFolder.root).build() val task = project.tasks.register("testFixTask", FixManifestMaxSdkTask::class.java).get() blameReportFile.writeText(""" uses-permission#android.permission.READ_CONTACTS MERGED from /app/src/main/AndroidManifest.xml:5:3-33 """.trimIndent()) val originalContent = mergedManifestIn.readText() task.blameReportFile.set(blameReportFile) task.mergedManifestIn.set(mergedManifestIn) task.modifiedManifestOut.set(modifiedManifestOut) task.taskAction() val outputContent = modifiedManifestOut.readText() assertThat(outputContent).isEqualTo(originalContent) assertThat(outputContent).contains("maxSdkVersion=\"28\"") } }