diff --git a/services/api/src/main/kotlin/db/migration/R__Boards_seed.kt b/services/api/src/main/kotlin/db/migration/R__Boards_seed.kt index 77ccb8353..5aceea390 100644 --- a/services/api/src/main/kotlin/db/migration/R__Boards_seed.kt +++ b/services/api/src/main/kotlin/db/migration/R__Boards_seed.kt @@ -62,31 +62,30 @@ class R__Boards_seed : BaseJavaMigration() { val boardRows = boards.associateBy { row -> row.getValue("number") } val boardIds = boards.associate { row -> row.getValue("number") to upsertBoard(connection, row) } - var written = 0 - var attached = 0 - var skipped = 0 - seats.forEach { row -> + // Counted from what came back rather than tallied as it goes: a var written inside a + // lambda is a boxed reference the reader has to hold in their head, and static analysis + // reads it as a local that is never assigned at all. + val outcomes = seats.map { row -> val number = row.getValue("board") val boardId = boardIds[number] val boardRow = boardRows[number] + // Absent where the board it sits on is deleted, or where the file names a board + // that has no row of its own. if (boardId == null || boardRow == null) { - // The board it sits on is deleted, or the file names one that has no row at all. - skipped += 1 - return@forEach - } - when (upsertSeat(connection, boardId, boardRow, row)) { - Seat.ATTACHED -> { written += 1; attached += 1 } - Seat.WRITTEN -> written += 1 - Seat.LEFT_DELETED -> skipped += 1 + Seat.LEFT_DELETED + } else { + upsertSeat(connection, boardId, boardRow, row) } } + val attached = outcomes.count { it == Seat.ATTACHED } + val written = outcomes.count { it != Seat.LEFT_DELETED } if (attached > 0) log.info("[boards-seed] {} seats found the account they were recorded under", attached) log.info( "[boards-seed] {} boards and {} seats applied ({} left to their deletion)", boardIds.values.count { it != null }, written, - skipped, + outcomes.size - written, ) } diff --git a/services/api/src/main/resources/db/seed/boards/art/board5/board5.webp b/services/api/src/main/resources/db/seed/boards/art/board5/board5.webp new file mode 100644 index 000000000..497511b5f Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board5/board5.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/amber.webp b/services/api/src/main/resources/db/seed/boards/art/board6/amber.webp new file mode 100644 index 000000000..257a148d1 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/amber.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/board6.webp b/services/api/src/main/resources/db/seed/boards/art/board6/board6.webp new file mode 100644 index 000000000..bb04dbf58 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/board6.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/jelle.webp b/services/api/src/main/resources/db/seed/boards/art/board6/jelle.webp new file mode 100644 index 000000000..3a8cec333 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/jelle.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/jonas.webp b/services/api/src/main/resources/db/seed/boards/art/board6/jonas.webp new file mode 100644 index 000000000..e24f30465 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/jonas.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/roos.webp b/services/api/src/main/resources/db/seed/boards/art/board6/roos.webp new file mode 100644 index 000000000..ecfb25d52 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/roos.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/thijs.webp b/services/api/src/main/resources/db/seed/boards/art/board6/thijs.webp new file mode 100644 index 000000000..61c7f962f Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/thijs.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board6/thomas.webp b/services/api/src/main/resources/db/seed/boards/art/board6/thomas.webp new file mode 100644 index 000000000..1d39f54b3 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board6/thomas.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board7/board7.webp b/services/api/src/main/resources/db/seed/boards/art/board7/board7.webp new file mode 100644 index 000000000..15f4fc1bb Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board7/board7.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board7/jesse.webp b/services/api/src/main/resources/db/seed/boards/art/board7/jesse.webp new file mode 100644 index 000000000..e14f30fbc Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board7/jesse.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board7/max.webp b/services/api/src/main/resources/db/seed/boards/art/board7/max.webp new file mode 100644 index 000000000..3d89f0586 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board7/max.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board7/mitchell.webp b/services/api/src/main/resources/db/seed/boards/art/board7/mitchell.webp new file mode 100644 index 000000000..36785fcfb Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board7/mitchell.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board7/reinout.webp b/services/api/src/main/resources/db/seed/boards/art/board7/reinout.webp new file mode 100644 index 000000000..ca3ebd47e Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board7/reinout.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board7/sanne.webp b/services/api/src/main/resources/db/seed/boards/art/board7/sanne.webp new file mode 100644 index 000000000..2c9b7fc84 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board7/sanne.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board8/Chris.webp b/services/api/src/main/resources/db/seed/boards/art/board8/Chris.webp new file mode 100644 index 000000000..788bca8ab Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board8/Chris.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board8/Joris.webp b/services/api/src/main/resources/db/seed/boards/art/board8/Joris.webp new file mode 100644 index 000000000..b25c706a8 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board8/Joris.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board8/Michal.webp b/services/api/src/main/resources/db/seed/boards/art/board8/Michal.webp new file mode 100644 index 000000000..eeb511166 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board8/Michal.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board8/Yannick.webp b/services/api/src/main/resources/db/seed/boards/art/board8/Yannick.webp new file mode 100644 index 000000000..3ed8c36cb Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board8/Yannick.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board8/board8.webp b/services/api/src/main/resources/db/seed/boards/art/board8/board8.webp new file mode 100644 index 000000000..e42c61567 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board8/board8.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/Boris.webp b/services/api/src/main/resources/db/seed/boards/art/board9/Boris.webp new file mode 100644 index 000000000..153eec6ff Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/Boris.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/Emma.webp b/services/api/src/main/resources/db/seed/boards/art/board9/Emma.webp new file mode 100644 index 000000000..4533aede2 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/Emma.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/Rene.webp b/services/api/src/main/resources/db/seed/boards/art/board9/Rene.webp new file mode 100644 index 000000000..bedefcbb9 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/Rene.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/Sylwia.webp b/services/api/src/main/resources/db/seed/boards/art/board9/Sylwia.webp new file mode 100644 index 000000000..43c36bc57 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/Sylwia.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/Taha.webp b/services/api/src/main/resources/db/seed/boards/art/board9/Taha.webp new file mode 100644 index 000000000..361151b2e Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/Taha.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/Viktor.webp b/services/api/src/main/resources/db/seed/boards/art/board9/Viktor.webp new file mode 100644 index 000000000..c1db313cd Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/Viktor.webp differ diff --git a/services/api/src/main/resources/db/seed/boards/art/board9/board9.webp b/services/api/src/main/resources/db/seed/boards/art/board9/board9.webp new file mode 100644 index 000000000..eca39e327 Binary files /dev/null and b/services/api/src/main/resources/db/seed/boards/art/board9/board9.webp differ diff --git a/services/api/src/test/kotlin/db/migration/BoardSeedParsingTest.kt b/services/api/src/test/kotlin/db/migration/BoardSeedParsingTest.kt index 993ba7dd5..8099809c2 100644 --- a/services/api/src/test/kotlin/db/migration/BoardSeedParsingTest.kt +++ b/services/api/src/test/kotlin/db/migration/BoardSeedParsingTest.kt @@ -3,6 +3,8 @@ package db.migration import net.blueshell.api.board.domain.BoardSeed import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test +import java.nio.file.Files +import java.nio.file.Path import java.time.LocalDate /** @@ -88,6 +90,48 @@ class BoardSeedParsingTest { assertThat(seats.none { it.getValue("name").contains('"') }).isTrue() } + /** + * Every picture the files name, as the art directory would spell it. + * + * The rule is one substitution: the master for a row is that row's own `image` with + * `.webp` for an extension. There is no lookup table to fall out of step. + */ + private fun artNamed(rows: List>): List = + rows.map { it.getValue("image") } + .filter { it.isNotBlank() } + .map { "db/seed/boards/art/" + it.substringBeforeLast('.') + ".webp" } + + @Test + fun `every picture the files name ships beside them`() { + // The photographs are still asset names the frontend loads, and they are also the + // masters the api will store. Naming one that is not here would be a board drawn + // blank on a fresh database, which no test further down the stack would catch. + val missing = (artNamed(boards) + artNamed(seats)) + .filter { javaClass.classLoader.getResource(it) == null } + + assertThat(missing).isEmpty() + } + + @Test + fun `the art directory holds nothing the files do not name`() { + // The other direction: a picture nobody points at is megabytes nobody notices. Read + // off the source tree rather than the classpath, because the packaged resources are + // inside a jar by the time a test runs and a jar is not a directory to walk. + val art = Path.of("src/main/resources/db/seed/boards/art") + assertThat(Files.isDirectory(art)) + .describedAs("the shipped board art at %s", art.toAbsolutePath()) + .isTrue() + + val named = (artNamed(boards) + artNamed(seats)).toSet() + val shipped = Files.walk(art).use { paths -> + paths.filter { it.fileName.toString().endsWith(".webp") } + .map { "db/seed/boards/art/${it.parent.fileName}/${it.fileName}" } + .toList() + } + + assertThat(shipped).hasSize(26).allMatch { it in named } + } + @Test fun `every seat names a board the boards file lists`() { val numbers = boards.map { it.getValue("number") }.toSet()