Goal: have a personal blog, and try out another point in the 'modular app design with elixir' space. Designing OTP systems with elixir had some interesting ideas.
49 lines
1.3 KiB
Elixir
49 lines
1.3 KiB
Elixir
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: "<p>Post body.</p>",
|
|
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
|