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")
}
}