diff --git a/core/data/src/main/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepo.kt b/core/data/src/main/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepo.kt index 597946d6..4d59aef9 100644 --- a/core/data/src/main/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepo.kt +++ b/core/data/src/main/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepo.kt @@ -158,6 +158,12 @@ class DatabaseRepo( val all = nameToCatnum.filter { (localName, _) -> dataParser.matchesAmSatName(localName, keys) }.values.toSet() + // No local entry matches this AMSAT name (e.g. a brand-new + // satellite not yet in the local TLE, like TEVEL2/RS95S): + // skip it. Returning empty is correct — crashing here (via + // all.first()) aborted the WHOLE list update and kept the + // stale pre-whitelist FM list with all five ISS modules. + if (all.isEmpty()) return emptySet() if (all.size <= 1) return all val preferred = all.intersect(activeCatnums) if (preferred.isNotEmpty()) return preferred diff --git a/core/data/src/test/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepoTest.kt b/core/data/src/test/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepoTest.kt index 14eac89c..d950a44b 100644 --- a/core/data/src/test/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepoTest.kt +++ b/core/data/src/test/java/com/rtbishop/look4sat/core/data/repository/DatabaseRepoTest.kt @@ -244,6 +244,43 @@ class DatabaseRepoTest { assertEquals(setOf(25544), settingsRepo.amSatFm) } + @Test + fun `amsat fm list survives unknown satellite names and still disambiguates ISS`() = runTest(dispatcher) { + // Regression: AMSAT pages list satellites absent from the local TLE + // (TEVEL2-1..9, RS95S). resolvePerName used to crash on the empty + // match set (all.first()), aborting the WHOLE list update and keeping + // the stale pre-whitelist FM list with all five ISS modules. + val satnogsUrl = Sources.satelliteDataUrls.getValue("SatNOGS") + val localSource = FakeLocalSource() + val remoteSource = FakeRemoteSource().apply { + networkStreams[satnogsUrl] = { issModulesCsvStream() } + networkStreams[Sources.amSatLiveUrls.getValue("FM")] = { amsatFmPageWithUnknownStream() } + } + val settingsRepo = FakeSettingsRepo( + dataSources = DataSourcesSettings( + satelliteUrls = listOf(satnogsUrl), + transceiversUrls = emptyList() + ) + ).apply { amSatActive = setOf(25544) } + val repository = DatabaseRepo(dispatcher, dataParser, localSource, remoteSource, settingsRepo) + + repository.updateFromRemote() + + // No crash; ISS still collapses to the primary ZARYA (25544). + assertEquals(setOf(25544), settingsRepo.amSatFm) + } + + private fun amsatFmPageWithUnknownStream(): InputStream = """ +
| Satellite | Uplink | Downlink | Comment |
|---|---|---|---|
| ISS | 145.990 MHz | 437.800 MHz | |
| TEVEL2-1 thru TEVEL2-9 | 145.970 MHz | 436.400 MHz | |
| RS95S(QMR-KWT-2) | 145.920 MHz | 436.950 MHz |