From 074cde0bd10f9e0bdce4e5bd41894e014fddbe3e Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 4 Apr 2026 15:52:21 +0000 Subject: [PATCH] test: add media extension detection tests for ShareHelper Make getImageExtension, getVideoExtension, and getMediaExtension internal for testing. Add tests covering all supported image formats (JPEG, PNG, GIF, WebP) and video formats (WebM, AVI, MP4, MOV), plus edge cases (unknown formats, empty files, short headers). https://claude.ai/code/session_01Euj5mXfjneNCx9m49YTp92 --- .../amethyst/ui/components/ShareHelper.kt | 6 +- .../amethyst/ui/components/ShareHelperTest.kt | 113 ++++++++++++++++++ 2 files changed, 116 insertions(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/ShareHelper.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/ShareHelper.kt index 2b91c47c1..4be867651 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/ShareHelper.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/ShareHelper.kt @@ -85,11 +85,11 @@ object ShareHelper { } ?: throw IOException("Unable to open snapshot for: $imageUrl") } - private fun getImageExtension(file: File): String = getMediaExtension(file, isVideo = false) + internal fun getImageExtension(file: File): String = getMediaExtension(file, isVideo = false) - private fun getVideoExtension(file: File): String = getMediaExtension(file, isVideo = true) + internal fun getVideoExtension(file: File): String = getMediaExtension(file, isVideo = true) - private fun getMediaExtension( + internal fun getMediaExtension( file: File, isVideo: Boolean, ): String { diff --git a/amethyst/src/test/java/com/vitorpamplona/amethyst/ui/components/ShareHelperTest.kt b/amethyst/src/test/java/com/vitorpamplona/amethyst/ui/components/ShareHelperTest.kt index 509e40670..8bbc8a29a 100644 --- a/amethyst/src/test/java/com/vitorpamplona/amethyst/ui/components/ShareHelperTest.kt +++ b/amethyst/src/test/java/com/vitorpamplona/amethyst/ui/components/ShareHelperTest.kt @@ -49,4 +49,117 @@ class ShareHelperTest { targetFile.delete() tempDir.delete() } + + @Test + fun getImageExtension_jpeg() { + val file = createTempFileWithBytes(byteArrayOf(0xFF.toByte(), 0xD8.toByte(), 0x00, 0x00)) + assertEquals("jpg", ShareHelper.getImageExtension(file)) + file.delete() + } + + @Test + fun getImageExtension_png() { + val file = createTempFileWithBytes(byteArrayOf(0x89.toByte(), 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A)) + assertEquals("png", ShareHelper.getImageExtension(file)) + file.delete() + } + + @Test + fun getImageExtension_gif() { + val file = createTempFileWithBytes("GIF89a".toByteArray()) + assertEquals("gif", ShareHelper.getImageExtension(file)) + file.delete() + } + + @Test + fun getImageExtension_webp() { + // RIFF....WEBP + val header = ByteArray(12) + "RIFF".toByteArray().copyInto(header, 0) + "WEBP".toByteArray().copyInto(header, 8) + val file = createTempFileWithBytes(header) + assertEquals("webp", ShareHelper.getImageExtension(file)) + file.delete() + } + + @Test + fun getImageExtension_unknownDefaultsToJpg() { + val file = createTempFileWithBytes(byteArrayOf(0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07)) + assertEquals("jpg", ShareHelper.getImageExtension(file)) + file.delete() + } + + @Test + fun getImageExtension_tooShortDefaultsToJpg() { + val file = createTempFileWithBytes(byteArrayOf(0x00, 0x01)) + assertEquals("jpg", ShareHelper.getImageExtension(file)) + file.delete() + } + + @Test + fun getVideoExtension_webm() { + val file = createTempFileWithBytes(byteArrayOf(0x1A, 0x45, 0xDF.toByte(), 0xA3.toByte(), 0x00, 0x00)) + assertEquals("webm", ShareHelper.getVideoExtension(file)) + file.delete() + } + + @Test + fun getVideoExtension_avi() { + // RIFF....AVI + val header = ByteArray(12) + "RIFF".toByteArray().copyInto(header, 0) + "AVI ".toByteArray().copyInto(header, 8) + val file = createTempFileWithBytes(header) + assertEquals("avi", ShareHelper.getVideoExtension(file)) + file.delete() + } + + @Test + fun getVideoExtension_mp4Isom() { + // ....ftypisom + val header = ByteArray(12) + "ftyp".toByteArray().copyInto(header, 4) + "isom".toByteArray().copyInto(header, 8) + val file = createTempFileWithBytes(header) + assertEquals("mp4", ShareHelper.getVideoExtension(file)) + file.delete() + } + + @Test + fun getVideoExtension_mov() { + // ....ftypqt__ + val header = ByteArray(12) + "ftyp".toByteArray().copyInto(header, 4) + "qt ".toByteArray().copyInto(header, 8) + val file = createTempFileWithBytes(header) + assertEquals("mov", ShareHelper.getVideoExtension(file)) + file.delete() + } + + @Test + fun getVideoExtension_unknownDefaultsToMp4() { + val file = createTempFileWithBytes(byteArrayOf(0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07)) + assertEquals("mp4", ShareHelper.getVideoExtension(file)) + file.delete() + } + + @Test + fun getMediaExtension_emptyFileDefaultsToImage() { + val file = createTempFileWithBytes(byteArrayOf()) + assertEquals("jpg", ShareHelper.getMediaExtension(file, isVideo = false)) + file.delete() + } + + @Test + fun getMediaExtension_emptyFileDefaultsToVideo() { + val file = createTempFileWithBytes(byteArrayOf()) + assertEquals("mp4", ShareHelper.getMediaExtension(file, isVideo = true)) + file.delete() + } + + private fun createTempFileWithBytes(bytes: ByteArray): File { + val file = File.createTempFile("sharehelpertest", ".tmp") + file.writeBytes(bytes) + return file + } }