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  }