default_path_for now routes posts whose lang differs from default_lang into content_dir/<lang>/<slug>.md, matching the documented multi-language layout and preventing same-slug posts in different languages from overwriting each other.
74 lines
2.2 KiB
Ruby
74 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "test_helper"
|
|
require "tmpdir"
|
|
require "fileutils"
|
|
|
|
class StoreTest < Minitest::Test
|
|
def setup
|
|
@dir = Dir.mktmpdir
|
|
File.write(File.join(@dir, "hello.md"), "+++\ntitle = \"Hello\"\n+++\n\nBody\n")
|
|
FileUtils.mkdir_p(File.join(@dir, "cs"))
|
|
File.write(File.join(@dir, "cs", "ahoj.md"), "+++\ntitle = \"Ahoj\"\n+++\n\nTelo\n")
|
|
end
|
|
|
|
def teardown
|
|
FileUtils.remove_entry(@dir)
|
|
end
|
|
|
|
def test_all_loads_every_post
|
|
assert_equal 2, Volumen::Store.new(@dir).all.length
|
|
end
|
|
|
|
def test_slug_falls_back_to_filename
|
|
slugs = Volumen::Store.new(@dir).all.map(&:slug).sort
|
|
assert_equal %w[ahoj hello], slugs
|
|
end
|
|
|
|
def test_lang_derived_from_subdirectory
|
|
store = Volumen::Store.new(@dir, default_lang: "en")
|
|
assert_equal "cs", store.find("ahoj").lang
|
|
assert_equal "en", store.find("hello").lang
|
|
end
|
|
|
|
def test_find_returns_nil_when_missing
|
|
assert_nil Volumen::Store.new(@dir).find("nope")
|
|
end
|
|
|
|
def test_all_langs_post_is_visible_in_any_language
|
|
File.write(File.join(@dir, "global.md"), <<~POST)
|
|
+++
|
|
title = "Global"
|
|
lang = "en"
|
|
all_langs = true
|
|
+++
|
|
|
|
Visible everywhere.
|
|
POST
|
|
store = Volumen::Store.new(@dir, default_lang: "en")
|
|
assert store.find("global", lang: "cs")
|
|
assert store.find("global", lang: "en")
|
|
end
|
|
|
|
def test_save_rejects_path_traversal_slug
|
|
store = Volumen::Store.new(@dir)
|
|
post = Volumen::Post.new(metadata: { "slug" => "../../etc/passwd" }, body: "x")
|
|
assert_raises(ArgumentError, "slug escapes content directory") { store.save(post) }
|
|
end
|
|
|
|
def test_save_uses_lang_subdirectory_for_non_default_language
|
|
store = Volumen::Store.new(@dir, default_lang: "en")
|
|
post = Volumen::Post.new(metadata: { "slug" => "bonjour", "lang" => "fr" }, body: "x")
|
|
store.save(post)
|
|
assert File.exist?(File.join(@dir, "fr", "bonjour.md"))
|
|
end
|
|
|
|
def test_save_uses_root_for_default_language
|
|
store = Volumen::Store.new(@dir, default_lang: "en")
|
|
post = Volumen::Post.new(metadata: { "slug" => "hello-new", "lang" => "en" }, body: "x")
|
|
store.save(post)
|
|
assert File.exist?(File.join(@dir, "hello-new.md"))
|
|
refute File.exist?(File.join(@dir, "en", "hello-new.md"))
|
|
end
|
|
end
|