mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 12:40:40 +08:00
243fcb6ffc
This commit introduces the `run_theme_migration` spec helper to allow theme developers to write RSpec tests for theme migrations. For example, this allows the following RSpec test to be written in themes: ``` RSpec.describe "0003-migrate-small-links-setting migration" do let!(:theme) { upload_theme_component } it "should set target property to `_blank` if previous target component is not valid or empty" do theme.theme_settings.create!( name: "small_links", theme: theme, data_type: ThemeSetting.types[:string], value: "some text, #|some text 2, #, invalid target", ) run_theme_migration(theme, "0003-migrate-small-links-setting") expect(theme.settings[:small_links].value).to eq( [ { "text" => "some text", "url" => "#", "target" => "_blank" }, { "text" => "some text 2", "url" => "#", "target" => "_blank" }, ], ) end end ``` This change is being introduced because we realised that writting just javascript tests for the migrations is insufficient since javascript tests do not ensure that the migrated theme settings can actually be successfully saved into the database. Hence, we are introduce this helper as a way for theme developers to write "end-to-end" migrations tests.
55 lines
1.6 KiB
Ruby
55 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ThemeSettingsMigration < ActiveRecord::Base
|
|
belongs_to :theme
|
|
belongs_to :theme_field
|
|
|
|
validates :theme_id, presence: true, uniqueness: { scope: :version }
|
|
validates :theme_field_id, presence: true
|
|
|
|
validates :version, presence: true
|
|
validates :name, presence: true
|
|
validates :diff, presence: true
|
|
|
|
def calculate_diff(settings_before, settings_after)
|
|
diff = { additions: [], deletions: [] }
|
|
|
|
before_keys = settings_before.keys
|
|
after_keys = settings_after.keys
|
|
|
|
removed_keys = before_keys - after_keys
|
|
removed_keys.each { |key| diff[:deletions] << { key: key, val: settings_before[key] } }
|
|
|
|
added_keys = after_keys - before_keys
|
|
added_keys.each { |key| diff[:additions] << { key: key, val: settings_after[key] } }
|
|
|
|
common_keys = before_keys & after_keys
|
|
common_keys.each do |key|
|
|
if settings_before[key] != settings_after[key]
|
|
diff[:deletions] << { key: key, val: settings_before[key] }
|
|
diff[:additions] << { key: key, val: settings_after[key] }
|
|
end
|
|
end
|
|
|
|
self.diff = diff
|
|
end
|
|
end
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: theme_settings_migrations
|
|
#
|
|
# id :bigint not null, primary key
|
|
# theme_id :integer not null
|
|
# theme_field_id :integer not null
|
|
# version :integer not null
|
|
# name :string(150) not null
|
|
# diff :json not null
|
|
# created_at :datetime not null
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_theme_settings_migrations_on_theme_field_id (theme_field_id) UNIQUE
|
|
# index_theme_settings_migrations_on_theme_id_and_version (theme_id,version) UNIQUE
|
|
#
|