diff --git a/app/models/upload.rb b/app/models/upload.rb index e574bd392..5b1d19e78 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Upload < ApplicationRecord + class Error < StandardError; end + attr_accessor :file belongs_to :uploader, class_name: "User" @@ -96,14 +98,19 @@ class Upload < ApplicationRecord elsif source.present? strategy = Sources::Strategies.find(source, referer_url) page_url = strategy.page_url + image_urls = strategy.image_urls - upload_media_assets = strategy.image_urls.map do |image_url| + if image_urls.empty? + raise Error, "#{source} doesn't contain any images" + end + + upload_media_assets = image_urls.map do |image_url| UploadMediaAsset.new(source_url: image_url, page_url: page_url, media_asset: nil) end update!(upload_media_assets: upload_media_assets, media_asset_count: upload_media_assets.size) else - raise "No file or source given" # Should never happen + raise Error, "No file or source given" # Should never happen end rescue Exception => e update!(status: "error", error: e.message) diff --git a/test/functional/uploads_controller_test.rb b/test/functional/uploads_controller_test.rb index f06b3d90f..3e0f6fa97 100644 --- a/test/functional/uploads_controller_test.rb +++ b/test/functional/uploads_controller_test.rb @@ -258,6 +258,16 @@ class UploadsControllerTest < ActionDispatch::IntegrationTest end end + context "for a source that doesn't contain any images" do + should "fail" do + create_upload!("https://twitter.com/danboorubot/status/923612084616577024", user: @user) + + assert_response 201 + assert_equal(true, Upload.last.is_errored?) + assert_match("doesn't contain any images", Upload.last.error) + end + end + should "work for a source URL containing unicode characters" do source1 = "https://cdn.donmai.us/original/d3/4e/d34e4cf0a437a5d65f8e82b7bcd02606.jpg?one=東方&two=a%20b" source2 = "https://cdn.donmai.us/original/d3/4e/d34e4cf0a437a5d65f8e82b7bcd02606.jpg?one=%E6%9D%B1%E6%96%B9&two=a%20b"