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  }