entc/gen: reject codegen in case of duplicate edges (#858)

See #856
This commit is contained in:
Ariel Mashraki
2020-10-16 14:04:52 +03:00
committed by GitHub
parent 2128d0baee
commit 7635d45c8a
3 changed files with 26 additions and 3 deletions

View File

@@ -200,9 +200,13 @@ func (g *Graph) addIndexes(schema *load.Schema) {
// addEdges adds the node edges to the graph.
func (g *Graph) addEdges(schema *load.Schema) {
t, _ := g.typ(schema.Name)
seen := make(map[string]struct{}, len(schema.Edges))
for _, e := range schema.Edges {
typ, ok := g.typ(e.Type)
expect(ok, "type %q does not exist for edge", e.Type)
_, ok = seen[e.Name]
expect(!ok, "%s schema contains multiple %q edges", schema.Name, e.Name)
seen[e.Name] = struct{}{}
switch {
// Assoc only.
case !e.Inverse:

View File

@@ -178,6 +178,25 @@ func TestNewGraphBadInverse(t *testing.T) {
require.Errorf(t, err, "mismatch type for back-reference")
}
func TestNewGraphDuplicateEdges(t *testing.T) {
_, err := NewGraph(&Config{Package: "entc/gen", Storage: drivers[0]},
&load.Schema{
Name: "User",
Edges: []*load.Edge{
{Name: "groups", Type: "Group"},
{Name: "groups", Type: "Group", RefName: "owner", Inverse: true},
},
},
&load.Schema{
Name: "Group",
Edges: []*load.Edge{
{Name: "users", Type: "User", RefName: "groups", Inverse: true},
{Name: "owner", Type: "User", Unique: true},
},
})
require.EqualError(t, err, `entc/gen: User schema contains multiple "groups" edges`)
}
func TestRelation(t *testing.T) {
require := require.New(t)
_, err := NewGraph(&Config{Package: "entc/gen", Storage: drivers[0]}, T1)

View File

@@ -239,11 +239,11 @@ func (t Type) Receiver() string {
return receiver(t.Name)
}
// HasAssoc returns true if this type has an assoc edge with the given name.
// faster than map access for most cases.
// HasAssoc returns true if this type has an assoc-edge (non-inverse)
// with the given name. faster than map access for most cases.
func (t Type) HasAssoc(name string) (*Edge, bool) {
for _, e := range t.Edges {
if name == e.Name {
if name == e.Name && !e.IsInverse() {
return e, true
}
}