Introduce a `one-time` retention option and persist it on the manifest as `one_time_download`. One-time download boxes bypass retention expiry scheduling, force zip downloads, and reject download attempts until all files are complete to prevent partial retrievals.feat(boxstore): add one-time download retention mode Introduce a `one-time` retention option and persist it on the manifest as `one_time_download`. One-time download boxes bypass retention expiry scheduling, force zip downloads, and reject download attempts until all files are complete to prevent partial retrievals.
62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
package boxstore
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"warpbox/lib/models"
|
|
)
|
|
|
|
func TestStartRetentionWaitsForEveryFileToFinish(t *testing.T) {
|
|
manifest := models.BoxManifest{
|
|
RetentionSecs: 10,
|
|
Files: []models.BoxFile{
|
|
{ID: "one", Status: models.FileStatusReady},
|
|
{ID: "two", Status: models.FileStatusWork},
|
|
},
|
|
}
|
|
|
|
startRetentionIfTerminalUnlocked(&manifest)
|
|
|
|
if !manifest.ExpiresAt.IsZero() {
|
|
t.Fatalf("expected retention to stay unset while a file is still uploading, got %s", manifest.ExpiresAt)
|
|
}
|
|
}
|
|
|
|
func TestStartRetentionBeginsWhenEveryFileIsTerminal(t *testing.T) {
|
|
manifest := models.BoxManifest{
|
|
RetentionSecs: 10,
|
|
Files: []models.BoxFile{
|
|
{ID: "one", Status: models.FileStatusReady},
|
|
{ID: "two", Status: models.FileStatusFailed},
|
|
},
|
|
}
|
|
before := time.Now().UTC()
|
|
|
|
startRetentionIfTerminalUnlocked(&manifest)
|
|
|
|
if manifest.ExpiresAt.IsZero() {
|
|
t.Fatal("expected retention to start once every file is complete or failed")
|
|
}
|
|
if manifest.ExpiresAt.Before(before.Add(9 * time.Second)) {
|
|
t.Fatalf("expected retention to start from completion time, got %s", manifest.ExpiresAt)
|
|
}
|
|
}
|
|
|
|
func TestStartRetentionSkipsOneTimeDownload(t *testing.T) {
|
|
manifest := models.BoxManifest{
|
|
RetentionSecs: 10,
|
|
OneTimeDownload: true,
|
|
Files: []models.BoxFile{
|
|
{ID: "one", Status: models.FileStatusReady},
|
|
{ID: "two", Status: models.FileStatusReady},
|
|
},
|
|
}
|
|
|
|
startRetentionIfTerminalUnlocked(&manifest)
|
|
|
|
if !manifest.ExpiresAt.IsZero() {
|
|
t.Fatalf("expected one-time download box to avoid retention expiry, got %s", manifest.ExpiresAt)
|
|
}
|
|
}
|