From 5e565431335837942e95cce9e830353a67392daf Mon Sep 17 00:00:00 2001 From: Ariel Mashraki <7413593+a8m@users.noreply.github.com> Date: Thu, 20 Aug 2020 12:15:43 +0300 Subject: [PATCH] schema/edge: fix edge annotations with to/from builders (#679) --- entc/gen/graph.go | 2 +- entc/gen/graph_test.go | 6 ++++++ entc/load/schema_test.go | 11 ++++++++++- schema/edge/edge_test.go | 29 +++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/entc/gen/graph.go b/entc/gen/graph.go index 182dc0755..3464807fd 100644 --- a/entc/gen/graph.go +++ b/entc/gen/graph.go @@ -190,7 +190,7 @@ func (g *Graph) addEdges(schema *load.Schema) { Unique: ref.Unique, Optional: !ref.Required, StructTag: ref.Tag, - Annotations: e.Annotations, + Annotations: ref.Annotations, }) default: panic(graphError{"edge must be either an assoc or inverse edge"}) diff --git a/entc/gen/graph_test.go b/entc/gen/graph_test.go index 60a83357d..ccb07711d 100644 --- a/entc/gen/graph_test.go +++ b/entc/gen/graph_test.go @@ -57,6 +57,7 @@ var ( {Name: "t1_o2m", Type: "T1", RefName: "t2_m2o", Inverse: true}, {Name: "t1_m2o", Type: "T1", RefName: "t2_o2m", Unique: true, Inverse: true}, {Name: "t1_m2m", Type: "T1", RefName: "t2_m2m", Inverse: true}, + {Name: "t2_m2m_from", Type: "T2", Ref: &load.Edge{Name: "t2_m2m_to", Type: "T2", Annotations: dict("GQL", map[string]string{"Name": "To"})}, Inverse: true, Annotations: dict("GQL", map[string]string{"Name": "From"})}, }, } ) @@ -118,6 +119,11 @@ func TestNewGraph(t *testing.T) { require.True(e1.IsInverse()) require.Equal("t2", e1.Inverse) require.Equal(graph.Nodes[0], e1.Type) + + require.Equal("t2_m2m_from", t2.Edges[5].Name) + require.Equal("t2_m2m_to", t2.Edges[6].Name) + require.Equal(map[string]string{"Name": "From"}, t2.Edges[5].Annotations["GQL"]) + require.Equal(map[string]string{"Name": "To"}, t2.Edges[6].Annotations["GQL"]) } func TestNewGraphRequiredLoop(t *testing.T) { diff --git a/entc/load/schema_test.go b/entc/load/schema_test.go index 799758c85..a0ddca0ba 100644 --- a/entc/load/schema_test.go +++ b/entc/load/schema_test.go @@ -66,6 +66,10 @@ func (User) Edges() []ent.Edge { Unique(). StorageKey(edge.Column("user_parent_id")). From("children"), + edge.To("following", User.Type). + Annotations(&OrderConfig{FieldName: "following"}). + From("followers"). + Annotations(&OrderConfig{FieldName: "followers"}), } } @@ -137,7 +141,7 @@ func TestMarshalSchema(t *testing.T) { require.True(t, schema.Fields[7].Default) require.Equal(t, "github.com/google/uuid", schema.Fields[7].Info.PkgPath) - require.Len(t, schema.Edges, 2) + require.Len(t, schema.Edges, 3) require.Equal(t, "groups", schema.Edges[0].Name) require.Equal(t, "Group", schema.Edges[0].Type) require.False(t, schema.Edges[0].Inverse) @@ -153,6 +157,11 @@ func TestMarshalSchema(t *testing.T) { require.True(t, schema.Edges[1].Ref.Unique) require.Equal(t, "user_parent_id", schema.Edges[1].Ref.StorageKey.Columns[0]) + ant = schema.Edges[2].Annotations["order_config"].(map[string]interface{}) + require.Equal(t, ant["FieldName"], "followers") + ant = schema.Edges[2].Ref.Annotations["order_config"].(map[string]interface{}) + require.Equal(t, ant["FieldName"], "following") + require.Equal(t, []string{"name", "address"}, schema.Indexes[0].Fields) require.True(t, schema.Indexes[0].Unique) require.Equal(t, []string{"name"}, schema.Indexes[1].Fields) diff --git a/schema/edge/edge_test.go b/schema/edge/edge_test.go index 728203680..5d76da8df 100644 --- a/schema/edge/edge_test.go +++ b/schema/edge/edge_test.go @@ -7,6 +7,8 @@ package edge_test import ( "testing" + "github.com/stretchr/testify/require" + "github.com/facebook/ent" "github.com/facebook/ent/schema/edge" @@ -84,3 +86,30 @@ func TestEdge(t *testing.T) { assert.Equal("following", from.Ref.Tag) assert.Equal(edge.StorageKey{Table: "user_followers", Columns: []string{"following_id", "followers_id"}}, *from.Ref.StorageKey) } + +type GQL struct { + Field string +} + +func (GQL) Name() string { + return "GQL" +} + +func TestAnnotations(t *testing.T) { + type User struct{ ent.Schema } + to := edge.To("user", User.Type). + Annotations(GQL{Field: "to"}). + Descriptor() + require.Equal(t, []edge.Annotation{GQL{Field: "to"}}, to.Annotations) + from := edge.From("user", User.Type). + Annotations(GQL{Field: "from"}). + Descriptor() + require.Equal(t, []edge.Annotation{GQL{Field: "from"}}, from.Annotations) + bidi := edge.To("following", User.Type). + Annotations(GQL{Field: "to"}). + From("followers"). + Annotations(GQL{Field: "from"}). + Descriptor() + require.Equal(t, []edge.Annotation{GQL{Field: "from"}}, bidi.Annotations) + require.Equal(t, []edge.Annotation{GQL{Field: "to"}}, bidi.Ref.Annotations) +}