diff --git a/spec/tasks/themes_spec.rb b/spec/tasks/themes_spec.rb index 4a1c4a84ecf..ff454dac007 100644 --- a/spec/tasks/themes_spec.rb +++ b/spec/tasks/themes_spec.rb @@ -18,7 +18,20 @@ RSpec.describe "tasks/themes" do } JSON - setup_git_repo("about.json" => about_json, "common/header.html" => "I AM A HEADER") + settings_yaml = <<~YAML + some_setting: + type: string + default: some default value + string_setting: + type: string + default: default value + YAML + + setup_git_repo( + "about.json" => about_json, + "common/header.html" => "I AM A HEADER", + "settings.yml" => settings_yaml, + ) end let(:initial_repo_url) do @@ -31,6 +44,57 @@ RSpec.describe "tasks/themes" do after { `rm -fr #{initial_repo}` } + it "should retain a theme's settings and not update the theme when a theme's setting fails to save" do + theme.update_setting(:some_setting, "some setting value") + + migration_content = <<~JS + export default function migrate(settings) { + const oldSetting = settings.get("string_setting"); + settings.set("string_setting", [{}]); + return settings; + } + JS + + settings_yaml = <<~YAML + string_setting: + type: objects + default: [] + schema: + name: some object + properties: + title: + type: string + required: true + YAML + + add_to_git_repo( + initial_repo, + "migrations/settings/0001-a-migration.js" => migration_content, + "settings.yml" => settings_yaml, + "common/header.html" => "I AM UPDATED HEADER", + ) + + original_remote_version = theme.remote_theme.remote_version + original_local_version = theme.remote_theme.local_version + + stderr = capture_stderr { capture_stdout { Rake::Task["themes:update"].invoke } } + + expect(stderr.chomp).to eq( + "[default] Failed to update 'awesome theme' (#{theme.id}): The property at JSON Pointer '/0/title' must be present.", + ) + + theme.reload + + expect(theme.theme_fields.count).to eq(2) + expect(theme.theme_fields.where(name: "header").first.value).to eq("I AM A HEADER") + expect(theme.theme_settings_migrations.count).to eq(0) + expect(theme.remote_theme.commits_behind).to eq(0) + expect(theme.remote_theme.remote_version).to eq(original_remote_version) + expect(theme.remote_theme.local_version).to eq(original_local_version) + expect(theme.settings[:some_setting].value).to eq("some setting value") + expect(theme.settings[:string_setting].value).to eq("default value") + end + it "should not update the theme if a theme setting migration fails during the update" do migration_content = <<~JS export default function migrate(settings) { @@ -51,7 +115,7 @@ RSpec.describe "tasks/themes" do theme.reload - expect(theme.theme_fields.count).to eq(1) + expect(theme.theme_fields.count).to eq(2) expect(theme.theme_fields.where(name: "header").first.value).to eq("I AM A HEADER") expect(theme.theme_settings_migrations.count).to eq(0) expect(theme.remote_theme.commits_behind).to eq(0)