aboutsummaryrefslogtreecommitdiff
path: root/app/src/androidTest/kotlin/com/pitchedapps
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2018-12-25 22:14:56 -0500
committerAllan Wang <me@allanwang.ca>2018-12-25 22:14:56 -0500
commit49a67bc7c6d0ea38c88d8b424a2f188941dc609e (patch)
treefb01f3a4c2e17236bd229f7846b8f813e94c2a78 /app/src/androidTest/kotlin/com/pitchedapps
parent697e457da453568ca703c2b655a2dd490157b443 (diff)
downloadfrost-49a67bc7c6d0ea38c88d8b424a2f188941dc609e.tar.gz
frost-49a67bc7c6d0ea38c88d8b424a2f188941dc609e.tar.bz2
frost-49a67bc7c6d0ea38c88d8b424a2f188941dc609e.zip
Update imageactivity and add tests, resolves #1107
Diffstat (limited to 'app/src/androidTest/kotlin/com/pitchedapps')
-rw-r--r--app/src/androidTest/kotlin/com/pitchedapps/frost/activities/ImageActivityTest.kt102
-rw-r--r--app/src/androidTest/kotlin/com/pitchedapps/frost/helper/Helper.kt32
2 files changed, 129 insertions, 5 deletions
diff --git a/app/src/androidTest/kotlin/com/pitchedapps/frost/activities/ImageActivityTest.kt b/app/src/androidTest/kotlin/com/pitchedapps/frost/activities/ImageActivityTest.kt
index abffb106..23f6dab9 100644
--- a/app/src/androidTest/kotlin/com/pitchedapps/frost/activities/ImageActivityTest.kt
+++ b/app/src/androidTest/kotlin/com/pitchedapps/frost/activities/ImageActivityTest.kt
@@ -1,14 +1,43 @@
+/*
+ * Copyright 2018 Allan Wang
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
package com.pitchedapps.frost.activities
+import android.content.Intent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
-import org.junit.Rule
-import org.junit.runner.RunWith
-import android.content.Intent
+import com.pitchedapps.frost.helper.getResource
import com.pitchedapps.frost.utils.ARG_COOKIE
import com.pitchedapps.frost.utils.ARG_IMAGE_URL
import com.pitchedapps.frost.utils.ARG_TEXT
+import com.pitchedapps.frost.utils.isIndirectImageUrl
+import okhttp3.mockwebserver.Dispatcher
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import okhttp3.mockwebserver.RecordedRequest
+import okio.Buffer
+import okio.Okio
+import org.junit.Rule
import org.junit.Test
+import org.junit.rules.Timeout
+import org.junit.runner.RunWith
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertNull
+import kotlin.test.assertTrue
@RunWith(AndroidJUnit4::class)
class ImageActivityTest {
@@ -16,7 +45,14 @@ class ImageActivityTest {
@get:Rule
val activity: ActivityTestRule<ImageActivity> = ActivityTestRule(ImageActivity::class.java, true, false)
+ @get:Rule
+ val globalTimeout: Timeout = Timeout.seconds(15)
+
private fun launchActivity(imageUrl: String, text: String? = null, cookie: String? = null) {
+ assertFalse(
+ imageUrl.isIndirectImageUrl,
+ "For simplicity, urls that are direct will be used without modifications in the production code."
+ )
val intent = Intent().apply {
putExtra(ARG_IMAGE_URL, imageUrl)
putExtra(ARG_TEXT, text)
@@ -25,8 +61,64 @@ class ImageActivityTest {
activity.launchActivity(intent)
}
+ private val mockServer: MockWebServer by lazy {
+ val magentaImg = Buffer()
+ magentaImg.writeAll(Okio.source(getResource("bayer-pattern.jpg")))
+ MockWebServer().apply {
+ setDispatcher(object : Dispatcher() {
+ override fun dispatch(request: RecordedRequest): MockResponse =
+ when {
+ request.path.contains("text") -> MockResponse().setResponseCode(200).setBody("Valid mock text response")
+ request.path.contains("image") -> MockResponse().setResponseCode(200).setBody(magentaImg)
+ else -> MockResponse().setResponseCode(404).setBody("Error mock response")
+ }
+ })
+ start()
+ }
+ }
+
@Test
- fun intent() {
+ fun validImageTest() {
+ launchActivity(mockServer.url("image").toString())
+ mockServer.takeRequest()
+ with(activity.activity) {
+ assertEquals(1, mockServer.requestCount, "One http request expected")
+ assertEquals(fabAction, FabStates.DOWNLOAD, "Image should be successful, image should be downloaded")
+ assertTrue(tempFile.exists(), "Image should be located at temp file")
+ assertTrue(
+ System.currentTimeMillis() - tempFile.lastModified() < 2000L,
+ "Image should have been modified within the last few seconds"
+ )
+ assertNull(errorRef, "No error should exist")
+ tempFile.delete()
+ }
+ }
+ @Test
+ fun invalidImageTest() {
+ launchActivity(mockServer.url("text").toString())
+ mockServer.takeRequest()
+ with(activity.activity) {
+ assertEquals(1, mockServer.requestCount, "One http request expected")
+ assertEquals(fabAction, FabStates.ERROR, "Text should not be a valid image format, error state expected")
+ assertEquals("Image format not supported", errorRef?.message, "Error message mismatch")
+ assertFalse(tempFile.exists(), "Temp file should have been removed")
+ }
+ }
+
+ @Test
+ fun errorTest() {
+ launchActivity(mockServer.url("error").toString())
+ mockServer.takeRequest()
+ with(activity.activity) {
+ assertEquals(1, mockServer.requestCount, "One http request expected")
+ assertEquals(fabAction, FabStates.ERROR, "Error response code, error state expected")
+ assertEquals(
+ "Unsuccessful response for image: Error mock response",
+ errorRef?.message,
+ "Error message mismatch"
+ )
+ assertFalse(tempFile.exists(), "Temp file should have been removed")
+ }
}
-} \ No newline at end of file
+}
diff --git a/app/src/androidTest/kotlin/com/pitchedapps/frost/helper/Helper.kt b/app/src/androidTest/kotlin/com/pitchedapps/frost/helper/Helper.kt
new file mode 100644
index 00000000..f7484cb3
--- /dev/null
+++ b/app/src/androidTest/kotlin/com/pitchedapps/frost/helper/Helper.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018 Allan Wang
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.pitchedapps.frost.helper
+
+import android.content.Context
+import androidx.test.platform.app.InstrumentationRegistry
+import java.io.InputStream
+
+val context: Context
+ get() = InstrumentationRegistry.getInstrumentation().targetContext
+
+fun getAsset(asset: String): InputStream =
+ context.assets.open(asset)
+
+private class Helper
+
+fun getResource(resource: String): InputStream =
+ Helper::class.java.classLoader!!.getResource(resource).openStream()