Skip to content

Commit 612c6c0

Browse files
authored
Fix visualize tests (#405)
PR #404 attempted to improve the tests in `visualize_test.go` by requiring length equality on the expected/actual ctors. During CI, this actually uncovered a test failure: ``` --- FAIL: TestDotGraph (0.02s) --- FAIL: TestDotGraph/create_graph_with_one_constructor_and_as_interface_option (0.00s) visualize_test.go:453: Error Trace: visualize_test.go:453 visualize_test.go:117 Error: "[]" should have 1 item(s), but has 0 Test: TestDotGraph/create_graph_with_one_constructor_and_as_interface_option ``` This is because, in this specific test case, the provide was never actually provided because of an error during provide (`t5 did not implement io.Reader`). This commit: * Changes all of the provides that are expected to pass to `RequireProvide` which will fail if the provide fails. * Modifies `t5` to implement `io.Reader`. * Change the test case to expect the provider to only provide the interface in the `fx.As` (`fx.As` does not also provide the actual type) * Add the len check from #404.
1 parent 45369ac commit 612c6c0

File tree

1 file changed

+46
-44
lines changed

1 file changed

+46
-44
lines changed

visualize_test.go

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"testing"
3131

3232
"github.com/stretchr/testify/assert"
33+
"github.com/stretchr/testify/require"
3334
"go.uber.org/dig"
3435
"go.uber.org/dig/internal/digtest"
3536
"go.uber.org/dig/internal/dot"
@@ -62,13 +63,14 @@ func TestDotGraph(t *testing.T) {
6263
type t2 struct{}
6364
type t3 struct{}
6465
type t4 struct{}
65-
type t5 strings.Reader
66+
type t5 struct {
67+
strings.Reader
68+
}
6669

6770
type1 := reflect.TypeOf(t1{})
6871
type2 := reflect.TypeOf(t2{})
6972
type3 := reflect.TypeOf(t3{})
7073
type4 := reflect.TypeOf(t4{})
71-
type5 := reflect.TypeOf(t5{})
7274
type6 := reflect.Indirect(reflect.ValueOf(new(io.Reader))).Type()
7375
type7 := reflect.Indirect(reflect.ValueOf(new(io.Writer))).Type()
7476

@@ -81,7 +83,6 @@ func TestDotGraph(t *testing.T) {
8183
r2 := tresult(type2, "", "", 0)
8284
r3 := tresult(type3, "", "", 0)
8385
r4 := tresult(type4, "", "", 0)
84-
r5 := tresult(type5, "", "", 0)
8586
r6 := tresult(type6, "", "", 0)
8687

8788
t.Parallel()
@@ -95,7 +96,7 @@ func TestDotGraph(t *testing.T) {
9596
}
9697

9798
c := digtest.New(t)
98-
c.Provide(func(A t1) t2 { return t2{} })
99+
c.RequireProvide(func(A t1) t2 { return t2{} })
99100

100101
dg := c.CreateGraph()
101102
assertCtorsEqual(t, expected, dg.Ctors)
@@ -105,12 +106,12 @@ func TestDotGraph(t *testing.T) {
105106
expected := []*dot.Ctor{
106107
{
107108
Params: []*dot.Param{p1},
108-
Results: []*dot.Result{r5, r6},
109+
Results: []*dot.Result{r6},
109110
},
110111
}
111112

112113
c := digtest.New(t)
113-
c.Provide(func(A t1) t5 { return t5{} }, dig.As(new(io.Reader)))
114+
c.RequireProvide(func(A t1) *t5 { return &t5{} }, dig.As(new(io.Reader)))
114115

115116
dg := c.CreateGraph()
116117
assertCtorsEqual(t, expected, dg.Ctors)
@@ -133,9 +134,9 @@ func TestDotGraph(t *testing.T) {
133134
}
134135

135136
c := digtest.New(t)
136-
c.Provide(func(A t1) t2 { return t2{} })
137-
c.Provide(func(A t1) t3 { return t3{} })
138-
c.Provide(func(A t2) t4 { return t4{} })
137+
c.RequireProvide(func(A t1) t2 { return t2{} })
138+
c.RequireProvide(func(A t1) t3 { return t3{} })
139+
c.RequireProvide(func(A t2) t4 { return t4{} })
139140

140141
dg := c.CreateGraph()
141142
assertCtorsEqual(t, expected, dg.Ctors)
@@ -158,7 +159,7 @@ func TestDotGraph(t *testing.T) {
158159
}
159160

160161
c := digtest.New(t)
161-
c.Provide(func(A t1) t2 { return t2{} })
162+
c.RequireProvide(func(A t1) t2 { return t2{} })
162163

163164
s := c.Scope("test")
164165
s.Provide(func(A t1) t3 { return t3{} })
@@ -185,7 +186,7 @@ func TestDotGraph(t *testing.T) {
185186
}
186187

187188
c := digtest.New(t)
188-
c.Provide(func(A t1) t2 { return t2{} })
189+
c.RequireProvide(func(A t1) t2 { return t2{} })
189190

190191
s := c.Scope("parent_scope")
191192
s.Provide(func(A t1) t3 { return t3{} })
@@ -206,7 +207,7 @@ func TestDotGraph(t *testing.T) {
206207
}
207208

208209
c := digtest.New(t)
209-
c.Provide(func(A t3, B t4) (t1, t2) { return t1{}, t2{} })
210+
c.RequireProvide(func(A t3, B t4) (t1, t2) { return t1{}, t2{} })
210211

211212
dg := c.CreateGraph()
212213
assertCtorsEqual(t, expected, dg.Ctors)
@@ -235,7 +236,7 @@ func TestDotGraph(t *testing.T) {
235236
}
236237

237238
c := digtest.New(t)
238-
c.Provide(func(i in) out { return out{} })
239+
c.RequireProvide(func(i in) out { return out{} })
239240

240241
dg := c.CreateGraph()
241242
assertCtorsEqual(t, expected, dg.Ctors)
@@ -266,7 +267,7 @@ func TestDotGraph(t *testing.T) {
266267
}
267268

268269
c := digtest.New(t)
269-
c.Provide(func(p in) t4 { return t4{} })
270+
c.RequireProvide(func(p in) t4 { return t4{} })
270271

271272
dg := c.CreateGraph()
272273
assertCtorsEqual(t, expected, dg.Ctors)
@@ -301,7 +302,7 @@ func TestDotGraph(t *testing.T) {
301302
}
302303

303304
c := digtest.New(t)
304-
c.Provide(func(A t1) out { return out{} })
305+
c.RequireProvide(func(A t1) out { return out{} })
305306

306307
dg := c.CreateGraph()
307308
assertCtorsEqual(t, expected, dg.Ctors)
@@ -351,22 +352,22 @@ func TestDotGraph(t *testing.T) {
351352
}
352353

353354
c := digtest.New(t)
354-
c.Provide(func(B t2) out1 { return out1{} })
355-
c.Provide(func(B t4) out2 { return out2{} })
356-
c.Provide(func(i in) t3 { return t3{} })
355+
c.RequireProvide(func(B t2) out1 { return out1{} })
356+
c.RequireProvide(func(B t4) out2 { return out2{} })
357+
c.RequireProvide(func(i in) t3 { return t3{} })
357358

358359
dg := c.CreateGraph()
359360
assertCtorsEqual(t, expected, dg.Ctors)
360361
})
361362

362363
t.Run("value groups as", func(t *testing.T) {
363364
c := digtest.New(t)
364-
c.Provide(
365+
c.RequireProvide(
365366
func() *bytes.Buffer { return bytes.NewBufferString("foo") },
366367
dig.As(new(io.Reader), new(io.Writer)),
367368
dig.Group("buffs"),
368369
)
369-
c.Provide(
370+
c.RequireProvide(
370371
func() *bytes.Buffer { return bytes.NewBufferString("bar") },
371372
dig.As(new(io.Reader), new(io.Writer)),
372373
dig.Group("buffs"),
@@ -408,7 +409,7 @@ func TestDotGraph(t *testing.T) {
408409
}
409410

410411
c := digtest.New(t)
411-
c.Provide(func(i in) out { return out{B: t2{}} })
412+
c.RequireProvide(func(i in) out { return out{B: t2{}} })
412413

413414
dg := c.CreateGraph()
414415
assertCtorsEqual(t, expected, dg.Ctors)
@@ -435,7 +436,7 @@ func TestDotGraph(t *testing.T) {
435436
}
436437

437438
c := digtest.New(t)
438-
c.Provide(func(i in) t4 { return t4{} })
439+
c.RequireProvide(func(i in) t4 { return t4{} })
439440

440441
dg := c.CreateGraph()
441442
assertCtorsEqual(t, expected, dg.Ctors)
@@ -449,6 +450,7 @@ func assertCtorEqual(t *testing.T, expected *dot.Ctor, ctor *dot.Ctor) {
449450
}
450451

451452
func assertCtorsEqual(t *testing.T, expected []*dot.Ctor, ctors []*dot.Ctor) {
453+
require.Equal(t, len(expected), len(ctors))
452454
for i, c := range ctors {
453455
assertCtorEqual(t, expected[i], c)
454456
}
@@ -470,8 +472,8 @@ func TestVisualize(t *testing.T) {
470472
t.Run("simple graph", func(t *testing.T) {
471473
c := digtest.New(t)
472474

473-
c.Provide(func() (t1, t2) { return t1{}, t2{} })
474-
c.Provide(func(A t1, B t2) (t3, t4) { return t3{}, t4{} })
475+
c.RequireProvide(func() (t1, t2) { return t1{}, t2{} })
476+
c.RequireProvide(func(A t1, B t2) (t3, t4) { return t3{}, t4{} })
475477
dig.VerifyVisualization(t, "simple", c.Container)
476478
})
477479

@@ -495,8 +497,8 @@ func TestVisualize(t *testing.T) {
495497
A t3 `name:"foo"`
496498
}
497499

498-
c.Provide(func(in) out1 { return out1{} })
499-
c.Provide(func() out2 { return out2{} })
500+
c.RequireProvide(func(in) out1 { return out1{} })
501+
c.RequireProvide(func() out2 { return out2{} })
500502
dig.VerifyVisualization(t, "named", c.Container)
501503
})
502504

@@ -521,8 +523,8 @@ func TestVisualize(t *testing.T) {
521523
A t1 `optional:"true"`
522524
}
523525

524-
c.Provide(func() t1 { return t1{} })
525-
c.Provide(func(in) t2 { return t2{} })
526+
c.RequireProvide(func() t1 { return t1{} })
527+
c.RequireProvide(func(in) t2 { return t2{} })
526528
dig.VerifyVisualization(t, "optional", c.Container)
527529
})
528530

@@ -547,9 +549,9 @@ func TestVisualize(t *testing.T) {
547549
A t3 `group:"foo"`
548550
}
549551

550-
c.Provide(func() out1 { return out1{} })
551-
c.Provide(func() out2 { return out2{} })
552-
c.Provide(func(in) t2 { return t2{} })
552+
c.RequireProvide(func() out1 { return out1{} })
553+
c.RequireProvide(func() out2 { return out2{} })
554+
c.RequireProvide(func(in) t2 { return t2{} })
553555

554556
dig.VerifyVisualization(t, "grouped", c.Container)
555557
})
@@ -590,32 +592,32 @@ func TestVisualize(t *testing.T) {
590592
B t2 `group:"g2"`
591593
}
592594

593-
c.Provide(func(in1) out1 { return out1{} })
594-
c.Provide(func(in2) t4 { return t4{} })
595-
c.Provide(func() out2 { return out2{} })
596-
c.Provide(func() (out3, error) { return out3{}, errors.New("great sadness") })
595+
c.RequireProvide(func(in1) out1 { return out1{} })
596+
c.RequireProvide(func(in2) t4 { return t4{} })
597+
c.RequireProvide(func() out2 { return out2{} })
598+
c.RequireProvide(func() (out3, error) { return out3{}, errors.New("great sadness") })
597599
err := c.Invoke(func(t4 t4) {})
598600

599601
dig.VerifyVisualization(t, "error", c.Container, dig.VisualizeError(err))
600602

601603
t.Run("non-failing graph nodes are pruned", func(t *testing.T) {
602604
t.Run("prune non-failing constructor result", func(t *testing.T) {
603605
c := digtest.New(t)
604-
c.Provide(func(in1) out1 { return out1{} })
605-
c.Provide(func(in2) t4 { return t4{} })
606-
c.Provide(func() (out2, error) { return out2{}, errors.New("great sadness") })
607-
c.Provide(func() out3 { return out3{} })
606+
c.RequireProvide(func(in1) out1 { return out1{} })
607+
c.RequireProvide(func(in2) t4 { return t4{} })
608+
c.RequireProvide(func() (out2, error) { return out2{}, errors.New("great sadness") })
609+
c.RequireProvide(func() out3 { return out3{} })
608610
err := c.Invoke(func(t4 t4) {})
609611

610612
dig.VerifyVisualization(t, "prune_constructor_result", c.Container, dig.VisualizeError(err))
611613
})
612614

613615
t.Run("if only the root node fails all node except for the root should be pruned", func(t *testing.T) {
614616
c := digtest.New(t)
615-
c.Provide(func(in1) out1 { return out1{} })
616-
c.Provide(func(in2) (t4, error) { return t4{}, errors.New("great sadness") })
617-
c.Provide(func() out2 { return out2{} })
618-
c.Provide(func() out3 { return out3{} })
617+
c.RequireProvide(func(in1) out1 { return out1{} })
618+
c.RequireProvide(func(in2) (t4, error) { return t4{}, errors.New("great sadness") })
619+
c.RequireProvide(func() out2 { return out2{} })
620+
c.RequireProvide(func() out3 { return out3{} })
619621
err := c.Invoke(func(t4 t4) {})
620622

621623
dig.VerifyVisualization(t, "prune_non_root_nodes", c.Container, dig.VisualizeError(err))
@@ -626,7 +628,7 @@ func TestVisualize(t *testing.T) {
626628
t.Run("missing types", func(t *testing.T) {
627629
c := digtest.New(t)
628630

629-
c.Provide(func(A t1, B t2, C t3) t4 { return t4{} })
631+
c.RequireProvide(func(A t1, B t2, C t3) t4 { return t4{} })
630632
err := c.Invoke(func(t4 t4) {})
631633

632634
dig.VerifyVisualization(t, "missing", c.Container, dig.VisualizeError(err))

0 commit comments

Comments
 (0)