/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package mozilla.components.support.utils

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class DomainMatcherTest {

    @Test
    fun `should perform basic domain matching for a given query`() {
        assertNull(segmentAwareDomainMatch("moz", listOf()))

        val urls = listOf(
            "http://www.mozilla.org", "http://Firefox.com",
            "https://mobile.twitter.com", "https://m.youtube.com",
            "https://en.Wikipedia.org/Wiki/Mozilla",
            "http://192.168.254.254:8000", "http://192.168.254.254:8000/admin",
            "http://иННая.локаль", // TODO add more test data for non-english locales
            "about:config", "about:crashes", "http://localhost:8080/index.html"
        )
        // Full url matching.
        assertEquals(
            DomainMatch("http://www.mozilla.org", "http://www.mozilla.org"),
            segmentAwareDomainMatch("http://www.m", urls)
        )
        // Protocol stripping.
        assertEquals(
            DomainMatch("http://www.mozilla.org", "www.mozilla.org"),
            segmentAwareDomainMatch("www.moz", urls)
        )
        // Subdomain stripping.
        assertEquals(
            DomainMatch("http://www.mozilla.org", "mozilla.org"),
            segmentAwareDomainMatch("moz", urls)
        )
        assertEquals(
            DomainMatch("https://mobile.twitter.com", "twitter.com"),
            segmentAwareDomainMatch("twit", urls)
        )
        assertEquals(
            DomainMatch("https://m.youtube.com", "youtube.com"),
            segmentAwareDomainMatch("yo", urls)
        )
        // Case insensitivity in the host and in the path. Subdomain matching and stripping.
        assertEquals(
            DomainMatch("https://en.wikipedia.org/wiki/mozilla", "en.wikipedia.org/wiki/mozilla"),
            segmentAwareDomainMatch("en", urls)
        )
        assertEquals(
            DomainMatch("https://en.wikipedia.org/wiki/mozilla", "en.wikipedia.org/wiki/mozilla"),
            segmentAwareDomainMatch("en.wikipedia.org/wi", urls)
        )
        assertEquals(
            DomainMatch("http://firefox.com", "firefox.com"),
            segmentAwareDomainMatch("fire", urls)
        )
        // Urls with ports.
        assertEquals(
            DomainMatch("http://192.168.254.254:8000", "192.168.254.254:8000"),
            segmentAwareDomainMatch("192", urls)
        )
        assertEquals(
            DomainMatch("http://192.168.254.254:8000/admin", "192.168.254.254:8000/admin"),
            segmentAwareDomainMatch("192.168.254.254:8000/a", urls)
        )

        assertEquals(
            DomainMatch("http://localhost:8080/index.html", "localhost:8080/index.html"),
            segmentAwareDomainMatch("localhost", urls)
        )

        // About urls.
        assertEquals(
            DomainMatch("about:config", "about:config"),
            segmentAwareDomainMatch("abo", urls)
        )
        assertEquals(
            DomainMatch("about:config", "about:config"),
            segmentAwareDomainMatch("about:", urls)
        )
        assertEquals(
            DomainMatch("about:crashes", "about:crashes"),
            segmentAwareDomainMatch("about:cr", urls)
        )

        // Non-english locale.
        assertEquals(
            DomainMatch("http://инная.локаль", "инная.локаль"),
            segmentAwareDomainMatch("ин", urls)
        )

        assertNull(segmentAwareDomainMatch("nomatch", urls))
    }
}
