package com.peachpasswords import java.io.File import javax.xml.parsers.DocumentBuilderFactory import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test import org.w3c.dom.Element class MainActivityManifestTest { @Test fun main_activity_declares_only_the_launcher_filter() { val manifest = manifestFile() val document = DocumentBuilderFactory.newInstance().apply { isNamespaceAware = true }.newDocumentBuilder().parse(manifest) val activities = document.getElementsByTagName("activity") val mainActivity = (0 until activities.length) .mapNotNull { activities.item(it) as? Element } .single { it.getAttributeNS(ANDROID_NAMESPACE, "name") == ".MainActivity" } val filters = mainActivity.getElementsByTagName("intent-filter") assertEquals("MainActivity must have only its launcher filter", 1, filters.length) val filter = filters.item(0) as Element val actions = filter.getElementsByTagName("action") val categories = filter.getElementsByTagName("category") assertEquals(1, actions.length) assertEquals( "android.intent.action.MAIN", (actions.item(0) as Element).getAttributeNS(ANDROID_NAMESPACE, "name"), ) assertEquals(1, categories.length) assertEquals( "android.intent.category.LAUNCHER", (categories.item(0) as Element).getAttributeNS(ANDROID_NAMESPACE, "name"), ) assertTrue( "MainActivity must not declare a custom peach URI handler", filter.getElementsByTagName("data").length == 0, ) } private fun manifestFile(): File = File("src/main/AndroidManifest.xml") .takeIf { it.isFile } ?: File("app/src/main/AndroidManifest.xml") private companion object { const val ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android" } }