mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 21:43:02 +12:00
65e26cbc16
* feat: Ash.create and Ash.update oneliner See #1015. * fix: opts dispatch for create and update * chore: shorten arguments by args
153 lines
4.3 KiB
Elixir
153 lines
4.3 KiB
Elixir
defmodule Ash.Test.AshTest do
|
|
@moduledoc false
|
|
use ExUnit.Case, async: true
|
|
|
|
defmodule Domain do
|
|
use Ash.Domain
|
|
|
|
resources do
|
|
allow_unregistered? true
|
|
end
|
|
end
|
|
|
|
defmodule User do
|
|
@moduledoc false
|
|
|
|
use Ash.Resource,
|
|
domain: Domain
|
|
|
|
attributes do
|
|
uuid_primary_key :id
|
|
|
|
attribute :name, :string, public?: true
|
|
|
|
attribute :state, :atom do
|
|
public? true
|
|
default :sleeping
|
|
constraints one_of: [:sleeping, :awake]
|
|
end
|
|
end
|
|
|
|
actions do
|
|
default_accept [:name, :state]
|
|
defaults [:create, :update]
|
|
|
|
create :create_awake do
|
|
accept [:name]
|
|
|
|
argument :name, :string
|
|
|
|
change set_attribute(:name, arg(:name))
|
|
change set_attribute(:state, :awake)
|
|
end
|
|
|
|
update :update_state do
|
|
accept [:state]
|
|
|
|
argument :state, :atom
|
|
|
|
change set_attribute(:state, arg(:state))
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "create/1" do
|
|
test "with a {resource, args} as first argument" do
|
|
assert {:ok, %User{name: "John"}} = Ash.create({User, name: "John"})
|
|
assert {:ok, %User{name: "John"}} = Ash.create({User, %{name: "John"}})
|
|
end
|
|
end
|
|
|
|
describe "create/2" do
|
|
test "with a {record, args} as first argument and explicit action" do
|
|
assert {:ok, %User{name: "John"}} =
|
|
Ash.create({User, name: "John"}, action: :create)
|
|
|
|
assert {:ok, %User{name: "John"}} =
|
|
Ash.create({User, %{name: "John"}}, action: :create)
|
|
|
|
assert {:ok, %User{name: "John", state: :awake}} =
|
|
Ash.create({User, name: "John"}, action: :create_awake)
|
|
|
|
assert {:ok, %User{name: "John", state: :awake}} =
|
|
Ash.create({User, %{name: "John"}}, action: :create_awake)
|
|
end
|
|
end
|
|
|
|
describe "create!/1" do
|
|
test "with a {resource, args} as first argument" do
|
|
assert %User{name: "John"} = Ash.create!({User, name: "John"})
|
|
assert %User{name: "John"} = Ash.create!({User, %{name: "John"}})
|
|
end
|
|
end
|
|
|
|
describe "create!/2" do
|
|
test "with a {record, args} as first argument and explicit action" do
|
|
assert %User{name: "John"} =
|
|
Ash.create!({User, name: "John"}, action: :create)
|
|
|
|
assert %User{name: "John"} =
|
|
Ash.create!({User, %{name: "John"}}, action: :create)
|
|
|
|
assert %User{name: "John", state: :awake} =
|
|
Ash.create!({User, name: "John"}, action: :create_awake)
|
|
|
|
assert %User{name: "John", state: :awake} =
|
|
Ash.create!({User, %{name: "John"}}, action: :create_awake)
|
|
end
|
|
end
|
|
|
|
describe "update/1" do
|
|
test "with a {record, args} as first argument" do
|
|
user = Ash.create!({User, name: "John"})
|
|
|
|
assert {:ok, %User{name: "Jane"}} = Ash.update({user, name: "Jane"})
|
|
assert {:ok, %User{name: "Jane"}} = Ash.update({user, %{name: "Jane"}})
|
|
end
|
|
end
|
|
|
|
describe "update/2" do
|
|
test "with a {record, args} as first argument and explicit action" do
|
|
user = Ash.create!({User, name: "John"})
|
|
|
|
assert {:ok, %User{name: "Jane"}} =
|
|
Ash.update({user, name: "Jane"}, action: :update)
|
|
|
|
assert {:ok, %User{name: "Jane"}} =
|
|
Ash.update({user, %{name: "Jane"}}, action: :update)
|
|
|
|
assert {:ok, %User{name: "John", state: :awake}} =
|
|
Ash.update({user, state: :awake}, action: :update_state)
|
|
|
|
assert {:ok, %User{name: "John", state: :awake}} =
|
|
Ash.update({user, %{state: :awake}}, action: :update_state)
|
|
end
|
|
end
|
|
|
|
describe "update!/1" do
|
|
test "with a {record, args} as first argument" do
|
|
user = Ash.create!({User, name: "John"})
|
|
|
|
assert %User{name: "Jane"} = Ash.update!({user, name: "Jane"})
|
|
assert %User{name: "Jane"} = Ash.update!({user, %{name: "Jane"}})
|
|
end
|
|
end
|
|
|
|
describe "update!/2" do
|
|
test "with a {record, args} as first argument and explicit action" do
|
|
user = Ash.create!({User, name: "John"})
|
|
|
|
assert %User{name: "Jane"} =
|
|
Ash.update!({user, name: "Jane"}, action: :update)
|
|
|
|
assert %User{name: "Jane"} =
|
|
Ash.update!({user, %{name: "Jane"}}, action: :update)
|
|
|
|
assert %User{name: "John", state: :awake} =
|
|
Ash.update!({user, state: :awake}, action: :update_state)
|
|
|
|
assert %User{name: "John", state: :awake} =
|
|
Ash.update!({user, %{state: :awake}}, action: :update_state)
|
|
end
|
|
end
|
|
end
|