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  }