mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-26 20:56:48 +00:00
111 lines
3.6 KiB
Ruby
111 lines
3.6 KiB
Ruby
# frozen_string_literal: false
|
|
|
|
require 'spec_helper'
|
|
|
|
module Spree
|
|
RSpec.describe Image do
|
|
include FileHelper
|
|
|
|
subject {
|
|
Spree::Image.create!(
|
|
attachment: black_logo_file,
|
|
viewable: product,
|
|
)
|
|
}
|
|
let(:product) { create(:product) }
|
|
|
|
describe "#url" do
|
|
it "returns URLs for different sizes" do
|
|
expect(subject.url(:small)).to match(
|
|
%r|^http://test\.host/rails/active_storage/representations/redirect/.+/logo-black\.png$|
|
|
)
|
|
end
|
|
|
|
it "returns download link for unsupported formats" do
|
|
subject.attachment_blob.update_columns(
|
|
content_type: "application/octet-stream"
|
|
)
|
|
|
|
expect(subject.url(:small)).to match(
|
|
%r|^http://test\.host/rails/active_storage/blobs/redirect/.+/logo-black\.png$|
|
|
)
|
|
end
|
|
|
|
it "returns default image when the attachment is missing" do
|
|
subject.attachment = nil
|
|
|
|
expect(subject.url(:small)).to eq "/noimage/small.png"
|
|
end
|
|
|
|
context "when no image attachment is found" do
|
|
it "returns a default product image" do
|
|
expect(subject).to receive_message_chain(:attachment, :attached?) { false }
|
|
|
|
expect(subject.url(:mini)).to eq "/noimage/mini.png"
|
|
end
|
|
end
|
|
|
|
context "when accessing the image raises an ActiveStorage error" do
|
|
it "rescues the error and returns a default product image" do
|
|
expect(subject).to receive(:attachment) { raise ActiveStorage::FileNotFoundError }
|
|
|
|
expect(subject.url(:small)).to eq "/noimage/small.png"
|
|
end
|
|
end
|
|
|
|
context "when using public images" do
|
|
it "returns the direct URL for the processed image" do
|
|
allow(ENV).to receive(:[])
|
|
expect(ENV).to receive(:[]).with("S3_BUCKET").and_return("present")
|
|
|
|
variant = double(:variant)
|
|
allow(subject).to receive_message_chain(:attachment, :attached?) { true }
|
|
expect(subject).to receive(:variant) { variant }
|
|
expect(variant).to receive_message_chain(:service, :public?) { true }
|
|
expect(variant).to receive_message_chain(:processed, :url) { "https://ofn-s3/123.png" }
|
|
|
|
expect(subject.url(:small)).to eq "https://ofn-s3/123.png"
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#default_image_url" do
|
|
it "returns default product image for a given size" do
|
|
expect(subject.class.default_image_url(:mini)).to eq "/noimage/mini.png"
|
|
end
|
|
|
|
it "returns default product image when no size is given" do
|
|
expect(subject.class.default_image_url(nil)).to eq "/noimage/product.png"
|
|
end
|
|
end
|
|
|
|
describe "using local storage" do
|
|
it "stores a new image" do
|
|
attachment = subject.attachment
|
|
expect(attachment.attached?).to eq true
|
|
|
|
url = Rails.application.routes.url_helpers.url_for(attachment)
|
|
expect(url).to match %r|^http://test\.host/rails/active_storage/blobs/redirect/[[:alnum:]-]+/logo-black\.png$|
|
|
end
|
|
end
|
|
|
|
describe "using AWS S3" do
|
|
before do
|
|
allow(Rails.application.config.active_storage).
|
|
to receive(:service).and_return(:test_amazon)
|
|
end
|
|
|
|
it "saves a new image when none is present" do
|
|
# Active Storage requests
|
|
as_upload_pattern = %r"^https://ofn.s3.amazonaws.com/[[:alnum:]]+$"
|
|
|
|
stub_request(:put, as_upload_pattern).to_return(status: 200, body: "", headers: {})
|
|
|
|
expect(subject.attachment).to be_attached
|
|
expect(Rails.application.routes.url_helpers.url_for(subject.attachment)).
|
|
to match %r"^http://test\.host/rails/active_storage/blobs/redirect/[[:alnum:]-]+/logo-black\.png"
|
|
end
|
|
end
|
|
end
|
|
end
|