mirror of
https://github.com/ash-project/ash_postgres.git
synced 2024-09-21 05:53:18 +12:00
206 lines
5.1 KiB
Elixir
206 lines
5.1 KiB
Elixir
defmodule AshPostgres.MixSquashSnapshotsTest do
|
|
use AshPostgres.RepoCase, async: false
|
|
@moduletag :migration
|
|
|
|
defmacrop defposts(mod \\ Post, do: body) do
|
|
quote do
|
|
Code.compiler_options(ignore_module_conflict: true)
|
|
|
|
defmodule unquote(mod) do
|
|
use Ash.Resource,
|
|
domain: nil,
|
|
data_layer: AshPostgres.DataLayer
|
|
|
|
postgres do
|
|
table "posts"
|
|
repo(AshPostgres.TestRepo)
|
|
|
|
custom_indexes do
|
|
# need one without any opts
|
|
index(["id"])
|
|
index(["id"], unique: true, name: "test_unique_index")
|
|
end
|
|
end
|
|
|
|
actions do
|
|
defaults([:create, :read, :update, :destroy])
|
|
end
|
|
|
|
unquote(body)
|
|
end
|
|
|
|
Code.compiler_options(ignore_module_conflict: false)
|
|
end
|
|
end
|
|
|
|
defmacrop defdomain(resources) do
|
|
quote do
|
|
Code.compiler_options(ignore_module_conflict: true)
|
|
|
|
defmodule Domain do
|
|
use Ash.Domain
|
|
|
|
resources do
|
|
for resource <- unquote(resources) do
|
|
resource(resource)
|
|
end
|
|
end
|
|
end
|
|
|
|
Code.compiler_options(ignore_module_conflict: false)
|
|
end
|
|
end
|
|
|
|
def squash_snapshots(args) do
|
|
args = ["--snapshot-path", "test_snapshots_path"] ++ args
|
|
Mix.Task.rerun("ash_postgres.squash_snapshots", args)
|
|
end
|
|
|
|
def list_snapshots do
|
|
Path.wildcard("test_snapshots_path/**/[0-9]*.json")
|
|
end
|
|
|
|
describe "with two snapshots to squash" do
|
|
setup do
|
|
on_exit(fn ->
|
|
File.rm_rf!("test_snapshots_path")
|
|
File.rm_rf!("test_migration_path")
|
|
end)
|
|
|
|
Mix.shell(Mix.Shell.Process)
|
|
|
|
defposts do
|
|
identities do
|
|
identity(:title, [:title])
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key(:id)
|
|
attribute(:title, :string, public?: true)
|
|
end
|
|
end
|
|
|
|
defdomain([Post])
|
|
|
|
AshPostgres.MigrationGenerator.generate(Domain,
|
|
snapshot_path: "test_snapshots_path",
|
|
migration_path: "test_migration_path",
|
|
quiet: true,
|
|
format: false
|
|
)
|
|
|
|
defposts do
|
|
identities do
|
|
identity(:title, [:title])
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key(:id)
|
|
attribute(:title, :string, public?: true)
|
|
attribute(:name, :string, allow_nil?: false, public?: true)
|
|
end
|
|
end
|
|
|
|
AshPostgres.MigrationGenerator.generate(Domain,
|
|
snapshot_path: "test_snapshots_path",
|
|
migration_path: "test_migration_path",
|
|
quiet: true,
|
|
format: false
|
|
)
|
|
|
|
:ok
|
|
end
|
|
|
|
test "runs without flags" do
|
|
[_first_snapshot, last_snapshot] = list_snapshots() |> Enum.sort()
|
|
squash_snapshots([])
|
|
assert [^last_snapshot] = list_snapshots()
|
|
end
|
|
|
|
test "runs with `--check`" do
|
|
prev_snapshots = list_snapshots()
|
|
assert catch_exit(squash_snapshots(["--check"])) == {:shutdown, 1}
|
|
assert prev_snapshots == list_snapshots()
|
|
end
|
|
|
|
test "runs with `--dry-run`" do
|
|
prev_snapshots = list_snapshots()
|
|
squash_snapshots(["--dry-run"])
|
|
assert prev_snapshots == list_snapshots()
|
|
end
|
|
|
|
test "runs with `--into last`" do
|
|
[_first_snapshot, last_snapshot] = list_snapshots() |> Enum.sort()
|
|
squash_snapshots(["--into", "last"])
|
|
assert [^last_snapshot] = list_snapshots()
|
|
end
|
|
|
|
test "runs with `--into first`" do
|
|
[first_snapshot, _last_snapshot] = list_snapshots() |> Enum.sort()
|
|
squash_snapshots(["--into", "first"])
|
|
assert [^first_snapshot] = list_snapshots()
|
|
end
|
|
|
|
test "runs with `--into zero`" do
|
|
squash_snapshots(["--into", "zero"])
|
|
assert ["test_snapshots_path/test_repo/posts/00000000000000.json"] = list_snapshots()
|
|
end
|
|
end
|
|
|
|
describe "with one snapshot to squash" do
|
|
setup do
|
|
on_exit(fn ->
|
|
File.rm_rf!("test_snapshots_path")
|
|
File.rm_rf!("test_migration_path")
|
|
end)
|
|
|
|
Mix.shell(Mix.Shell.Process)
|
|
|
|
defposts do
|
|
identities do
|
|
identity(:title, [:title])
|
|
end
|
|
|
|
attributes do
|
|
uuid_primary_key(:id)
|
|
attribute(:title, :string, public?: true)
|
|
end
|
|
end
|
|
|
|
defdomain([Post])
|
|
|
|
AshPostgres.MigrationGenerator.generate(Domain,
|
|
snapshot_path: "test_snapshots_path",
|
|
migration_path: "test_migration_path",
|
|
quiet: true,
|
|
format: false
|
|
)
|
|
|
|
:ok
|
|
end
|
|
|
|
test "runs with `--check`" do
|
|
prev_snapshots = list_snapshots()
|
|
squash_snapshots(["--check"])
|
|
assert prev_snapshots == list_snapshots()
|
|
end
|
|
|
|
test "runs with `--check --into last`" do
|
|
prev_snapshots = list_snapshots()
|
|
squash_snapshots(["--check", "--into", "last"])
|
|
assert prev_snapshots == list_snapshots()
|
|
end
|
|
|
|
test "runs with `--check --into first`" do
|
|
prev_snapshots = list_snapshots()
|
|
squash_snapshots(["--check", "--into", "last"])
|
|
assert prev_snapshots == list_snapshots()
|
|
end
|
|
|
|
test "runs with `--check --into zero`" do
|
|
prev_snapshots = list_snapshots()
|
|
assert catch_exit(squash_snapshots(["--check", "--into", "zero"])) == {:shutdown, 1}
|
|
assert prev_snapshots == list_snapshots()
|
|
end
|
|
end
|
|
end
|