github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/vfs/version_test.go (about) 1 package vfs 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/cozy/cozy-stack/pkg/utils" 8 "github.com/gofrs/uuid/v5" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestVersion(t *testing.T) { 13 if testing.Short() { 14 t.Skip("an instance is required for this test: test skipped due to the use of --short flag") 15 } 16 17 t.Run("DetectVersionsToClean", func(t *testing.T) { 18 fileID := uuidv7() 19 now := time.Now() 20 genVersion := func(timeAgo time.Duration) Version { 21 v := Version{ 22 DocID: fileID + "/" + utils.RandomString(16), 23 } 24 v.CozyMetadata.CreatedAt = now.Add(-1 * timeAgo) 25 return v 26 } 27 28 v0 := genVersion(120 * time.Minute) 29 v1 := genVersion(100 * time.Minute) 30 v2 := genVersion(80 * time.Minute) 31 v3 := genVersion(60 * time.Minute) 32 v4 := genVersion(40 * time.Minute) 33 v5 := genVersion(20 * time.Minute) 34 v6 := genVersion(2 * time.Minute) 35 candidate := genVersion(0 * time.Minute) 36 37 olds := []*Version{&v0, &v1, &v2} 38 action, toClean := detectVersionsToClean(&candidate, olds, 20, 1*time.Minute) 39 assert.Equal(t, KeepCandidateVersion, action) 40 assert.Len(t, toClean, 0) 41 42 olds = []*Version{&v0, &v1, &v2, &v3} 43 action, toClean = detectVersionsToClean(&v1, olds, 20, 1*time.Minute) 44 assert.Equal(t, DoNothingForCandidateVersion, action) 45 assert.Len(t, toClean, 0) 46 47 olds = []*Version{&v0, &v1, &v2, &v3, &v4, &v5, &v6} 48 action, toClean = detectVersionsToClean(&candidate, olds, 20, 15*time.Minute) 49 assert.Equal(t, CleanCandidateVersion, action) 50 assert.Len(t, toClean, 0) 51 52 olds = []*Version{&v1, &v2, &v3, &v4, &v5} 53 action, toClean = detectVersionsToClean(&candidate, olds, 5, 30*time.Minute) 54 assert.Equal(t, CleanCandidateVersion, action) 55 assert.Len(t, toClean, 1) 56 assert.Equal(t, &v1, toClean[0]) 57 58 olds = []*Version{&v1, &v2, &v3, &v4} 59 action, toClean = detectVersionsToClean(&candidate, olds, 5, 15*time.Minute) 60 assert.Equal(t, KeepCandidateVersion, action) 61 assert.Len(t, toClean, 1) 62 assert.Equal(t, &v1, toClean[0]) 63 64 olds = []*Version{&v3, &v6, &v2, &v0, &v5, &v4, &v1} 65 action, toClean = detectVersionsToClean(&candidate, olds, 5, 1*time.Minute) 66 assert.Equal(t, KeepCandidateVersion, action) 67 assert.Len(t, toClean, 4) 68 assert.Equal(t, &v0, toClean[0]) 69 assert.Equal(t, &v1, toClean[1]) 70 assert.Equal(t, &v2, toClean[2]) 71 assert.Equal(t, &v3, toClean[3]) 72 73 olds = []*Version{&v3, &v6, &v2, &v0, &v5, &v4, &v1} 74 action, toClean = detectVersionsToClean(&candidate, olds, 5, 10*time.Minute) 75 assert.Equal(t, CleanCandidateVersion, action) 76 assert.Len(t, toClean, 3) 77 assert.Equal(t, &v0, toClean[0]) 78 assert.Equal(t, &v1, toClean[1]) 79 assert.Equal(t, &v2, toClean[2]) 80 81 v0.Tags = []string{"foo"} 82 v2.Tags = []string{"bar", "baz"} 83 candidate.Tags = []string{"qux"} 84 85 olds = []*Version{&v3, &v6, &v2, &v0, &v5, &v4, &v1} 86 action, toClean = detectVersionsToClean(&candidate, olds, 5, 10*time.Minute) 87 assert.Equal(t, KeepCandidateVersion, action) 88 assert.Len(t, toClean, 4) 89 assert.Equal(t, &v1, toClean[0]) 90 assert.Equal(t, &v3, toClean[1]) 91 assert.Equal(t, &v4, toClean[2]) 92 assert.Equal(t, &v5, toClean[3]) 93 }) 94 } 95 96 func uuidv7() string { 97 return uuid.Must(uuid.NewV7()).String() 98 }