package topaz_test import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/netkingdom/flex-auth/internal/adapters/topaz" ) func TestHTTPClientUsesTopazDirectoryRESTShape(t *testing.T) { var gotCheck topaz.DirectoryCheckRequest var gotObject topaz.DirectoryObject var gotRelation topaz.DirectoryRelation server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/api/v3/directory/check": var body struct { topaz.DirectoryCheckRequest } if err := json.NewDecoder(r.Body).Decode(&body); err != nil { t.Fatalf("decode check: %v", err) } gotCheck = body.DirectoryCheckRequest w.Header().Set("Content-Type", "application/json") w.Write([]byte(`{"check":true,"etag":"etag:check"}`)) case "/api/v3/directory/object": var body struct { Object topaz.DirectoryObject `json:"object"` } if err := json.NewDecoder(r.Body).Decode(&body); err != nil { t.Fatalf("decode object: %v", err) } gotObject = body.Object w.WriteHeader(http.StatusNoContent) case "/api/v3/directory/relation": var body struct { Relation topaz.DirectoryRelation `json:"relation"` } if err := json.NewDecoder(r.Body).Decode(&body); err != nil { t.Fatalf("decode relation: %v", err) } gotRelation = body.Relation w.Header().Set("Content-Type", "application/json") w.Write([]byte(`{"etag":"etag:relation"}`)) case "/api/v3/directory/manifest": if r.Header.Get("Content-Type") != "application/yaml" { t.Fatalf("manifest content-type = %q", r.Header.Get("Content-Type")) } w.WriteHeader(http.StatusNoContent) default: t.Fatalf("unexpected path %s", r.URL.Path) } })) defer server.Close() client, err := topaz.NewHTTPClient(server.URL, nil) if err != nil { t.Fatalf("NewHTTPClient: %v", err) } check, err := client.Check(context.Background(), topaz.DirectoryCheckRequest{ ObjectType: "document", ObjectID: "document:internal-note", Relation: "read", SubjectType: "user", SubjectID: "user:alice", }) if err != nil { t.Fatalf("Check: %v", err) } if !check.Allowed || check.DirectoryETag != "etag:check" { t.Fatalf("check = %+v", check) } if gotCheck.ObjectType != "document" || gotCheck.SubjectID != "user:alice" { t.Fatalf("gotCheck = %+v", gotCheck) } if err := client.PutObject(context.Background(), topaz.DirectoryObject{Type: "document", ID: "document:internal-note"}); err != nil { t.Fatalf("PutObject: %v", err) } if gotObject.Type != "document" || gotObject.ID != "document:internal-note" { t.Fatalf("gotObject = %+v", gotObject) } write, err := client.PutRelation(context.Background(), topaz.DirectoryRelation{ ObjectType: "document", ObjectID: "document:internal-note", Relation: "reader", SubjectType: "user", SubjectID: "user:alice", }) if err != nil { t.Fatalf("PutRelation: %v", err) } if write.ETag != "etag:relation" || gotRelation.Relation != "reader" { t.Fatalf("write = %+v relation = %+v", write, gotRelation) } if err := client.PutManifest(context.Background(), []byte("model: v3\n")); err != nil { t.Fatalf("PutManifest: %v", err) } }