github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/cmd/test/others/unit/parse_table/parse_test.go (about)

     1  package parse_table
     2  
     3  import (
     4  	"flag"
     5  	"log"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/easysoft/zendata/internal/command"
    12  	commandConfig "github.com/easysoft/zendata/internal/command/config"
    13  	configUtils "github.com/easysoft/zendata/internal/pkg/config"
    14  	"github.com/easysoft/zendata/internal/pkg/model"
    15  	fileUtils "github.com/easysoft/zendata/pkg/utils/file"
    16  	"github.com/easysoft/zendata/pkg/utils/vari"
    17  	"gopkg.in/yaml.v3"
    18  	"gorm.io/driver/mysql"
    19  	"gorm.io/gorm"
    20  )
    21  
    22  var (
    23  	Dsn = "" // "root:P2ssw0rd@(127.0.0.1:3306)/zd_test?charset=utf8&parseTime=True&loc=Local"
    24  	Out = "" // "demo/out/sql"
    25  
    26  	TableByFieldName = "by_field_name"
    27  	TableByFieldType = "by_field_type"
    28  	TableByRecords   = "by_records"
    29  )
    30  
    31  func setup() {
    32  	initArgs()
    33  
    34  	os.Chdir("../../../../")
    35  	configUtils.InitConfig("")
    36  	vari.DB, _ = commandConfig.NewGormDB()
    37  
    38  	initTables()
    39  }
    40  
    41  func teardown() {
    42  
    43  }
    44  
    45  func TestMain(m *testing.M) {
    46  	setup()
    47  	code := m.Run()
    48  	teardown()
    49  
    50  	os.Exit(code)
    51  }
    52  
    53  func TestGenDefFromFieldName(t *testing.T) {
    54  	vari.GlobalVars.Table = TableByFieldName
    55  	parse(t)
    56  	checkByFieldName(t)
    57  }
    58  
    59  func TestGenDefFromColumnType(t *testing.T) {
    60  	vari.GlobalVars.Table = TableByFieldType
    61  	parse(t)
    62  	checkByFieldType(t)
    63  }
    64  
    65  func TestGenDefFromRecords(t *testing.T) {
    66  	vari.GlobalVars.Table = TableByRecords
    67  	parse(t)
    68  	checkByFieldRecords(t)
    69  }
    70  
    71  func parse(t *testing.T) {
    72  	mainCtrl, _ := command.InitCtrl()
    73  	mainCtrl.GenYaml("")
    74  }
    75  
    76  func checkByFieldName(t *testing.T) {
    77  	def := readYamlObj(TableByFieldName)
    78  
    79  	for _, field := range def.Fields {
    80  		pass := true
    81  		if field.Field == "username" {
    82  			pass = field.From == "name.enaccount.v1.yaml"
    83  		} else if field.Field == "telphone" {
    84  			pass = field.From == "phone.v1.yaml"
    85  		} else if field.Field == "mobilephone" {
    86  			pass = field.From == "phone.v1.yaml"
    87  		} else if field.Field == "email" {
    88  			pass = field.From == "email.v1.yaml"
    89  		} else if field.Field == "url" {
    90  			pass = field.From == "domain.domain.v1.yaml"
    91  		} else if field.Field == "ip" {
    92  			pass = field.From == "ip.v1.yaml"
    93  		} else if field.Field == "macaddress" {
    94  			pass = field.Format == "mac()"
    95  		} else if field.Field == "creditcard" {
    96  			pass = field.Format == "credit_card(amex)"
    97  		} else if field.Field == "idcard" {
    98  			pass = field.Format == "id_card()"
    99  		} else if field.Field == "token" {
   100  			pass = field.Format == "token()"
   101  		}
   102  
   103  		if !pass {
   104  			t.Errorf(`Wrong Config: field "%s"; from: "%v"; format: "%v""`, field.Field, field.From, field.Format)
   105  		}
   106  	}
   107  }
   108  
   109  func checkByFieldType(t *testing.T) {
   110  	def := readYamlObj(TableByFieldType)
   111  
   112  	for _, field := range def.Fields {
   113  		pass := true
   114  		if field.Field == "f_bit" {
   115  			pass = field.Range == "0,1:R"
   116  		} else if field.Field == "f_tinyint" {
   117  			pass = field.Range == "0-255:R"
   118  		} else if field.Field == "f_smallint" {
   119  			pass = field.Range == "0-65535:R"
   120  		} else if field.Field == "f_mediumint" {
   121  			pass = field.Range == "0-16777215:R"
   122  		} else if field.Field == "f_int" {
   123  			pass = field.Range == "0-4294967295:R"
   124  		} else if field.Field == "f_bigint" {
   125  			pass = field.Range == "0-9223372036854775807:R"
   126  		} else if field.Field == "f_float" {
   127  			pass = field.Range == "0-99.999:R"
   128  		} else if field.Field == "f_double" {
   129  			pass = field.Range == "0-99.999999:R"
   130  		} else if field.Field == "f_decimal" {
   131  			pass = field.Range == "0-99.99:R"
   132  		} else if field.Field == "f_char" {
   133  			pass = field.Range == "a-z"
   134  		} else if field.Field == "f_tinytext" {
   135  			pass = field.From == "idiom.v1.idiom"
   136  		} else if field.Field == "f_text" {
   137  			pass = field.From == "xiehouyu.v1.xiehouyu"
   138  		} else if field.Field == "f_mediumtext" {
   139  			pass = field.From == "joke.v1.joke"
   140  		} else if field.Field == "f_longtext" {
   141  			pass = field.From == "song.v1.song"
   142  
   143  		} else if field.Field == "f_tinyblob" {
   144  			pass = field.Format == "binary()"
   145  		} else if field.Field == "f_blob" {
   146  			pass = field.Format == "binary()"
   147  		} else if field.Field == "f_mediumblob" {
   148  			pass = field.Format == "binary()"
   149  		} else if field.Field == "f_longblob" {
   150  			pass = field.Format == "binary()"
   151  		} else if field.Field == "f_binary" {
   152  			pass = field.Format == "binary()"
   153  		} else if field.Field == "f_varbinary" {
   154  			pass = field.Format == "binary()"
   155  
   156  		} else if field.Field == "f_date" {
   157  			pass = field.Range == "(-1M)-(+1w):86400" && field.Format == "YY/MM/DD" && field.Type == "timestamp"
   158  		} else if field.Field == "f_time" {
   159  			pass = field.Range == "(-1M)-(+1w):60" && field.Format == "hh:mm:ss" && field.Type == "timestamp"
   160  		} else if field.Field == "f_year" {
   161  			pass = field.Range == "(-6Y)-(+6Y):31536000" && field.Format == "YYYY" && field.Type == "timestamp"
   162  		} else if field.Field == "f_datetime" {
   163  			pass = field.Range == "(-1M)-(+1w):60" && field.Format == "YY/MM/DD hh:mm:ss" && field.Type == "timestamp"
   164  		} else if field.Field == "f_timestamp" {
   165  			pass = field.Range == "(-1M)-(+1w):60" && field.Type == "timestamp"
   166  
   167  		} else if field.Field == "f_enum" {
   168  			pass = field.Range == "a,b,c"
   169  		} else if field.Field == "f_set" {
   170  			pass = field.Range == "a,b,c" && field.Loop == "2-3"
   171  		}
   172  		if !pass {
   173  			t.Errorf(`Wrong Config: field "%s"; from: "%v"; format: "%v""`, field.Field, field.From, field.Format)
   174  		}
   175  	}
   176  }
   177  
   178  func checkByFieldRecords(t *testing.T) {
   179  	def := readYamlObj(TableByRecords)
   180  
   181  	for _, field := range def.Fields {
   182  		pass := true
   183  
   184  		if field.Field == "f1" {
   185  			pass = field.From == "email.v1.yaml"
   186  		} else if field.Field == "f2" {
   187  			pass = field.Format == "credit_card(amex)"
   188  		} else if field.Field == "f3" {
   189  			pass = field.Format == "mac()"
   190  		} else if field.Field == "f4" {
   191  			pass = field.From == "uuid.v1.yaml"
   192  		} else if field.Field == "f5" {
   193  			pass = field.Format == "md5"
   194  		} else if field.Field == "f6" {
   195  			pass = field.From == "phone.v1.yaml" && field.Use == "cellphone"
   196  		} else if field.Field == "f7" {
   197  			pass = field.From == "phone.v1.yaml" && field.Use == "telephone_china"
   198  		} else if field.Field == "f8" {
   199  			pass = field.Format == "id_card()"
   200  		} else if field.Field == "f9" {
   201  			pass = field.From == "domain.domain.v1.yaml"
   202  		} else if field.Field == "f10" {
   203  			pass = field.Format == "json()"
   204  		}
   205  
   206  		if !pass {
   207  			t.Errorf(`Wrong Config: field "%s"; from: "%v"; format: "%v""`, field.Field, field.From, field.Format)
   208  		}
   209  	}
   210  }
   211  
   212  func initTables() {
   213  	initTable(TableByFieldName)
   214  	initTable(TableByFieldType)
   215  	initTable(TableByRecords)
   216  }
   217  
   218  func initTable(name string) {
   219  	dir := filepath.Join("cmd", "test", "unit", "parse_table")
   220  	sqls := fileUtils.ReadFile(filepath.Join(dir, name+".sql"))
   221  
   222  	arr := strings.Split(sqls, ";")
   223  
   224  	db, err := gorm.Open(mysql.Open(vari.GlobalVars.DBDsn))
   225  	if err != nil {
   226  		panic(err)
   227  	}
   228  
   229  	for _, sql := range arr {
   230  		if sql == "" {
   231  			continue
   232  		}
   233  		err = db.Exec(sql).Error
   234  		if err != nil {
   235  			panic(err)
   236  		}
   237  	}
   238  }
   239  
   240  func initArgs() {
   241  	flag.Parse()
   242  	argList := flag.Args()
   243  
   244  	vari.GlobalVars.DBDsn = argList[0]
   245  	vari.GlobalVars.Output = argList[1]
   246  	log.Printf("DBDsn = %s", vari.GlobalVars.DBDsn)
   247  	log.Printf("Output = %s", vari.GlobalVars.Output)
   248  }
   249  
   250  func readYamlObj(name string) (def model.ZdDef) {
   251  	pth := filepath.Join(vari.GlobalVars.Output, name+".yaml")
   252  	content := fileUtils.ReadFileBuf(pth)
   253  
   254  	def = model.ZdDef{}
   255  	yaml.Unmarshal(content, &def)
   256  
   257  	return
   258  }