Skip to content

Commit bb9d6eb

Browse files
committed
Add additional raise UnknownMigrationVersionError
Raise error on the movement of migrations when the current migration does not exist.
1 parent b77d2aa commit bb9d6eb

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

activerecord/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
* Raise error `UnknownMigrationVersionError` on the movement of migrations
2+
when the current migration does not exist.
3+
4+
*bogdanvlviv*
5+
16
* Fix `bin/rails db:forward` first migration.
27

38
*bogdanvlviv*

activerecord/lib/active_record/migration.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,18 +1105,20 @@ def migration_files(paths)
11051105
def move(direction, migrations_paths, steps)
11061106
migrator = new(direction, migrations(migrations_paths))
11071107

1108+
if current_version != 0 && !migrator.current_migration
1109+
raise UnknownMigrationVersionError.new(current_version)
1110+
end
1111+
11081112
start_index =
11091113
if current_version == 0
11101114
0
11111115
else
11121116
migrator.migrations.index(migrator.current_migration)
11131117
end
11141118

1115-
if start_index
1116-
finish = migrator.migrations[start_index + steps]
1117-
version = finish ? finish.version : 0
1118-
send(direction, migrations_paths, version)
1119-
end
1119+
finish = migrator.migrations[start_index + steps]
1120+
version = finish ? finish.version : 0
1121+
send(direction, migrations_paths, version)
11201122
end
11211123
end
11221124

railties/test/application/rake/migrations_test.rb

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,37 @@ class AMigration < ActiveRecord::Migration::Current
167167
end
168168
end
169169

170+
test "raise error on any move when current migration does not exist" do
171+
Dir.chdir(app_path) do
172+
`bin/rails generate model user username:string password:string;
173+
bin/rails generate migration add_email_to_users email:string;
174+
bin/rails db:migrate
175+
rm db/migrate/*email*.rb`
176+
177+
output = `bin/rails db:migrate:status`
178+
assert_match(/up\s+\d{14}\s+Create users/, output)
179+
assert_match(/up\s+\d{14}\s+\** NO FILE \**/, output)
180+
181+
output = `bin/rails db:rollback 2>&1`
182+
assert_match(/rails aborted!/, output)
183+
assert_match(/ActiveRecord::UnknownMigrationVersionError:/, output)
184+
assert_match(/No migration with version number\s\d{14}\./, output)
185+
186+
output = `bin/rails db:migrate:status`
187+
assert_match(/up\s+\d{14}\s+Create users/, output)
188+
assert_match(/up\s+\d{14}\s+\** NO FILE \**/, output)
189+
190+
output = `bin/rails db:forward 2>&1`
191+
assert_match(/rails aborted!/, output)
192+
assert_match(/ActiveRecord::UnknownMigrationVersionError:/, output)
193+
assert_match(/No migration with version number\s\d{14}\./, output)
194+
195+
output = `bin/rails db:migrate:status`
196+
assert_match(/up\s+\d{14}\s+Create users/, output)
197+
assert_match(/up\s+\d{14}\s+\** NO FILE \**/, output)
198+
end
199+
end
200+
170201
test "migration status after rollback and redo without timestamps" do
171202
add_to_config("config.active_record.timestamped_migrations = false")
172203

@@ -257,7 +288,6 @@ class TwoMigration < ActiveRecord::Migration::Current
257288
rm db/migrate/*email*.rb`
258289

259290
output = `bin/rails db:migrate:status`
260-
File.write("test.txt", output)
261291

262292
assert_match(/up\s+\d{14}\s+Create users/, output)
263293
assert_match(/up\s+\d{14}\s+\** NO FILE \**/, output)

0 commit comments

Comments
 (0)