Commit 8fd2c8b1 authored by Stan Hu's avatar Stan Hu

Prevent attr_encrypted models from being overriden

Fix failing spec in spec/controllers/admin/hooks_controller_spec.rb

attr_encrypted expects models to have their attribute methods defined,
or it will override them with standard Ruby accessors. Migration specs
that rolled back the state of the database after columns were migrated
to encrypted values were interfering with these definitions. To ensure
that the SystemHook specs pass, we need to call
`SystemHook.define_attribute_methods` to ensure that attr_encrypted sees
the right methods that reflect the latest state of the database.

Closes https://gitlab.com/gitlab-org/gitlab-ee/issues/8234
parent f4023a69
module MigrationsHelpers module MigrationsHelpers
def active_record_base
ActiveRecord::Base
end
def table(name) def table(name)
Class.new(ActiveRecord::Base) do Class.new(active_record_base) do
self.table_name = name self.table_name = name
self.inheritance_column = :_type_disabled self.inheritance_column = :_type_disabled
...@@ -19,7 +23,7 @@ module MigrationsHelpers ...@@ -19,7 +23,7 @@ module MigrationsHelpers
end end
def clear_schema_cache! def clear_schema_cache!
ActiveRecord::Base.connection_pool.connections.each do |conn| active_record_base.connection_pool.connections.each do |conn|
conn.schema_cache.clear! conn.schema_cache.clear!
end end
end end
...@@ -40,11 +44,18 @@ module MigrationsHelpers ...@@ -40,11 +44,18 @@ module MigrationsHelpers
# Reset column information for the most offending classes **after** we # Reset column information for the most offending classes **after** we
# migrated the schema up, otherwise, column information could be # migrated the schema up, otherwise, column information could be
# outdated. We have a separate method for this so we can override it in EE. # outdated. We have a separate method for this so we can override it in EE.
ActiveRecord::Base.descendants.each(&method(:reset_column_information)) active_record_base.descendants.each(&method(:reset_column_information))
end
# Without that, we get errors because of missing attributes, e.g. def refresh_attribute_methods
# Without this, we get errors because of missing attributes, e.g.
# super: no superclass method `elasticsearch_indexing' for #<ApplicationSetting:0x00007f85628508d8> # super: no superclass method `elasticsearch_indexing' for #<ApplicationSetting:0x00007f85628508d8>
ApplicationSetting.define_attribute_methods # attr_encrypted also expects ActiveRecord attribute methods to be
# defined, or it will override the accessors:
# https://gitlab.com/gitlab-org/gitlab-ee/issues/8234#note_113976421
[ApplicationSetting, SystemHook].each do |model|
model.define_attribute_methods
end
end end
def reset_column_information(klass) def reset_column_information(klass)
...@@ -84,6 +95,7 @@ module MigrationsHelpers ...@@ -84,6 +95,7 @@ module MigrationsHelpers
end end
reset_column_in_all_models reset_column_in_all_models
refresh_attribute_methods
end end
def disable_migrations_output def disable_migrations_output
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment