Skip to content

Commit 46139d3

Browse files
committed
Merge pull request rails#15394 from morgoth/fix-automatic-maintaining-test-schema-for-sql-format
ActiveRecord::Migration.maintain_test_schema! doesn't work with structure.sql Conflicts: activerecord/CHANGELOG.md
2 parents 8f24787 + ad42aae commit 46139d3

File tree

4 files changed

+104
-2
lines changed

4 files changed

+104
-2
lines changed

activerecord/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
* Fixed automatic maintaining test schema to properly handle sql structure
2+
schema format.
3+
4+
Fixes #15394.
5+
6+
*Wojciech Wnętrzak*
7+
18
* Pluck now works when selecting columns from different tables with the same
29
name.
310

activerecord/lib/active_record/tasks/database_tasks.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,12 @@ def load_schema(format = ActiveRecord::Base.schema_format, file = nil)
161161
when :ruby
162162
file ||= File.join(db_dir, "schema.rb")
163163
check_schema_file(file)
164+
purge(current_config)
164165
load(file)
165166
when :sql
166167
file ||= File.join(db_dir, "structure.sql")
167168
check_schema_file(file)
169+
purge(current_config)
168170
structure_load(current_config, file)
169171
else
170172
raise ArgumentError, "unknown format #{format.inspect}"

activerecord/lib/active_record/tasks/sqlite_database_tasks.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ def drop
2121

2222
FileUtils.rm(file) if File.exist?(file)
2323
end
24-
alias :purge :drop
24+
25+
def purge
26+
drop
27+
create
28+
end
2529

2630
def charset
2731
connection.encoding

railties/test/application/test_test.rb

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_failure
6767
assert_match %r{/app/test/unit/failing_test\.rb}, output
6868
end
6969

70-
test "migrations" do
70+
test "ruby schema migrations" do
7171
output = script('generate model user name:string')
7272
version = output.match(/(\d+)_create_users\.rb/)[1]
7373

@@ -104,6 +104,95 @@ class UserTest < ActiveSupport::TestCase
104104
assert !result.include?("create_table(:users)")
105105
end
106106

107+
test "sql structure migrations" do
108+
output = script('generate model user name:string')
109+
version = output.match(/(\d+)_create_users\.rb/)[1]
110+
111+
app_file 'test/models/user_test.rb', <<-RUBY
112+
require 'test_helper'
113+
114+
class UserTest < ActiveSupport::TestCase
115+
test "user" do
116+
User.create! name: "Jon"
117+
end
118+
end
119+
RUBY
120+
121+
app_file 'db/structure.sql', ''
122+
app_file 'config/initializers/enable_sql_schema_format.rb', <<-RUBY
123+
Rails.application.config.active_record.schema_format = :sql
124+
RUBY
125+
126+
assert_unsuccessful_run "models/user_test.rb", "Migrations are pending"
127+
128+
app_file 'db/structure.sql', <<-SQL
129+
CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL);
130+
CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");
131+
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255));
132+
INSERT INTO schema_migrations (version) VALUES ('#{version}');
133+
SQL
134+
135+
app_file 'config/initializers/disable_maintain_test_schema.rb', <<-RUBY
136+
Rails.application.config.active_record.maintain_test_schema = false
137+
RUBY
138+
139+
assert_unsuccessful_run "models/user_test.rb", "Could not find table 'users'"
140+
141+
File.delete "#{app_path}/config/initializers/disable_maintain_test_schema.rb"
142+
143+
assert_successful_test_run('models/user_test.rb')
144+
end
145+
146+
test "sql structure migrations when adding column to existing table" do
147+
output_1 = script('generate model user name:string')
148+
version_1 = output_1.match(/(\d+)_create_users\.rb/)[1]
149+
150+
app_file 'test/models/user_test.rb', <<-RUBY
151+
require 'test_helper'
152+
class UserTest < ActiveSupport::TestCase
153+
test "user" do
154+
User.create! name: "Jon"
155+
end
156+
end
157+
RUBY
158+
159+
app_file 'config/initializers/enable_sql_schema_format.rb', <<-RUBY
160+
Rails.application.config.active_record.schema_format = :sql
161+
RUBY
162+
163+
app_file 'db/structure.sql', <<-SQL
164+
CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL);
165+
CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");
166+
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255));
167+
INSERT INTO schema_migrations (version) VALUES ('#{version_1}');
168+
SQL
169+
170+
assert_successful_test_run('models/user_test.rb')
171+
172+
output_2 = script('generate migration add_email_to_users')
173+
version_2 = output_2.match(/(\d+)_add_email_to_users\.rb/)[1]
174+
175+
app_file 'test/models/user_test.rb', <<-RUBY
176+
require 'test_helper'
177+
178+
class UserTest < ActiveSupport::TestCase
179+
test "user" do
180+
User.create! name: "Jon", email: "jon@doe.com"
181+
end
182+
end
183+
RUBY
184+
185+
app_file 'db/structure.sql', <<-SQL
186+
CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL);
187+
CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version");
188+
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "email" varchar(255));
189+
INSERT INTO schema_migrations (version) VALUES ('#{version_1}');
190+
INSERT INTO schema_migrations (version) VALUES ('#{version_2}');
191+
SQL
192+
193+
assert_successful_test_run('models/user_test.rb')
194+
end
195+
107196
private
108197
def assert_unsuccessful_run(name, message)
109198
result = run_test_file(name)

0 commit comments

Comments
 (0)