ash_sqlite/test/atomics_test.exs

76 lines
2 KiB
Elixir
Raw Normal View History

2023-09-23 14:52:22 +12:00
defmodule AshSqlite.AtomicsTest do
use AshSqlite.RepoCase, async: false
alias AshSqlite.Test.Post
2023-09-23 14:52:22 +12:00
import Ash.Expr
2023-10-12 08:39:36 +13:00
test "atomics work on upserts" do
id = Ash.UUID.generate()
Post
|> Ash.Changeset.for_create(:create, %{id: id, title: "foo", price: 1}, upsert?: true)
|> Ash.Changeset.atomic_update(:price, expr(price + 1))
|> Ash.create!()
2023-10-12 08:39:36 +13:00
Post
|> Ash.Changeset.for_create(:create, %{id: id, title: "foo", price: 1}, upsert?: true)
|> Ash.Changeset.atomic_update(:price, expr(price + 1))
|> Ash.create!()
2023-10-12 08:39:36 +13:00
assert [%{price: 2}] = Post |> Ash.read!()
2023-10-12 08:39:36 +13:00
end
2023-09-23 14:52:22 +12:00
test "a basic atomic works" do
post =
Post
|> Ash.Changeset.for_create(:create, %{title: "foo", price: 1})
|> Ash.create!()
2023-09-23 14:52:22 +12:00
assert %{price: 2} =
post
|> Ash.Changeset.for_update(:update, %{})
|> Ash.Changeset.atomic_update(:price, expr(price + 1))
|> Ash.update!()
2023-09-23 14:52:22 +12:00
end
test "an atomic that violates a constraint will return the proper error" do
post =
Post
|> Ash.Changeset.for_create(:create, %{title: "foo", price: 1})
|> Ash.create!()
2023-09-23 14:52:22 +12:00
assert_raise Ash.Error.Invalid, ~r/does not exist/, fn ->
post
|> Ash.Changeset.for_update(:update, %{})
|> Ash.Changeset.atomic_update(:organization_id, Ash.UUID.generate())
|> Ash.update!()
2023-09-23 14:52:22 +12:00
end
end
test "an atomic can refer to a calculation" do
post =
Post
|> Ash.Changeset.for_create(:create, %{title: "foo", price: 1})
|> Ash.create!()
2023-09-23 14:52:22 +12:00
post =
post
|> Ash.Changeset.for_update(:update, %{})
|> Ash.Changeset.atomic_update(:score, expr(score_after_winning))
|> Ash.update!()
2023-09-23 14:52:22 +12:00
assert post.score == 1
end
test "an atomic can be attached to an action" do
post =
Post
|> Ash.Changeset.for_create(:create, %{title: "foo", price: 1})
|> Ash.create!()
2023-09-23 14:52:22 +12:00
assert Post.increment_score!(post, 2).score == 2
assert Post.increment_score!(post, 2).score == 4
end
end