-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathstore_test.go
More file actions
112 lines (93 loc) · 2.53 KB
/
store_test.go
File metadata and controls
112 lines (93 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package marlow
import "fmt"
import "io"
import "sync"
import "bytes"
import "net/url"
import "testing"
import "go/ast"
import "go/token"
import "go/parser"
import "github.com/franela/goblin"
import "github.com/marlow/marlow/writing"
type storeTestScaffold struct {
output *bytes.Buffer
imports chan string
methods map[string]writing.FuncDecl
record url.Values
received map[string]bool
closed bool
wg *sync.WaitGroup
}
func (s *storeTestScaffold) g() io.Reader {
record := marlowRecord{
importChannel: s.imports,
config: s.record,
}
return newStoreGenerator(record, s.methods)
}
func (s *storeTestScaffold) parsed() (*ast.File, error) {
return parser.ParseFile(token.NewFileSet(), "", s.output, parser.AllErrors)
}
func (s *storeTestScaffold) close() {
s.closed = true
close(s.imports)
s.wg.Wait()
}
func Test_StoreGenerator(t *testing.T) {
g := goblin.Goblin(t)
var scaffold *storeTestScaffold
g.Describe("store generator test suite", func() {
g.BeforeEach(func() {
scaffold = &storeTestScaffold{
output: new(bytes.Buffer),
imports: make(chan string),
record: make(url.Values),
methods: make(map[string]writing.FuncDecl),
received: make(map[string]bool),
closed: false,
wg: &sync.WaitGroup{},
}
scaffold.wg.Add(1)
go func() {
for i := range scaffold.imports {
scaffold.received[i] = true
}
scaffold.wg.Done()
}()
})
g.AfterEach(func() {
if scaffold.closed == false {
scaffold.close()
}
})
g.It("returns an error if the store name is not valid", func() {
_, e := io.Copy(scaffold.output, scaffold.g())
g.Assert(e == nil).Equal(false)
})
g.It("does not inject any imports if name is invalid", func() {
io.Copy(scaffold.output, scaffold.g())
scaffold.close()
g.Assert(len(scaffold.received)).Equal(0)
})
g.Describe("with a valid store name", func() {
g.BeforeEach(func() {
scaffold.record.Set("storeName", "BookStore")
fmt.Fprintln(scaffold.output, "package marlowt")
})
g.It("injects fmt and sql packages into import stream", func() {
io.Copy(scaffold.output, scaffold.g())
scaffold.close()
g.Assert(scaffold.received["database/sql"]).Equal(true)
g.Assert(scaffold.received["io"]).Equal(true)
g.Assert(scaffold.received["os"]).Equal(true)
g.Assert(len(scaffold.received)).Equal(3)
})
g.It("writes valid golang code if store name is present", func() {
io.Copy(scaffold.output, scaffold.g())
_, e := scaffold.parsed()
g.Assert(e).Equal(nil)
})
})
})
}