defmodule Blogex.Test.PostBuilder do @moduledoc """ Builds `%Blogex.Post{}` structs for tests. Call `build/0` for a post with sensible defaults, or `build/1` with a keyword list to override only the fields that matter for your specific test. build() # generic post build(title: "Specific Title") # override one field build(tags: ~w(elixir otp), blog: :eng) # override several build(published: false) # draft post """ @defaults %{ id: "a-blog-post", title: "A Blog Post", author: "Test Author", body: "
Post body.
", description: "A test post", date: ~D[2026-01-15], tags: ["general"], blog: :test_blog, published: true } @doc "Build a post with defaults, merging any overrides." def build(overrides \\ []) do attrs = Map.merge(@defaults, Map.new(overrides)) struct!(Blogex.Post, attrs) end @doc "Build a list of n posts with sequential dates (newest first)." def build_many(n, overrides \\ []) do Enum.map(1..n, fn i -> build( Keyword.merge( [ id: "post-#{i}", title: "Post #{i}", date: Date.add(~D[2026-01-01], n - i) ], overrides ) ) end) end end