discourse/spec/models/topic_thumbnail_spec.rb
Blake Erickson 1e9ce51151
FIX: Prevent thumbnail gen if image too large (#10247)
It's possible through an import or other means to have images larger
than the current max allowed image size in the db.

If this happens the thumbnail generation job will keep running
indefinitely trying to download a new copy of the original but
discarding it because it is larger than the max_file_size eventually
causing this error

`Job exception: undefined method `path' for nil:NilClass`

because the newly downloaded image is now nil.

This fix stops the enqueuing of the `GenerateTopicThumbnails` job for
all images that happen to be larger than the max image size.
2020-07-16 11:15:53 +10:00

60 lines
1.5 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe "TopicThumbnail" do
let(:upload1) { Fabricate(:image_upload, width: 5000, height: 5000) }
let(:topic) { Fabricate(:topic, image_upload: upload1) }
let(:upload2) { Fabricate(:image_upload, width: 5000, height: 5000, filesize: 8000) }
let(:topic2) { Fabricate(:topic, image_upload: upload2) }
before do
SiteSetting.create_thumbnails = true
topic.generate_thumbnails!(extra_sizes: nil)
TopicThumbnail.ensure_consistency!
topic.reload
expect(topic.topic_thumbnails.length).to eq(1)
end
it "does not enque job if original image is too large" do
SiteSetting.create_thumbnails = true
topic2.generate_thumbnails!(extra_sizes: nil)
TopicThumbnail.ensure_consistency!
topic2.reload
expect(topic2.topic_thumbnails.length).to eq(0)
end
it "cleans up deleted uploads" do
upload1.delete
TopicThumbnail.ensure_consistency!
topic.reload
expect(topic.topic_thumbnails.length).to eq(0)
end
it "cleans up deleted optimized images" do
upload1.optimized_images.reload.delete_all
TopicThumbnail.ensure_consistency!
topic.reload
expect(topic.topic_thumbnails.length).to eq(0)
end
it "cleans up unneeded sizes" do
expect(topic.topic_thumbnails.length).to eq(1)
topic.topic_thumbnails[0].update_column(:max_width, 999999)
TopicThumbnail.ensure_consistency!
topic.reload
expect(topic.topic_thumbnails.length).to eq(0)
end
end