Skip to content

Commit

Permalink
fix: uuid mapping migration paginates
Browse files Browse the repository at this point in the history
  • Loading branch information
zepatrik committed Aug 31, 2022
1 parent 3498dac commit 926ad02
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 31 deletions.
96 changes: 69 additions & 27 deletions internal/persistence/sql/migrations/migratest/migration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
stdSql "database/sql"
"os"
"strconv"
"strings"
"testing"
"time"
Expand Down Expand Up @@ -130,34 +131,75 @@ func TestMigrations(t *testing.T) {
})

t.Run("suite=uuid_migrations", func(t *testing.T) {
ctx, cancel := context.WithTimeout(ctx, 20*time.Second)
defer cancel()
require.NoError(t, tm.Down(ctx, -1))
t.Run("correct types", func(t *testing.T) {
ctx, cancel := context.WithTimeout(ctx, 20*time.Second)
defer cancel()
require.NoError(t, tm.Down(ctx, -1))

// Migrate up to (including) "drop old non-uuid table"
migrateUpTo(t, tm, "20220513200600000001")
t.Log("status after up migration")
logMigrationStatus(t, tm)

// Assert that relationtuples have UUIDs
tuples, _, err := p.GetRelationTuples(ctx, &relationtuple.RelationQuery{Namespace: &namespaces[1].Name})
require.NoError(t, err)
assert.NotZero(t, tuples[0].Subject.(*relationtuple.SubjectID).ID)
assert.NotZero(t, tuples[0].Object)

// Migrate down to before "migrate-strings-to-uuids"
migrateDownTo(t, tm, "20220513200300000000")
t.Log("status after down migration")
logMigrationStatus(t, tm)

// Assert that relationtuples have strings
var oldRTs []*tuplesBeforeUUID
require.NoError(t, p.Connection(ctx).
Select("subject_id", "object").
Where("namespace_id = ?", namespaces[1].ID).
All(&oldRTs))
assert.Equalf(t, "user", oldRTs[0].SubjectID.String, "%+v", oldRTs[0])
assert.Equal(t, "object", oldRTs[0].Object)
})

// Migrate up to (including) "drop old non-uuid table"
migrateUpTo(t, tm, "20220513200600000001")
t.Log("status after up migration")
logMigrationStatus(t, tm)

// Assert that relationtuples have UUIDs
tuples, _, err := p.GetRelationTuples(ctx, &relationtuple.RelationQuery{Namespace: &namespaces[1].Name})
require.NoError(t, err)
assert.NotZero(t, tuples[0].Subject.(*relationtuple.SubjectID).ID)
assert.NotZero(t, tuples[0].Object)

// Migrate down to before "migrate-strings-to-uuids"
migrateDownTo(t, tm, "20220513200300000000")
t.Log("status after down migration")
logMigrationStatus(t, tm)

// Assert that relationtuples have strings
var oldRTs []*tuplesBeforeUUID
require.NoError(t, p.Connection(ctx).
Select("subject_id", "object").
Where("namespace_id = ?", namespaces[1].ID).
All(&oldRTs))
assert.Equalf(t, "user", oldRTs[0].SubjectID.String, "%+v", oldRTs[0])
assert.Equal(t, "object", oldRTs[0].Object)
t.Run("paginates", func(t *testing.T) {
ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
defer cancel()
require.NoError(t, tm.Down(ctx, -1))

// migrate up to before all UUID migrations
migrateUpTo(t, tm, "20220512151000000000")
t.Log("status after up migration")
logMigrationStatus(t, tm)

oldRTs := make([]tuplesBeforeUUID, 2000)
expected := make([]*ketoapi.RelationTuple, len(oldRTs))
for i := 0; i < len(oldRTs); i++ {
oldRTs[i] = tuplesBeforeUUID{
NetworkID: p.NetworkID(ctx),
NamespaceID: namespaces[1].ID,
Object: "object-" + strconv.Itoa(i),
Relation: "pagination-works",
SubjectID: stdSql.NullString{String: "subject-" + strconv.Itoa(i), Valid: true},
CommitTime: time.Now(),
}
expected[i] = &ketoapi.RelationTuple{
Namespace: namespaces[1].Name,
Object: oldRTs[i].Object,
Relation: "pagination-works",
SubjectID: x.Ptr(oldRTs[i].SubjectID.String),
}
}
require.NoError(t, p.Connection(ctx).Create(oldRTs))
require.NoError(t, tm.Up(ctx))

newRTs, _, err := p.GetRelationTuples(ctx, &relationtuple.RelationQuery{Relation: x.Ptr("pagination-works")}, x.WithSize(len(oldRTs)))
require.NoError(t, err)
assert.Len(t, newRTs, len(oldRTs))
actual, err := reg.Mapper().ToTuple(ctx, newRTs...)
require.NoError(t, err)
assert.ElementsMatch(t, expected, actual)
})
})

t.Run("suite=down", func(t *testing.T) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ var (
Runner: func(_ popx.Migration, conn *pop.Connection, _ *pop.Tx) error {
var (
relationTuples []OldRelationTuple
offset int
err error
lastID uuid.UUID
)
Expand Down Expand Up @@ -217,9 +216,6 @@ var (
if err := BatchInsertTuples(conn, newTuples); err != nil {
return fmt.Errorf("could not insert new tuples: %w", err)
}
if offset == 0 {
break
}
}

return nil
Expand Down

0 comments on commit 926ad02

Please sign in to comment.