heic_test.go

 1package imageutil
 2
 3import (
 4	"bytes"
 5	"image/png"
 6	"os"
 7	"testing"
 8)
 9
10func TestIsHEIC(t *testing.T) {
11	tests := []struct {
12		name string
13		data []byte
14		want bool
15	}{
16		{"empty", []byte{}, false},
17		{"too short", []byte{0, 0, 0, 0, 'f', 't', 'y', 'p'}, false},
18		{"heic brand", []byte{0, 0, 0, 0, 'f', 't', 'y', 'p', 'h', 'e', 'i', 'c'}, true},
19		{"heix brand", []byte{0, 0, 0, 0, 'f', 't', 'y', 'p', 'h', 'e', 'i', 'x'}, true},
20		{"mif1 brand", []byte{0, 0, 0, 0, 'f', 't', 'y', 'p', 'm', 'i', 'f', '1'}, true},
21		{"avif brand", []byte{0, 0, 0, 0, 'f', 't', 'y', 'p', 'a', 'v', 'i', 'f'}, true},
22		{"not ftyp", []byte{0, 0, 0, 0, 'x', 'x', 'x', 'x', 'h', 'e', 'i', 'c'}, false},
23		{"unknown brand", []byte{0, 0, 0, 0, 'f', 't', 'y', 'p', 'i', 's', 'o', 'm'}, false},
24		{"png", []byte{0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a, 0, 0, 0, 0}, false},
25	}
26	for _, tt := range tests {
27		t.Run(tt.name, func(t *testing.T) {
28			if got := IsHEIC(tt.data); got != tt.want {
29				t.Errorf("IsHEIC() = %v, want %v", got, tt.want)
30			}
31		})
32	}
33}
34
35func TestConvertHEICToPNG(t *testing.T) {
36	// Skip if no real HEIC test file available
37	testFile := "/tmp/shelley-screenshots/upload_349d2aa15d2b3e4e.heic"
38	data, err := os.ReadFile(testFile)
39	if err != nil {
40		t.Skipf("test HEIC file not available: %v", err)
41	}
42
43	if !IsHEIC(data) {
44		t.Fatal("test file should be detected as HEIC")
45	}
46
47	pngData, err := ConvertHEICToPNG(data)
48	if err != nil {
49		t.Fatalf("ConvertHEICToPNG failed: %v", err)
50	}
51
52	// Verify it's valid PNG
53	_, err = png.Decode(bytes.NewReader(pngData))
54	if err != nil {
55		t.Fatalf("result is not valid PNG: %v", err)
56	}
57}