From debd559f7cfff790bdb91f883f3d2cd6ee7dddca Mon Sep 17 00:00:00 2001 From: Claudomator Agent Date: Mon, 16 Mar 2026 00:45:04 +0000 Subject: feat: add GribFileManager interface and InMemoryGribFileManager --- .../terst/nav/data/storage/GribFileManagerTest.kt | 100 +++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 test-runner/src/test/kotlin/org/terst/nav/data/storage/GribFileManagerTest.kt (limited to 'test-runner/src/test/kotlin') diff --git a/test-runner/src/test/kotlin/org/terst/nav/data/storage/GribFileManagerTest.kt b/test-runner/src/test/kotlin/org/terst/nav/data/storage/GribFileManagerTest.kt new file mode 100644 index 0000000..95ca546 --- /dev/null +++ b/test-runner/src/test/kotlin/org/terst/nav/data/storage/GribFileManagerTest.kt @@ -0,0 +1,100 @@ +package org.terst.nav.data.storage + +import org.junit.Assert.* +import org.junit.Test +import org.terst.nav.data.model.GribFile +import org.terst.nav.data.model.GribRegion +import java.time.Instant + +private fun makeGribFile( + region: GribRegion, + downloadedAt: Instant, + sizeBytes: Long = 1024L +): GribFile = GribFile( + region = region, + modelRunTime = downloadedAt.minusSeconds(6 * 3600), + forecastHours = 48, + downloadedAt = downloadedAt, + filePath = "/tmp/grib_${region.name}_${downloadedAt.epochSecond}.grb2", + sizeBytes = sizeBytes +) + +class GribFileManagerTest { + private val manager = InMemoryGribFileManager() + private val regionA = GribRegion("Atlantic", 30.0, 60.0, -50.0, 0.0) + private val regionB = GribRegion("Pacific", 20.0, 50.0, -160.0, -100.0) + private val baseTime = Instant.parse("2026-01-01T12:00:00Z") + + @Test + fun saveMetadata_addsFileToList() { + val file = makeGribFile(regionA, baseTime) + manager.saveMetadata(file) + assertEquals(listOf(file), manager.listFiles(regionA)) + } + + @Test + fun listFiles_returnsOnlyFilesForRegion() { + val fileA = makeGribFile(regionA, baseTime) + val fileB = makeGribFile(regionB, baseTime) + manager.saveMetadata(fileA) + manager.saveMetadata(fileB) + assertEquals(listOf(fileA), manager.listFiles(regionA)) + assertEquals(listOf(fileB), manager.listFiles(regionB)) + } + + @Test + fun listFiles_returnsNewestFirst() { + val older = makeGribFile(regionA, baseTime) + val newer = makeGribFile(regionA, baseTime.plusSeconds(3600)) + manager.saveMetadata(older) + manager.saveMetadata(newer) + assertEquals(listOf(newer, older), manager.listFiles(regionA)) + } + + @Test + fun latestFile_returnsNull_whenNoFiles() { + assertNull(manager.latestFile(regionA)) + } + + @Test + fun latestFile_returnsMostRecent() { + val older = makeGribFile(regionA, baseTime) + val newer = makeGribFile(regionA, baseTime.plusSeconds(3600)) + manager.saveMetadata(older) + manager.saveMetadata(newer) + assertEquals(newer, manager.latestFile(regionA)) + } + + @Test + fun delete_removesFile_returnsTrue() { + val file = makeGribFile(regionA, baseTime) + manager.saveMetadata(file) + assertTrue(manager.delete(file)) + assertTrue(manager.listFiles(regionA).isEmpty()) + } + + @Test + fun delete_returnsFalse_whenNotPresent() { + val file = makeGribFile(regionA, baseTime) + assertFalse(manager.delete(file)) + } + + @Test + fun purgeOlderThan_removesOldFiles_returnsCount() { + val old = makeGribFile(regionA, baseTime) + val recent = makeGribFile(regionA, baseTime.plusSeconds(7200)) + manager.saveMetadata(old) + manager.saveMetadata(recent) + val cutoff = baseTime.plusSeconds(3600) + val deleted = manager.purgeOlderThan(cutoff) + assertEquals(1, deleted) + assertEquals(listOf(recent), manager.listFiles(regionA)) + } + + @Test + fun totalSizeBytes_sumsAllFiles() { + manager.saveMetadata(makeGribFile(regionA, baseTime, sizeBytes = 1000L)) + manager.saveMetadata(makeGribFile(regionB, baseTime, sizeBytes = 2000L)) + assertEquals(3000L, manager.totalSizeBytes()) + } +} -- cgit v1.2.3