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 }