samhuri.net/test/drafts_test.rb
Sami Samhuri fc68fc58af Extract bake logic into lib/pressa and fold tasks back into one bake.rb
Pull the pure, testable logic out of the bake tasks into Pressa modules:

- Pressa::Drafts — slugs, ordinal dates, draft paths, and the new-draft template
- Pressa::Coverage — the coverage measurement script, output parsing, and baseline-ref resolution
- Pressa::Publish — the rsync command builder

Each gets its own tests, so this logic now sits under the lib/ coverage gate
instead of being untested glue inside the task files.

With the logic extracted, the namespaced bake/ split no longer earns its keep —
those files were mostly thin task declarations. Collapse build/draft/publish/quality
back into a single bake.rb with the original flat task names (new_draft, coverage,
publish_beta, and so on) and update CI and AGENTS.md to match.
2026-06-07 17:57:01 -07:00

93 lines
3.8 KiB
Ruby

require "test_helper"
class Pressa::DraftsTest < Minitest::Test
def test_slugify_lowercases_and_hyphenates
assert_equal("powder-day-at-baker", Pressa::Drafts.slugify("Powder Day at Baker"))
end
def test_slugify_strips_symbols_and_squeezes_separators
assert_equal("nine-inch-nails-the-fragile", Pressa::Drafts.slugify("Nine Inch Nails: The Fragile!!!"))
end
def test_slugify_trims_leading_and_trailing_hyphens
assert_equal("hello", Pressa::Drafts.slugify(" ...Hello... "))
end
def test_slugify_returns_empty_string_for_symbol_only_titles
assert_equal("", Pressa::Drafts.slugify("!!!"))
end
def test_ordinal_date_uses_st_nd_rd_suffixes
assert_equal("1st June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 1)))
assert_equal("2nd June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 2)))
assert_equal("3rd June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 3)))
assert_equal("21st June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 21)))
assert_equal("31st March, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 3, 31)))
end
def test_ordinal_date_uses_th_for_the_teens
assert_equal("11th June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 11)))
assert_equal("12th June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 12)))
assert_equal("13th June, 2026", Pressa::Drafts.ordinal_date(Time.new(2026, 6, 13)))
end
def test_path_joins_filename_with_drafts_dir
drafts = Pressa::Drafts.new(dir: "public/drafts")
assert_equal("public/drafts/the-fragile.md", drafts.path("the-fragile.md"))
end
def test_next_available_returns_base_filename_when_free
drafts = Pressa::Drafts.new(dir: "public/drafts", exists: ->(_path) { false })
assert_equal("untitled.md", drafts.next_available)
end
def test_next_available_appends_counter_on_collision
taken = ["public/drafts/untitled.md", "public/drafts/untitled-1.md"]
drafts = Pressa::Drafts.new(dir: "public/drafts", exists: ->(path) { taken.include?(path) })
assert_equal("untitled-2.md", drafts.next_available)
end
def test_resolve_input_treats_bare_name_as_draft_filename
drafts = Pressa::Drafts.new(dir: "public/drafts")
assert_equal(["public/drafts/the-fragile.md", "the-fragile.md"], drafts.resolve_input("the-fragile.md"))
end
def test_resolve_input_uses_explicit_path_verbatim
drafts = Pressa::Drafts.new(dir: "public/drafts")
assert_equal(
["public/drafts/the-fragile.md", "the-fragile.md"],
drafts.resolve_input("public/drafts/the-fragile.md")
)
end
def test_resolve_input_rejects_already_published_paths
drafts = Pressa::Drafts.new(dir: "public/drafts")
error = assert_raises(Pressa::Drafts::Error) { drafts.resolve_input("posts/2026/06/the-fragile.md") }
assert_match(/already published/, error.message)
end
def test_current_author_returns_a_non_empty_login
assert_kind_of(String, Pressa::Drafts.current_author)
refute_empty(Pressa::Drafts.current_author)
end
def test_current_author_falls_back_when_getlogin_raises
original = Etc.method(:getlogin)
Etc.define_singleton_method(:getlogin) { raise "no login on this box" }
assert_kind_of(String, Pressa::Drafts.current_author)
refute_empty(Pressa::Drafts.current_author)
ensure
Etc.define_singleton_method(:getlogin, original)
end
def test_render_template_includes_front_matter_and_title
drafts = Pressa::Drafts.new(dir: "public/drafts")
content = drafts.render_template("The Downward Spiral", author: "Trent Reznor", now: Time.new(2026, 6, 7, 9, 30, 0))
assert_match(/^Author: Trent Reznor$/, content)
assert_match(/^Title: The Downward Spiral$/, content)
assert_match(/^Date: unpublished$/, content)
assert_match(/^Timestamp: 2026-06-07T09:30:00/, content)
assert_match(/^# The Downward Spiral$/, content)
end
end