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
This commit is contained in:
Claude
2026-04-04 15:52:21 +00:00
parent 7a70c98158
commit 074cde0bd1
2 changed files with 116 additions and 3 deletions
@@ -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 {
@@ -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
}
}