FIX: Allow post migrations using `#change` to carry out unsafe migration

FIX: Allow post migrations using #change to carry out unsafe migration

diff --git a/lib/migration/safe_migrate.rb b/lib/migration/safe_migrate.rb
index cf6c43b..0b65ee0 100644
--- a/lib/migration/safe_migrate.rb
+++ b/lib/migration/safe_migrate.rb
@@ -34,13 +34,17 @@ class Migration::SafeMigrate
     private
 
     def is_post_deploy_migration?
+      instance_methods = self.class.instance_methods(false)
+
       method =
-        if self.respond_to?(:up)
+        if instance_methods.include?(:up)
           :up
-        elsif self.respond_to?(:change)
+        elsif instance_methods.include?(:change)
           :change
         end
 
+      return false if !method
+
       self.method(method).source_location.first.include?(
         Discourse::DB_POST_MIGRATE_PATH
       )
diff --git a/spec/components/migration/safe_migrate_spec.rb b/spec/components/migration/safe_migrate_spec.rb
index f7d3a38..d15416e 100644
--- a/spec/components/migration/safe_migrate_spec.rb
+++ b/spec/components/migration/safe_migrate_spec.rb
@@ -99,18 +99,28 @@ describe Migration::SafeMigrate do
   end
 
   describe 'for a post deployment migration' do
-    it 'should not ban unsafe migrations' do
-      user = Fabricate(:user)
+    it 'should not ban unsafe migrations using up' do
       Migration::SafeMigrate::SafeMigration.enable_safe!
 
-      path = File.expand_path "#{Rails.root}/spec/fixtures/db/post_migrate"
+      path = File.expand_path "#{Rails.root}/spec/fixtures/db/post_migrate/drop_table"
+
+      output = capture_stdout do
+        migrate_up(path)
+      end
+
+      expect(output).to include("drop_table(:email_logs)")
+    end
+
+    it 'should not ban unsafe migrations using change' do
+      Migration::SafeMigrate::SafeMigration.enable_safe!
+
+      path = File.expand_path "#{Rails.root}/spec/fixtures/db/post_migrate/change"
 
       output = capture_stdout do
         migrate_up(path)
       end
 
       expect(output).to include("drop_table(:email_logs)")
-      expect(user.reload).to eq(user)
     end
   end
 end
diff --git a/spec/fixtures/db/post_migrate/change/20990309014015_drop_email_logs.rb b/spec/fixtures/db/post_migrate/change/20990309014015_drop_email_logs.rb
new file mode 100644
index 0000000..7b4b1e2
--- /dev/null
+++ b/spec/fixtures/db/post_migrate/change/20990309014015_drop_email_logs.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class DropEmailLogs < ActiveRecord::Migration[5.2]
+  DROPPED_TABLES ||= %i{email_logs}
+
+  def change
+    drop_table :email_logs
+    raise ActiveRecord::Rollback
+  end
+end

GitHub sha: 9ab5801a

2 Likes