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  }