aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cli/internal/client/client_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cli/internal/client/client_test.go')
-rw-r--r--cli/internal/client/client_test.go159
1 files changed, 159 insertions, 0 deletions
diff --git a/cli/internal/client/client_test.go b/cli/internal/client/client_test.go
new file mode 100644
index 0000000..36ff3fb
--- /dev/null
+++ b/cli/internal/client/client_test.go
@@ -0,0 +1,159 @@
+package client
+
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
+ "io/ioutil"
+ "net/http"
+ "net/http/httptest"
+ "reflect"
+ "testing"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/go-hclog"
+ "github.com/vercel/turbo/cli/internal/util"
+)
+
+func Test_sendToServer(t *testing.T) {
+ ch := make(chan []byte, 1)
+ ts := httptest.NewServer(
+ http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ defer req.Body.Close()
+ b, err := ioutil.ReadAll(req.Body)
+ if err != nil {
+ t.Errorf("failed to read request %v", err)
+ }
+ ch <- b
+ w.WriteHeader(200)
+ w.Write([]byte{})
+ }))
+ defer ts.Close()
+
+ remoteConfig := RemoteConfig{
+ TeamSlug: "my-team-slug",
+ APIURL: ts.URL,
+ Token: "my-token",
+ }
+ apiClient := NewClient(remoteConfig, hclog.Default(), "v1", Opts{})
+
+ myUUID, err := uuid.NewUUID()
+ if err != nil {
+ t.Errorf("failed to create uuid %v", err)
+ }
+ events := []map[string]interface{}{
+ {
+ "sessionId": myUUID.String(),
+ "hash": "foo",
+ "source": "LOCAL",
+ "event": "hit",
+ },
+ {
+ "sessionId": myUUID.String(),
+ "hash": "bar",
+ "source": "REMOTE",
+ "event": "MISS",
+ },
+ }
+
+ apiClient.RecordAnalyticsEvents(events)
+
+ body := <-ch
+
+ result := []map[string]interface{}{}
+ err = json.Unmarshal(body, &result)
+ if err != nil {
+ t.Errorf("unmarshalling body %v", err)
+ }
+ if !reflect.DeepEqual(events, result) {
+ t.Errorf("roundtrip got %v, want %v", result, events)
+ }
+}
+
+func Test_PutArtifact(t *testing.T) {
+ ch := make(chan []byte, 1)
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ defer req.Body.Close()
+ b, err := ioutil.ReadAll(req.Body)
+ if err != nil {
+ t.Errorf("failed to read request %v", err)
+ }
+ ch <- b
+ w.WriteHeader(200)
+ w.Write([]byte{})
+ }))
+ defer ts.Close()
+
+ // Set up test expected values
+ remoteConfig := RemoteConfig{
+ TeamSlug: "my-team-slug",
+ APIURL: ts.URL,
+ Token: "my-token",
+ }
+ apiClient := NewClient(remoteConfig, hclog.Default(), "v1", Opts{})
+ expectedArtifactBody := []byte("My string artifact")
+
+ // Test Put Artifact
+ apiClient.PutArtifact("hash", expectedArtifactBody, 500, "")
+ testBody := <-ch
+ if !bytes.Equal(expectedArtifactBody, testBody) {
+ t.Errorf("Handler read '%v', wants '%v'", testBody, expectedArtifactBody)
+ }
+
+}
+
+func Test_PutWhenCachingDisabled(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ defer func() { _ = req.Body.Close() }()
+ w.WriteHeader(403)
+ _, _ = w.Write([]byte("{\"code\": \"remote_caching_disabled\",\"message\":\"caching disabled\"}"))
+ }))
+ defer ts.Close()
+
+ // Set up test expected values
+ remoteConfig := RemoteConfig{
+ TeamSlug: "my-team-slug",
+ APIURL: ts.URL,
+ Token: "my-token",
+ }
+ apiClient := NewClient(remoteConfig, hclog.Default(), "v1", Opts{})
+ expectedArtifactBody := []byte("My string artifact")
+ // Test Put Artifact
+ err := apiClient.PutArtifact("hash", expectedArtifactBody, 500, "")
+ cd := &util.CacheDisabledError{}
+ if !errors.As(err, &cd) {
+ t.Errorf("expected cache disabled error, got %v", err)
+ }
+ if cd.Status != util.CachingStatusDisabled {
+ t.Errorf("caching status: expected %v, got %v", util.CachingStatusDisabled, cd.Status)
+ }
+}
+
+func Test_FetchWhenCachingDisabled(t *testing.T) {
+ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ defer func() { _ = req.Body.Close() }()
+ w.WriteHeader(403)
+ _, _ = w.Write([]byte("{\"code\": \"remote_caching_disabled\",\"message\":\"caching disabled\"}"))
+ }))
+ defer ts.Close()
+
+ // Set up test expected values
+ remoteConfig := RemoteConfig{
+ TeamSlug: "my-team-slug",
+ APIURL: ts.URL,
+ Token: "my-token",
+ }
+ apiClient := NewClient(remoteConfig, hclog.Default(), "v1", Opts{})
+ // Test Put Artifact
+ resp, err := apiClient.FetchArtifact("hash")
+ cd := &util.CacheDisabledError{}
+ if !errors.As(err, &cd) {
+ t.Errorf("expected cache disabled error, got %v", err)
+ }
+ if cd.Status != util.CachingStatusDisabled {
+ t.Errorf("caching status: expected %v, got %v", util.CachingStatusDisabled, cd.Status)
+ }
+ if resp != nil {
+ t.Errorf("response got %v, want <nil>", resp)
+ }
+}