package gus_test import ( "bytes" "context" "io" "net/url" "strings" "testing" "tildegit.org/tjp/gus" "tildegit.org/tjp/gus/gemini" ) func TestFallthrough(t *testing.T) { h1 := func(ctx context.Context, req *gus.Request) *gus.Response { if req.Path == "/one" { return gemini.Success("text/gemini", bytes.NewBufferString("one")) } return nil } h2 := func(ctx context.Context, req *gus.Request) *gus.Response { if req.Path == "/two" { return gemini.Success("text/gemini", bytes.NewBufferString("two")) } return nil } fth := gus.FallthroughHandler(h1, h2) u, err := url.Parse("gemini://test.local/one") if err != nil { t.Fatalf("url.Parse: %s", err.Error()) } resp := fth(context.Background(), &gus.Request{URL: u}) if resp.Status != gemini.StatusSuccess { t.Errorf("expected status %d, got %d", gemini.StatusSuccess, resp.Status) } if resp.Meta != "text/gemini" { t.Errorf(`expected meta "text/gemini", got %q`, resp.Meta) } body, err := io.ReadAll(resp.Body) if err != nil { t.Errorf("Read: %s", err.Error()) } if string(body) != "one" { t.Errorf(`expected body "one", got %q`, string(body)) } u, err = url.Parse("gemini://test.local/two") if err != nil { t.Fatalf("url.Parse: %s", err.Error()) } resp = fth(context.Background(), &gus.Request{URL: u}) if resp.Status != gemini.StatusSuccess { t.Errorf("expected status %d, got %d", gemini.StatusSuccess, resp.Status) } if resp.Meta != "text/gemini" { t.Errorf(`expected meta "text/gemini", got %q`, resp.Meta) } body, err = io.ReadAll(resp.Body) if err != nil { t.Errorf("Read: %s", err.Error()) } if string(body) != "two" { t.Errorf(`expected body "two", got %q`, string(body)) } u, err = url.Parse("gemini://test.local/three") if err != nil { t.Fatalf("url.Parse: %s", err.Error()) } resp = fth(context.Background(), &gus.Request{URL: u}) if resp != nil { t.Errorf("expected nil, got %+v", resp) } } func TestFilter(t *testing.T) { pred := func(ctx context.Context, req *gus.Request) bool { return strings.HasPrefix(req.Path, "/allow") } base := func(ctx context.Context, req *gus.Request) *gus.Response { return gemini.Success("text/gemini", bytes.NewBufferString("allowed!")) } handler := gus.Filter(pred, nil)(base) u, err := url.Parse("gemini://test.local/allow/please") if err != nil { t.Fatalf("url.Parse: %s", err.Error()) } resp := handler(context.Background(), &gus.Request{URL: u}) if resp.Status != gemini.StatusSuccess { t.Errorf("expected status %d, got %d", gemini.StatusSuccess, resp.Status) } u, err = url.Parse("gemini://test.local/disallow/please") if err != nil { t.Fatalf("url.Parse: %s", err.Error()) } resp = handler(context.Background(), &gus.Request{URL: u}) if resp != nil { t.Errorf("expected nil, got %+v", resp) } }