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  }