github.com/zhongdalu/gf@v1.0.0/g/database/gdb/gdb_unit_init_test.go (about)

     1  // Copyright 2019 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/zhongdalu/gf.
     6  
     7  package gdb_test
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  
    13  	"github.com/zhongdalu/gf/g"
    14  	"github.com/zhongdalu/gf/g/container/garray"
    15  
    16  	"github.com/zhongdalu/gf/g/database/gdb"
    17  	"github.com/zhongdalu/gf/g/os/gtime"
    18  	"github.com/zhongdalu/gf/g/test/gtest"
    19  )
    20  
    21  const (
    22  	INIT_DATA_SIZE = 10      // 初始化表数据量
    23  	TABLE          = "user"  // 测试数据表
    24  	SCHEMA1        = "test1" // 测试数据库1
    25  	SCHEMA2        = "test2" // 测试数据库2
    26  )
    27  
    28  var (
    29  	// 测试包变量,ORM对象
    30  	db gdb.DB
    31  )
    32  
    33  // 初始化连接参数。
    34  // 测试前需要修改连接参数。
    35  func init() {
    36  	node := gdb.ConfigNode{
    37  		Host:    "127.0.0.1",
    38  		Port:    "3306",
    39  		User:    "root",
    40  		Pass:    "",
    41  		Name:    "",
    42  		Type:    "mysql",
    43  		Role:    "master",
    44  		Charset: "utf8",
    45  		Weight:  1,
    46  	}
    47  	// 作者本地测试hack
    48  	if hostname, _ := os.Hostname(); hostname == "ijohn" {
    49  		node.Pass = "12345678"
    50  	}
    51  	gdb.AddConfigNode("test", node)
    52  	gdb.AddConfigNode(gdb.DEFAULT_GROUP_NAME, node)
    53  	if r, err := gdb.New(); err != nil {
    54  		gtest.Error(err)
    55  	} else {
    56  		db = r
    57  	}
    58  	// 准备测试数据结构:数据库
    59  	schemaTemplate := "CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET UTF8"
    60  	if _, err := db.Exec(fmt.Sprintf(schemaTemplate, SCHEMA1)); err != nil {
    61  		gtest.Error(err)
    62  	}
    63  	// 多个数据库,用于测试数据库切换
    64  	if _, err := db.Exec(fmt.Sprintf(schemaTemplate, SCHEMA2)); err != nil {
    65  		gtest.Error(err)
    66  	}
    67  	// 设置默认操作数据库
    68  	db.SetSchema(SCHEMA1)
    69  	// 创建默认用户表
    70  	createTable(TABLE)
    71  }
    72  
    73  // 创建指定名称的user测试表,当table为空时,创建随机的表名。
    74  // 创建的测试表默认没有任何数据。
    75  // 执行完成后返回该表名。
    76  func createTable(table ...string) (name string) {
    77  	if len(table) > 0 {
    78  		name = table[0]
    79  	} else {
    80  		name = fmt.Sprintf(`%s_%d`, TABLE, gtime.Nanosecond())
    81  	}
    82  	dropTable(name)
    83  	if _, err := db.Exec(fmt.Sprintf(`
    84      CREATE TABLE %s (
    85          id          int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    86          passport    varchar(45) NOT NULL COMMENT '账号',
    87          password    char(32) NOT NULL COMMENT '密码',
    88          nickname    varchar(45) NOT NULL COMMENT '昵称',
    89          create_time timestamp NOT NULL COMMENT '创建时间/注册时间',
    90          PRIMARY KEY (id)
    91      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    92      `, name)); err != nil {
    93  		gtest.Error(err)
    94  	}
    95  	return
    96  }
    97  
    98  // 创建测试表,并初始化默认数据。
    99  func createInitTable(table ...string) (name string) {
   100  	name = createTable(table...)
   101  	array := garray.New(true)
   102  	for i := 1; i <= INIT_DATA_SIZE; i++ {
   103  		array.Append(g.Map{
   104  			"id":          i,
   105  			"passport":    fmt.Sprintf(`user_%d`, i),
   106  			"password":    fmt.Sprintf(`pass_%d`, i),
   107  			"nickname":    fmt.Sprintf(`name_%d`, i),
   108  			"create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(),
   109  		})
   110  	}
   111  	result, err := db.Table(name).Data(array.Slice()).Insert()
   112  	gtest.Assert(err, nil)
   113  
   114  	n, e := result.RowsAffected()
   115  	gtest.Assert(e, nil)
   116  	gtest.Assert(n, INIT_DATA_SIZE)
   117  	return
   118  }
   119  
   120  // 删除指定表.
   121  func dropTable(table string) {
   122  	if _, err := db.Exec(fmt.Sprintf("DROP TABLE IF EXISTS `%s`", table)); err != nil {
   123  		gtest.Error(err)
   124  	}
   125  }