github.com/GetStream/moq@v0.0.0-20181113105103-b721cd3f6524/pkg/moq/moq_test.go (about) 1 package moq 2 3 import ( 4 "bytes" 5 "io" 6 "os" 7 "os/exec" 8 "strings" 9 "testing" 10 ) 11 12 func TestMoq(t *testing.T) { 13 m, err := New("testpackages/example", "") 14 if err != nil { 15 t.Fatalf("moq.New: %s", err) 16 } 17 var buf bytes.Buffer 18 err = m.Mock(&buf, "PersonStore") 19 if err != nil { 20 t.Errorf("m.Mock: %s", err) 21 } 22 s := buf.String() 23 // assertions of things that should be mentioned 24 var strs = []string{ 25 "package example", 26 "type PersonStoreMock struct", 27 "CreateFunc func(ctx context.Context, person *Person, confirm bool) error", 28 "GetFunc func(ctx context.Context, id string) (*Person, error)", 29 "func (mock *PersonStoreMock) Create(ctx context.Context, person *Person, confirm bool) error", 30 "func (mock *PersonStoreMock) Get(ctx context.Context, id string) (*Person, error)", 31 "panic(\"PersonStoreMock.CreateFunc: method is nil but PersonStore.Create was just called\")", 32 "panic(\"PersonStoreMock.GetFunc: method is nil but PersonStore.Get was just called\")", 33 "lockPersonStoreMockGet.Lock()", 34 "mock.calls.Get = append(mock.calls.Get, callInfo)", 35 "lockPersonStoreMockGet.Unlock()", 36 "// ID is the id argument value", 37 } 38 for _, str := range strs { 39 if !strings.Contains(s, str) { 40 t.Errorf("expected but missing: \"%s\"", str) 41 } 42 } 43 } 44 45 func TestMoqWithAlias(t *testing.T) { 46 m, err := New("testpackages/example", "") 47 if err != nil { 48 t.Fatalf("moq.New: %s", err) 49 } 50 var buf bytes.Buffer 51 err = m.Mock(&buf, "PersonStore:AnotherPersonStore") 52 if err != nil { 53 t.Errorf("m.Mock: %s", err) 54 } 55 s := buf.String() 56 // assertions of things that should be mentioned 57 var strs = []string{ 58 "package example", 59 "type AnotherPersonStoreMock struct", 60 "CreateFunc func(ctx context.Context, person *Person, confirm bool) error", 61 "GetFunc func(ctx context.Context, id string) (*Person, error)", 62 "func (mock *AnotherPersonStoreMock) Create(ctx context.Context, person *Person, confirm bool) error", 63 "func (mock *AnotherPersonStoreMock) Get(ctx context.Context, id string) (*Person, error)", 64 "panic(\"moq: AnotherPersonStoreMock.CreateFunc is nil but AnotherPersonStore.Create was just called\")", 65 "panic(\"moq: AnotherPersonStoreMock.GetFunc is nil but AnotherPersonStore.Get was just called\")", 66 "lockAnotherPersonStoreMockGet.Lock()", 67 "mock.calls.Get = append(mock.calls.Get, callInfo)", 68 "lockAnotherPersonStoreMockGet.Unlock()", 69 "// ID is the id argument value", 70 } 71 for _, str := range strs { 72 if !strings.Contains(s, str) { 73 t.Errorf("expected but missing: \"%s\"", str) 74 } 75 } 76 } 77 78 func TestMoqExplicitPackage(t *testing.T) { 79 m, err := New("testpackages/example", "different") 80 if err != nil { 81 t.Fatalf("moq.New: %s", err) 82 } 83 var buf bytes.Buffer 84 err = m.Mock(&buf, "PersonStore") 85 if err != nil { 86 t.Errorf("m.Mock: %s", err) 87 } 88 s := buf.String() 89 // assertions of things that should be mentioned 90 var strs = []string{ 91 "package different", 92 "type PersonStoreMock struct", 93 "CreateFunc func(ctx context.Context, person *example.Person, confirm bool) error", 94 "GetFunc func(ctx context.Context, id string) (*example.Person, error)", 95 "func (mock *PersonStoreMock) Create(ctx context.Context, person *example.Person, confirm bool) error", 96 "func (mock *PersonStoreMock) Get(ctx context.Context, id string) (*example.Person, error)", 97 } 98 for _, str := range strs { 99 if !strings.Contains(s, str) { 100 t.Errorf("expected but missing: \"%s\"", str) 101 } 102 } 103 } 104 105 // TestVeradicArguments tests to ensure variadic work as 106 // expected. 107 // see https://github.com/matryer/moq/issues/5 108 func TestVariadicArguments(t *testing.T) { 109 m, err := New("testpackages/variadic", "") 110 if err != nil { 111 t.Fatalf("moq.New: %s", err) 112 } 113 var buf bytes.Buffer 114 err = m.Mock(&buf, "Greeter") 115 if err != nil { 116 t.Errorf("m.Mock: %s", err) 117 } 118 s := buf.String() 119 // assertions of things that should be mentioned 120 var strs = []string{ 121 "package variadic", 122 "type GreeterMock struct", 123 "GreetFunc func(ctx context.Context, names ...string) string", 124 "return mock.GreetFunc(ctx, names...)", 125 } 126 for _, str := range strs { 127 if !strings.Contains(s, str) { 128 t.Errorf("expected but missing: \"%s\"", str) 129 } 130 } 131 } 132 133 func TestNothingToReturn(t *testing.T) { 134 m, err := New("testpackages/example", "") 135 if err != nil { 136 t.Fatalf("moq.New: %s", err) 137 } 138 var buf bytes.Buffer 139 err = m.Mock(&buf, "PersonStore") 140 if err != nil { 141 t.Errorf("m.Mock: %s", err) 142 } 143 s := buf.String() 144 if strings.Contains(s, `return mock.ClearCacheFunc(id)`) { 145 t.Errorf("should not have return for items that have no return arguments") 146 } 147 // assertions of things that should be mentioned 148 var strs = []string{ 149 "mock.ClearCacheFunc(id)", 150 } 151 for _, str := range strs { 152 if !strings.Contains(s, str) { 153 t.Errorf("expected but missing: \"%s\"", str) 154 } 155 } 156 } 157 158 func TestChannelNames(t *testing.T) { 159 m, err := New("testpackages/channels", "") 160 if err != nil { 161 t.Fatalf("moq.New: %s", err) 162 } 163 var buf bytes.Buffer 164 err = m.Mock(&buf, "Queuer") 165 if err != nil { 166 t.Errorf("m.Mock: %s", err) 167 } 168 s := buf.String() 169 var strs = []string{ 170 "func (mock *QueuerMock) Sub(topic string) (<-chan Queue, error)", 171 } 172 for _, str := range strs { 173 if !strings.Contains(s, str) { 174 t.Errorf("expected but missing: \"%s\"", str) 175 } 176 } 177 } 178 179 func TestImports(t *testing.T) { 180 m, err := New("testpackages/imports/two", "") 181 if err != nil { 182 t.Fatalf("moq.New: %s", err) 183 } 184 var buf bytes.Buffer 185 err = m.Mock(&buf, "DoSomething") 186 if err != nil { 187 t.Errorf("m.Mock: %s", err) 188 } 189 s := buf.String() 190 var strs = []string{ 191 ` "sync"`, 192 ` "github.com/matryer/moq/pkg/moq/testpackages/imports/one"`, 193 } 194 for _, str := range strs { 195 if !strings.Contains(s, str) { 196 t.Errorf("expected but missing: \"%s\"", str) 197 } 198 if len(strings.Split(s, str)) > 2 { 199 t.Errorf("more than one: \"%s\"", str) 200 } 201 } 202 } 203 204 func TestTemplateFuncs(t *testing.T) { 205 fn := templateFuncs["Exported"].(func(string) string) 206 if fn("var") != "Var" { 207 t.Errorf("exported didn't work: %s", fn("var")) 208 } 209 } 210 211 func TestVendoredPackages(t *testing.T) { 212 m, err := New("testpackages/vendoring/user", "") 213 if err != nil { 214 t.Fatalf("moq.New: %s", err) 215 } 216 var buf bytes.Buffer 217 err = m.Mock(&buf, "Service") 218 if err != nil { 219 t.Errorf("mock error: %s", err) 220 } 221 s := buf.String() 222 // assertions of things that should be mentioned 223 var strs = []string{ 224 `"github.com/matryer/somerepo"`, 225 } 226 for _, str := range strs { 227 if !strings.Contains(s, str) { 228 t.Errorf("expected but missing: \"%s\"", str) 229 } 230 } 231 } 232 233 // TestDotImports tests for https://github.com/matryer/moq/issues/21. 234 func TestDotImports(t *testing.T) { 235 preDir, err := os.Getwd() 236 if err != nil { 237 t.Errorf("Getwd: %s", err) 238 } 239 err = os.Chdir("testpackages/dotimport") 240 if err != nil { 241 t.Errorf("Chdir: %s", err) 242 } 243 defer func() { 244 err := os.Chdir(preDir) 245 if err != nil { 246 t.Errorf("Chdir back: %s", err) 247 } 248 }() 249 m, err := New(".", "moqtest_test") 250 if err != nil { 251 t.Fatalf("moq.New: %s", err) 252 } 253 var buf bytes.Buffer 254 err = m.Mock(&buf, "Service") 255 if err != nil { 256 t.Errorf("mock error: %s", err) 257 } 258 s := buf.String() 259 if strings.Contains(s, `"."`) { 260 t.Error("contains invalid dot import") 261 } 262 } 263 264 func TestEmptyInterface(t *testing.T) { 265 m, err := New("testpackages/emptyinterface", "") 266 if err != nil { 267 t.Fatalf("moq.New: %s", err) 268 } 269 var buf bytes.Buffer 270 err = m.Mock(&buf, "Empty") 271 if err != nil { 272 t.Errorf("mock error: %s", err) 273 } 274 s := buf.String() 275 if strings.Contains(s, `"sync"`) { 276 t.Error("contains sync import, although this package isn't used") 277 } 278 } 279 280 func TestGoGenerateVendoredPackages(t *testing.T) { 281 cmd := exec.Command("go", "generate", "./...") 282 cmd.Dir = "testpackages/gogenvendoring" 283 stdout, err := cmd.StdoutPipe() 284 if err != nil { 285 t.Errorf("StdoutPipe: %s", err) 286 } 287 defer stdout.Close() 288 err = cmd.Start() 289 if err != nil { 290 t.Errorf("Start: %s", err) 291 } 292 buf := bytes.NewBuffer(nil) 293 io.Copy(buf, stdout) 294 err = cmd.Wait() 295 if err != nil { 296 if exitErr, ok := err.(*exec.ExitError); ok { 297 t.Errorf("Wait: %s %s", exitErr, string(exitErr.Stderr)) 298 } else { 299 t.Errorf("Wait: %s", err) 300 } 301 } 302 s := buf.String() 303 if strings.Contains(s, `vendor/`) { 304 t.Error("contains vendor directory in import path") 305 } 306 } 307 308 func TestImportedPackageWithSameName(t *testing.T) { 309 m, err := New("testpackages/samenameimport", "") 310 if err != nil { 311 t.Fatalf("moq.New: %s", err) 312 } 313 var buf bytes.Buffer 314 err = m.Mock(&buf, "Example") 315 if err != nil { 316 t.Errorf("mock error: %s", err) 317 } 318 s := buf.String() 319 if !strings.Contains(s, `a samename.A`) { 320 t.Error("missing samename.A to address the struct A from the external package samename") 321 } 322 }