Revision control
Copy as Markdown
/* 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
package org.mozilla.focus.settings
import mozilla.components.concept.fetch.Client
import mozilla.components.concept.fetch.Request
import mozilla.components.concept.fetch.Response
import mozilla.components.lib.fetch.okhttp.OkHttpClient
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.focus.settings.ManualAddSearchEngineSettingsFragment.Companion.isValidSearchQueryURL
import org.robolectric.RobolectricTestRunner
@RunWith(RobolectricTestRunner::class)
// This unit test is not running on an Android device. Allow me to use spaces in function names.
@Suppress("IllegalIdentifier")
class SearchEngineValidationTest {
lateinit var client: Client
@Before
fun setup() {
client = OkHttpWrapper()
}
@Test
fun `URL returning 200 OK is valid`() = withMockWebServer(responseWithStatus(200)) {
assertTrue(isValidSearchQueryURL(client, it.rootUrl()))
}
@Test
fun `URL using HTTP redirect is invalid`() = withMockWebServer(responseWithStatus(301)) {
// We now follow redirects(Issue #1976). This test now asserts false.
assertFalse(isValidSearchQueryURL(client, it.rootUrl()))
}
@Test
fun `URL returning 404 NOT FOUND is not valid`() = withMockWebServer(responseWithStatus(404)) {
assertFalse(isValidSearchQueryURL(client, it.rootUrl()))
}
@Test
fun `URL returning server error is not valid`() = withMockWebServer(responseWithStatus(500)) {
assertFalse(isValidSearchQueryURL(client, it.rootUrl()))
}
@Test
fun `URL timing out is not valid`() = withMockWebServer {
// Without queuing a response MockWebServer will not return anything and keep the connection open
assertFalse(isValidSearchQueryURL(client, it.rootUrl()))
}
}
/**
* Helper for creating a test that uses a mock webserver instance.
*/
private fun withMockWebServer(vararg responses: MockResponse, block: (MockWebServer) -> Unit) {
val server = MockWebServer()
responses.forEach { server.enqueue(it) }
server.start()
try {
block(server)
} finally {
server.shutdown()
}
}
private fun MockWebServer.rootUrl(): String = url("/").toString()
private fun responseWithStatus(status: Int) =
MockResponse()
.setResponseCode(status)
.setBody("")
private class OkHttpWrapper : Client() {
private val actual = OkHttpClient()
override fun fetch(request: Request): Response {
// OkHttpClient does not support private requests. Therefore we make them non-private for
// testing purposes
val nonPrivate = request.copy(private = false)
return actual.fetch(nonPrivate)
}
}