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 }