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