From 49a67bc7c6d0ea38c88d8b424a2f188941dc609e Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Tue, 25 Dec 2018 22:14:56 -0500 Subject: Update imageactivity and add tests, resolves #1107 --- .../frost/activities/ImageActivityTest.kt | 102 ++++++++++++++++++++- .../kotlin/com/pitchedapps/frost/helper/Helper.kt | 32 +++++++ app/src/androidTest/resources/bayer-pattern.jpg | Bin 0 -> 6195 bytes app/src/androidTest/resources/magenta.png | Bin 0 -> 165 bytes 4 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 app/src/androidTest/kotlin/com/pitchedapps/frost/helper/Helper.kt create mode 100644 app/src/androidTest/resources/bayer-pattern.jpg create mode 100644 app/src/androidTest/resources/magenta.png (limited to 'app/src/androidTest') 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 . + */ 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 = 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 . + */ +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() diff --git a/app/src/androidTest/resources/bayer-pattern.jpg b/app/src/androidTest/resources/bayer-pattern.jpg new file mode 100644 index 00000000..672ac178 Binary files /dev/null and b/app/src/androidTest/resources/bayer-pattern.jpg differ diff --git a/app/src/androidTest/resources/magenta.png b/app/src/androidTest/resources/magenta.png new file mode 100644 index 00000000..14afbce8 Binary files /dev/null and b/app/src/androidTest/resources/magenta.png differ -- cgit v1.2.3