summaryrefslogtreecommitdiff
path: root/gemini/gemtext/atomconv/convert_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'gemini/gemtext/atomconv/convert_test.go')
-rw-r--r--gemini/gemtext/atomconv/convert_test.go139
1 files changed, 139 insertions, 0 deletions
diff --git a/gemini/gemtext/atomconv/convert_test.go b/gemini/gemtext/atomconv/convert_test.go
new file mode 100644
index 0000000..8adaa2e
--- /dev/null
+++ b/gemini/gemtext/atomconv/convert_test.go
@@ -0,0 +1,139 @@
+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: `
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>gemini://sombodys.site/a/page</id>
+ <link href="gemini://sombodys.site/a/page"/>
+ <title>This is a gemlog page</title>
+ <subtitle>with a subtitle after empty lines</subtitle>
+ <updated>2023-08-25T12:00:00Z</updated>
+ <entry>
+ <id>./first-post.gmi</id>
+ <link rel="alternate" href="./first-post.gmi"/>
+ <title>This is my first post</title>
+ <updated>2023-08-25T12:00:00Z</updated>
+ </entry>
+</feed>
+`[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 := `
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>gemini://127.0.0.1/foo.gmi.atom</id>
+ <link href="gemini://127.0.0.1/foo.gmi.atom"/>
+ <title>This is my gemini page</title>
+ <subtitle>a subtitle</subtitle>
+ <updated>2023-06-02T12:00:00Z</updated>
+ <entry>
+ <id>./first-post.gmi</id>
+ <link rel="alternate" href="./first-post.gmi"/>
+ <title>My first post</title>
+ <updated>2023-05-17T12:00:00Z</updated>
+ </entry>
+ <entry>
+ <id>./second-post.gmi</id>
+ <link rel="alternate" href="./second-post.gmi"/>
+ <title>second-ever post</title>
+ <updated>2023-06-02T12:00:00Z</updated>
+ </entry>
+</feed>
+`[1:]
+ if string(result) != target {
+ fmt.Println(target)
+ fmt.Println(string(result))
+ t.Fatal("response body")
+ }
+}