github.com/iasthc/atlas/cmd/atlas@v0.0.0-20230523071841-73246df3f88d/internal/cmdlog/cmdlog_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 cmdlog_test
     6  
     7  import (
     8  	"bytes"
     9  	"context"
    10  	"encoding/json"
    11  	"errors"
    12  	"io"
    13  	"testing"
    14  	"text/template"
    15  
    16  	"github.com/iasthc/atlas/cmd/atlas/internal/cmdlog"
    17  	"github.com/iasthc/atlas/sql/migrate"
    18  	"github.com/iasthc/atlas/sql/schema"
    19  	"github.com/iasthc/atlas/sql/sqlclient"
    20  	_ "github.com/iasthc/atlas/sql/sqlite"
    21  
    22  	_ "github.com/mattn/go-sqlite3"
    23  	"github.com/stretchr/testify/require"
    24  )
    25  
    26  func TestSchemaInspect_MarshalJSON(t *testing.T) {
    27  	report := &cmdlog.SchemaInspect{
    28  		Realm: schema.NewRealm(
    29  			schema.New("test").
    30  				AddTables(
    31  					schema.NewTable("users").
    32  						AddColumns(
    33  							&schema.Column{
    34  								Name: "id",
    35  								Type: &schema.ColumnType{Raw: "bigint"},
    36  							},
    37  							&schema.Column{
    38  								Name: "name",
    39  								Type: &schema.ColumnType{Raw: "varchar(255)"},
    40  							},
    41  						),
    42  					schema.NewTable("posts").
    43  						AddColumns(
    44  							&schema.Column{
    45  								Name: "id",
    46  								Type: &schema.ColumnType{Raw: "bigint"},
    47  							},
    48  							&schema.Column{
    49  								Name: "text",
    50  								Type: &schema.ColumnType{Raw: "text"},
    51  							},
    52  						),
    53  				),
    54  			schema.New("temp"),
    55  		),
    56  	}
    57  	b, err := report.MarshalJSON()
    58  	require.NoError(t, err)
    59  	ident, err := json.MarshalIndent(json.RawMessage(b), "", "  ")
    60  	require.NoError(t, err)
    61  	require.Equal(t, `{
    62    "schemas": [
    63      {
    64        "name": "test",
    65        "tables": [
    66          {
    67            "name": "users",
    68            "columns": [
    69              {
    70                "name": "id",
    71                "type": "bigint"
    72              },
    73              {
    74                "name": "name",
    75                "type": "varchar(255)"
    76              }
    77            ]
    78          },
    79          {
    80            "name": "posts",
    81            "columns": [
    82              {
    83                "name": "id",
    84                "type": "bigint"
    85              },
    86              {
    87                "name": "text",
    88                "type": "text"
    89              }
    90            ]
    91          }
    92        ]
    93      },
    94      {
    95        "name": "temp"
    96      }
    97    ]
    98  }`, string(ident))
    99  
   100  	report = &cmdlog.SchemaInspect{Error: io.EOF}
   101  	b, err = report.MarshalJSON()
   102  	require.NoError(t, err)
   103  	require.Equal(t, `{"Error":"EOF"}`, string(b))
   104  }
   105  
   106  func TestSchemaInspect_EncodeSQL(t *testing.T) {
   107  	ctx := context.Background()
   108  	client, err := sqlclient.Open(ctx, "sqlite://ci?mode=memory&_fk=1")
   109  	require.NoError(t, err)
   110  	defer client.Close()
   111  	err = client.ApplyChanges(ctx, schema.Changes{
   112  		&schema.AddTable{
   113  			T: schema.NewTable("users").
   114  				AddColumns(
   115  					schema.NewIntColumn("id", "int"),
   116  					schema.NewStringColumn("name", "text"),
   117  				),
   118  		},
   119  	})
   120  	require.NoError(t, err)
   121  	realm, err := client.InspectRealm(ctx, nil)
   122  	require.NoError(t, err)
   123  
   124  	var (
   125  		b    bytes.Buffer
   126  		tmpl = template.Must(template.New("format").Funcs(cmdlog.InspectTemplateFuncs).Parse(`{{ sql . }}`))
   127  	)
   128  	require.NoError(t, tmpl.Execute(&b, &cmdlog.SchemaInspect{Client: client, Realm: realm}))
   129  	require.Equal(t, "-- Create \"users\" table\nCREATE TABLE `users` (`id` int NOT NULL, `name` text NOT NULL);\n", b.String())
   130  	b.Reset()
   131  	require.NoError(t, tmpl.Execute(&b, &cmdlog.SchemaInspect{Error: errors.New("failure")}))
   132  	require.Equal(t, "failure", b.String())
   133  }
   134  
   135  func TestMigrateSet(t *testing.T) {
   136  	var (
   137  		b   bytes.Buffer
   138  		log = &cmdlog.MigrateSet{}
   139  	)
   140  	require.NoError(t, cmdlog.MigrateSetTemplate.Execute(&b, log))
   141  	require.Empty(t, b.String())
   142  
   143  	log.Current = &migrate.Revision{Version: "1"}
   144  	require.NoError(t, cmdlog.MigrateSetTemplate.Execute(&b, log))
   145  	require.Empty(t, b.String())
   146  
   147  	log.Current = &migrate.Revision{Version: "1"}
   148  	log.Removed(&migrate.Revision{Version: "2"})
   149  	log.Removed(&migrate.Revision{Version: "3", Description: "desc"})
   150  	require.NoError(t, cmdlog.MigrateSetTemplate.Execute(&b, log))
   151  	require.Equal(t, `Current version is 1 (2 removed):
   152  
   153    - 2
   154    - 3 (desc)
   155  
   156  `, b.String())
   157  
   158  	b.Reset()
   159  	log.Set(&migrate.Revision{Version: "1.1", Description: "desc"})
   160  	require.NoError(t, cmdlog.MigrateSetTemplate.Execute(&b, log))
   161  	require.Equal(t, `Current version is 1 (1 set, 2 removed):
   162  
   163    + 1.1 (desc)
   164    - 2
   165    - 3 (desc)
   166  
   167  `, b.String())
   168  
   169  	b.Reset()
   170  	log.Current, log.Revisions = nil, nil
   171  	log.Removed(&migrate.Revision{Version: "2"})
   172  	log.Removed(&migrate.Revision{Version: "3", Description: "desc"})
   173  	require.NoError(t, cmdlog.MigrateSetTemplate.Execute(&b, log))
   174  	require.Equal(t, `All revisions deleted (2 in total):
   175  
   176    - 2
   177    - 3 (desc)
   178  
   179  `, b.String())
   180  }