storj/satellite/metabase/project_test.go
Michał Niewrzał de8464e848 satellite/metabase: add GetProjectSegmentCount method
This new method will be used with mechanism to limit number
of segments per project, similar to limiting buckets or bandwidth.
This is only one of multiple changes we will do to implement this
limitation.

Change-Id: Ia516c2a006ad1d7b4431d780679be9d809848f4b
2021-11-24 13:20:02 +00:00

134 lines
3.2 KiB
Go

// Copyright (C) 2021 Storj Labs, Inc.
// See LICENSE for copying information.
package metabase_test
import (
"testing"
"time"
"storj.io/common/testcontext"
"storj.io/common/testrand"
"storj.io/common/uuid"
"storj.io/storj/satellite/metabase"
"storj.io/storj/satellite/metabase/metabasetest"
)
func TestGetProjectSegmentsCount(t *testing.T) {
metabasetest.Run(t, func(ctx *testcontext.Context, t *testing.T, db *metabase.DB) {
obj := metabasetest.RandObjectStream()
t.Run("ProjectID missing", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.GetProjectSegmentCount{
Opts: metabase.GetProjectSegmentCount{},
ErrClass: &metabase.ErrInvalidRequest,
ErrText: "ProjectID missing",
}.Check(ctx, t, db)
metabasetest.Verify{}.Check(ctx, t, db)
})
t.Run("empty database", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.GetProjectSegmentCount{
Opts: metabase.GetProjectSegmentCount{
ProjectID: obj.ProjectID,
},
ErrClass: &metabase.Error,
ErrText: "project not found: " + obj.ProjectID.String(),
}.Check(ctx, t, db)
})
t.Run("object without segments", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.CreateObject(ctx, t, db, obj, 0)
metabasetest.GetProjectSegmentCount{
Opts: metabase.GetProjectSegmentCount{
ProjectID: obj.ProjectID,
},
Result: 0,
}.Check(ctx, t, db)
})
t.Run("object with segments", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.CreateObject(ctx, t, db, obj, 1)
metabasetest.GetProjectSegmentCount{
Opts: metabase.GetProjectSegmentCount{
ProjectID: obj.ProjectID,
},
Result: 1,
}.Check(ctx, t, db)
})
t.Run("object with segments (as of system time)", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
metabasetest.CreateObject(ctx, t, db, obj, 1)
metabasetest.GetProjectSegmentCount{
Opts: metabase.GetProjectSegmentCount{
ProjectID: obj.ProjectID,
AsOfSystemTime: time.Now(),
AsOfSystemInterval: time.Millisecond,
},
Result: 1,
}.Check(ctx, t, db)
})
t.Run("multiple projects", func(t *testing.T) {
defer metabasetest.DeleteAll{}.Check(ctx, t, db)
project1 := testrand.UUID()
project2 := testrand.UUID()
project3 := testrand.UUID()
type Object struct {
ProjectID uuid.UUID
Segments byte
}
objects := []Object{
{project1, 1},
{project1, 4},
{project2, 5},
{project2, 3},
{project2, 1},
{project3, 2},
{project3, 0},
}
for _, object := range objects {
obj := metabasetest.RandObjectStream()
obj.ProjectID = object.ProjectID
metabasetest.CreateObject(ctx, t, db, obj, object.Segments)
}
// expected number of segments per project
projects := map[uuid.UUID]int{
project1: 5,
project2: 9,
project3: 2,
}
for project, segments := range projects {
metabasetest.GetProjectSegmentCount{
Opts: metabase.GetProjectSegmentCount{
ProjectID: project,
},
Result: int64(segments),
}.Check(ctx, t, db)
}
})
})
}