AshRandomParams

View Source

A library that generates random parameters for Ash resource actions. It provides a convenient way to create random test data for your Ash resources by automatically generating random values for accepts and arguments.

Usage

Add the random_params DSL to your Ash resource:

defmodule Post do
  use Ash.Resource, extensions: [AshRandomParams]

  attributes do
    uuid_primary_key :id
    attribute :author, :string, allow_nil?: false
    attribute :title, :string, allow_nil?: false
    attribute :content, :string, allow_nil?: true
    attribute :tag, :string, allow_nil?: false, default: "JS"
  end

  random_params do
    random MyRandom  # Optional: specify your custom random generator
  end
end

Using Random Params

# Basic usage
Post.random_params!(:create)
=> %{author: "author-81491", title: "title-388112", content: nil, tag: "JS"}

# With initial params
Post.random_params!(:create, %{author: "James"})
=> %{author: "James", title: "title-388112", content: nil, tag: "JS"}

# With options
Post.random_params!(:create, %{author: "James"}, %{
  populate: [:content],   
  omit: [:title],   
  include_defaults?: false
})
=> %{author: "James", content: "content-38128"}

Default Behavior

By default, it generates random values for accepts and arguments that have allow_nil?: false and no default value (default == nil). In the example above, author and title fall into this category.

Belongs To Relationships

For accepts and arguments that match the name or source_attribute of a belongs_to relationship:

  • In create actions, they are generated with nil values
  • In other actions, they are not generated at all

This behavior exists because:

  • In create actions, omitting a value is equivalent to setting it to nil
  • In update actions, omitting a value preserves the existing relationship, while explicitly setting it to nil removes the relationship

Options

  • populate: Forces generation of random values for specified accepts/arguments, overriding the default behavior
  • omit: Prevents generation of random values for specified accepts/arguments, overriding the default behavior
  • include_defaults?: When set to true, includes default values for accepts/arguments that have either allow_nil?: true or a non-nil default value. Defaults to true. In the example above, this would add %{content: nil, tag: "JS"} to the generated params.

Custom Random Generator

You can implement a custom random generator by using the AshRandomParams.Random behaviour:

defmodule MyRandom do
  use AshRandomParams.Random

  @impl AshRandomParams.Random
  def random(%{type: Ash.Type.Integer}, _opts, _context) do
    777
  end

  @impl AshRandomParams.Random
  def random(attr_or_arg, opts, context) do
    # Fallback to DefaultRandom for all other types
    AshRandomParams.DefaultRandom.random(attr_or_arg, opts, context)
  end
end

Features

  • Automatically generates random values for action accepts and arguments
  • Supports custom random value generators
  • Useful for testing and development

Installation

Add ash_random_params to your list of dependencies in mix.exs:

def deps do
  [
    {:ash_random_params, "~> 0.1.0"}
  ]
end

License

MIT