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 }