package atomconv import ( "bytes" "context" "fmt" "io" "net/url" "testing" "tildegit.org/tjp/sliderule" "tildegit.org/tjp/sliderule/gemini" "tildegit.org/tjp/sliderule/gemini/gemtext" "tildegit.org/tjp/sliderule/internal/types" ) func TestConvert(t *testing.T) { tests := []struct { url string input string output string }{ { url: "gemini://sombodys.site/a/page", input: ` # This is a gemlog page ## with a subtitle after empty lines => ./first-post.gmi 2023-08-25 - This is my first post `[1:], output: ` gemini://sombodys.site/a/page This is a gemlog page with a subtitle after empty lines 2023-08-25T12:00:00Z ./first-post.gmi This is my first post 2023-08-25T12:00:00Z `[1:], }, } for _, test := range tests { t.Run(test.url, func(t *testing.T) { doc, err := gemtext.Parse(bytes.NewBufferString(test.input)) if err != nil { t.Fatal(err) } loc, err := url.Parse(test.url) if err != nil { t.Fatal(err) } out := &bytes.Buffer{} if err := Convert(out, doc, loc); err != nil { t.Fatal(err) } if out.String() != test.output { t.Fatal("mismatched output") } }) } } func TestAuto(t *testing.T) { rout := &sliderule.Router{} rout.Route("/foo.gmi", types.HandlerFunc(func(ctx context.Context, request *types.Request) *types.Response { return gemini.Success("text/gemini", bytes.NewBufferString(` # This is my gemini page ## a subtitle => ./first-post.gmi 2023-05-17 - My first post => ./second-post.gmi 2023-06-02 second-ever post `[1:])) })) rout.Route("/bar.gmi", types.HandlerFunc(func(ctx context.Context, request *types.Request) *types.Response { return gemini.Success("text/gemini", bytes.NewBufferString(` # Another homepage => ./first-post.gmi 2023-05-17 - first post => ./second-post.gmi 2023-06-02 second post `[1:])) })) h := Auto(rout.Handler()) response := h.Handle(context.Background(), &types.Request{URL: &url.URL{ Scheme: "gemini", Host: "127.0.0.1", Path: "/foo.gmi.atom", }}) if response.Status != gemini.StatusSuccess { t.Fatal("bad response code") } result, err := io.ReadAll(response.Body) if err != nil { t.Fatal(err) } target := ` gemini://127.0.0.1/foo.gmi.atom This is my gemini page a subtitle 2023-06-02T12:00:00Z ./first-post.gmi My first post 2023-05-17T12:00:00Z ./second-post.gmi second-ever post 2023-06-02T12:00:00Z `[1:] if string(result) != target { fmt.Println(target) fmt.Println(string(result)) t.Fatal("response body") } }