1package downloadruntime
2
3import (
4 "context"
5 "testing"
6
7 "github.com/stretchr/testify/require"
8
9 "github.com/bnema/dumber/internal/application/port"
10 "github.com/bnema/dumber/internal/application/usecase"
11)
12
13type stubResponse struct {
14 mimeType string
15 uri string
16}
17
18func (s stubResponse) GetMimeType() string { return s.mimeType }
19func (stubResponse) GetSuggestedFilename() string { return "" }
20func (s stubResponse) GetUri() string { return s.uri }
21
22type captureEvents struct {
23 events []port.DownloadEvent
24}
25
26func (c *captureEvents) OnDownloadEvent(_ context.Context, event port.DownloadEvent) {
27 c.events = append(c.events, event)
28}
29
30func TestRuntimeResolveDestinationAndEvents(t *testing.T) {
31 ctx := context.Background()
32 events := &captureEvents{}
33 runtime := New(t.TempDir(), events, usecase.NewPrepareDownloadUseCase(nil))
34
35 output, err := runtime.ResolveDestination(ctx, "artifact", stubResponse{mimeType: "application/pdf"})
36
37 require.NoError(t, err)
38 require.Equal(t, "artifact.pdf", output.Filename)
39 runtime.EmitStarted(ctx, output)
40 runtime.EmitProgress(ctx, output.Filename, output.DestinationPath, 0.42, 42, 100)
41 runtime.EmitFinished(ctx, output.Filename, output.DestinationPath)
42
43 require.Len(t, events.events, 3)
44 require.Equal(t, port.DownloadEventStarted, events.events[0].Type)
45 require.Equal(t, port.DownloadEventProgress, events.events[1].Type)
46 require.InEpsilon(t, 0.42, events.events[1].Progress, 0.0001)
47 require.EqualValues(t, 42, events.events[1].BytesReceived)
48 require.EqualValues(t, 100, events.events[1].BytesTotal)
49 require.Equal(t, port.DownloadEventFinished, events.events[2].Type)
50}
51
52func TestNewRuntime_NilPreparer_NoPanic(t *testing.T) {
53 require.NotPanics(t, func() {
54 _ = New("/tmp/downloads", nil, nil)
55 })
56}
57
58func TestRuntimeResolveDestination_NilPreparerReturnsError(t *testing.T) {
59 runtime := New(t.TempDir(), nil, nil)
60
61 output, err := runtime.ResolveDestination(context.Background(), "artifact", stubResponse{})
62
63 require.Nil(t, output)
64 require.Error(t, err)
65 require.ErrorContains(t, err, "download preparer is required")
66}