github.com/drellem2/pogo@v0.0.0-20240503070746-2c2b76da329a/internal/driver/driver_test.go (about) 1 package driver_test 2 3 import ( 4 "bytes" 5 "net/url" 6 "os" 7 "path/filepath" 8 "testing" 9 "text/template" 10 "time" 11 12 "github.com/kinbiko/jsonassert" 13 14 "github.com/drellem2/pogo/internal/driver" 15 "github.com/drellem2/pogo/internal/project" 16 ) 17 18 const aService = "_testdata/a-service/" // In initial state 19 const bService = "_testdata/b-service/" // Not in initial state 20 const zService = "_testdata/z-service/" // Doesn't exist 21 22 const readme = "/README.md" 23 const mainC = "/src/main.c" 24 25 func init() { 26 os.Chdir("../..") 27 } 28 29 func absolute(path string) (string, error) { 30 str, err := filepath.Abs(path) 31 if err != nil { 32 return "", err 33 } 34 info, err2 := os.Lstat(path) 35 if err2 != nil { 36 return "", err2 37 } 38 if info.IsDir() { 39 return str + "/", nil 40 } 41 return str, nil 42 } 43 44 func setUp(t *testing.T) (string, error) { 45 d, _ := os.Getwd() 46 t.Logf("Current working directory: %s", d) 47 aServiceAbs, err := absolute(aService) 48 if err != nil { 49 return "", err 50 } 51 t.Logf("a-service at: %s", aServiceAbs) 52 driver.Init() 53 project.ProjectFileName = "projects-test.json" 54 project.Init() 55 p := project.Project{ 56 Id: 0, 57 Path: aServiceAbs, 58 } 59 project.Add(&p) 60 return aServiceAbs, nil 61 } 62 63 func cleanUp() { 64 driver.Kill() 65 project.RemoveSaveFile() 66 } 67 68 func TestPluginsLoad(t *testing.T) { 69 t.Logf("Starting test TestPluginsLoad") 70 _, err := setUp(t) 71 defer cleanUp() 72 if err != nil { 73 t.Errorf("Failed test set-up %v", err) 74 return 75 } 76 numPlugins := len(driver.GetPluginPaths()) 77 if numPlugins != 1 { 78 t.Errorf("Wrong number of plugins, expected %d but found %d", 1, numPlugins) 79 return 80 } 81 } 82 83 // Test doesn't work for builtin plugins 84 85 // func TestPluginRestarts(t *testing.T) { 86 // t.Logf("Starting test TestPluginRestarts") 87 // _, err := setUp(t) 88 // defer cleanUp() 89 // if err != nil { 90 // t.Errorf("Failed test set-up %v", err) 91 // return 92 // } 93 // plugins := driver.GetPluginPaths() 94 // numPlugins := len(plugins) 95 // if numPlugins < 1 { 96 // t.Errorf("Wrong number of plugins, expected at least %d but found %d", 1, numPlugins) 97 // return 98 // } 99 // pluginPath := plugins[0] 100 // pluginClient := driver.GetPluginClient(pluginPath) 101 // pluginClient.Kill() 102 // if !pluginClient.Exited() { 103 // t.Errorf("Failed to kill plugin") 104 // return 105 // } 106 // plugin := driver.GetPlugin(pluginPath) 107 // if plugin == nil { 108 // t.Errorf("Unexpected nil plugin") 109 // return 110 // } 111 // info := (*plugin).Info() 112 // if info == nil { 113 // t.Errorf("Unexpected nil info") 114 // return 115 // } 116 // version := (*info).Version 117 // if version != "0.0.1" { 118 // t.Errorf("Unexpected version %s expected %s", version, "0.0.1") 119 // return 120 // } 121 // } 122 123 func TestPluginInfo(t *testing.T) { 124 t.Logf("Starting test TestPluginInfo") 125 _, err := setUp(t) 126 defer cleanUp() 127 if err != nil { 128 t.Errorf("Failed test set-up %v", err) 129 return 130 } 131 plugins := driver.GetPluginPaths() 132 numPlugins := len(plugins) 133 if numPlugins < 1 { 134 t.Errorf("Wrong number of plugins, expected at least %d but found %d", 1, numPlugins) 135 return 136 } 137 pluginPath := plugins[0] 138 plugin := driver.GetPlugin(pluginPath) 139 if plugin == nil { 140 t.Errorf("Unexpected nil plugin") 141 return 142 } 143 info := (*plugin).Info() 144 if info == nil { 145 t.Errorf("Unexpected nil info") 146 return 147 } 148 version := (*info).Version 149 if version != "0.0.1" { 150 t.Errorf("Unexpected version %s expected %s", version, "0.0.1") 151 return 152 } 153 } 154 155 func TestPluginExecute(t *testing.T) { 156 t.Logf("Starting test TestPluginExecute") 157 _, err := setUp(t) 158 defer cleanUp() 159 if err != nil { 160 t.Errorf("Failed test set-up %v", err) 161 return 162 } 163 // Initialization causes the search plugin to index the files. 164 // We wait for that goroutine to finish before executing the test. 165 time.Sleep(1 * time.Second) 166 167 plugins := driver.GetPluginPaths() 168 numPlugins := len(plugins) 169 if numPlugins < 1 { 170 t.Errorf("Wrong number of plugins, expected at least %d but found %d", 1, numPlugins) 171 return 172 } 173 pluginPath := plugins[0] 174 plugin := driver.GetPlugin(pluginPath) 175 aServiceAbs, err := absolute(aService) 176 if err != nil { 177 t.Errorf("Failed to get absolute path for %s", aService) 178 return 179 } 180 181 req := url.QueryEscape("{\"type\": \"files\", \"projectRoot\": \"" + aServiceAbs + "\"}") 182 encodedResp := (*plugin).Execute(req) 183 resp, err2 := url.QueryUnescape(encodedResp) 184 t.Logf("Response: %s", resp) 185 if err2 != nil { 186 t.Errorf("Error decoding response %v", err2) 187 } 188 // Print current directory 189 d, _ := os.Getwd() 190 expectedResTemplate := ` 191 { 192 "index":{ 193 "root":"{{ .current_dir }}/_testdata/a-service/", 194 "paths":[ 195 "src/a.c", 196 "README.md", 197 ".gitignore" 198 ] 199 }, 200 "results":{ 201 "files":null 202 }, 203 "error":"" 204 }` 205 var buff bytes.Buffer 206 templ := template.Must(template.New("Json Response").Parse(expectedResTemplate)) 207 err = templ.Execute(&buff, map[string]interface{}{ 208 "current_dir": d, 209 }) 210 if err != nil { 211 t.Errorf("Error executing template %v", err) 212 } 213 jsonassert.New(t).Assertf(resp, buff.String()) 214 }