summaryrefslogtreecommitdiff
path: root/test-runner/src/test/kotlin/org/terst/nav
diff options
context:
space:
mode:
authorClaudomator Agent <agent@claudomator>2026-03-16 00:45:04 +0000
committerClaudomator Agent <agent@claudomator>2026-03-16 00:45:04 +0000
commitdebd559f7cfff790bdb91f883f3d2cd6ee7dddca (patch)
treeb39789f70652f4fc225a2414d6d64baea7ddc18b /test-runner/src/test/kotlin/org/terst/nav
parent76a7e39a4bdb15db8b782ac0c469b26bfc7d7ab6 (diff)
feat: add GribFileManager interface and InMemoryGribFileManager
Diffstat (limited to 'test-runner/src/test/kotlin/org/terst/nav')
-rw-r--r--test-runner/src/test/kotlin/org/terst/nav/data/storage/GribFileManagerTest.kt100
1 files changed, 100 insertions, 0 deletions
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())
+ }
+}