defmodule BDS.Generation.ValidationTest do use ExUnit.Case, async: true alias BDS.Generation.Validation @base_url "https://example.com/blog" @post_url_path "/2026/06/01/sample-post" setup do temp_dir = Path.join(System.tmp_dir!(), "bds-validation-#{System.unique_integer([:positive])}") html_dir = Path.join(temp_dir, "html") post_html_path = Path.join([html_dir, "2026", "06", "01", "sample-post", "index.html"]) source_path = Path.join(temp_dir, "sample-post.md") File.mkdir_p!(Path.dirname(post_html_path)) File.write!(Path.join(html_dir, "index.html"), "home") File.write!(post_html_path, "post") File.write!(source_path, "Sample body") on_exit(fn -> File.rm_rf(temp_dir) end) %{html_dir: html_dir, post_html_path: post_html_path, source_path: source_path} end defp compare(html_dir, source_path, generated_updated_at_ms) do sitemap_xml = Enum.join([ ~s(), ~s(), ~s(#{@base_url}/), ~s(#{@base_url}#{@post_url_path}/), ~s() ]) Validation.compare_sitemap_to_html(%{ sitemap_xml: sitemap_xml, base_url: @base_url, html_dir: html_dir, on_progress: nil, post_timestamp_checks: [ %{ post_url_path: @post_url_path, post_file_path: source_path, generated_updated_at_ms: generated_updated_at_ms } ] }) end test "does not report a post as updated when its source mtime second adjoins the generation timestamp", %{html_dir: html_dir, post_html_path: post_html_path, source_path: source_path} do source_mtime = System.os_time(:second) File.touch!(source_path, source_mtime) File.touch!(post_html_path, source_mtime - 5) File.touch!(Path.join(html_dir, "index.html"), source_mtime - 5) generated_updated_at_ms = source_mtime * 1000 - 100 result = compare(html_dir, source_path, generated_updated_at_ms) assert result.missing_url_paths == [] assert result.extra_url_paths == [] assert result.updated_post_url_paths == [] end test "does not report a post as updated when its source mtime is in the same second as the generation timestamp", %{html_dir: html_dir, post_html_path: post_html_path, source_path: source_path} do source_mtime = System.os_time(:second) File.touch!(source_path, source_mtime) File.touch!(post_html_path, source_mtime - 5) File.touch!(Path.join(html_dir, "index.html"), source_mtime - 5) generated_updated_at_ms = source_mtime * 1000 + 500 result = compare(html_dir, source_path, generated_updated_at_ms) assert result.updated_post_url_paths == [] end test "reports a post as updated when its source mtime is beyond the granularity tolerance", %{html_dir: html_dir, post_html_path: post_html_path, source_path: source_path} do source_mtime = System.os_time(:second) File.touch!(source_path, source_mtime) File.touch!(post_html_path, source_mtime - 5) File.touch!(Path.join(html_dir, "index.html"), source_mtime - 5) generated_updated_at_ms = (source_mtime - 5) * 1000 result = compare(html_dir, source_path, generated_updated_at_ms) assert result.updated_post_url_paths == [@post_url_path] end end