1package webkit
2
3import (
4 "context"
5 "os"
6 "path/filepath"
7 "testing"
8
9 "github.com/bnema/dumber/internal/application/port"
10 "github.com/bnema/dumber/internal/domain/entity"
11 "github.com/stretchr/testify/require"
12)
13
14type fakeDownloadPreparer struct {
15 calls int
16 input port.DownloadPrepareInput
17 output *port.DownloadPrepareOutput
18}
19
20func (f *fakeDownloadPreparer) Execute(_ context.Context, input port.DownloadPrepareInput) *port.DownloadPrepareOutput {
21 f.calls++
22 f.input = input
23 return f.output
24}
25
26func TestResolvedImageSaver_SaveResolvedImage(t *testing.T) {
27 downloadDir := t.TempDir()
28 destPath := filepath.Join(downloadDir, "image.png")
29 preparer := &fakeDownloadPreparer{output: &port.DownloadPrepareOutput{Filename: "image.png", DestinationPath: destPath}}
30 saver := NewResolvedImageSaver(preparer, downloadDir)
31
32 err := saver.SaveResolvedImage(context.Background(), entity.ImageData{Bytes: []byte{1, 2, 3, 4}, MimeType: "image/jpeg"}, port.MenuContext{ImageURI: "https://example.com/assets/image"})
33 require.NoError(t, err)
34 require.Equal(t, downloadDir, preparer.input.DownloadDir)
35 require.Equal(t, "https://example.com/assets/image", preparer.input.Response.GetUri())
36 require.Equal(t, "image/jpeg", preparer.input.Response.GetMimeType())
37 require.Equal(t, []byte{1, 2, 3, 4}, readFile(t, destPath))
38}
39
40func TestResolvedImageSaver_SaveResolvedImageRequiresDestination(t *testing.T) {
41 preparer := &fakeDownloadPreparer{output: &port.DownloadPrepareOutput{Filename: "image.png"}}
42 saver := NewResolvedImageSaver(preparer, t.TempDir())
43
44 err := saver.SaveResolvedImage(context.Background(), entity.ImageData{Bytes: []byte{1}}, port.MenuContext{})
45 require.Error(t, err)
46 require.Contains(t, err.Error(), "destination path")
47}
48
49func TestResolvedImageSaver_SaveResolvedImageRejectsEmptyBytes(t *testing.T) {
50 preparer := &fakeDownloadPreparer{output: &port.DownloadPrepareOutput{Filename: "image.png", DestinationPath: filepath.Join(t.TempDir(), "image.png")}}
51 saver := NewResolvedImageSaver(preparer, t.TempDir())
52
53 err := saver.SaveResolvedImage(context.Background(), entity.ImageData{}, port.MenuContext{})
54 require.Error(t, err)
55 require.Contains(t, err.Error(), "empty image data")
56 require.Zero(t, preparer.calls)
57}
58
59func readFile(t *testing.T, path string) []byte {
60 t.Helper()
61 data, err := os.ReadFile(path)
62 require.NoError(t, err)
63 return data
64}