Packages
ecto_sql
3.0.0
3.14.0
3.13.5
3.13.4
3.13.3
3.13.2
3.13.1
3.13.0
3.12.1
3.12.0
3.11.3
3.11.2
3.11.1
3.11.0
3.10.2
3.10.1
3.10.0
3.9.2
3.9.1
3.9.0
3.8.3
3.8.2
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.2
3.6.1
3.6.0
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.5.0-rc.0
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.2
3.2.1
3.2.0
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.1
3.0.0-rc.0
SQL-based adapters for Ecto and database migrations
Current section
Files
Jump to
Current section
Files
integration_test/sql/migrator.exs
Code.require_file "../support/file_helpers.exs", __DIR__
defmodule Ecto.Integration.MigratorTest do
use Ecto.Integration.Case
import Support.FileHelpers
import Ecto.Migrator, only: [migrated_versions: 1]
alias Ecto.Integration.PoolRepo
alias Ecto.Migration.SchemaMigration
setup do
PoolRepo.delete_all(SchemaMigration)
:ok
end
defmodule GoodMigration do
use Ecto.Migration
def up do
:ok
end
def down do
:ok
end
end
defmodule BadMigration do
use Ecto.Migration
def change do
execute "CREATE WHAT"
end
end
import Ecto.Migrator
test "schema migration" do
up(PoolRepo, 30, GoodMigration, log: false)
[migration] = PoolRepo.all(SchemaMigration)
assert migration.version == 30
assert migration.inserted_at
end
test "migrations up and down" do
assert migrated_versions(PoolRepo) == []
assert up(PoolRepo, 31, GoodMigration, log: false) == :ok
assert migrated_versions(PoolRepo) == [31]
assert up(PoolRepo, 31, GoodMigration, log: false) == :already_up
assert migrated_versions(PoolRepo) == [31]
assert down(PoolRepo, 32, GoodMigration, log: false) == :already_down
assert migrated_versions(PoolRepo) == [31]
assert down(PoolRepo, 31, GoodMigration, log: false) == :ok
assert migrated_versions(PoolRepo) == []
end
test "bad migration" do
assert catch_error(up(PoolRepo, 31, BadMigration, log: false))
end
test "run up to/step migration" do
in_tmp fn path ->
create_migration(47)
create_migration(48)
assert [47] = run(PoolRepo, path, :up, step: 1, log: false)
assert count_entries() == 1
assert [48] = run(PoolRepo, path, :up, to: 48, log: false)
end
end
test "run down to/step migration" do
in_tmp fn path ->
migrations = [
create_migration(49),
create_migration(50),
]
assert [49, 50] = run(PoolRepo, path, :up, all: true, log: false)
purge migrations
assert [50] = run(PoolRepo, path, :down, step: 1, log: false)
purge migrations
assert count_entries() == 1
assert [50] = run(PoolRepo, path, :up, to: 50, log: false)
end
end
test "runs all migrations" do
in_tmp fn path ->
migrations = [
create_migration(53),
create_migration(54),
]
assert [53, 54] = run(PoolRepo, path, :up, all: true, log: false)
assert [] = run(PoolRepo, path, :up, all: true, log: false)
purge migrations
assert [54, 53] = run(PoolRepo, path, :down, all: true, log: false)
purge migrations
assert count_entries() == 0
assert [53, 54] = run(PoolRepo, path, :up, all: true, log: false)
end
end
test "raises when connection pool is too small" do
config = Application.fetch_env!(:ecto_sql, PoolRepo)
Application.put_env(:ecto_sql, __MODULE__.SingleConnectionRepo, Keyword.put(config, :pool_size, 1))
defmodule SingleConnectionRepo do
use Ecto.Repo, otp_app: :ecto_sql, adapter: PoolRepo.__adapter__
end
{:ok, _pid} = SingleConnectionRepo.start_link
in_tmp fn path ->
exception_message = ~r/Migrations failed to run because the connection pool size is less than 2/
assert_raise Ecto.MigrationError, exception_message, fn ->
run(SingleConnectionRepo, path, :up, all: true, log: false)
end
end
end
defp count_entries() do
PoolRepo.aggregate(SchemaMigration, :count, :version)
end
defp create_migration(num) do
module = Module.concat(__MODULE__, "Migration#{num}")
File.write! "#{num}_migration_#{num}.exs", """
defmodule #{module} do
use Ecto.Migration
def up do
update &[#{num}|&1]
end
def down do
update &List.delete(&1, #{num})
end
defp update(fun) do
Process.put(:migrations, fun.(Process.get(:migrations) || []))
end
end
"""
module
end
defp purge(modules) do
Enum.each(List.wrap(modules), fn m ->
:code.delete m
:code.purge m
end)
end
end