github.com/RevenueMonster/sqlike@v1.0.6/examples/table.go (about)

     1  package examples
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/RevenueMonster/sqlike/sqlike"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  // MigrateExamples :
    12  func MigrateExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
    13  	var (
    14  		ns      *normalStruct
    15  		err     error
    16  		results []sqlike.Column
    17  		columns []string
    18  	)
    19  
    20  	table := db.Table("normal_struct")
    21  
    22  	{
    23  		err = db.Table("NormalStruct").DropIfExists(ctx)
    24  		require.NoError(t, err)
    25  	}
    26  
    27  	// migrate table
    28  	{
    29  		err = table.UnsafeMigrate(ctx, ns)
    30  		require.NoError(t, err)
    31  		columnMap := make(map[string]sqlike.Column)
    32  		columns = make([]string, 0)
    33  		results, err = table.Columns().List(ctx)
    34  		require.NoError(t, err)
    35  
    36  		table.MustMigrate(ctx, ns)
    37  
    38  		for _, f := range results {
    39  			columnMap[f.Name] = f
    40  			columns = append(columns, f.Name)
    41  		}
    42  
    43  		{
    44  			pk := columnMap["$Key"]
    45  			require.Equal(t, "VARCHAR(36)", pk.Type)
    46  			require.Equal(t, "$Key", pk.Name)
    47  			require.Equal(t, "Primary key", pk.Comment)
    48  		}
    49  
    50  		utf8mb4 := "utf8mb4"
    51  		// check struct tag option
    52  		require.Equal(t, "VARCHAR(300)", columnMap["CustomStrType"].Type)
    53  		require.Equal(t, "DOUBLE UNSIGNED", columnMap["UFloat32"].Type)
    54  		require.Equal(t, "ENUM('SUCCESS','FAILED','UNKNOWN')", columnMap["Enum"].Type)
    55  		// // enum by default is using latin1 for performance concern
    56  		require.Equal(t, &utf8mb4, columnMap["Enum"].Charset)
    57  
    58  		require.ElementsMatch(t, []string{
    59  			"$Key", "Key", "PtrUUID", "Date", "SID",
    60  			"Emoji", "FullText", "LongStr", "CustomStrType",
    61  			"EmptyByte", "Byte", "Bool",
    62  			"Int", "TinyInt", "SmallInt", "MediumInt", "BigInt",
    63  			"Uint", "TinyUint", "SmallUint", "MediumUint", "BigUint",
    64  			"Float32", "Float64", "UFloat32",
    65  			"EmptyStruct",
    66  			"Struct", "VirtualColumn", "Struct.StoredStr",
    67  			"JSONRaw", "Map",
    68  			"DateTime", "Timestamp", "Location",
    69  			"Language", "Languages", "Currency", "Currencies",
    70  			"Enum", "Set", "CreatedAt", "UpdatedAt",
    71  		}, columns)
    72  	}
    73  
    74  	{
    75  		err = table.Rename(ctx, "NormalStruct")
    76  		require.NoError(t, err)
    77  	}
    78  
    79  	{
    80  		err = db.Table("NormalStruct").Truncate(ctx)
    81  		require.NoError(t, err)
    82  	}
    83  
    84  	// Alter table
    85  	{
    86  		err = db.Table("NormalStruct").Migrate(ctx, normalStruct{})
    87  		require.NoError(t, err)
    88  	}
    89  
    90  	{
    91  		err = db.Table("PtrStruct").DropIfExists(ctx)
    92  		require.NoError(t, err)
    93  	}
    94  
    95  	{
    96  		err = db.Table("PtrStruct").Migrate(ctx, ptrStruct{})
    97  		require.NoError(t, err)
    98  	}
    99  
   100  	// migrate table with generated columns
   101  	{
   102  		table := db.Table("GeneratedStruct")
   103  		err = table.DropIfExists(ctx)
   104  		require.NoError(t, err)
   105  
   106  		err = table.Migrate(ctx, generatedStruct{})
   107  		require.NoError(t, err)
   108  
   109  		columns = make([]string, 0)
   110  		results, err = table.Columns().List(ctx)
   111  		require.NoError(t, err)
   112  
   113  		for _, f := range results {
   114  			columns = append(columns, f.Name)
   115  		}
   116  
   117  		require.ElementsMatch(t, []string{
   118  			"NestedID", "Amount", "Nested", "CivilDate",
   119  			"No", "id", "Line1", "Line2", "City", "State", "Country",
   120  			"Date.CreatedAt", "Date.UpdatedAt",
   121  		}, columns)
   122  
   123  		err = table.Migrate(ctx, generatedStruct{})
   124  		require.NoError(t, err)
   125  	}
   126  
   127  	temp := db.Table("Temp")
   128  
   129  	// migrate with auto_increment field
   130  	{
   131  		err = temp.DropIfExists(ctx)
   132  		require.NoError(t, err)
   133  		temp.MustMigrate(ctx,
   134  			struct {
   135  				ID     string `sqlike:"$Key"`
   136  				Number int64  `sqlike:",auto_increment"`
   137  			}{},
   138  		)
   139  	}
   140  
   141  	// migrate with auto_increment field
   142  	{
   143  		err = temp.DropIfExists(ctx)
   144  		require.NoError(t, err)
   145  		temp.MustMigrate(ctx, struct {
   146  			ID     string `sqlike:"$Key"`
   147  			Number int64
   148  		}{})
   149  
   150  		temp.MustMigrate(ctx, struct {
   151  			ID     string `sqlike:"$Key"`
   152  			Number int64  `sqlike:",auto_increment"`
   153  		}{})
   154  	}
   155  
   156  	// migrate with overriding fields
   157  	{
   158  		table := db.Table("Override")
   159  		err = table.DropIfExists(ctx)
   160  		require.NoError(t, err)
   161  		table.MustUnsafeMigrate(ctx, overrideStruct{})
   162  
   163  		cols, err := table.Columns().List(ctx)
   164  		require.NoError(t, err)
   165  
   166  		zero := "0"
   167  		require.Contains(t, cols, sqlike.Column{
   168  			Name:         "ID",
   169  			Position:     10,
   170  			Type:         "BIGINT",
   171  			DataType:     "BIGINT",
   172  			IsNullable:   false,
   173  			DefaultValue: &zero,
   174  			Comment:      "Int64 ID",
   175  		})
   176  		require.Contains(t, cols, sqlike.Column{
   177  			Name:         "Amount",
   178  			Position:     11,
   179  			Type:         "INT",
   180  			DataType:     "INT",
   181  			IsNullable:   false,
   182  			DefaultValue: &zero,
   183  			Comment:      "Int Amount",
   184  		})
   185  
   186  		emptyStr := ""
   187  		charset := "utf8mb4"
   188  		collate := "utf8mb4_unicode_ci"
   189  		require.Contains(t, cols, sqlike.Column{
   190  			Name:         "Nested",
   191  			Position:     12,
   192  			Type:         "VARCHAR(191)",
   193  			DataType:     "VARCHAR",
   194  			IsNullable:   false,
   195  			DefaultValue: &emptyStr,
   196  			Charset:      &charset,
   197  			Collation:    &collate,
   198  			Comment:      "String Nested",
   199  		})
   200  	}
   201  }
   202  
   203  // MigrateErrorExamples :
   204  func MigrateErrorExamples(ctx context.Context, t *testing.T, db *sqlike.Database) {
   205  	var (
   206  		err error
   207  	)
   208  
   209  	{
   210  		// empty table shouldn't able to migrate
   211  		err = db.Table("").Migrate(ctx, new(normalStruct))
   212  		require.Error(t, err)
   213  
   214  		err = db.Table("NormalStruct").Migrate(ctx, int(1))
   215  		require.Error(t, err)
   216  
   217  		err = db.Table("NormalStruct").Migrate(ctx, struct{}{})
   218  		require.Error(t, err)
   219  
   220  		err = db.Table("NormalStruct").Migrate(ctx, nil)
   221  		require.Error(t, err)
   222  
   223  		err = db.Table("NormalStruct").Migrate(ctx, bool(false))
   224  		require.Error(t, err)
   225  
   226  		err = db.Table("NormalStruct").Migrate(ctx, map[string]interface{}{})
   227  		require.Error(t, err)
   228  
   229  		err = db.Table("NormalStruct").Migrate(ctx, []interface{}{})
   230  		require.Error(t, err)
   231  	}
   232  }