code.gitea.io/gitea@v1.21.7/models/migrations/base/db_test.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package base
     5  
     6  import (
     7  	"testing"
     8  
     9  	"code.gitea.io/gitea/modules/timeutil"
    10  
    11  	"xorm.io/xorm/names"
    12  )
    13  
    14  func Test_DropTableColumns(t *testing.T) {
    15  	x, deferable := PrepareTestEnv(t, 0)
    16  	if x == nil || t.Failed() {
    17  		defer deferable()
    18  		return
    19  	}
    20  	defer deferable()
    21  
    22  	type DropTest struct {
    23  		ID            int64 `xorm:"pk autoincr"`
    24  		FirstColumn   string
    25  		ToDropColumn  string `xorm:"unique"`
    26  		AnotherColumn int64
    27  		CreatedUnix   timeutil.TimeStamp `xorm:"INDEX created"`
    28  		UpdatedUnix   timeutil.TimeStamp `xorm:"INDEX updated"`
    29  	}
    30  
    31  	columns := []string{
    32  		"first_column",
    33  		"to_drop_column",
    34  		"another_column",
    35  		"created_unix",
    36  		"updated_unix",
    37  	}
    38  
    39  	for i := range columns {
    40  		x.SetMapper(names.GonicMapper{})
    41  		if err := x.Sync(new(DropTest)); err != nil {
    42  			t.Errorf("unable to create DropTest table: %v", err)
    43  			return
    44  		}
    45  		sess := x.NewSession()
    46  		if err := sess.Begin(); err != nil {
    47  			sess.Close()
    48  			t.Errorf("unable to begin transaction: %v", err)
    49  			return
    50  		}
    51  		if err := DropTableColumns(sess, "drop_test", columns[i:]...); err != nil {
    52  			sess.Close()
    53  			t.Errorf("Unable to drop columns[%d:]: %s from drop_test: %v", i, columns[i:], err)
    54  			return
    55  		}
    56  		if err := sess.Commit(); err != nil {
    57  			sess.Close()
    58  			t.Errorf("unable to commit transaction: %v", err)
    59  			return
    60  		}
    61  		sess.Close()
    62  		if err := x.DropTables(new(DropTest)); err != nil {
    63  			t.Errorf("unable to drop table: %v", err)
    64  			return
    65  		}
    66  		for j := range columns[i+1:] {
    67  			x.SetMapper(names.GonicMapper{})
    68  			if err := x.Sync(new(DropTest)); err != nil {
    69  				t.Errorf("unable to create DropTest table: %v", err)
    70  				return
    71  			}
    72  			dropcols := append([]string{columns[i]}, columns[j+i+1:]...)
    73  			sess := x.NewSession()
    74  			if err := sess.Begin(); err != nil {
    75  				sess.Close()
    76  				t.Errorf("unable to begin transaction: %v", err)
    77  				return
    78  			}
    79  			if err := DropTableColumns(sess, "drop_test", dropcols...); err != nil {
    80  				sess.Close()
    81  				t.Errorf("Unable to drop columns: %s from drop_test: %v", dropcols, err)
    82  				return
    83  			}
    84  			if err := sess.Commit(); err != nil {
    85  				sess.Close()
    86  				t.Errorf("unable to commit transaction: %v", err)
    87  				return
    88  			}
    89  			sess.Close()
    90  			if err := x.DropTables(new(DropTest)); err != nil {
    91  				t.Errorf("unable to drop table: %v", err)
    92  				return
    93  			}
    94  		}
    95  	}
    96  }