Improve test coverage of gemini renderer

This commit is contained in:
Sami Samhuri 2026-04-11 12:32:48 -07:00
parent 7904a5974b
commit a64c2cc929
No known key found for this signature in database
3 changed files with 192 additions and 0 deletions

View file

@ -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

View 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

View file

@ -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: &uarr; &larr; &nbsp; &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