github.com/glassmonkey/gore@v0.6.4/session_gomod_test.go (about)

     1  package gore
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"strconv"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func chdir(dir string) func() {
    17  	d, _ := os.Getwd()
    18  	os.Chdir(dir)
    19  	return func() { os.Chdir(d) }
    20  }
    21  
    22  func setenv(name, value string) func() {
    23  	v := os.Getenv(name)
    24  	os.Setenv(name, value)
    25  	return func() { os.Setenv(name, v) }
    26  }
    27  
    28  func gomodSetup(t *testing.T) func() {
    29  	tempDir, err := ioutil.TempDir("", "gore-")
    30  	require.NoError(t, err)
    31  	mod1Dir := filepath.Join(tempDir, "mod1")
    32  	require.NoError(t, os.Mkdir(mod1Dir, 0700))
    33  	require.NoError(t, ioutil.WriteFile(filepath.Join(mod1Dir, "go.mod"), []byte(`module mod1
    34  `), 0600))
    35  	require.NoError(t, ioutil.WriteFile(filepath.Join(mod1Dir, "mod1.go"), []byte(`package mod1
    36  
    37  const Value = 10
    38  `), 0600))
    39  
    40  	mod2Dir := filepath.Join(tempDir, "mod2")
    41  	require.NoError(t, os.Mkdir(mod2Dir, 0700))
    42  	require.NoError(t, ioutil.WriteFile(filepath.Join(mod2Dir, "go.mod"), []byte(fmt.Sprintf(`module mod2
    43  
    44  replace mod1 => %s
    45  
    46  require mod1 v0.0.0-00010101000000-000000000000
    47  `, strconv.Quote(mod1Dir))), 0600))
    48  	require.NoError(t, ioutil.WriteFile(filepath.Join(mod2Dir, "mod2.go"), []byte(`package mod2
    49  
    50  import "mod1"
    51  
    52  func Foo() int {
    53  	return mod1.Value
    54  }
    55  `), 0600))
    56  
    57  	mod3Dir := filepath.Join(mod2Dir, "mod3")
    58  	require.NoError(t, os.Mkdir(mod3Dir, 0700))
    59  	require.NoError(t, ioutil.WriteFile(filepath.Join(mod3Dir, "mod3.go"), []byte(`package mod3
    60  
    61  func Bar() string {
    62  	return "mod3"
    63  }
    64  `), 0600))
    65  
    66  	mod4Dir := filepath.Join(mod2Dir, "mod4")
    67  	require.NoError(t, os.Mkdir(mod4Dir, 0700))
    68  
    69  	restore := chdir(mod2Dir)
    70  	return func() {
    71  		defer os.RemoveAll(tempDir)
    72  		defer restore()
    73  	}
    74  }
    75  
    76  func TestSessionEval_Gomod(t *testing.T) {
    77  	stdout, stderr, stdin := new(bytes.Buffer), new(bytes.Buffer), new(bytes.Reader)
    78  	defer gomodSetup(t)()
    79  	s, err := NewSession(stdout, stderr, stdin)
    80  	defer s.Clear()
    81  	require.NoError(t, err)
    82  
    83  	codes := []string{
    84  		`:i mod2`,
    85  		`mod2.Foo()`,
    86  		`mod2.Foo() + mod2.Foo()`,
    87  		`:clear`,
    88  		`:i mod2`,
    89  		`mod2.Foo()`,
    90  		`:i mod1`,
    91  		`3 * mod1.Value`,
    92  	}
    93  
    94  	for _, code := range codes {
    95  		_ = s.Eval(code)
    96  	}
    97  
    98  	assert.Equal(t, "10\n20\n10\n30\n", stdout.String())
    99  	assert.Equal(t, ``, stderr.String())
   100  }
   101  
   102  func TestSessionEval_Gomod_AutoImport(t *testing.T) {
   103  	stdout, stderr, stdin := new(bytes.Buffer), new(bytes.Buffer), new(bytes.Reader)
   104  	defer gomodSetup(t)()
   105  	s, err := NewSession(stdout, stderr, stdin)
   106  	defer s.Clear()
   107  	require.NoError(t, err)
   108  	s.autoImport = true
   109  
   110  	codes := []string{
   111  		`mod2.Foo()`,
   112  		`mod2.Foo() + mod2.Foo()`,
   113  		`:clear`,
   114  		`mod2.Foo()`,
   115  		`3 * mod1.Value`,
   116  		`:t mod2.Foo`,
   117  		`:d mod2.Foo`,
   118  		`mod3.Bar()`,
   119  		`:t mod3.Bar`,
   120  	}
   121  
   122  	for _, code := range codes {
   123  		_ = s.Eval(code)
   124  	}
   125  
   126  	assert.Equal(t, `10
   127  20
   128  10
   129  30
   130  func() int
   131  package mod2 // import "mod2"
   132  
   133  func Foo() int
   134  "mod3"
   135  func() string
   136  `, stdout.String())
   137  	assert.Equal(t, ``, stderr.String())
   138  }
   139  
   140  func TestSessionEval_Gomod_DeepDir(t *testing.T) {
   141  	stdout, stderr, stdin := new(bytes.Buffer), new(bytes.Buffer), new(bytes.Reader)
   142  	defer gomodSetup(t)()
   143  	require.NoError(t, os.Mkdir("tmp", 0700))
   144  	require.NoError(t, os.Chdir("tmp"))
   145  	s, err := NewSession(stdout, stderr, stdin)
   146  	defer s.Clear()
   147  	require.NoError(t, err)
   148  
   149  	codes := []string{
   150  		`:i mod2`,
   151  		`mod2.Foo()`,
   152  		`mod2.Foo() + mod2.Foo()`,
   153  		`:clear`,
   154  		`:i mod2`,
   155  		`mod2.Foo()`,
   156  		`:i mod1`,
   157  		`3 * mod1.Value`,
   158  	}
   159  
   160  	for _, code := range codes {
   161  		_ = s.Eval(code)
   162  	}
   163  
   164  	assert.Equal(t, "10\n20\n10\n30\n", stdout.String())
   165  	assert.Equal(t, ``, stderr.String())
   166  }
   167  
   168  func TestSessionEval_Gomod_Outside(t *testing.T) {
   169  	stdout, stderr, stdin := new(bytes.Buffer), new(bytes.Buffer), new(bytes.Reader)
   170  	tempDir, _ := ioutil.TempDir("", "gore-")
   171  	defer chdir(tempDir)()
   172  	defer os.RemoveAll(tempDir)
   173  	s, err := NewSession(stdout, stderr, stdin)
   174  	defer s.Clear()
   175  	require.NoError(t, err)
   176  
   177  	codes := []string{
   178  		`:i github.com/glassmonkey/gore`,
   179  		`gore.Session{}`,
   180  	}
   181  
   182  	for _, code := range codes {
   183  		_ = s.Eval(code)
   184  	}
   185  
   186  	assert.Equal(t, ``, stderr.String())
   187  }
   188  
   189  func TestSessionEval_Gomod_CompleteImport(t *testing.T) {
   190  	stdout, stderr, stdin := new(bytes.Buffer), new(bytes.Buffer), new(bytes.Reader)
   191  	defer gomodSetup(t)()
   192  	s, err := NewSession(stdout, stderr, stdin)
   193  	defer s.Clear()
   194  	require.NoError(t, err)
   195  
   196  	pre, cands, post := s.completeWord(":i ", 3)
   197  	assert.Equal(t, ":i ", pre)
   198  	assert.Subset(t, cands, []string{"mod2", "mod1"})
   199  	assert.Equal(t, post, "")
   200  
   201  	pre, cands, post = s.completeWord(":i mod2/", 8)
   202  	assert.Equal(t, ":i ", pre)
   203  	assert.Subset(t, cands, []string{"mod2/mod3", "mod2/mod4"})
   204  	assert.Equal(t, post, "")
   205  }