From b1217d5f486ac63c20a1192118d89f0d34fa169c Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 31 Jan 2020 19:51:57 +0200 Subject: [PATCH] Add unit test for readmanga source --- app/build.gradle | 1 + .../java/org/koitharu/kotatsu/KotatsuApp.kt | 2 +- .../kotatsu/domain/MangaLoaderContext.kt | 10 +----- .../domain/repository/ReadmangaRepository.kt | 4 ++- .../koitharu/kotatsu/utils/ext/StringExt.kt | 5 +++ .../kotatsu/parsers/MangaParserTest.kt | 6 ++++ .../parsers/RepositoryTestEnvironment.kt | 32 +++++++++++++++++ .../parsers/repository/ReadmangaRuTest.kt | 34 +++++++++++++++++++ .../org/koitharu/kotatsu/utils/MyAsserts.kt | 22 ++++++++++++ 9 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 app/src/test/java/org/koitharu/kotatsu/parsers/MangaParserTest.kt create mode 100644 app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt create mode 100644 app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt create mode 100644 app/src/test/java/org/koitharu/kotatsu/utils/MyAsserts.kt diff --git a/app/build.gradle b/app/build.gradle index cf36edc85..22276bfa5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,4 +74,5 @@ dependencies { implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' testImplementation 'junit:junit:4.13' + testImplementation 'org.mockito:mockito-core:2.23.0' } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 53bcf83b7..432f8e5c1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -29,7 +29,7 @@ class KotatsuApp : Application() { } }, module { single { - MangaLoaderContext(applicationContext) + MangaLoaderContext() } }, module { single { diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt b/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt index 4c060eb31..519bce9ca 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/MangaLoaderContext.kt @@ -6,10 +6,9 @@ import org.koin.core.KoinComponent import org.koin.core.inject import org.koitharu.kotatsu.utils.ext.await -class MangaLoaderContext(context: Context) : KoinComponent { +class MangaLoaderContext : KoinComponent { private val okHttp by inject() - private val preferences = context.getSharedPreferences("sources", Context.MODE_PRIVATE) suspend fun get(url: String, block: (Request.Builder.() -> Unit)? = null): Response { val request = Request.Builder() @@ -38,11 +37,4 @@ class MangaLoaderContext(context: Context) : KoinComponent { } return okHttp.newCall(request.build()).await() } - - fun getStringOption(name: String, default: String? = null) = - preferences.getString(name, default) - - fun getIntOption(name: String, default: Int) = preferences.getInt(name, default) - - fun getBooleanOption(name: String, default: Boolean) = preferences.getBoolean(name, default) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt index 0945ec6f1..43906e325 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/repository/ReadmangaRepository.kt @@ -7,6 +7,7 @@ import org.koitharu.kotatsu.domain.exceptions.ParseException import org.koitharu.kotatsu.utils.ext.longHashCode import org.koitharu.kotatsu.utils.ext.parseHtml import org.koitharu.kotatsu.utils.ext.safe +import org.koitharu.kotatsu.utils.ext.withDomain class ReadmangaRepository(loaderContext: MangaLoaderContext) : MangaRepository(loaderContext) { @@ -23,7 +24,8 @@ class ReadmangaRepository(loaderContext: MangaLoaderContext) : MangaRepository(l return root.select("div.tile").mapNotNull { node -> val imgDiv = node.selectFirst("div.img") ?: return@mapNotNull null val descDiv = node.selectFirst("div.desc") ?: return@mapNotNull null - val href = imgDiv.selectFirst("a").attr("href") ?: return@mapNotNull null + val href = imgDiv.selectFirst("a").attr("href")?.withDomain("readmanga.me") + ?: return@mapNotNull null val title = descDiv.selectFirst("h3")?.selectFirst("a")?.text() ?: return@mapNotNull null Manga( diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt index 3b7082c96..91f4b285a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt @@ -7,4 +7,9 @@ fun String.longHashCode(): Long { h = 31 * h + this[i].toLong() } return h +} + +fun String.withDomain(domain: String) = when { + this.startsWith("/") -> "http://$domain" + else -> this } \ No newline at end of file diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/MangaParserTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/MangaParserTest.kt new file mode 100644 index 000000000..337e9cb4c --- /dev/null +++ b/app/src/test/java/org/koitharu/kotatsu/parsers/MangaParserTest.kt @@ -0,0 +1,6 @@ +package org.koitharu.kotatsu.parsers + +interface MangaParserTest { + + fun testMangaList() +} \ No newline at end of file diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt new file mode 100644 index 000000000..35dd8514b --- /dev/null +++ b/app/src/test/java/org/koitharu/kotatsu/parsers/RepositoryTestEnvironment.kt @@ -0,0 +1,32 @@ +package org.koitharu.kotatsu.parsers + +import okhttp3.OkHttpClient +import org.junit.BeforeClass +import org.koin.core.context.startKoin +import org.koin.dsl.module +import org.koitharu.kotatsu.domain.MangaLoaderContext +import org.koitharu.kotatsu.domain.MangaRepository + +abstract class RepositoryTestEnvironment { + + lateinit var repository: MangaRepository + + @BeforeClass + fun initialize(cls: Class) { + startKoin { + modules(listOf( + module { + factory { + OkHttpClient() + } + }, module { + single { + MangaLoaderContext() + } + } + )) + } + val constructor = cls.getConstructor(MangaLoaderContext::class.java) + repository = constructor.newInstance(MangaLoaderContext()) + } +} \ No newline at end of file diff --git a/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt new file mode 100644 index 000000000..42ce06d64 --- /dev/null +++ b/app/src/test/java/org/koitharu/kotatsu/parsers/repository/ReadmangaRuTest.kt @@ -0,0 +1,34 @@ +package org.koitharu.kotatsu.parsers.repository + +import kotlinx.coroutines.runBlocking +import org.junit.Assert +import org.junit.BeforeClass +import org.junit.Test +import org.junit.runner.RunWith +import org.koitharu.kotatsu.domain.repository.ReadmangaRepository +import org.koitharu.kotatsu.parsers.MangaParserTest +import org.koitharu.kotatsu.parsers.RepositoryTestEnvironment +import org.koitharu.kotatsu.utils.MyAsserts +import org.mockito.junit.MockitoJUnitRunner + +@RunWith(MockitoJUnitRunner::class) +class ReadmangaRuTest : MangaParserTest { + + @Test + override fun testMangaList() { + val list = runBlocking { repository.getList(1) } + Assert.assertTrue(list.size == 70) + val item = list[40] + Assert.assertTrue(item.title.isNotEmpty()) + Assert.assertTrue(item.rating in 0f..1f) + MyAsserts.assertValidUrl(item.url) + MyAsserts.assertValidUrl(item.coverUrl) + } + + companion object : RepositoryTestEnvironment() { + + @JvmStatic + @BeforeClass + fun setUp() = initialize(ReadmangaRepository::class.java) + } +} \ No newline at end of file diff --git a/app/src/test/java/org/koitharu/kotatsu/utils/MyAsserts.kt b/app/src/test/java/org/koitharu/kotatsu/utils/MyAsserts.kt new file mode 100644 index 000000000..f398a30a1 --- /dev/null +++ b/app/src/test/java/org/koitharu/kotatsu/utils/MyAsserts.kt @@ -0,0 +1,22 @@ +package org.koitharu.kotatsu.utils + +import org.junit.Assert +import java.net.HttpURLConnection +import java.net.URL + +object MyAsserts { + + private val VALID_RESPONSE_CODES = arrayOf( + HttpURLConnection.HTTP_OK, + HttpURLConnection.HTTP_MOVED_PERM, + HttpURLConnection.HTTP_MOVED_TEMP + ) + + fun assertValidUrl(url: String) { + val cn = URL(url).openConnection() as HttpURLConnection + cn.connect() + val code = cn.responseCode + Assert.assertTrue("Invalid response code $code", code in VALID_RESPONSE_CODES) + } + +} \ No newline at end of file