diff options
author | tjpcc <tjp@ctrl-c.club> | 2023-08-31 20:16:16 -0600 |
---|---|---|
committer | tjpcc <tjp@ctrl-c.club> | 2023-08-31 20:16:16 -0600 |
commit | 0fe9ec0c90bfe82f637f1897e47fec07f90805ec (patch) | |
tree | c483fd2b4834a9ba281c92220bcf8adb9e13fb46 /gemini/gemtext/atomconv/convert_test.go | |
parent | d3d5d0df7fcc353318feadb57e1775f10778d505 (diff) |
move gemtext->atom conversion into package atomconv like the other converters
Diffstat (limited to 'gemini/gemtext/atomconv/convert_test.go')
-rw-r--r-- | gemini/gemtext/atomconv/convert_test.go | 139 |
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") + } +} |