Skip to content

Commit b316309

Browse files
committed
Add test coverage for stdout, stderr capture
1 parent 7069b21 commit b316309

File tree

5 files changed

+67
-32
lines changed

5 files changed

+67
-32
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
class MyLibrary
22
def initialize
3-
$stderr.puts "Created MyLibrary"
3+
$stderr.puts "Created MyLibrary [err]"
4+
$stdout.puts "Created MyLibrary [out]"
45
end
56
end

src/qa_test/fixtures/ruby/simple/spec/simple_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'my-library'
22

33
RSpec.describe MyLibrary, ".new" do
4-
it "works" do
4+
it "my library rspec" do
55
MyLibrary.new
66
end
77

src/qa_test/fixtures/ruby/simple/test/minitest/test-simple.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
require 'my-library'
33

44
class SimpleMinitestTest < Minitest::Test
5-
def test_library
5+
def test_library_minitest
66
MyLibrary.new
77
end
88

src/qa_test/fixtures/ruby/simple/test/test-unit/test-simple.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
require 'my-library'
33

44
class SimpleTestUnitTest < Test::Unit::TestCase
5-
def test_library
5+
def test_library_test_unit
66
MyLibrary.new
77
end
88

src/qa_test/qa_run_test.go

+62-28
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
package qa_test
22

3-
// go test .
4-
53
import (
64
"bytes"
75
"io"
8-
"os"
96
"path"
107
"qa/cmd"
118
"qa/cmd/run"
129
"qa/tapjio"
1310
"testing"
11+
12+
"github.com/stretchr/testify/require"
1413
)
1514

15+
type transcript struct {
16+
Stderr string
17+
Events []interface{}
18+
SuiteEvents []tapjio.SuiteEvent
19+
TestEvents []tapjio.TestEvent
20+
TestStartedEvents []tapjio.TestStartedEvent
21+
TraceEvents []tapjio.TraceEvent
22+
FinalEvents []tapjio.FinalEvent
23+
}
24+
1625
// TODO which ruby version must qa want to run?
17-
func runQa(t *testing.T, dir string) (events []interface{}, stderr string, err error) {
18-
events = make([]interface{}, 0)
26+
func runQa(t *testing.T, dir string) (tscript transcript, err error) {
27+
tscript.Events = make([]interface{}, 0)
1928

2029
var stderrBuf bytes.Buffer
2130

@@ -26,7 +35,7 @@ func runQa(t *testing.T, dir string) (events []interface{}, stderr string, err e
2635
errCh := make(chan error, 1)
2736
go func() {
2837
errCh <- run.Main(
29-
&cmd.Env{Stdout: wr, Stderr: os.Stderr, Dir: dir},
38+
&cmd.Env{Stdout: wr, Stderr: &stderrBuf, Dir: dir},
3039
[]string{
3140
"-format=tapj",
3241
"rspec",
@@ -40,23 +49,28 @@ func runQa(t *testing.T, dir string) (events []interface{}, stderr string, err e
4049
err = tapjio.Decode(rd,
4150
&tapjio.DecodingCallbacks{
4251
OnSuite: func(event tapjio.SuiteEvent) error {
43-
events = append(events, event)
52+
tscript.Events = append(tscript.Events, event)
53+
tscript.SuiteEvents = append(tscript.SuiteEvents, event)
4454
return nil
4555
},
4656
OnTestBegin: func(event tapjio.TestStartedEvent) error {
47-
events = append(events, event)
57+
tscript.Events = append(tscript.Events, event)
58+
tscript.TestStartedEvents = append(tscript.TestStartedEvents, event)
4859
return nil
4960
},
5061
OnTest: func(event tapjio.TestEvent) error {
51-
events = append(events, event)
62+
tscript.Events = append(tscript.Events, event)
63+
tscript.TestEvents = append(tscript.TestEvents, event)
5264
return nil
5365
},
5466
OnTrace: func(event tapjio.TraceEvent) error {
55-
events = append(events, event)
67+
tscript.Events = append(tscript.Events, event)
68+
tscript.TraceEvents = append(tscript.TraceEvents, event)
5669
return nil
5770
},
5871
OnFinal: func(event tapjio.FinalEvent) error {
59-
events = append(events, event)
72+
tscript.Events = append(tscript.Events, event)
73+
tscript.FinalEvents = append(tscript.FinalEvents, event)
6074
return nil
6175
},
6276
})
@@ -65,46 +79,66 @@ func runQa(t *testing.T, dir string) (events []interface{}, stderr string, err e
6579
err = <-errCh
6680
}
6781

68-
stderr = stderrBuf.String()
82+
tscript.Stderr = stderrBuf.String()
6983
return
7084
}
7185

86+
func findTestEvent(events []tapjio.TestEvent, label string) tapjio.TestEvent {
87+
for _, event := range events {
88+
if event.Label == label {
89+
return event
90+
}
91+
}
92+
93+
return tapjio.TestEvent{}
94+
}
95+
7296
func TestRuby(t *testing.T) {
7397
baseDir := "fixtures/ruby"
74-
var events []interface{}
7598
var err error
76-
var stderr string
99+
var tscript transcript
77100

78-
events, stderr, err = runQa(t, path.Join(baseDir, "simple"))
101+
tscript, err = runQa(t, path.Join(baseDir, "simple"))
79102
if err != nil {
80-
t.Fatal("qa failed here.", err, stderr)
103+
t.Fatal("qa failed here.", err, tscript.Stderr)
81104
}
82105

83-
if len(events) == 0 {
84-
t.Fatal("No events for tests in", baseDir, stderr)
106+
if len(tscript.Events) == 0 {
107+
t.Fatal("No events for tests in", baseDir, tscript.Stderr)
108+
}
109+
110+
testEventLabelsExpectingStandardFds := []string{
111+
"test_library_minitest",
112+
"test_library_test_unit",
113+
"my library rspec",
114+
}
115+
for _, label := range testEventLabelsExpectingStandardFds {
116+
testEvent := findTestEvent(tscript.TestEvents, label)
117+
require.Contains(t, testEvent.Stdout, "Created MyLibrary [out]")
118+
require.Contains(t, testEvent.Stderr, "Created MyLibrary [err]")
85119
}
86120

87-
finalEvent := events[len(events)-1]
121+
finalEvent := tscript.Events[len(tscript.Events)-1]
88122
if fe, ok := finalEvent.(tapjio.FinalEvent); ok {
89123
expect := tapjio.ResultTally{Total: 6, Pass: 6}
90124

91125
if expect != *fe.Counts {
92-
t.Fatal("wrong count in final event.", expect, "vs", *fe.Counts, events, stderr)
126+
t.Fatal("wrong count in final event.", expect, "vs", *fe.Counts, tscript.Events, tscript.Stderr)
93127
}
94128
} else {
95-
t.Fatal("last event wasn't a final event.", events, stderr)
129+
t.Fatal("last event wasn't a final event.", tscript.Events, tscript.Stderr)
96130
}
97131

98-
events, stderr, err = runQa(t, path.Join(baseDir, "all-outcomes"))
132+
tscript, err = runQa(t, path.Join(baseDir, "all-outcomes"))
99133
if err == nil {
100-
t.Fatal("qa should have failed.", stderr)
134+
t.Fatal("qa should have failed.", tscript.Stderr)
101135
}
102136

103-
if len(events) == 0 {
104-
t.Fatal("No events for tests in", baseDir, stderr)
137+
if len(tscript.Events) == 0 {
138+
t.Fatal("No events for tests in", baseDir, tscript.Stderr)
105139
}
106140

107-
finalEvent = events[len(events)-1]
141+
finalEvent = tscript.Events[len(tscript.Events)-1]
108142
if fe, ok := finalEvent.(tapjio.FinalEvent); ok {
109143
expect := tapjio.ResultTally{
110144
Total: 16,
@@ -115,9 +149,9 @@ func TestRuby(t *testing.T) {
115149
}
116150

117151
if expect != *fe.Counts {
118-
t.Fatal("wrong count in final event.", expect, "vs", *fe.Counts, events, stderr)
152+
t.Fatal("wrong count in final event.", expect, "vs", *fe.Counts, tscript.Events, tscript.Stderr)
119153
}
120154
} else {
121-
t.Fatal("last event wasn't a final event.", events, stderr)
155+
t.Fatal("last event wasn't a final event.", tscript.Events, tscript.Stderr)
122156
}
123157
}

0 commit comments

Comments
 (0)