github.com/hasnat/dolt/go@v0.0.0-20210628190320-9eb5d843fbb7/libraries/doltcore/schema/alterschema/dropcolumn_test.go (about) 1 // Copyright 2019 Dolthub, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package alterschema 16 17 import ( 18 "context" 19 "testing" 20 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 24 "github.com/dolthub/dolt/go/libraries/doltcore/dtestutils" 25 "github.com/dolthub/dolt/go/libraries/doltcore/row" 26 "github.com/dolthub/dolt/go/libraries/doltcore/schema" 27 "github.com/dolthub/dolt/go/store/types" 28 ) 29 30 func TestDropColumn(t *testing.T) { 31 tests := []struct { 32 name string 33 colName string 34 expectedSchema schema.Schema 35 expectedRows []row.Row 36 expectedErr string 37 }{ 38 { 39 name: "remove int", 40 colName: "age", 41 expectedSchema: dtestutils.RemoveColumnFromSchema(dtestutils.TypedSchema, dtestutils.AgeTag), 42 expectedRows: dtestutils.TypedRows, 43 }, 44 { 45 name: "remove string", 46 colName: "title", 47 expectedSchema: dtestutils.RemoveColumnFromSchema(dtestutils.TypedSchema, dtestutils.TitleTag), 48 expectedRows: dtestutils.TypedRows, 49 }, 50 { 51 name: "column not found", 52 colName: "not found", 53 expectedErr: "column not found", 54 }, 55 { 56 name: "remove primary key col", 57 colName: "id", 58 expectedErr: "Cannot drop column in primary key", 59 }, 60 } 61 62 for _, tt := range tests { 63 t.Run(tt.name, func(t *testing.T) { 64 dEnv := dtestutils.CreateEnvWithSeedData(t) 65 ctx := context.Background() 66 67 root, err := dEnv.WorkingRoot(ctx) 68 require.NoError(t, err) 69 tbl, _, err := root.GetTable(ctx, tableName) 70 require.NoError(t, err) 71 72 updatedTable, err := DropColumn(ctx, tbl, tt.colName, nil) 73 if len(tt.expectedErr) > 0 { 74 require.Error(t, err) 75 assert.Contains(t, err.Error(), tt.expectedErr) 76 return 77 } else { 78 require.NoError(t, err) 79 } 80 81 sch, err := updatedTable.GetSchema(ctx) 82 require.NoError(t, err) 83 originalSch, err := tbl.GetSchema(ctx) 84 require.NoError(t, err) 85 index := originalSch.Indexes().GetByName(dtestutils.IndexName) 86 tt.expectedSchema.Indexes().AddIndex(index) 87 require.Equal(t, tt.expectedSchema, sch) 88 89 rowData, err := updatedTable.GetRowData(ctx) 90 require.NoError(t, err) 91 92 var foundRows []row.Row 93 err = rowData.Iter(ctx, func(key, value types.Value) (stop bool, err error) { 94 tpl, err := row.FromNoms(dtestutils.TypedSchema, key.(types.Tuple), value.(types.Tuple)) 95 assert.NoError(t, err) 96 foundRows = append(foundRows, tpl) 97 return false, nil 98 }) 99 100 assert.NoError(t, err) 101 assert.Equal(t, tt.expectedRows, foundRows) 102 }) 103 } 104 } 105 106 func TestDropColumnUsedByIndex(t *testing.T) { 107 tests := []struct { 108 name string 109 colName string 110 expectedIndex bool 111 expectedSchema schema.Schema 112 expectedRows []row.Row 113 }{ 114 { 115 name: "remove int", 116 colName: "age", 117 expectedIndex: true, 118 expectedSchema: dtestutils.RemoveColumnFromSchema(dtestutils.TypedSchema, dtestutils.AgeTag), 119 expectedRows: dtestutils.TypedRows, 120 }, 121 { 122 name: "remove string", 123 colName: "title", 124 expectedIndex: true, 125 expectedSchema: dtestutils.RemoveColumnFromSchema(dtestutils.TypedSchema, dtestutils.TitleTag), 126 expectedRows: dtestutils.TypedRows, 127 }, 128 { 129 name: "remove name", 130 colName: "name", 131 expectedIndex: false, 132 expectedSchema: dtestutils.RemoveColumnFromSchema(dtestutils.TypedSchema, dtestutils.NameTag), 133 expectedRows: dtestutils.TypedRows, 134 }, 135 } 136 137 for _, tt := range tests { 138 t.Run(tt.name, func(t *testing.T) { 139 dEnv := dtestutils.CreateEnvWithSeedData(t) 140 ctx := context.Background() 141 142 root, err := dEnv.WorkingRoot(ctx) 143 require.NoError(t, err) 144 tbl, _, err := root.GetTable(ctx, tableName) 145 require.NoError(t, err) 146 147 updatedTable, err := DropColumn(ctx, tbl, tt.colName, nil) 148 require.NoError(t, err) 149 150 sch, err := updatedTable.GetSchema(ctx) 151 require.NoError(t, err) 152 originalSch, err := tbl.GetSchema(ctx) 153 require.NoError(t, err) 154 index := originalSch.Indexes().GetByName(dtestutils.IndexName) 155 assert.NotNil(t, index) 156 if tt.expectedIndex { 157 tt.expectedSchema.Indexes().AddIndex(index) 158 indexRowData, err := updatedTable.GetIndexRowData(ctx, dtestutils.IndexName) 159 require.NoError(t, err) 160 assert.Greater(t, indexRowData.Len(), uint64(0)) 161 } else { 162 assert.Nil(t, sch.Indexes().GetByName(dtestutils.IndexName)) 163 _, err := updatedTable.GetIndexRowData(ctx, dtestutils.IndexName) 164 assert.Error(t, err) 165 } 166 require.Equal(t, tt.expectedSchema, sch) 167 168 rowData, err := updatedTable.GetRowData(ctx) 169 require.NoError(t, err) 170 171 var foundRows []row.Row 172 err = rowData.Iter(ctx, func(key, value types.Value) (stop bool, err error) { 173 tpl, err := row.FromNoms(dtestutils.TypedSchema, key.(types.Tuple), value.(types.Tuple)) 174 assert.NoError(t, err) 175 foundRows = append(foundRows, tpl) 176 return false, nil 177 }) 178 179 assert.NoError(t, err) 180 assert.Equal(t, tt.expectedRows, foundRows) 181 }) 182 } 183 }