package sliderule_test import ( "bytes" "context" "io" "net/url" "strings" "testing" sr "tildegit.org/tjp/sliderule" "tildegit.org/tjp/sliderule/gemini" ) func TestFallthrough(t *testing.T) { h1 := sr.HandlerFunc(func(ctx context.Context, req *sr.Request) *sr.Response { if req.Path == "/one" { return gemini.Success("text/gemini", bytes.NewBufferString("one")) } return nil }) h2 := sr.HandlerFunc(func(ctx context.Context, req *sr.Request) *sr.Response { if req.Path == "/two" { return gemini.Success("text/gemini", bytes.NewBufferString("two")) } return nil }) fth := sr.FallthroughHandler(h1, h2) u, err := url.Parse("gemini://test.local/one") if err != nil { t.Fatalf("url.Parse: %s", err.Error()) } resp := fth.Handle(context.Background(), &sr.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.Handle(context.Background(), &sr.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.Handle(context.Background(), &sr.Request{URL: u}) if resp != nil { t.Errorf("expected nil, got %+v", resp) } } func TestFilter(t *testing.T) { pred := func(ctx context.Context, req *sr.Request) bool { return strings.HasPrefix(req.Path, "/allow") } base := sr.HandlerFunc(func(ctx context.Context, req *sr.Request) *sr.Response { return gemini.Success("text/gemini", bytes.NewBufferString("allowed!")) }) handler := sr.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.Handle(context.Background(), &sr.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.Handle(context.Background(), &sr.Request{URL: u}) if resp != nil { t.Errorf("expected nil, got %+v", resp) } }