Add randomize support for enums, add enums for pq
This commit is contained in:
parent
6f0fce21b8
commit
d891bcb9f0
4 changed files with 102 additions and 0 deletions
37
README.md
37
README.md
|
@ -1047,6 +1047,43 @@ exists, err := jet.Pilot(db).Exists()
|
||||||
exists, err := models.Pilots(db, Where("id=?", 5)).Exists()
|
exists, err := models.Pilots(db, Where("id=?", 5)).Exists()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Enums
|
||||||
|
|
||||||
|
If your MySQL or Postgres tables use enums we will generate constants that hold their values
|
||||||
|
that you can use in your queries. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
CREATE TYPE workday AS ENUM('monday', 'tuesday', 'wednesday', 'thursday', 'friday');
|
||||||
|
|
||||||
|
CREATE TABLE event_one (
|
||||||
|
id serial PRIMARY KEY NOT NULL,
|
||||||
|
name VARCHAR(255),
|
||||||
|
day workday NOT NULL
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
An enum type defined like the above, being used by a table, will generate the following enums:
|
||||||
|
|
||||||
|
```
|
||||||
|
const (
|
||||||
|
WorkdayMonday = "monday"
|
||||||
|
WorkdayTuesday = "tuesday"
|
||||||
|
WorkdayWednesday = "wednesday"
|
||||||
|
WorkdayThursday = "thursday"
|
||||||
|
WorkdayFriday = "friday"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
For Postgres we use `enum type name + title cased` value to generate the const variable name.
|
||||||
|
For MySQL we use `table name + column name + title cased value` to generate the const variable name.
|
||||||
|
|
||||||
|
Note: If your enum holds a value we cannot parse correctly due, to non-alphabet characters for example,
|
||||||
|
it may not be generated. In this event, you will receive errors in your generated tests because
|
||||||
|
the value randomizer in the test suite does not know how to generate valid enum values. You will
|
||||||
|
still be able to use your generated library, and it will still work as expected, but the only way
|
||||||
|
to get the tests to pass in this event is to either use a parsable enum value or use a regular column
|
||||||
|
instead of an enum.
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
#### Won't compiling models for a huge database be very slow?
|
#### Won't compiling models for a huge database be very slow?
|
||||||
|
|
|
@ -158,6 +158,16 @@ func randDate(s *Seed) time.Time {
|
||||||
// If canBeNull is true:
|
// If canBeNull is true:
|
||||||
// The value has the possibility of being null or non-zero at random.
|
// The value has the possibility of being null or non-zero at random.
|
||||||
func randomizeField(s *Seed, field reflect.Value, fieldType string, canBeNull bool) error {
|
func randomizeField(s *Seed, field reflect.Value, fieldType string, canBeNull bool) error {
|
||||||
|
if strings.HasPrefix(fieldType, "enum") {
|
||||||
|
enum, err := randEnumValue(fieldType)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
field.Set(reflect.ValueOf(enum))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
kind := field.Kind()
|
kind := field.Kind()
|
||||||
typ := field.Type()
|
typ := field.Type()
|
||||||
|
|
||||||
|
@ -604,3 +614,12 @@ func getVariableRandValue(s *Seed, kind reflect.Kind, typ reflect.Type) interfac
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func randEnumValue(enum string) (string, error) {
|
||||||
|
vals := strmangle.ParseEnumVals(enum)
|
||||||
|
if vals == nil || len(vals) == 0 {
|
||||||
|
return "", fmt.Errorf("unable to parse enum string: %s", enum)
|
||||||
|
}
|
||||||
|
|
||||||
|
return vals[rand.Intn(len(vals)-1)], nil
|
||||||
|
}
|
||||||
|
|
|
@ -144,3 +144,28 @@ func TestRandomizeField(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRandEnumValue(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
enum1 := "enum.workday('monday','tuesday')"
|
||||||
|
enum2 := "enum('monday','tuesday')"
|
||||||
|
|
||||||
|
r1, err := randEnumValue(enum1)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r1 != "monday" && r1 != "tuesday" {
|
||||||
|
t.Errorf("Expected monday or tueday, got: %q", r1)
|
||||||
|
}
|
||||||
|
|
||||||
|
r2, err := randEnumValue(enum2)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r2 != "monday" && r2 != "tuesday" {
|
||||||
|
t.Errorf("Expected monday or tueday, got: %q", r2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
21
testdata/postgres_test_schema.sql
vendored
21
testdata/postgres_test_schema.sql
vendored
|
@ -1,3 +1,24 @@
|
||||||
|
CREATE TYPE workday AS ENUM('monday', 'tuesday', 'wednesday', 'thursday', 'friday');
|
||||||
|
CREATE TYPE faceyface AS ENUM('angry', 'hungry', 'bitter');
|
||||||
|
|
||||||
|
CREATE TABLE event_one (
|
||||||
|
id serial PRIMARY KEY NOT NULL,
|
||||||
|
name VARCHAR(255),
|
||||||
|
day workday NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE event_two (
|
||||||
|
id serial PRIMARY KEY NOT NULL,
|
||||||
|
name VARCHAR(255),
|
||||||
|
day workday NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE facey (
|
||||||
|
id serial PRIMARY KEY NOT NULL,
|
||||||
|
name VARCHAR(255),
|
||||||
|
face faceyface NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
CREATE TABLE magic (
|
CREATE TABLE magic (
|
||||||
id serial PRIMARY KEY NOT NULL,
|
id serial PRIMARY KEY NOT NULL,
|
||||||
id_two serial NOT NULL,
|
id_two serial NOT NULL,
|
||||||
|
|
Loading…
Add table
Reference in a new issue