From aaa278f41ed3674863dc7dfc39062eafb7e5e559 Mon Sep 17 00:00:00 2001 From: "Giau. Tran Minh" Date: Sun, 3 Apr 2022 00:23:13 +0700 Subject: [PATCH 1/3] entc/gen: block Optional on the ID field --- entc/gen/type.go | 3 +++ entc/gen/type_test.go | 24 ++++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/entc/gen/type.go b/entc/gen/type.go index ac70a21277..1f2b521bf7 100644 --- a/entc/gen/type.go +++ b/entc/gen/type.go @@ -239,6 +239,9 @@ func NewType(c *Config, schema *load.Schema) (*Type, error) { } // User defined id field. if tf.Name == typ.ID.Name { + if tf.Optional { + return nil, fmt.Errorf("id field must not be optional") + } typ.ID = tf } else { typ.Fields = append(typ.Fields, tf) diff --git a/entc/gen/type_test.go b/entc/gen/type_test.go index d70c31314c..88236a1fac 100644 --- a/entc/gen/type_test.go +++ b/entc/gen/type_test.go @@ -25,17 +25,17 @@ func TestType(t *testing.T) { _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Fields: []*load.Field{ - {Unique: true, Default: true, Info: &field.TypeInfo{Type: field.TypeInt}}, + {Name: "foo", Unique: true, Default: true, Info: &field.TypeInfo{Type: field.TypeInt}}, }, }) - require.Error(err, "unique field can not have default") + require.EqualError(err, "unique field \"foo\" cannot have default value") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Fields: []*load.Field{ - {Sensitive: true, Tag: `yaml:"pwd"`, Info: &field.TypeInfo{Type: field.TypeString}}, + {Name: "foo", Sensitive: true, Tag: `yaml:"pwd"`, Info: &field.TypeInfo{Type: field.TypeString}}, }, }) - require.Error(err, "sensitive field cannot have tags") + require.EqualError(err, "sensitive field \"foo\" cannot have struct tags") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -44,7 +44,7 @@ func TestType(t *testing.T) { {Name: "foo", Unique: true, Info: &field.TypeInfo{Type: field.TypeInt}}, }, }) - require.Error(err, "field foo redeclared") + require.EqualError(err, "field \"foo\" redeclared for type \"T\"") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -52,7 +52,7 @@ func TestType(t *testing.T) { {Name: "enums", Info: &field.TypeInfo{Type: field.TypeEnum}, Enums: []struct{ N, V string }{{V: "v"}, {V: "v"}}}, }, }) - require.Error(err, "duplicate enums") + require.EqualError(err, "duplicate values \"v\" for enum field \"enums\"") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -60,7 +60,7 @@ func TestType(t *testing.T) { {Name: "enums", Info: &field.TypeInfo{Type: field.TypeEnum}, Enums: []struct{ N, V string }{{}}}, }, }) - require.Error(err, "empty value for enums") + require.EqualError(err, "\"enums\" field value cannot be empty") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -68,7 +68,15 @@ func TestType(t *testing.T) { {Name: "", Info: &field.TypeInfo{Type: field.TypeInt}}, }, }) - require.Error(err, "empty field name") + require.EqualError(err, "field name cannot be empty") + + _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ + Name: "T", + Fields: []*load.Field{ + {Name: "id", Info: &field.TypeInfo{Type: field.TypeInt}, Optional: true}, + }, + }) + require.EqualError(err, "id field must not be optional") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{Name: "Type"}) require.EqualError(err, "schema lowercase name conflicts with Go keyword \"type\"") From 04441413f2879e5031da2d05d30fdbef81f8985a Mon Sep 17 00:00:00 2001 From: "Giau. Tran Minh" Date: Sun, 3 Apr 2022 00:30:36 +0700 Subject: [PATCH 2/3] chore: restore the old error message --- entc/gen/type_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/entc/gen/type_test.go b/entc/gen/type_test.go index 88236a1fac..032f9fad76 100644 --- a/entc/gen/type_test.go +++ b/entc/gen/type_test.go @@ -28,14 +28,14 @@ func TestType(t *testing.T) { {Name: "foo", Unique: true, Default: true, Info: &field.TypeInfo{Type: field.TypeInt}}, }, }) - require.EqualError(err, "unique field \"foo\" cannot have default value") + require.EqualError(err, "unique field \"foo\" cannot have default value", "unique field can not have default") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Fields: []*load.Field{ {Name: "foo", Sensitive: true, Tag: `yaml:"pwd"`, Info: &field.TypeInfo{Type: field.TypeString}}, }, }) - require.EqualError(err, "sensitive field \"foo\" cannot have struct tags") + require.EqualError(err, "sensitive field \"foo\" cannot have struct tags", "sensitive field cannot have tags") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -44,7 +44,7 @@ func TestType(t *testing.T) { {Name: "foo", Unique: true, Info: &field.TypeInfo{Type: field.TypeInt}}, }, }) - require.EqualError(err, "field \"foo\" redeclared for type \"T\"") + require.EqualError(err, "field \"foo\" redeclared for type \"T\"", "field foo redeclared") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -52,7 +52,7 @@ func TestType(t *testing.T) { {Name: "enums", Info: &field.TypeInfo{Type: field.TypeEnum}, Enums: []struct{ N, V string }{{V: "v"}, {V: "v"}}}, }, }) - require.EqualError(err, "duplicate values \"v\" for enum field \"enums\"") + require.EqualError(err, "duplicate values \"v\" for enum field \"enums\"", "duplicate enums") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -60,7 +60,7 @@ func TestType(t *testing.T) { {Name: "enums", Info: &field.TypeInfo{Type: field.TypeEnum}, Enums: []struct{ N, V string }{{}}}, }, }) - require.EqualError(err, "\"enums\" field value cannot be empty") + require.EqualError(err, "\"enums\" field value cannot be empty", "empty value for enums") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -68,7 +68,7 @@ func TestType(t *testing.T) { {Name: "", Info: &field.TypeInfo{Type: field.TypeInt}}, }, }) - require.EqualError(err, "field name cannot be empty") + require.EqualError(err, "field name cannot be empty", "empty field name") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{ Name: "T", @@ -76,7 +76,7 @@ func TestType(t *testing.T) { {Name: "id", Info: &field.TypeInfo{Type: field.TypeInt}, Optional: true}, }, }) - require.EqualError(err, "id field must not be optional") + require.EqualError(err, "id field must not be optional", "id field can't be optional") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{Name: "Type"}) require.EqualError(err, "schema lowercase name conflicts with Go keyword \"type\"") From b47907ea33eafca5bea67061ed314f8b8afc6495 Mon Sep 17 00:00:00 2001 From: "Giau. Tran Minh" Date: Sun, 3 Apr 2022 00:31:30 +0700 Subject: [PATCH 3/3] Update entc/gen/type.go Co-authored-by: Ariel Mashraki <7413593+a8m@users.noreply.github.com> --- entc/gen/type.go | 2 +- entc/gen/type_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/entc/gen/type.go b/entc/gen/type.go index 1f2b521bf7..2ac5461abd 100644 --- a/entc/gen/type.go +++ b/entc/gen/type.go @@ -240,7 +240,7 @@ func NewType(c *Config, schema *load.Schema) (*Type, error) { // User defined id field. if tf.Name == typ.ID.Name { if tf.Optional { - return nil, fmt.Errorf("id field must not be optional") + return nil, fmt.Errorf("id field cannot be optional") } typ.ID = tf } else { diff --git a/entc/gen/type_test.go b/entc/gen/type_test.go index 032f9fad76..89a04ac104 100644 --- a/entc/gen/type_test.go +++ b/entc/gen/type_test.go @@ -76,7 +76,7 @@ func TestType(t *testing.T) { {Name: "id", Info: &field.TypeInfo{Type: field.TypeInt}, Optional: true}, }, }) - require.EqualError(err, "id field must not be optional", "id field can't be optional") + require.EqualError(err, "id field cannot be optional", "id field cannot be optional") _, err = NewType(&Config{Package: "entc/gen"}, &load.Schema{Name: "Type"}) require.EqualError(err, "schema lowercase name conflicts with Go keyword \"type\"")