code.gitea.io/gitea@v1.22.3/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  	x.SetMapper(names.GonicMapper{})
    40  
    41  	for i := range columns {
    42  		if err := x.Sync(new(DropTest)); err != nil {
    43  			t.Errorf("unable to create DropTest table: %v", err)
    44  			return
    45  		}
    46  
    47  		sess := x.NewSession()
    48  		if err := sess.Begin(); err != nil {
    49  			sess.Close()
    50  			t.Errorf("unable to begin transaction: %v", err)
    51  			return
    52  		}
    53  		if err := DropTableColumns(sess, "drop_test", columns[i:]...); err != nil {
    54  			sess.Close()
    55  			t.Errorf("Unable to drop columns[%d:]: %s from drop_test: %v", i, columns[i:], err)
    56  			return
    57  		}
    58  		if err := sess.Commit(); err != nil {
    59  			sess.Close()
    60  			t.Errorf("unable to commit transaction: %v", err)
    61  			return
    62  		}
    63  		sess.Close()
    64  		if err := x.DropTables(new(DropTest)); err != nil {
    65  			t.Errorf("unable to drop table: %v", err)
    66  			return
    67  		}
    68  		for j := range columns[i+1:] {
    69  			if err := x.Sync(new(DropTest)); err != nil {
    70  				t.Errorf("unable to create DropTest table: %v", err)
    71  				return
    72  			}
    73  			dropcols := append([]string{columns[i]}, columns[j+i+1:]...)
    74  			sess := x.NewSession()
    75  			if err := sess.Begin(); err != nil {
    76  				sess.Close()
    77  				t.Errorf("unable to begin transaction: %v", err)
    78  				return
    79  			}
    80  			if err := DropTableColumns(sess, "drop_test", dropcols...); err != nil {
    81  				sess.Close()
    82  				t.Errorf("Unable to drop columns: %s from drop_test: %v", dropcols, err)
    83  				return
    84  			}
    85  			if err := sess.Commit(); err != nil {
    86  				sess.Close()
    87  				t.Errorf("unable to commit transaction: %v", err)
    88  				return
    89  			}
    90  			sess.Close()
    91  			if err := x.DropTables(new(DropTest)); err != nil {
    92  				t.Errorf("unable to drop table: %v", err)
    93  				return
    94  			}
    95  		}
    96  	}
    97  }