diff --git a/storage/graph_test.go b/storage/graph_test.go index 54baab3..33e1dac 100644 --- a/storage/graph_test.go +++ b/storage/graph_test.go @@ -3,6 +3,7 @@ package storage import ( "context" "fmt" + "io/ioutil" "local/dndex/storage/entity" "local/dndex/storage/operator" "os" @@ -13,12 +14,14 @@ import ( ) func TestIntegration(t *testing.T) { - if len(os.Getenv("INTEGRATION")) == 0 { - t.Logf("skipping because $INTEGRATION unset") - return - } - os.Args = os.Args[:1] + f, err := ioutil.TempFile(os.TempDir(), "pattern*") + if err != nil { + t.Fatal(err) + } + f.Close() + defer os.Remove(f.Name()) + os.Setenv("DBURI", f.Name()) graph := NewGraph() ctx, can := context.WithCancel(context.TODO()) defer can() diff --git a/view/httpisnow.go b/view/httpisnow.go deleted file mode 100644 index 4affcc9..0000000 --- a/view/httpisnow.go +++ /dev/null @@ -1,49 +0,0 @@ -package view - -import ( - "fmt" - "io/ioutil" - "local/dndex/storage" - "local/dndex/storage/entity" - "local/dndex/storage/operator" - "net/http" - "path" - - "github.com/buger/jsonparser" -) - -func httpisnow(g storage.Graph, w http.ResponseWriter, r *http.Request) error { - namespace := path.Base(r.URL.Path) - - b, err := ioutil.ReadAll(r.Body) - if err != nil { - return err - } - - name, err := jsonparser.GetString(b, entity.JSONName) - if err != nil { - return fmt.Errorf("cannot find %q: %v", entity.JSONName, err) - } - if name == "" { - http.Error(w, `{"error":"must provide a name"}`, http.StatusBadRequest) - return nil - } - - key, err := jsonparser.GetString(b, "set", "key") - if err != nil { - return fmt.Errorf("cannot find %q: %v", "set.key", err) - } - if key == "" { - http.Error(w, `{"error":"must provide a set.key"}`, http.StatusBadRequest) - return nil - } - - value, err := jsonparser.GetString(b, "set", "value") - if err != nil { - return fmt.Errorf("cannot find %q: %v", "set.value", err) - } - - operator := operator.Set{Key: key, Value: value} - - return g.Update(r.Context(), namespace, entity.One{Name: name}, operator) -} diff --git a/view/httpmeet.go b/view/httpmeet.go deleted file mode 100644 index 9341ef3..0000000 --- a/view/httpmeet.go +++ /dev/null @@ -1,13 +0,0 @@ -package view - -import ( - "local/dndex/storage" - "net/http" - "path" -) - -func httpmeet(g storage.Graph, w http.ResponseWriter, r *http.Request) error { - namespace := path.Base(r.URL.Path) - w.Write([]byte(namespace)) - return nil -} diff --git a/view/httpwho.go b/view/httpwho.go deleted file mode 100644 index 38ac7d5..0000000 --- a/view/httpwho.go +++ /dev/null @@ -1,73 +0,0 @@ -package view - -import ( - "context" - "encoding/json" - "local/dndex/storage" - "local/dndex/storage/entity" - "log" - "net/http" - "path" - "strings" -) - -func httpwho(g storage.Graph, w http.ResponseWriter, r *http.Request) error { - namespace := strings.TrimLeft(r.URL.Path, path.Dir(r.URL.Path)) - if len(namespace) == 0 { - http.NotFound(w, r) - return nil - } - ids := r.URL.Query()["id"] - _, verbose := r.URL.Query()["v"] - _, one := r.URL.Query()["one"] - results := make(map[string]entity.One) - for i := 0; i < len(ids); i++ { - id := ids[i] - one, err := httpwhoOne(r.Context(), g, namespace, id, verbose) - if err != nil { - return err - } - results[id] = one - } - var marshalme interface{} - if one { - for k := range results { - marshalme = results[k] - break - } - } else { - marshalme = results - } - log.Printf("id=%+v, one=%v, verbose=%v, results:%+v", ids, one, verbose, marshalme) - enc := json.NewEncoder(w) - enc.SetIndent("", " ") - return enc.Encode(marshalme) -} - -func httpwhoOne(ctx context.Context, g storage.Graph, namespace, id string, verbose bool) (entity.One, error) { - ones, err := g.List(ctx, namespace, id) - if err != nil { - return entity.One{}, err - } - if len(ones) != 1 { - ones = append(ones, entity.One{}) - } - one := ones[0] - if verbose { - ones, err := g.List(ctx, namespace, one.Peers()...) - if err != nil { - return entity.One{}, err - } - for _, another := range ones { - another.Connections = nil - another.Text = "" - for j := range one.Connections { - if one.Connections[j].Name == another.Name { - another.Relationship = one.Connections[j].Relationship - one.Connections[j] = another - } - } - } - } - return one, nil -} diff --git a/view/json_test.go b/view/json_test.go deleted file mode 100644 index 8b409cf..0000000 --- a/view/json_test.go +++ /dev/null @@ -1,156 +0,0 @@ -package view - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "local/dndex/config" - "local/dndex/storage" - "local/dndex/storage/entity" - "net/http" - "net/http/httptest" - "os" - "strings" - "testing" - "time" - - "github.com/google/uuid" -) - -func TestJSON(t *testing.T) { - if len(os.Getenv("INTEGRATION")) == 0 { - t.Logf("skipping because $INTEGRATION unset") - return - } - os.Args = os.Args[:1] - - t.Logf("config: %+v", config.New()) - - g := storage.NewGraph() - ones := fillDB(t, g) - want := ones[len(ones)-1] - - handler := jsonHandler(g) - - t.Run("404 on /who", func(t *testing.T) { - r := httptest.NewRequest("GET", "/who", strings.NewReader(``)) - w := httptest.NewRecorder() - handler.ServeHTTP(w, r) - if w.Code != http.StatusNotFound { - t.Error(w.Code) - } - }) - - t.Run("404 on /who/", func(t *testing.T) { - r := httptest.NewRequest("GET", "/who/", strings.NewReader(``)) - w := httptest.NewRecorder() - handler.ServeHTTP(w, r) - if w.Code != http.StatusNotFound { - t.Error(w.Code) - } - }) - - req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("http://localhost:%d/who/col?id=%s&v", config.New().Port, want.Name), strings.NewReader(``)) - if err != nil { - t.Fatal(err) - } - w := httptest.NewRecorder() - handler.ServeHTTP(w, req) - - var v interface{} - if b, err := ioutil.ReadAll(w.Body); err != nil { - t.Fatalf("failed to read all resp body: %v: %s", err, b) - } else if err := json.Unmarshal(b, &v); err != nil { - t.Fatalf("err unmarshalling response: %v: %s", err, b) - } - b, err := json.MarshalIndent(v, "", " ") - if err != nil { - t.Fatal(err) - } - var gotOnes map[string]entity.One - if err := json.Unmarshal(b, &gotOnes); err != nil { - t.Fatal(err) - } - if len(gotOnes) != 1 { - t.Fatal("too many results: ", len(gotOnes)) - } - var o entity.One - for _, v := range gotOnes { - o = v - } - for i := range want.Connections { - found := false - for j := range o.Connections { - if want.Connections[i].Name == o.Connections[j].Name { - found = true - if want.Connections[i].Relationship != o.Connections[j].Relationship { - t.Errorf("connection is wrong: want %+v, got %+v", want.Connections[i], o.Connections[j]) - } - } - } - if !found { - t.Errorf("didn't find connection %+v in %+v", want.Connections[i], o.Connections) - } - } - if o.Image != want.Image { - t.Errorf("wrong image: want %q, got %q", want.Image, o.Image) - } - if o.Text != want.Text { - t.Errorf("wrong text: want %q, got %q", want.Text, o.Text) - } - if o.Title != want.Title { - t.Errorf("wrong title: want %q, got %q", want.Title, o.Title) - } - if o.Type != want.Type { - t.Errorf("wrong type: want %q, got %q", want.Type, o.Type) - } - if o.Name != want.Name { - t.Errorf("wrong name: want %q, got %q", want.Name, o.Name) - } - t.Logf("\n%s\n", b) -} - -func fillDB(t *testing.T, g storage.Graph) []entity.One { - ones := make([]entity.One, 5) - for i := range ones { - ones[i] = randomOne() - if i > 0 { - ones[i].Connections[ones[i-1].Name] = entity.One{ - Name: ones[i-1].Name, - Relationship: ":D", - } - } - } - for i := range ones { - if err := g.Insert(context.TODO(), "col", ones[i]); err != nil { - t.Fatal(err) - } - if results, err := g.List(context.TODO(), "col", ones[i].Name); err != nil { - t.Fatal(err) - } else if len(results) != 1 { - t.Fatal(len(results)) - } else if len(results[0].Connections) != len(ones[i].Connections) { - t.Fatal(len(results[0].Connections), len(ones[i].Connections)) - } else if len(results[0].Connections) > 0 { - for k, v := range results[0].Connections { - if k == "" || v.Name == "" { - t.Fatalf("name is gone: %q:%+v", k, v) - } - } - } - } - return ones -} - -func randomOne() entity.One { - return entity.One{ - Name: "name-" + uuid.New().String()[:5], - Type: "type-" + uuid.New().String()[:5], - Title: "titl-" + uuid.New().String()[:5], - Image: "imge-" + uuid.New().String()[:5], - Text: "text-" + uuid.New().String()[:5], - Modified: time.Now().UnixNano(), - Connections: map[string]entity.One{}, - } -} diff --git a/view/who.go b/view/who.go index def6769..409773e 100644 --- a/view/who.go +++ b/view/who.go @@ -109,7 +109,7 @@ func whoPut(namespace string, g storage.Graph, w http.ResponseWriter, r *http.Re delete(op, k) } } - if err := g.Update(r.Context(), namespace, entity.One{Name: id}, operator.SetMany{op}); err != nil { + if err := g.Update(r.Context(), namespace, entity.One{Name: id}, operator.SetMany{Value: op}); err != nil { return err } diff --git a/view/who_test.go b/view/who_test.go index 6fbde95..1127535 100644 --- a/view/who_test.go +++ b/view/who_test.go @@ -2,6 +2,7 @@ package view import ( "bytes" + "context" "encoding/json" "fmt" "io/ioutil" @@ -13,6 +14,9 @@ import ( "os" "strings" "testing" + "time" + + "github.com/google/uuid" ) func TestWho(t *testing.T) { @@ -153,3 +157,47 @@ func TestWho(t *testing.T) { t.Logf("POST POST:\n%s", b) }) } + +func fillDB(t *testing.T, g storage.Graph) []entity.One { + ones := make([]entity.One, 5) + for i := range ones { + ones[i] = randomOne() + if i > 0 { + ones[i].Connections[ones[i-1].Name] = entity.One{ + Name: ones[i-1].Name, + Relationship: ":D", + } + } + } + for i := range ones { + if err := g.Insert(context.TODO(), "col", ones[i]); err != nil { + t.Fatal(err) + } + if results, err := g.List(context.TODO(), "col", ones[i].Name); err != nil { + t.Fatal(err) + } else if len(results) != 1 { + t.Fatal(len(results)) + } else if len(results[0].Connections) != len(ones[i].Connections) { + t.Fatal(len(results[0].Connections), len(ones[i].Connections)) + } else if len(results[0].Connections) > 0 { + for k, v := range results[0].Connections { + if k == "" || v.Name == "" { + t.Fatalf("name is gone: %q:%+v", k, v) + } + } + } + } + return ones +} + +func randomOne() entity.One { + return entity.One{ + Name: "name-" + uuid.New().String()[:5], + Type: "type-" + uuid.New().String()[:5], + Title: "titl-" + uuid.New().String()[:5], + Image: "imge-" + uuid.New().String()[:5], + Text: "text-" + uuid.New().String()[:5], + Modified: time.Now().UnixNano(), + Connections: map[string]entity.One{}, + } +}