github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/logbook/logsync/http_test.go (about) 1 package logsync 2 3 import ( 4 "fmt" 5 "net/http" 6 "net/http/httptest" 7 "testing" 8 9 cmp "github.com/google/go-cmp/cmp" 10 "github.com/qri-io/qri/dsref" 11 "github.com/qri-io/qri/profile" 12 ) 13 14 func TestSyncHTTP(t *testing.T) { 15 tr, cleanup := newTestRunner(t) 16 defer cleanup() 17 18 a, b := tr.DefaultLogsyncs() 19 20 server := httptest.NewServer(HTTPHandler(a)) 21 defer server.Close() 22 23 ref, err := writeNasdaqLogs(tr.Ctx, tr.A) 24 if err != nil { 25 t.Fatal(err) 26 } 27 28 if _, err := b.NewPull(ref, ""); err == nil { 29 t.Errorf("expected invalid remote address to error") 30 } 31 32 pull, err := b.NewPull(ref, server.URL) 33 if err != nil { 34 t.Errorf("creating pull: %s", err) 35 } 36 pull.Merge = true 37 38 if _, err := pull.Do(tr.Ctx); err != nil { 39 t.Fatalf("pulling nasdaq logs %s", err.Error()) 40 } 41 42 var expect, got []dsref.VersionInfo 43 if expect, err = tr.A.Items(tr.Ctx, ref, 0, 100, ""); err != nil { 44 t.Error(err) 45 } 46 if got, err = tr.B.Items(tr.Ctx, ref, 0, 100, ""); err != nil { 47 t.Error(err) 48 } 49 50 if diff := cmp.Diff(expect, got); diff != "" { 51 t.Errorf("result mismatch. (-want +got):\n%s", diff) 52 } 53 54 worldBankRef, err := writeWorldBankLogs(tr.Ctx, tr.B) 55 if err != nil { 56 t.Fatal(err) 57 } 58 59 push, err := b.NewPush(worldBankRef, server.URL) 60 if err != nil { 61 t.Fatal(err) 62 } 63 64 if err = push.Do(tr.Ctx); err != nil { 65 t.Error(err) 66 } 67 68 if expect, err = tr.B.Items(tr.Ctx, worldBankRef, 0, 100, ""); err != nil { 69 t.Error(err) 70 } 71 if got, err = tr.A.Items(tr.Ctx, worldBankRef, 0, 100, ""); err != nil { 72 t.Error(err) 73 } 74 if diff := cmp.Diff(expect, got); diff != "" { 75 t.Errorf("result mismatch. (-want +got):\n%s", diff) 76 } 77 78 if err = b.DoRemove(tr.Ctx, ref, server.URL); err == nil { 79 t.Errorf("expected an error removing a log user doesn't own") 80 } 81 82 if err = b.DoRemove(tr.Ctx, worldBankRef, server.URL); err != nil { 83 t.Errorf("delete err: %s", err) 84 } 85 86 if got, err = tr.A.Items(tr.Ctx, worldBankRef, 0, 100, ""); err == nil { 87 t.Logf("%v\n", got) 88 t.Error("expected an err fetching removed reference") 89 } 90 } 91 92 func TestHTTPClientErrors(t *testing.T) { 93 tr, cleanup := newTestRunner(t) 94 defer cleanup() 95 authorA := profile.NewAuthorFromProfile(tr.A.Owner()) 96 97 c := httpClient{} 98 if _, _, err := c.get(tr.Ctx, authorA, dsref.Ref{}); err == nil { 99 t.Error("expected error to exist") 100 } 101 102 c.URL = "https://not.a.url .sadfhajksldfjaskl" 103 if _, _, err := c.get(tr.Ctx, authorA, dsref.Ref{}); err == nil { 104 t.Error("expected error to exist") 105 } 106 107 if err := c.put(tr.Ctx, authorA, dsref.Ref{}, nil); err == nil { 108 t.Error("expected error to exist") 109 } 110 111 if err := c.del(tr.Ctx, authorA, dsref.Ref{}); err == nil { 112 t.Error("expected error to exist") 113 } 114 115 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 116 w.WriteHeader(http.StatusNotFound) 117 })) 118 defer server.Close() 119 120 c.URL = server.URL 121 if _, _, err := c.get(tr.Ctx, authorA, dsref.Ref{}); err == nil { 122 t.Error("expected error to exist") 123 } 124 125 if err := c.put(tr.Ctx, authorA, dsref.Ref{}, nil); err == nil { 126 t.Error("expected error to exist") 127 } 128 129 if err := c.del(tr.Ctx, authorA, dsref.Ref{}); err == nil { 130 t.Error("expected error to exist") 131 } 132 } 133 134 func TestHTTPHandlerErrors(t *testing.T) { 135 tr, cleanup := newTestRunner(t) 136 defer cleanup() 137 handler := HTTPHandler(nil) 138 authorA := profile.NewAuthorFromProfile(tr.A.Owner()) 139 140 // one test with no author headers: 141 r := httptest.NewRequest("GET", "http://remote.qri.io", nil) 142 w := httptest.NewRecorder() 143 handler(w, r) 144 145 resp := w.Result() 146 if http.StatusBadRequest != resp.StatusCode { 147 t.Errorf("no author response code mismatch. expected: %d, got: %d", http.StatusBadRequest, resp.StatusCode) 148 } 149 150 cases := []struct { 151 description string 152 method, endpoint string 153 expectStatus int 154 }{ 155 {"no author fields", "GET", "", http.StatusBadRequest}, 156 {"no author fields", "GET", "?ref=foo/bar", http.StatusBadRequest}, 157 {"no author fields", "PUT", "", http.StatusBadRequest}, 158 {"no author fields", "DELETE", "", http.StatusBadRequest}, 159 } 160 161 for _, c := range cases { 162 r := httptest.NewRequest(c.method, fmt.Sprintf("http://remote.qri.io%s", c.endpoint), nil) 163 addAuthorHTTPHeaders(r.Header, authorA) 164 165 w := httptest.NewRecorder() 166 handler(w, r) 167 168 resp := w.Result() 169 if c.expectStatus != resp.StatusCode { 170 t.Errorf("case '%s', response code mismatch. expected: %d, got: %d", c.description, c.expectStatus, resp.StatusCode) 171 } 172 } 173 }