defmodule DecentralisedBookIndex.Generators do @moduledoc "Generators for tests" use Ash.Generator alias DecentralisedBookIndex.Metadata @doc """ Generates user changesets with the `:register_with_password` action. """ def user(opts \\ []) do changeset_generator( DecentralisedBookIndex.Accounts.User, :register_with_password, defaults: [ # Generates unique values using an auto-incrementing sequence # eg. `user1@example.com`, `user2@example.com`, etc. email: sequence(:user_email, &"user#{&1}@example.com"), password: "password", password_confirmation: "password" ], overrides: opts, authorize?: false ) end def author(opts \\ []) do actor = opts[:actor] || once(:default_actor, fn -> generate(user()) end) changeset_generator( Metadata.Author, :create, defaults: [ name: sequence(:name, &"Author #{&1}"), description: sequence(:name, &"Description #{&1}"), author_alias_registry_id: nil ], overrides: opts, actor: actor ) end @doc """ Generates a list of author roles. Example: > author_roles = author_roles() """ def author_roles(opts \\ []) do actor = opts[:actor] || once(:default_actor, fn -> generate(user()) end) count = opts[:count] || 2 for order <- 1..count do %{order: order, author_id: generate(author(actor: actor)).id, role: ""} end end @doc """ Generates a list of bids. Example: > bids = bids() """ def bids(opts \\ []) do actor = opts[:actor] || once(:default_actor, fn -> generate(user()) end) count = opts[:count] || 2 types = ["isbn10", "isbn13", "asin"] if count > length(types), do: count = length(types) random_types = Enum.take_random(types, count) for {order, type} <- Enum.zip(1..count, random_types) do %{order: order, type: type, bid: "1234567890"} end end @doc """ Generates a publisher. """ def publisher(opts \\ []) do actor = opts[:actor] || once(:default_actor, fn -> generate(user()) end) changeset_generator( Metadata.Publisher, :create, defaults: [ name: sequence(:name, &"Publisher #{&1}"), ], overrides: opts, actor: actor ) end @doc """ Generates a book. """ def book(opts \\ []) do actor = opts[:actor] || once(:default_actor, fn -> generate(user()) end) bids = opts[:bids] || once(:default_bids, fn -> bids() end) author_roles = opts[:author_roles] || once(:default_author_roles, fn -> author_roles() end) publisher_id = opts[:publisher_id] || once(:default_publisher, fn -> generate(publisher()).id end) changeset_generator( Metadata.Book, :create, defaults: [ title: sequence(:name, &"Book #{&1}"), description: sequence(:description, &"Description #{&1}"), language: sequence(:language, &"Language #{&1}"), format: sequence(:format, &"Format #{&1}"), page_count: sequence(:page_count, & &1), published: sequence(:published, &Date.add(~D[2025-03-04], &1)), bids: bids, author_roles: author_roles, publisher_id: publisher_id, book_editions_registry_id: nil, ], overrides: opts, actor: actor ) end end