From 30b678e833b54c887eb3c0256f26cd739b08375c Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Wed, 22 Jan 2025 22:42:24 +0100 Subject: [PATCH] fixed emulator test Signed-off-by: Jonas Kalderstam --- .../feeder/model/opml/OPMLTest.kt | 34 +++++++++++++++---- .../feeder/FeederApplication.kt | 3 ++ .../feeder/background/RssSyncJob.kt | 9 ++--- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt b/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt index 4b53df1e34..26bb609f89 100644 --- a/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt +++ b/app/src/androidTest/java/com/nononsenseapps/feeder/model/opml/OPMLTest.kt @@ -124,13 +124,15 @@ class OPMLTest : DIAware { writeSampleFile() val parser = OpmlPullParser(opmlParserHandler) - parser.parseFile(path!!.canonicalPath) + parser.parseFile(path!!.canonicalPath).leftOrNull()?.let { e -> + fail("Failed to parse file: ${e.throwable}") + } // Verify database is correct val actual = settingsStore.getAllSettings() - ALL_SETTINGS_WITH_VALUES.forEach { (key, expected) -> - assertEquals(expected, actual[key].toString()) + ALL_SETTINGS_WITH_VALUES.toList().forEachIndexed { index, (key, expected) -> + assertEquals("$index: Setting $key, expected $expected but was ${actual[key]}", expected, actual[key].toString()) } val actualBlocked = settingsStore.blockListPreference.first() @@ -146,14 +148,23 @@ class OPMLTest : DIAware { writeSampleFile() val parser = OpmlPullParser(opmlParserHandler) - parser.parseFile(path!!.canonicalPath) + parser.parseFile(path!!.canonicalPath).leftOrNull()?.let { e -> + fail("Failed to parse file: ${e.throwable}") + } // Verify database is correct val seen = ArrayList() val feeds = db.feedDao().getAllFeeds() assertFalse("No feeds in DB!", feeds.isEmpty()) for (feed in feeds) { - val i = Integer.parseInt(feed.title.replace("[custom \"]".toRegex(), "")) + val i = + try { + val title = feed.customTitle.replace("[custom \"]".toRegex(), "").ifBlank { feed.title } + Integer.parseInt(title.replace("[custom \"]".toRegex(), "")) + } catch (e: NumberFormatException) { + fail("Failed to parse title: ${feed.title}, ${feed.customTitle}") + continue + } seen.add(i) assertEquals("URL doesn't match", URL("http://example.com/$i/rss.xml"), feed.url) @@ -219,14 +230,23 @@ class OPMLTest : DIAware { // Read file val parser = OpmlPullParser(opmlParserHandler) - parser.parseFile(path!!.canonicalPath) + parser.parseFile(path!!.canonicalPath).leftOrNull()?.let { e -> + fail("Failed to parse file: ${e.throwable}") + } // should not kill the existing stuff val seen = ArrayList() val feeds = db.feedDao().getAllFeeds() assertFalse("No feeds in DB!", feeds.isEmpty()) for (feed in feeds) { - val i = Integer.parseInt(feed.title.replace("[custom \"]".toRegex(), "")) + val i = + try { + val title = feed.customTitle.replace("[custom \"]".toRegex(), "").ifBlank { feed.title } + Integer.parseInt(title.replace("[custom \"]".toRegex(), "")) + } catch (e: NumberFormatException) { + fail("Failed to parse title: ${feed.title}, ${feed.customTitle}") + continue + } seen.add(i) assertEquals(URL("http://example.com/$i/rss.xml"), feed.url) diff --git a/app/src/main/java/com/nononsenseapps/feeder/FeederApplication.kt b/app/src/main/java/com/nononsenseapps/feeder/FeederApplication.kt index 58d8317dea..af6bf24aa1 100644 --- a/app/src/main/java/com/nononsenseapps/feeder/FeederApplication.kt +++ b/app/src/main/java/com/nononsenseapps/feeder/FeederApplication.kt @@ -1,12 +1,14 @@ package com.nononsenseapps.feeder import android.app.Application +import android.app.job.JobScheduler import android.content.ContentResolver import android.content.SharedPreferences import android.os.Build.VERSION.SDK_INT import android.util.Log import android.widget.Toast import androidx.core.app.NotificationManagerCompat +import androidx.core.content.getSystemService import androidx.preference.PreferenceManager import coil.ImageLoader import coil.ImageLoaderFactory @@ -83,6 +85,7 @@ class FeederApplication : Application(), DIAware, ImageLoaderFactory { import(archModelModule) bind() with singleton { contentResolver } + bind() with singleton { getSystemService(JobScheduler::class.java) } bind() with singleton { object : ToastMaker { diff --git a/app/src/main/java/com/nononsenseapps/feeder/background/RssSyncJob.kt b/app/src/main/java/com/nononsenseapps/feeder/background/RssSyncJob.kt index 11b6642cff..219466d23d 100644 --- a/app/src/main/java/com/nononsenseapps/feeder/background/RssSyncJob.kt +++ b/app/src/main/java/com/nononsenseapps/feeder/background/RssSyncJob.kt @@ -20,6 +20,7 @@ import org.kodein.di.DI import org.kodein.di.DIAware import org.kodein.di.android.closestDI import org.kodein.di.instance +import org.kodein.di.instanceOrNull import java.time.Duration const val ARG_FORCE_NETWORK = "force_network" @@ -109,7 +110,7 @@ fun schedulePeriodicRssSync( ) { val repository: Repository by di.instance() val context: Application by di.instance() - val jobScheduler: JobScheduler? = context.getSystemService() + val jobScheduler: JobScheduler? by di.instanceOrNull() if (jobScheduler == null) { Log.e(RssSyncJob.LOG_TAG, "JobScheduler not available") @@ -118,7 +119,7 @@ fun schedulePeriodicRssSync( if (repository.syncFrequency.value.minutes < 1) { // Cancel and return - jobScheduler.cancel(BackgroundJobId.RSS_SYNC_PERIODIC.jobId) + jobScheduler?.cancel(BackgroundJobId.RSS_SYNC_PERIODIC.jobId) return } @@ -139,8 +140,8 @@ fun schedulePeriodicRssSync( .setPersisted(true) .build() - if (replace || jobScheduler.getMyPendingJob(BackgroundJobId.RSS_SYNC_PERIODIC.jobId) == null) { - jobScheduler.schedule(jobInfo) + if (replace || jobScheduler?.getMyPendingJob(BackgroundJobId.RSS_SYNC_PERIODIC.jobId) == null) { + jobScheduler?.schedule(jobInfo) } }