alter.exs (2432B)
1 defmodule Ecto.Integration.AlterTest do 2 use Ecto.Integration.Case, async: false 3 4 alias Ecto.Integration.PoolRepo 5 6 defmodule AlterMigrationOne do 7 use Ecto.Migration 8 9 def up do 10 create table(:alter_col_type) do 11 add :value, :integer 12 end 13 14 execute "INSERT INTO alter_col_type (value) VALUES (1)" 15 end 16 17 def down do 18 drop table(:alter_col_type) 19 end 20 end 21 22 defmodule AlterMigrationTwo do 23 use Ecto.Migration 24 25 def up do 26 alter table(:alter_col_type) do 27 modify :value, :numeric 28 end 29 end 30 31 def down do 32 alter table(:alter_col_type) do 33 modify :value, :integer 34 end 35 end 36 end 37 38 import Ecto.Query, only: [from: 1, from: 2] 39 40 defp run(direction, repo, module) do 41 Ecto.Migration.Runner.run(repo, repo.config(), 1, module, :forward, direction, direction, log: false) 42 end 43 44 test "reset cache on returning query after alter column type" do 45 values = from v in "alter_col_type", select: v.value 46 47 assert :ok == run(:up, PoolRepo, AlterMigrationOne) 48 assert PoolRepo.all(values) == [1] 49 50 assert :ok == run(:up, PoolRepo, AlterMigrationTwo) 51 [%Decimal{}] = PoolRepo.all(values) 52 53 PoolRepo.transaction(fn() -> 54 assert [%Decimal{}] = PoolRepo.all(values) 55 assert :ok == run(:down, PoolRepo, AlterMigrationTwo) 56 57 # Optionally fail once with database error when 58 # already prepared on connection (and clear cache) 59 try do 60 PoolRepo.all(values, [mode: :savepoint]) 61 rescue 62 _ -> 63 assert PoolRepo.all(values) == [1] 64 else 65 result -> 66 assert result == [1] 67 end 68 end) 69 after 70 assert :ok == run(:down, PoolRepo, AlterMigrationOne) 71 end 72 73 test "reset cache on parameterized query after alter column type" do 74 values = from v in "alter_col_type" 75 76 assert :ok == run(:up, PoolRepo, AlterMigrationOne) 77 assert PoolRepo.update_all(values, [set: [value: 2]]) == {1, nil} 78 79 assert :ok == run(:up, PoolRepo, AlterMigrationTwo) 80 assert PoolRepo.update_all(values, [set: [value: 3]]) == {1, nil} 81 82 PoolRepo.transaction(fn() -> 83 assert PoolRepo.update_all(values, [set: [value: Decimal.new(5)]]) == {1, nil} 84 assert :ok == run(:down, PoolRepo, AlterMigrationTwo) 85 assert PoolRepo.update_all(values, [set: [value: 6]]) == {1, nil} 86 end) 87 after 88 assert :ok == run(:down, PoolRepo, AlterMigrationOne) 89 end 90 end