Implement resumable download queue (T-301)
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package downloader
|
||||
|
||||
import (
|
||||
"context"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"softbox.local/core/application"
|
||||
)
|
||||
|
||||
func TestApplicationObserverUsesConcretePayloads(t *testing.T) {
|
||||
publisher := &recordingApplicationPublisher{}
|
||||
observer := ApplicationObserver{Publisher: publisher}
|
||||
tests := []struct {
|
||||
event Event
|
||||
wantType application.EventType
|
||||
wantPayload any
|
||||
}{
|
||||
{
|
||||
event: Event{
|
||||
Type: EventStarted, RequestID: "request-1", AppID: "app-1",
|
||||
Attempt: 1, Done: 2, TotalKnown: true, Total: 10,
|
||||
},
|
||||
wantType: application.EventDownloadStarted,
|
||||
wantPayload: application.DownloadStartedPayload{
|
||||
Attempt: 1, Done: 2, TotalKnown: true, Total: 10,
|
||||
},
|
||||
},
|
||||
{
|
||||
event: Event{
|
||||
Type: EventProgress, RequestID: "request-1", AppID: "app-1",
|
||||
Attempt: 1, Done: 4, TotalKnown: true, Total: 10, SpeedBytesSec: 2,
|
||||
},
|
||||
wantType: application.EventDownloadProgress,
|
||||
wantPayload: application.DownloadProgressPayload{
|
||||
Attempt: 1, Done: 4, TotalKnown: true, Total: 10, SpeedBytesSec: 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
event: Event{
|
||||
Type: EventPaused, RequestID: "request-1", AppID: "app-1",
|
||||
Attempt: 1, Done: 4,
|
||||
},
|
||||
wantType: application.EventDownloadPaused,
|
||||
wantPayload: application.DownloadPausedPayload{Attempt: 1, Done: 4},
|
||||
},
|
||||
{
|
||||
event: Event{
|
||||
Type: EventCompleted, RequestID: "request-1", AppID: "app-1",
|
||||
Attempt: 1, Done: 10, CompletedPath: "download",
|
||||
},
|
||||
wantType: application.EventDownloadCompleted,
|
||||
wantPayload: application.DownloadCompletedPayload{
|
||||
Attempt: 1, Done: 10, Path: "download",
|
||||
},
|
||||
},
|
||||
{
|
||||
event: Event{
|
||||
Type: EventFailed, RequestID: "request-1", AppID: "app-1",
|
||||
Attempt: 1, Done: 4, ErrorCode: "http_status",
|
||||
},
|
||||
wantType: application.EventDownloadFailed,
|
||||
wantPayload: application.DownloadFailedPayload{
|
||||
Attempt: 1, Done: 4, ErrorCode: "http_status",
|
||||
},
|
||||
},
|
||||
{
|
||||
event: Event{
|
||||
Type: EventCanceled, RequestID: "request-1", AppID: "app-1",
|
||||
Attempt: 1,
|
||||
},
|
||||
wantType: application.EventDownloadCanceled,
|
||||
wantPayload: application.DownloadCanceledPayload{Attempt: 1},
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
if err := observer.PublishDownload(context.Background(), test.event); err != nil {
|
||||
t.Fatalf("PublishDownload(%s) error = %v", test.event.Type, err)
|
||||
}
|
||||
got := publisher.events[len(publisher.events)-1]
|
||||
if got.Type != test.wantType ||
|
||||
got.RequestID != test.event.RequestID ||
|
||||
got.AppID != test.event.AppID {
|
||||
t.Fatalf("event = %#v", got)
|
||||
}
|
||||
if !reflect.DeepEqual(got.Payload, test.wantPayload) {
|
||||
t.Fatalf("payload = %#v, want %#v", got.Payload, test.wantPayload)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type recordingApplicationPublisher struct {
|
||||
events []application.Event
|
||||
}
|
||||
|
||||
func (publisher *recordingApplicationPublisher) Publish(
|
||||
_ context.Context,
|
||||
event application.Event,
|
||||
) error {
|
||||
publisher.events = append(publisher.events, event)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user