Fedora packaging (hopefully)
Some checks failed
Deploy Website / deploy-website (push) Successful in 39s
Publish kewt-git to AUR / publish-aur-git (push) Successful in 21s
Release Standalone Builder / build (release) Successful in 27s
Release Standalone Builder / publish-fedora (release) Failing after 15s
Release Standalone Builder / publish-aur (release) Successful in 22s
Release Standalone Builder / publish-homebrew (release) Successful in 7s

This commit is contained in:
2026-05-20 10:30:10 +02:00
parent cd9550ee8a
commit 930e1ac4dc
22 changed files with 640 additions and 36 deletions

185
tests/test_builder.sh Normal file
View File

@@ -0,0 +1,185 @@
test_needs_rebuild_no_output() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/runtime.sh"
. "$project_dir/lib/builder.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
echo "test" > "$tmpdir/src.md"
needs_rebuild "$tmpdir/src.md" "$tmpdir/out.html"
result=$?
assert_eq "0" "$result" "rebuild when output missing"
rm -rf "$tmpdir"
}
test_needs_rebuild_output_newer() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/runtime.sh"
. "$project_dir/lib/builder.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
echo "test" > "$tmpdir/src.md"
sleep 1
echo "test" > "$tmpdir/out.html"
needs_rebuild "$tmpdir/src.md" "$tmpdir/out.html"
result=$?
assert_eq "1" "$result" "no rebuild when output newer"
rm -rf "$tmpdir"
}
test_needs_rebuild_source_newer() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/runtime.sh"
. "$project_dir/lib/builder.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
echo "old" > "$tmpdir/out.html"
sleep 1
echo "new" > "$tmpdir/src.md"
needs_rebuild "$tmpdir/src.md" "$tmpdir/out.html"
result=$?
assert_eq "0" "$result" "rebuild when source newer"
rm -rf "$tmpdir"
}
test_escape_html_text() {
. "$project_dir/lib/generator.sh"
result=$(escape_html_text "<script>&test>")
assert_eq "&lt;script&gt;&amp;test&gt;" "$result" "escape html text"
}
test_escape_html_attr() {
. "$project_dir/lib/generator.sh"
result=$(escape_html_attr 'value with "quotes" & <tags>')
assert_eq "value with &quot;quotes&quot; &amp; &lt;tags&gt;" "$result" "escape html attr"
}
test_nav_links_empty() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/generator.sh"
nav_links=""
result=$(nav_links_html)
assert_eq "" "$result" "empty nav links"
}
test_nav_links_markdown() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/generator.sh"
nav_links="[Docs](/docs), [About](/about)"
result=$(nav_links_html)
assert_contains '<li><a href="/docs">Docs</a></li>' "$result" "nav links markdown docs"
assert_contains '<li><a href="/about">About</a></li>' "$result" "nav links markdown about"
}
test_nav_links_plain() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/generator.sh"
nav_links="https://example.com"
result=$(nav_links_html)
assert_contains '<li><a href="https://example.com">' "$result" "nav links plain url"
}
test_find_closest() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/generator.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir/sub/deep"
echo "root" > "$tmpdir/template.html"
echo "sub" > "$tmpdir/sub/template.html"
src="$tmpdir"
result=$(find_closest "template.html" "$tmpdir/sub/deep")
assert_eq "$tmpdir/sub/template.html" "$result" "find closest in parent"
result=$(find_closest "template.html" "$tmpdir")
assert_eq "$tmpdir/template.html" "$result" "find closest in current"
rm -rf "$tmpdir"
}
test_find_closest_fallback_to_src() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/generator.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir/sub"
echo "root" > "$tmpdir/template.html"
src="$tmpdir"
result=$(find_closest "template.html" "$tmpdir/sub")
assert_eq "$tmpdir/template.html" "$result" "find closest falls back to src"
rm -rf "$tmpdir"
}
test_custom_404_md() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/runtime.sh"
. "$project_dir/lib/metadata.sh"
. "$project_dir/lib/manifest.sh"
. "$project_dir/lib/generator.sh"
. "$project_dir/lib/builder.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
cat > "$tmpdir/site.conf" <<EOF
title = "Test"
error_page = "not_found.html"
EOF
printf '# Custom 404\n\nPage not found, sorry.\n' > "$tmpdir/not_found.md"
src="$tmpdir"
out="$tmpdir/out"
KEWT_TMPDIR="$tmpdir/tmp"
mkdir -p "$out" "$KEWT_TMPDIR"
awk_dir="$project_dir/awk"
script_dir="$project_dir"
style="kewt"
template="$KEWT_TMPDIR/default_template.html"
printf '%s\n' "$DEFAULT_TMPL" > "$template"
nav=""
footer=""
header_brand=""
head_extra=""
asset_version=""
lang="en"
current_url=""
fm_title=""
fm_content_warning=""
fm_description=""
generate_page_title="true"
logo_as_favicon="false"
favicon=""
display_logo="false"
display_title="true"
logo=""
search_in_header="false"
search_in_footer="false"
cw_hide_url="true"
enable_header_links="false"
custom_admonitions=""
build_error_page
assert_file_exists "$out/not_found.html" "custom 404 html generated"
assert_contains "Custom 404" "$(cat "$out/not_found.html")" "custom 404 has custom content"
rm -rf "$tmpdir"
}

View File

@@ -104,3 +104,26 @@ test_config_load_missing_file() {
assert_eq "kewt" "$title" "missing file keeps defaults"
}
test_config_feed_full_content_default() {
. "$project_dir/lib/config.sh"
assert_eq "false" "$feed_full_content" "default feed_full_content"
}
test_config_feed_full_content_load() {
. "$project_dir/lib/config.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
cat > "$tmpdir/test.conf" <<EOF
feed_full_content = true
EOF
reset_config
load_config "$tmpdir/test.conf"
assert_eq "true" "$feed_full_content" "load feed_full_content"
rm -rf "$tmpdir"
}

43
tests/test_manifest.sh Normal file
View File

@@ -0,0 +1,43 @@
test_draft_mode_includes_drafts_in_manifest() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/runtime.sh"
. "$project_dir/lib/metadata.sh"
. "$project_dir/lib/manifest.sh"
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
cat > "$tmpdir/site.conf" <<EOF
title = "Test"
dir_indexes = true
EOF
printf '# Normal Page\n' > "$tmpdir/normal.md"
printf -- '---\ndraft = true\n---\n# Draft Page\n' > "$tmpdir/draft.md"
src="$tmpdir"
out="$tmpdir/out"
KEWT_TMPDIR="$tmpdir/tmp"
mkdir -p "$KEWT_TMPDIR"
awk_dir="$project_dir/awk"
script_dir="$project_dir"
reset_config
load_config "$tmpdir/site.conf"
IGNORE_ARGS="-name '.kewtignore' -o -path '$src/.*'"
HIDE_ARGS="-name '.kewtignore' -o -name '.kewthide' -o -name '.kewtpreserve' -o -path '$src/.*'"
PRESERVE_ARGS="-false"
draft_mode="false"
build_markdown_manifest
visible_count=$(wc -l < "$manifest_visible_list")
assert_eq "1" "$visible_count" "without draft mode only normal page visible"
draft_mode="true"
build_markdown_manifest
visible_count=$(wc -l < "$manifest_visible_list")
assert_eq "2" "$visible_count" "with draft mode both pages visible"
rm -rf "$tmpdir"
}

146
tests/test_markdown.sh Normal file
View File

@@ -0,0 +1,146 @@
test_markdown_heading() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf '# Hello World\n\nSome content.\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<h1" "$result" "markdown heading tag"
assert_contains "Hello World" "$result" "markdown heading text"
rm -rf "$tmpdir"
}
test_markdown_paragraph() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf 'This is a paragraph.\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<p>" "$result" "markdown paragraph open"
assert_contains "This is a paragraph." "$result" "markdown paragraph text"
rm -rf "$tmpdir"
}
test_markdown_bold() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf 'This is **bold** text.\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<strong>bold</strong>" "$result" "markdown bold"
rm -rf "$tmpdir"
}
test_markdown_italic() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf 'This is *italic* text.\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<em>italic</em>" "$result" "markdown italic"
rm -rf "$tmpdir"
}
test_markdown_link() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf '[click here](https://example.com)\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains 'href="https://example.com"' "$result" "markdown link href"
assert_contains "click here" "$result" "markdown link text"
rm -rf "$tmpdir"
}
test_markdown_code_block() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
cat > "$tmpdir/test.md" <<EOF
\`\`\`
code here
\`\`\`
EOF
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<pre>" "$result" "markdown code block pre"
assert_contains "<code>" "$result" "markdown code block code"
rm -rf "$tmpdir"
}
test_markdown_unordered_list() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf -- '- item one\n- item two\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<ul>" "$result" "markdown list ul"
assert_contains "<li>item one</li>" "$result" "markdown list item one"
assert_contains "<li>item two</li>" "$result" "markdown list item two"
rm -rf "$tmpdir"
}
test_markdown_blockquote() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf '> This is a quote\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<blockquote>" "$result" "markdown blockquote"
rm -rf "$tmpdir"
}
test_markdown_frontmatter_stripped() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
cat > "$tmpdir/test.md" <<EOF
---
title = "Test"
---
# Heading
EOF
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<h1" "$result" "markdown frontmatter heading present"
assert_contains "Heading" "$result" "markdown frontmatter heading text"
result_not_contains=$(echo "$result" | grep -c 'title = "Test"')
assert_eq "0" "$result_not_contains" "markdown frontmatter not in output"
rm -rf "$tmpdir"
}
test_markdown_header_links() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
printf '# My Heading\n' > "$tmpdir/test.md"
result=$(ENABLE_HEADER_LINKS="true" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains 'id="my-heading"' "$result" "markdown header link id"
assert_contains 'href="#my-heading"' "$result" "markdown header link href"
rm -rf "$tmpdir"
}
test_markdown_pipe_table() {
tmpdir="${TMPDIR:-/tmp}/kewt_test.$$"
mkdir -p "$tmpdir"
cat > "$tmpdir/test.md" <<EOF
| A | B |
|---|---|
| 1 | 2 |
EOF
result=$(ENABLE_HEADER_LINKS="false" CUSTOM_ADMONITIONS="" MARKDOWN_SITE_ROOT="$tmpdir" MARKDOWN_FALLBACK_FILE="" sh "$project_dir/markdown.sh" "$tmpdir/test.md")
assert_contains "<table>" "$result" "markdown table"
assert_contains "<th>A</th>" "$result" "markdown table header"
assert_contains "<td>1</td>" "$result" "markdown table cell"
rm -rf "$tmpdir"
}

View File

@@ -69,3 +69,20 @@ test_trim_whitespace_tabs() {
result=$(trim_whitespace " world ")
assert_eq "world" "$result" "trim tabs"
}
test_is_posts_directory_rel() {
. "$project_dir/lib/config.sh"
. "$project_dir/lib/runtime.sh"
posts_dir="posts"
result=$(is_posts_directory_rel "posts" && echo "true" || echo "false")
assert_eq "true" "$result" "posts dir match"
result=$(is_posts_directory_rel "blog" && echo "true" || echo "false")
assert_eq "false" "$result" "posts dir no match"
posts_dir="./posts"
result=$(is_posts_directory_rel "posts" && echo "true" || echo "false")
assert_eq "true" "$result" "posts dir with dot prefix config"
}