discourse/spec/serializers/theme_serializer_spec.rb
Martin Brennan 456fbb1dbf
FEATURE: Allow themes to define screenshots (#29079)
This commit allows themes to define up to 2 screenshots
in about.json. These should be paths within the theme's
git repository, images with a 1MB max file size and max width 3840x2160.

These screenshots will be downloaded and stored against a theme
field, and we will use these in the redesigned theme grid UI.

These screenshots will be updated when the theme is updated
in the same way the additional theme files are.

For now this is gated behind a hidden `theme_download_screenshots`
site setting, to allow us to test this on a small number of sites without
making other sites make unnecessary uploads.

**Future considerations:**

* We may want to have a specialized naming system for screenshots. E.g. having light.png/dark.png/some_palette.png
* We may want to show more than one screenshot for the theme, maybe in a carousel or reacting to dark mode or color palette changes
* We may want to allow clicking on the theme screenshot to show a lightbox
* We may want to make an optimized thumbnail image for the theme grid

---------

Co-authored-by: Ted Johansson <ted@discourse.org>
2024-10-28 10:10:20 +10:00

68 lines
2.2 KiB
Ruby

# frozen_string_literal: true
RSpec.describe ThemeSerializer do
describe "load theme settings" do
fab!(:theme)
it "should add error message when settings format is invalid" do
Theme
.any_instance
.stubs(:settings)
.raises(ThemeSettingsParser::InvalidYaml, I18n.t("themes.settings_errors.invalid_yaml"))
serialized = ThemeSerializer.new(theme).as_json[:theme]
expect(serialized[:settings]).to be_nil
expect(serialized[:errors].count).to eq(1)
expect(serialized[:errors][0]).to eq(I18n.t("themes.settings_errors.invalid_yaml"))
end
it "should add errors messages from theme fields" do
error = "error when compiling theme field"
theme_field = Fabricate(:theme_field, error: error, theme: theme)
serialized = ThemeSerializer.new(theme.reload).as_json[:theme]
expect(serialized[:errors].count).to eq(1)
expect(serialized[:errors][0]).to eq(error)
end
end
describe "screenshot_url" do
fab!(:theme)
let(:serialized) { ThemeSerializer.new(theme.reload).as_json[:theme] }
it "should include screenshot_url when there is a theme field with screenshot upload type" do
Fabricate(
:theme_field,
theme: theme,
type_id: ThemeField.types[:theme_screenshot_upload_var],
name: "theme_screenshot_1",
upload: Fabricate(:upload),
)
expect(serialized[:screenshot_url]).to be_present
end
it "should not include screenshot_url when there is no theme field with screenshot upload type" do
expect(serialized[:screenshot_url]).to be_nil
end
it "should handle multiple screenshot fields and use the first one" do
first_upload = Fabricate(:upload)
second_upload = Fabricate(:upload)
Fabricate(
:theme_field,
theme: theme,
type_id: ThemeField.types[:theme_screenshot_upload_var],
name: "theme_screenshot_1",
upload: first_upload,
)
Fabricate(
:theme_field,
theme: theme,
type_id: ThemeField.types[:theme_screenshot_upload_var],
name: "theme_screenshot_2",
upload: second_upload,
)
expect(serialized[:screenshot_url]).to eq(first_upload.url)
end
end
end