github.com/iasthc/atlas/cmd/atlas@v0.0.0-20230523071841-73246df3f88d/internal/migrate/migrate_test.go (about)

     1  // Copyright 2021-present The Atlas Authors. All rights reserved.
     2  // This source code is licensed under the Apache 2.0 license found
     3  // in the LICENSE file in the root directory of this source tree.
     4  
     5  package migrate
     6  
     7  import (
     8  	"context"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/iasthc/atlas/cmd/atlas/internal/migrate/ent"
    13  	"github.com/iasthc/atlas/cmd/atlas/internal/migrate/ent/revision"
    14  	"github.com/iasthc/atlas/sql/migrate"
    15  	"github.com/iasthc/atlas/sql/sqlclient"
    16  
    17  	_ "github.com/mattn/go-sqlite3"
    18  	"github.com/stretchr/testify/require"
    19  )
    20  
    21  func TestNewEntRevisions(t *testing.T) {
    22  	ctx := context.Background()
    23  	c, err := sqlclient.Open(ctx, "sqlite://?mode=memory")
    24  	require.NoError(t, err)
    25  	r, err := NewEntRevisions(ctx, c)
    26  	require.NoError(t, err)
    27  	require.NoError(t, r.Migrate(ctx))
    28  
    29  	s, err := c.Driver.InspectSchema(ctx, "", nil)
    30  	require.NoError(t, err)
    31  	require.Len(t, s.Tables, 1)
    32  	_, ok := s.Table(revision.Table)
    33  	require.True(t, ok)
    34  
    35  	cur, err := r.CurrentRevision(ctx)
    36  	require.True(t, ent.IsNotFound(err))
    37  	require.Nil(t, cur)
    38  
    39  	err = r.WriteRevision(ctx, &migrate.Revision{
    40  		Version:         "1",
    41  		Description:     "desc",
    42  		Type:            migrate.RevisionTypeResolved,
    43  		ExecutedAt:      time.Now(),
    44  		Hash:            "hash",
    45  		OperatorVersion: "0.1.0",
    46  	})
    47  	require.NoError(t, err)
    48  	cur, err = r.CurrentRevision(ctx)
    49  	require.NoError(t, err)
    50  	require.Equal(t, "1", cur.Version)
    51  
    52  	next := *cur
    53  	next.Version = "2"
    54  	require.NoError(t, r.WriteRevision(ctx, &next))
    55  	cur, err = r.CurrentRevision(ctx)
    56  	require.NoError(t, err)
    57  	require.Equal(t, "2", cur.Version)
    58  
    59  	revs, err := r.ReadRevisions(ctx)
    60  	require.NoError(t, err)
    61  	require.Len(t, revs, 2)
    62  	require.Equal(t, "1", revs[0].Version)
    63  	require.Equal(t, "2", revs[1].Version)
    64  
    65  	id, err := r.ID(ctx, "v0.10.1")
    66  	require.NoError(t, err)
    67  	require.NotEmpty(t, id)
    68  	id1, err := r.ID(ctx, "v0.10.1")
    69  	require.NoError(t, err)
    70  	require.Equal(t, id, id1, "identifiers should be allocated only once")
    71  
    72  	// Identifier is not returned as a revision.
    73  	revs, err = r.ReadRevisions(ctx)
    74  	require.NoError(t, err)
    75  	require.Len(t, revs, 2, "identifiers should not be returned as revisions")
    76  	_, err = r.ReadRevision(ctx, revisionID)
    77  	require.Error(t, err)
    78  	err = r.DeleteRevision(ctx, revisionID)
    79  	require.Error(t, err)
    80  	err = r.WriteRevision(ctx, &migrate.Revision{Version: revisionID})
    81  	require.Error(t, err)
    82  
    83  	cur, err = r.CurrentRevision(ctx)
    84  	require.NoError(t, err)
    85  	require.Equal(t, "2", cur.Version)
    86  	require.NoError(t, r.DeleteRevision(ctx, "2"))
    87  	cur, err = r.CurrentRevision(ctx)
    88  	require.NoError(t, err)
    89  	require.Equal(t, "1", cur.Version)
    90  	require.NoError(t, r.DeleteRevision(ctx, "1"))
    91  	cur, err = r.CurrentRevision(ctx)
    92  	require.True(t, ent.IsNotFound(err))
    93  	require.Nil(t, cur)
    94  	revs, err = r.ReadRevisions(ctx)
    95  	require.NoError(t, err)
    96  	require.Len(t, revs, 0)
    97  	id1, err = r.ID(ctx, "v0.10.1")
    98  	require.NoError(t, err)
    99  	require.Equal(t, id, id1)
   100  }