mirror of
https://github.com/samsonjs/samhuri.net.git
synced 2026-04-16 12:25:53 +00:00
Improve test coverage of gemini renderer
This commit is contained in:
parent
7904a5974b
commit
a64c2cc929
3 changed files with 192 additions and 0 deletions
|
|
@ -590,6 +590,46 @@ class Pressa::Config::LoaderTest < Minitest::Test
|
|||
end
|
||||
end
|
||||
|
||||
def test_build_site_rejects_unsupported_output_format
|
||||
with_temp_config do |dir|
|
||||
File.write(File.join(dir, "site.toml"), <<~TOML)
|
||||
author = "Test Author"
|
||||
email = "test@example.com"
|
||||
title = "Test Site"
|
||||
description = "Test description"
|
||||
url = "https://example.net"
|
||||
TOML
|
||||
|
||||
loader = Pressa::Config::Loader.new(source_path: dir)
|
||||
|
||||
assert_raises(Pressa::Config::ValidationError, "Unsupported output format 'invalid'") do
|
||||
loader.build_site(output_format: "invalid")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def test_build_site_wraps_toml_parse_errors_in_validation_errors
|
||||
with_temp_config do |dir|
|
||||
# Create a malformed TOML file
|
||||
File.write(File.join(dir, "site.toml"), <<~TOML)
|
||||
author = "Test Author"
|
||||
email = "test@example.com"
|
||||
title = "Test Site"
|
||||
description = "Test description"
|
||||
url = "https://example.net"
|
||||
[invalid section without closing bracket
|
||||
TOML
|
||||
|
||||
loader = Pressa::Config::Loader.new(source_path: dir)
|
||||
|
||||
error = assert_raises(Pressa::Config::ValidationError) do
|
||||
loader.build_site
|
||||
end
|
||||
|
||||
assert_includes error.message, "Invalid"
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def with_temp_config
|
||||
|
|
|
|||
89
test/utils/gemini_markdown_renderer_test.rb
Normal file
89
test/utils/gemini_markdown_renderer_test.rb
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
require "test_helper"
|
||||
require "tmpdir"
|
||||
|
||||
class Pressa::Utils::GeminiMarkdownRendererTest < Minitest::Test
|
||||
def renderer
|
||||
@renderer ||= Pressa::Utils::GeminiMarkdownRenderer.new
|
||||
end
|
||||
|
||||
def site
|
||||
@site ||= Pressa::Site.new(
|
||||
author: "Fat Mike",
|
||||
email: "mike@nofx.example.net",
|
||||
title: "NOFX",
|
||||
description: "Punk in Drublic",
|
||||
url: "https://nofx.example.net",
|
||||
output_format: "gemini"
|
||||
)
|
||||
end
|
||||
|
||||
def with_rendered_file(filename, content)
|
||||
Dir.mktmpdir do |base|
|
||||
src = File.join(base, filename)
|
||||
FileUtils.mkdir_p(File.dirname(src))
|
||||
File.write(src, content)
|
||||
out = File.join(base, "out")
|
||||
FileUtils.mkdir_p(out)
|
||||
renderer.render(site: site, file_path: src, target_dir: out)
|
||||
yield out
|
||||
end
|
||||
end
|
||||
|
||||
def test_can_render_file
|
||||
assert renderer.can_render_file?(filename: "post.md", extension: "md")
|
||||
refute renderer.can_render_file?(filename: "page.html", extension: "html")
|
||||
refute renderer.can_render_file?(filename: "page.gmi", extension: "gmi")
|
||||
end
|
||||
|
||||
def test_render_writes_gemtext_with_title_and_web_link
|
||||
content = <<~MARKDOWN
|
||||
---
|
||||
Title: Punk in Drublic
|
||||
---
|
||||
## The album
|
||||
|
||||
A [classic](https://nofx.example.net/pid) record.
|
||||
MARKDOWN
|
||||
|
||||
with_rendered_file("public/pid.md", content) do |out|
|
||||
gemtext = File.read(File.join(out, "pid", "index.gmi"))
|
||||
assert_includes gemtext, "# Punk in Drublic"
|
||||
assert_includes gemtext, "## The album"
|
||||
assert_includes gemtext, "=> https://nofx.example.net/pid/"
|
||||
assert_includes gemtext, "Read on the web"
|
||||
end
|
||||
end
|
||||
|
||||
def test_render_nested_path_writes_to_correct_subdirectory
|
||||
content = "---\nTitle: Heavy Petting Zoo\n---\nContent"
|
||||
with_rendered_file("public/albums/hpz.md", content) do |out|
|
||||
assert File.exist?(File.join(out, "albums", "hpz", "index.gmi"))
|
||||
gemtext = File.read(File.join(out, "albums", "hpz", "index.gmi"))
|
||||
assert_includes gemtext, "=> https://nofx.example.net/albums/hpz/ Read on the web"
|
||||
end
|
||||
end
|
||||
|
||||
def test_render_show_extension_writes_flat_file
|
||||
content = <<~MARKDOWN
|
||||
---
|
||||
Title: White Trash Two Heebs and a Bean
|
||||
Show extension: true
|
||||
---
|
||||
Content
|
||||
MARKDOWN
|
||||
|
||||
with_rendered_file("public/wt2hab.md", content) do |out|
|
||||
assert File.exist?(File.join(out, "wt2hab.gmi"))
|
||||
refute File.exist?(File.join(out, "wt2hab", "index.gmi"))
|
||||
gemtext = File.read(File.join(out, "wt2hab.gmi"))
|
||||
assert_includes gemtext, "=> https://nofx.example.net/wt2hab.html Read on the web"
|
||||
end
|
||||
end
|
||||
|
||||
def test_render_falls_back_to_filename_as_title
|
||||
with_rendered_file("public/so-long.md", "No frontmatter here.") do |out|
|
||||
gemtext = File.read(File.join(out, "so-long", "index.gmi"))
|
||||
assert_includes gemtext, "# So-long"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -69,4 +69,67 @@ class Pressa::Utils::GemtextRendererTest < Minitest::Test
|
|||
|
||||
assert_equal("=> /f/volume.rb", rendered)
|
||||
end
|
||||
|
||||
def test_render_converts_various_markdown_features
|
||||
markdown = <<~MARKDOWN
|
||||
## My [Website](https://powder.example.net "Powder Day")
|
||||
|
||||
>No-space quote with a [link](https://shred.example.net)
|
||||
> Normal quote line
|
||||
|
||||
```ruby
|
||||
[link](url) and **bold** preserved
|
||||
<script>alert('drop-in')</script>
|
||||
```
|
||||
|
||||
Normal text after fence. **bold** *italic* __under__ _em_ `code` <em>html</em>
|
||||
|
||||
Entities: ↑ ← &foobar;
|
||||
|
||||
<img src="/rails.jpg" alt="rails">
|
||||
|
||||
- Check [this](https://one.example.net) and [that](https://two.example.net) out
|
||||
* Star item
|
||||
+ Plus item
|
||||
|
||||
[my ref]: <https://ref.example.net>
|
||||
|
||||
See [my ref][].
|
||||
MARKDOWN
|
||||
|
||||
rendered = Pressa::Utils::GemtextRenderer.render(markdown)
|
||||
|
||||
assert_includes(rendered, "## My Website")
|
||||
assert_includes(rendered, "=> https://powder.example.net")
|
||||
assert_includes(rendered, "> No-space quote with a link")
|
||||
assert_includes(rendered, "=> https://shred.example.net")
|
||||
assert_includes(rendered, "> Normal quote line")
|
||||
assert_includes(rendered, "```")
|
||||
assert_includes(rendered, "[link](url) and **bold** preserved")
|
||||
assert_includes(rendered, "<script>alert('drop-in')</script>")
|
||||
assert_includes(rendered, "bold italic under em code html")
|
||||
assert_includes(rendered, "\u2191")
|
||||
assert_includes(rendered, "\u2190")
|
||||
assert_includes(rendered, "&foobar;")
|
||||
assert_includes(rendered, "=> /rails.jpg")
|
||||
assert_includes(rendered, "* Check this and that out")
|
||||
assert_includes(rendered, "=> https://one.example.net")
|
||||
assert_includes(rendered, "=> https://two.example.net")
|
||||
assert_includes(rendered, "* Star item")
|
||||
assert_includes(rendered, "* Plus item")
|
||||
assert_includes(rendered, "=> https://ref.example.net")
|
||||
end
|
||||
|
||||
def test_render_handles_edge_cases
|
||||
assert_equal("", Pressa::Utils::GemtextRenderer.render(""))
|
||||
assert_equal("", Pressa::Utils::GemtextRenderer.render(nil))
|
||||
|
||||
rendered = Pressa::Utils::GemtextRenderer.render("Line 1\r\nLine 2\r\n")
|
||||
assert_includes(rendered, "Line 1")
|
||||
assert_includes(rendered, "Line 2")
|
||||
|
||||
rendered = Pressa::Utils::GemtextRenderer.render("Line 1\n\n\n\nLine 2")
|
||||
lines = rendered.split("\n")
|
||||
refute lines.each_cons(2).any? { it[0].strip.empty? && it[1].strip.empty? }
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in a new issue