DEV: Clean up S3 specs, stubs, and helpers

Extracted commonly used spec helpers into spec/support/uploads_helpers.rb, removed unused stubs and let definitions. Makes it easier to write new S3-related specs without copy and pasting setup steps from other specs.
This commit is contained in:
Jarek Radosz 2020-09-14 13:32:25 +02:00 committed by Daniel Waterworth
parent 50d53508b1
commit e00abbe1b7
38 changed files with 237 additions and 444 deletions

View File

@ -4,17 +4,6 @@ require "rails_helper"
require "cooked_post_processor" require "cooked_post_processor"
require "file_store/s3_store" require "file_store/s3_store"
def s3_setup
Rails.configuration.action_controller.stubs(:asset_host).returns("https://local.cdn.com")
SiteSetting.s3_upload_bucket = "some-bucket-on-s3"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.s3_cdn_url = "https://s3.cdn.com"
SiteSetting.enable_s3_uploads = true
SiteSetting.authorized_extensions = "png|jpg|gif|mov|ogg|"
end
describe CookedPostProcessor do describe CookedPostProcessor do
fab!(:upload) { Fabricate(:upload) } fab!(:upload) { Fabricate(:upload) }
let(:upload_path) { Discourse.store.upload_path } let(:upload_path) { Discourse.store.upload_path }
@ -483,17 +472,16 @@ describe CookedPostProcessor do
context "s3_uploads" do context "s3_uploads" do
let(:upload) { Fabricate(:secure_upload_s3) } let(:upload) { Fabricate(:secure_upload_s3) }
before do before do
s3_setup setup_s3
SiteSetting.s3_cdn_url = "https://s3.cdn.com"
SiteSetting.authorized_extensions = "png|jpg|gif|mov|ogg|"
stored_path = Discourse.store.get_path_for_upload(upload) stored_path = Discourse.store.get_path_for_upload(upload)
upload.update_column(:url, "#{SiteSetting.Upload.absolute_base_url}/#{stored_path}") upload.update_column(:url, "#{SiteSetting.Upload.absolute_base_url}/#{stored_path}")
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/") stub_upload(upload)
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/optimized/1X/#{upload.sha1}_2_#{optimized_size}.#{upload.extension}"
)
stub_request(:get, /#{SiteSetting.s3_upload_bucket}\.s3\.amazonaws\.com/)
SiteSetting.login_required = true SiteSetting.login_required = true
SiteSetting.secure_media = true SiteSetting.secure_media = true
@ -1049,11 +1037,11 @@ describe CookedPostProcessor do
context "when the post is with_secure_media and the upload is secure and secure media is enabled" do context "when the post is with_secure_media and the upload is secure and secure media is enabled" do
before do before do
setup_s3
upload.update(secure: true) upload.update(secure: true)
SiteSetting.login_required = true SiteSetting.login_required = true
s3_setup
SiteSetting.secure_media = true SiteSetting.secure_media = true
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
end end
it "does not use the direct URL, uses the cooked URL instead (because of the private ACL preventing w/h fetch)" do it "does not use the direct URL, uses the cooked URL instead (because of the private ACL preventing w/h fetch)" do
@ -1269,7 +1257,11 @@ describe CookedPostProcessor do
context "s3_uploads" do context "s3_uploads" do
before do before do
s3_setup Rails.configuration.action_controller.stubs(:asset_host).returns("https://local.cdn.com")
setup_s3
SiteSetting.s3_cdn_url = "https://s3.cdn.com"
SiteSetting.authorized_extensions = "png|jpg|gif|mov|ogg|"
uploaded_file = file_from_fixtures("smallest.png") uploaded_file = file_from_fixtures("smallest.png")
upload_sha1 = Digest::SHA1.hexdigest(File.read(uploaded_file)) upload_sha1 = Digest::SHA1.hexdigest(File.read(uploaded_file))
@ -1546,9 +1538,7 @@ describe CookedPostProcessor do
end end
it "doesn't disable download_remote_images_to_local if site uses S3" do it "doesn't disable download_remote_images_to_local if site uses S3" do
SiteSetting.s3_access_key_id = "s3-access-key-id" setup_s3
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
cpp.disable_if_low_on_disk_space cpp.disable_if_low_on_disk_space
expect(SiteSetting.download_remote_images_to_local).to eq(true) expect(SiteSetting.download_remote_images_to_local).to eq(true)

View File

@ -408,25 +408,10 @@ describe Email::Sender do
end end
context "when secure media enabled" do context "when secure media enabled" do
def enable_s3_uploads
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{image.sha1}.#{image.extension}?acl"
)
store = FileStore::S3Store.new
s3_helper = store.instance_variable_get(:@s3_helper)
client = Aws::S3::Client.new(stub_responses: true)
s3_helper.stubs(:s3_client).returns(client)
Discourse.stubs(:store).returns(store)
end
before do before do
enable_s3_uploads setup_s3
stub_s3_store
SiteSetting.secure_media = true SiteSetting.secure_media = true
SiteSetting.login_required = true SiteSetting.login_required = true
SiteSetting.email_total_attachment_size_limit_kb = 14_000 SiteSetting.email_total_attachment_size_limit_kb = 14_000

View File

@ -47,12 +47,7 @@ RSpec.describe FileStore::BaseStore do
describe '#download' do describe '#download' do
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.s3_region = "us-east-1"
stub_request(:get, upload_s3.url).to_return(status: 200, body: "Hello world") stub_request(:get, upload_s3.url).to_return(status: 200, body: "Hello world")
end end
@ -78,7 +73,7 @@ RSpec.describe FileStore::BaseStore do
end end
it "should return the file when s3 cdn enabled" do it "should return the file when s3 cdn enabled" do
SiteSetting.s3_cdn_url = "https://cdn.s3.amazonaws.com" SiteSetting.s3_cdn_url = "https://cdn.s3.#{SiteSetting.s3_region}.amazonaws.com"
stub_request(:get, Discourse.store.cdn_url(upload_s3.url)).to_return(status: 200, body: "Hello world") stub_request(:get, Discourse.store.cdn_url(upload_s3.url)).to_return(status: 200, body: "Hello world")
file = store.download(upload_s3) file = store.download(upload_s3)
@ -90,7 +85,7 @@ RSpec.describe FileStore::BaseStore do
SiteSetting.login_required = true SiteSetting.login_required = true
SiteSetting.secure_media = true SiteSetting.secure_media = true
stub_request(:head, "https://s3-upload-bucket.s3.amazonaws.com/") stub_request(:head, "https://s3-upload-bucket.s3.#{SiteSetting.s3_region}.amazonaws.com/")
signed_url = Discourse.store.signed_url_for_path(upload_s3.url) signed_url = Discourse.store.signed_url_for_path(upload_s3.url)
stub_request(:get, signed_url).to_return(status: 200, body: "Hello world") stub_request(:get, signed_url).to_return(status: 200, body: "Hello world")

View File

@ -5,42 +5,26 @@ require 'file_store/s3_store'
require 'file_store/local_store' require 'file_store/local_store'
describe FileStore::S3Store do describe FileStore::S3Store do
let(:store) { FileStore::S3Store.new } let(:store) { FileStore::S3Store.new }
let(:s3_helper) { store.instance_variable_get(:@s3_helper) } let(:s3_helper) { store.instance_variable_get(:@s3_helper) }
fab!(:upload) { Fabricate(:upload) } let(:client) { Aws::S3::Client.new(stub_responses: true) }
let(:uploaded_file) { file_from_fixtures("logo.png") } let(:resource) { Aws::S3::Resource.new(client: client) }
let(:s3_bucket) { resource.bucket("s3-upload-bucket") }
let(:s3_object) { stub }
fab!(:optimized_image) { Fabricate(:optimized_image) } fab!(:optimized_image) { Fabricate(:optimized_image) }
let(:optimized_image_file) { file_from_fixtures("logo.png") } let(:optimized_image_file) { file_from_fixtures("logo.png") }
let(:uploaded_file) { file_from_fixtures("logo.png") }
before(:each) do fab!(:upload) do
SiteSetting.s3_upload_bucket = "s3-upload-bucket" Fabricate(:upload, sha1: Digest::SHA1.hexdigest('secreet image string'))
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
end end
shared_context 's3 helpers' do before do
fab!(:upload) do setup_s3
Fabricate(:upload, sha1: Digest::SHA1.hexdigest('secreet image string')) SiteSetting.s3_region = 'us-west-1'
end
let(:store) { FileStore::S3Store.new }
let(:client) { Aws::S3::Client.new(stub_responses: true) }
let(:resource) { Aws::S3::Resource.new(client: client) }
let(:s3_bucket) { resource.bucket("s3-upload-bucket") }
let(:s3_helper) { store.instance_variable_get(:@s3_helper) }
before do
SiteSetting.s3_region = 'us-west-1'
end
end end
context 'uploading to s3' do context 'uploading to s3' do
include_context "s3 helpers"
let(:s3_object) { stub }
let(:etag) { "etag" } let(:etag) { "etag" }
describe "#store_upload" do describe "#store_upload" do
@ -159,8 +143,6 @@ describe FileStore::S3Store do
end end
context 'copying files in S3' do context 'copying files in S3' do
include_context "s3 helpers"
describe '#copy_file' do describe '#copy_file' do
it "copies the from in S3 with the right paths" do it "copies the from in S3 with the right paths" do
s3_helper.expects(:s3_bucket).returns(s3_bucket) s3_helper.expects(:s3_bucket).returns(s3_bucket)
@ -186,8 +168,6 @@ describe FileStore::S3Store do
end end
context 'removal from s3' do context 'removal from s3' do
include_context "s3 helpers"
describe "#remove_upload" do describe "#remove_upload" do
it "removes the file from s3 with the right paths" do it "removes the file from s3 with the right paths" do
store.expects(:get_depth_for).with(upload.id).returns(0) store.expects(:get_depth_for).with(upload.id).returns(0)
@ -243,8 +223,6 @@ describe FileStore::S3Store do
end end
describe "#remove_optimized_image" do describe "#remove_optimized_image" do
fab!(:optimized_image) { Fabricate(:optimized_image, upload: upload) }
let(:image_path) do let(:image_path) do
FileStore::BaseStore.new.get_path_for_optimized_image(optimized_image) FileStore::BaseStore.new.get_path_for_optimized_image(optimized_image)
end end
@ -303,23 +281,22 @@ describe FileStore::S3Store do
end end
describe ".has_been_uploaded?" do describe ".has_been_uploaded?" do
it "doesn't crash for invalid URLs" do it "doesn't crash for invalid URLs" do
expect(store.has_been_uploaded?("https://site.discourse.com/#bad#6")).to eq(false) expect(store.has_been_uploaded?("https://site.discourse.com/#bad#6")).to eq(false)
end end
it "doesn't crash if URL contains non-ascii characters" do it "doesn't crash if URL contains non-ascii characters" do
expect(store.has_been_uploaded?("//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/漢1337.png")).to eq(true) expect(store.has_been_uploaded?("//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/漢1337.png")).to eq(true)
expect(store.has_been_uploaded?("//s3-upload-bucket.s3.amazonaws.com/漢1337.png")).to eq(false) expect(store.has_been_uploaded?("//s3-upload-bucket.s3.amazonaws.com/漢1337.png")).to eq(false)
end end
it "identifies S3 uploads" do it "identifies S3 uploads" do
expect(store.has_been_uploaded?("//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/1337.png")).to eq(true) expect(store.has_been_uploaded?("//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/1337.png")).to eq(true)
end end
it "does not match other s3 urls" do it "does not match other s3 urls" do
expect(store.has_been_uploaded?("//s3-upload-bucket.s3.amazonaws.com/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s3-upload-bucket.s3.amazonaws.com/1337.png")).to eq(false)
expect(store.has_been_uploaded?("//s3-upload-bucket.s3-us-east-1.amazonaws.com/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s3-upload-bucket.s3-us-west-1.amazonaws.com/1337.png")).to eq(false)
expect(store.has_been_uploaded?("//s3.amazonaws.com/s3-upload-bucket/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s3.amazonaws.com/s3-upload-bucket/1337.png")).to eq(false)
expect(store.has_been_uploaded?("//s4_upload_bucket.s3.amazonaws.com/1337.png")).to eq(false) expect(store.has_been_uploaded?("//s4_upload_bucket.s3.amazonaws.com/1337.png")).to eq(false)
end end
@ -328,7 +305,7 @@ describe FileStore::S3Store do
describe ".absolute_base_url" do describe ".absolute_base_url" do
it "returns a lowercase schemaless absolute url" do it "returns a lowercase schemaless absolute url" do
expect(store.absolute_base_url).to eq("//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com") expect(store.absolute_base_url).to eq("//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com")
end end
it "uses the proper endpoint" do it "uses the proper endpoint" do
@ -353,12 +330,10 @@ describe FileStore::S3Store do
end end
describe ".purge_tombstone" do describe ".purge_tombstone" do
it "updates tombstone lifecycle" do it "updates tombstone lifecycle" do
s3_helper.expects(:update_tombstone_lifecycle) s3_helper.expects(:update_tombstone_lifecycle)
store.purge_tombstone(1.day) store.purge_tombstone(1.day)
end end
end end
describe ".path_for" do describe ".path_for" do
@ -380,9 +355,6 @@ describe FileStore::S3Store do
end end
context 'update ACL' do context 'update ACL' do
include_context "s3 helpers"
let(:s3_object) { stub }
before do before do
SiteSetting.authorized_extensions = "pdf|png" SiteSetting.authorized_extensions = "pdf|png"
end end
@ -411,7 +383,6 @@ describe FileStore::S3Store do
end end
describe '.cdn_url' do describe '.cdn_url' do
it 'supports subfolder' do it 'supports subfolder' do
SiteSetting.s3_upload_bucket = 's3-upload-bucket/livechat' SiteSetting.s3_upload_bucket = 's3-upload-bucket/livechat'
SiteSetting.s3_cdn_url = 'https://rainbow.com' SiteSetting.s3_cdn_url = 'https://rainbow.com'
@ -420,25 +391,19 @@ describe FileStore::S3Store do
# subfolder should not leak into uploads # subfolder should not leak into uploads
set_subfolder "/community" set_subfolder "/community"
url = "//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/livechat/original/gif.png" url = "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/livechat/original/gif.png"
expect(store.cdn_url(url)).to eq("https://rainbow.com/original/gif.png") expect(store.cdn_url(url)).to eq("https://rainbow.com/original/gif.png")
end end
end end
describe ".download_url" do describe ".download_url" do
include_context "s3 helpers"
let(:s3_object) { stub }
it "returns correct short URL with dl=1 param" do it "returns correct short URL with dl=1 param" do
expect(store.download_url(upload)).to eq("#{upload.short_path}?dl=1") expect(store.download_url(upload)).to eq("#{upload.short_path}?dl=1")
end end
end end
describe ".url_for" do describe ".url_for" do
include_context "s3 helpers"
let(:s3_object) { stub }
it "returns signed URL with content disposition when requesting to download image" do it "returns signed URL with content disposition when requesting to download image" do
s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once
s3_bucket.expects(:object).with("original/1X/#{upload.sha1}.png").returns(s3_object) s3_bucket.expects(:object).with("original/1X/#{upload.sha1}.png").returns(s3_object)
@ -454,9 +419,6 @@ describe FileStore::S3Store do
end end
describe ".signed_url_for_path" do describe ".signed_url_for_path" do
include_context "s3 helpers"
let(:s3_object) { stub }
it "returns signed URL for a given path" do it "returns signed URL for a given path" do
s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once s3_helper.expects(:s3_bucket).returns(s3_bucket).at_least_once
s3_bucket.expects(:object).with("special/optimized/file.png").returns(s3_object) s3_bucket.expects(:object).with("special/optimized/file.png").returns(s3_object)
@ -469,5 +431,4 @@ describe FileStore::S3Store do
expect(store.signed_url_for_path("special/optimized/file.png")).not_to eq(upload.url) expect(store.signed_url_for_path("special/optimized/file.png")).not_to eq(upload.url)
end end
end end
end end

View File

@ -1591,20 +1591,10 @@ describe PostCreator do
fab!(:public_topic) { Fabricate(:topic) } fab!(:public_topic) { Fabricate(:topic) }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.authorized_extensions = "png|jpg|gif|mp4" SiteSetting.authorized_extensions = "png|jpg|gif|mp4"
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.s3_region = "us-east-1"
SiteSetting.secure_media = true SiteSetting.secure_media = true
stub_upload(image_upload)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{image_upload.sha1}.#{image_upload.extension}?acl"
)
end end
it "links post uploads" do it "links post uploads" do

View File

@ -902,11 +902,8 @@ describe PrettyText do
describe "#strip_secure_media" do describe "#strip_secure_media" do
before do before do
SiteSetting.s3_upload_bucket = "some-bucket-on-s3" setup_s3
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.s3_cdn_url = "https://s3.cdn.com" SiteSetting.s3_cdn_url = "https://s3.cdn.com"
SiteSetting.enable_s3_uploads = true
SiteSetting.secure_media = true SiteSetting.secure_media = true
SiteSetting.login_required = true SiteSetting.login_required = true
end end

View File

@ -6,11 +6,8 @@ require "rails_helper"
describe "S3Helper" do describe "S3Helper" do
let(:client) { Aws::S3::Client.new(stub_responses: true) } let(:client) { Aws::S3::Client.new(stub_responses: true) }
before(:each) do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "abc"
SiteSetting.s3_secret_access_key = "def"
SiteSetting.s3_region = "us-east-1"
@lifecycle = <<~XML @lifecycle = <<~XML
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
@ -41,10 +38,10 @@ describe "S3Helper" do
stub_request(:get, "http://169.254.169.254/latest/meta-data/iam/security-credentials/"). stub_request(:get, "http://169.254.169.254/latest/meta-data/iam/security-credentials/").
to_return(status: 404, body: "", headers: {}) to_return(status: 404, body: "", headers: {})
stub_request(:get, "https://bob.s3.amazonaws.com/?lifecycle"). stub_request(:get, "https://bob.s3.#{SiteSetting.s3_region}.amazonaws.com/?lifecycle").
to_return(status: 200, body: @lifecycle, headers: {}) to_return(status: 200, body: @lifecycle, headers: {})
stub_request(:put, "https://bob.s3.amazonaws.com/?lifecycle"). stub_request(:put, "https://bob.s3.#{SiteSetting.s3_region}.amazonaws.com/?lifecycle").
with do |req| with do |req|
hash = Hash.from_xml(req.body.to_s) hash = Hash.from_xml(req.body.to_s)

View File

@ -12,9 +12,7 @@ describe "S3Inventory" do
let(:csv_filename) { "#{Rails.root}/spec/fixtures/csv/s3_inventory.csv" } let(:csv_filename) { "#{Rails.root}/spec/fixtures/csv/s3_inventory.csv" }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "abc"
SiteSetting.s3_secret_access_key = "def"
SiteSetting.enable_s3_inventory = true SiteSetting.enable_s3_inventory = true
client.stub_responses(:list_objects, -> (context) { client.stub_responses(:list_objects, -> (context) {

View File

@ -23,13 +23,12 @@ describe Stylesheet::Importer do
end end
it "applies S3 CDN to background category images" do it "applies S3 CDN to background category images" do
setup_s3
SiteSetting.s3_use_iam_profile = true SiteSetting.s3_use_iam_profile = true
SiteSetting.s3_upload_bucket = 'test' SiteSetting.s3_upload_bucket = 'test'
SiteSetting.s3_region = 'ap-southeast-2' SiteSetting.s3_region = 'ap-southeast-2'
SiteSetting.s3_cdn_url = "https://s3.cdn" SiteSetting.s3_cdn_url = "https://s3.cdn"
SiteSetting.enable_s3_uploads = true
background = Fabricate(:upload_s3) background = Fabricate(:upload_s3)
category = Fabricate(:category, uploaded_background: background) category = Fabricate(:category, uploaded_background: background)

View File

@ -164,11 +164,7 @@ describe SvgSprite do
let(:upload_s3) { Fabricate(:upload_s3) } let(:upload_s3) { Fabricate(:upload_s3) }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3bucket"
SiteSetting.s3_access_key_id = "s3_access_key_id"
SiteSetting.s3_secret_access_key = "s3_secret_access_key"
stub_request(:get, upload_s3.url).to_return(status: 200, body: "Hello world") stub_request(:get, upload_s3.url).to_return(status: 200, body: "Hello world")
end end

View File

@ -156,16 +156,15 @@ describe UrlHelper do
end end
describe "#cook_url" do describe "#cook_url" do
let(:url) { "//s3bucket.s3.dualstack.us-east-1.amazonaws.com/dev/original/3X/2/e/2e6f2ef81b6910ea592cd6d21ee897cd51cf72e4.jpeg" } let(:url) { "//s3bucket.s3.dualstack.us-west-1.amazonaws.com/dev/original/3X/2/e/2e6f2ef81b6910ea592cd6d21ee897cd51cf72e4.jpeg" }
before do before do
FileStore::S3Store.any_instance.stubs(:has_been_uploaded?).returns(true) setup_s3
Rails.configuration.action_controller.asset_host = "https://test.some-cdn.com/dev"
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3bucket" SiteSetting.s3_upload_bucket = "s3bucket"
SiteSetting.s3_access_key_id = "s3_access_key_id"
SiteSetting.s3_secret_access_key = "s3_secret_access_key"
SiteSetting.login_required = true SiteSetting.login_required = true
Rails.configuration.action_controller.asset_host = "https://test.some-cdn.com/dev"
FileStore::S3Store.any_instance.stubs(:has_been_uploaded?).returns(true)
end end
def cooked def cooked
@ -187,7 +186,7 @@ describe UrlHelper do
it "returns the local_cdn_url" do it "returns the local_cdn_url" do
expect(cooked).to eq( expect(cooked).to eq(
"//s3bucket.s3.dualstack.us-east-1.amazonaws.com/dev/original/3X/2/e/2e6f2ef81b6910ea592cd6d21ee897cd51cf72e4.jpeg" "//s3bucket.s3.dualstack.us-west-1.amazonaws.com/dev/original/3X/2/e/2e6f2ef81b6910ea592cd6d21ee897cd51cf72e4.jpeg"
) )
end end
end end

View File

@ -163,16 +163,13 @@ describe UserNotificationsHelper do
let(:upload) { Fabricate(:upload_s3, sha1: "somesha1") } let(:upload) { Fabricate(:upload_s3, sha1: "somesha1") }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.logo = upload SiteSetting.logo = upload
end end
it 'should return the right URL' do it 'should return the right URL' do
expect(helper.logo_url).to eq( expect(helper.logo_url).to eq(
"http://s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/somesha1.png" "http://s3-upload-bucket.s3.dualstack.#{SiteSetting.s3_region}.amazonaws.com/original/1X/somesha1.png"
) )
end end
@ -181,7 +178,7 @@ describe UserNotificationsHelper do
GlobalSetting.stubs(:cdn_url).returns('https://some.cdn.com/cluster') GlobalSetting.stubs(:cdn_url).returns('https://some.cdn.com/cluster')
expect(helper.logo_url).to eq( expect(helper.logo_url).to eq(
"http://s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/original/1X/somesha1.png" "http://s3-upload-bucket.s3.dualstack.#{SiteSetting.s3_region}.amazonaws.com/original/1X/somesha1.png"
) )
end end
end end

View File

@ -3,33 +3,30 @@
require 'rails_helper' require 'rails_helper'
describe Jobs::CorrectMissingDualstackUrls do describe Jobs::CorrectMissingDualstackUrls do
it 'corrects the urls' do it 'corrects the urls' do
setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket" SiteSetting.s3_region = "us-east-1"
SiteSetting.s3_access_key_id = "s3-access-key-id" SiteSetting.s3_upload_bucket = "custom-bucket"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
# we will only correct for our base_url, random urls will be left alone # we will only correct for our base_url, random urls will be left alone
expect(Discourse.store.absolute_base_url).to eq('//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com') expect(Discourse.store.absolute_base_url).to eq('//custom-bucket.s3.dualstack.us-east-1.amazonaws.com')
current_upload = Upload.create!( current_upload = Upload.create!(
url: '//s3-upload-bucket.s3-us-east-1.amazonaws.com/somewhere/a.png', url: '//custom-bucket.s3-us-east-1.amazonaws.com/somewhere/a.png',
original_filename: 'a.png', original_filename: 'a.png',
filesize: 100, filesize: 100,
user_id: -1, user_id: -1,
) )
bad_upload = Upload.create!( bad_upload = Upload.create!(
url: '//s3-upload-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png', url: '//custom-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png',
original_filename: 'a.png', original_filename: 'a.png',
filesize: 100, filesize: 100,
user_id: -1, user_id: -1,
) )
current_optimized = OptimizedImage.create!( current_optimized = OptimizedImage.create!(
url: '//s3-upload-bucket.s3-us-east-1.amazonaws.com/somewhere/a.png', url: '//custom-bucket.s3-us-east-1.amazonaws.com/somewhere/a.png',
filesize: 100, filesize: 100,
upload_id: current_upload.id, upload_id: current_upload.id,
width: 100, width: 100,
@ -39,7 +36,7 @@ describe Jobs::CorrectMissingDualstackUrls do
) )
bad_optimized = OptimizedImage.create!( bad_optimized = OptimizedImage.create!(
url: '//s3-upload-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png', url: '//custom-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png',
filesize: 100, filesize: 100,
upload_id: current_upload.id, upload_id: current_upload.id,
width: 110, width: 110,
@ -51,15 +48,15 @@ describe Jobs::CorrectMissingDualstackUrls do
Jobs::CorrectMissingDualstackUrls.new.execute_onceoff(nil) Jobs::CorrectMissingDualstackUrls.new.execute_onceoff(nil)
bad_upload.reload bad_upload.reload
expect(bad_upload.url).to eq('//s3-upload-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png') expect(bad_upload.url).to eq('//custom-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png')
current_upload.reload current_upload.reload
expect(current_upload.url).to eq('//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/somewhere/a.png') expect(current_upload.url).to eq('//custom-bucket.s3.dualstack.us-east-1.amazonaws.com/somewhere/a.png')
bad_optimized.reload bad_optimized.reload
expect(bad_optimized.url).to eq('//s3-upload-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png') expect(bad_optimized.url).to eq('//custom-bucket.s3-us-west-1.amazonaws.com/somewhere/a.png')
current_optimized.reload current_optimized.reload
expect(current_optimized.url).to eq('//s3-upload-bucket.s3.dualstack.us-east-1.amazonaws.com/somewhere/a.png') expect(current_optimized.url).to eq('//custom-bucket.s3.dualstack.us-east-1.amazonaws.com/somewhere/a.png')
end end
end end

View File

@ -5,9 +5,7 @@ require 'rails_helper'
RSpec.describe Jobs::EnsureS3UploadsExistence do RSpec.describe Jobs::EnsureS3UploadsExistence do
context "S3 inventory enabled" do context "S3 inventory enabled" do
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "abc"
SiteSetting.s3_secret_access_key = "def"
SiteSetting.enable_s3_inventory = true SiteSetting.enable_s3_inventory = true
end end

View File

@ -186,7 +186,9 @@ describe Jobs::PullHotlinkedImages do
context "when secure media enabled for an upload that has already been downloaded and exists" do context "when secure media enabled for an upload that has already been downloaded and exists" do
it "doesnt redownload the secure upload" do it "doesnt redownload the secure upload" do
enable_secure_media setup_s3
SiteSetting.secure_media = true
upload = Fabricate(:secure_upload_s3, secure: true) upload = Fabricate(:secure_upload_s3, secure: true)
stub_s3(upload) stub_s3(upload)
url = Upload.secure_media_url_from_upload_url(upload.url) url = Upload.secure_media_url_from_upload_url(upload.url)
@ -199,7 +201,9 @@ describe Jobs::PullHotlinkedImages do
context "when the upload original_sha1 is missing" do context "when the upload original_sha1 is missing" do
it "redownloads the upload" do it "redownloads the upload" do
enable_secure_media setup_s3
SiteSetting.secure_media = true
upload = Fabricate(:upload_s3, secure: true) upload = Fabricate(:upload_s3, secure: true)
stub_s3(upload) stub_s3(upload)
Upload.stubs(:signed_url_from_secure_media_url).returns(upload.url) Upload.stubs(:signed_url_from_secure_media_url).returns(upload.url)
@ -218,7 +222,9 @@ describe Jobs::PullHotlinkedImages do
context "when the upload access_control_post is different to the current post" do context "when the upload access_control_post is different to the current post" do
it "redownloads the upload" do it "redownloads the upload" do
enable_secure_media setup_s3
SiteSetting.secure_media = true
upload = Fabricate(:secure_upload_s3, secure: true) upload = Fabricate(:secure_upload_s3, secure: true)
stub_s3(upload) stub_s3(upload)
Upload.stubs(:signed_url_from_secure_media_url).returns(upload.url) Upload.stubs(:signed_url_from_secure_media_url).returns(upload.url)
@ -395,7 +401,9 @@ describe Jobs::PullHotlinkedImages do
context "when secure media enabled" do context "when secure media enabled" do
it 'should return false for secure-media-upload url' do it 'should return false for secure-media-upload url' do
enable_secure_media setup_s3
SiteSetting.secure_media = true
upload = Fabricate(:upload_s3, secure: true) upload = Fabricate(:upload_s3, secure: true)
stub_s3(upload) stub_s3(upload)
url = Upload.secure_media_url_from_upload_url(upload.url) url = Upload.secure_media_url_from_upload_url(upload.url)
@ -415,12 +423,9 @@ describe Jobs::PullHotlinkedImages do
end end
it "returns false for emoji when app and S3 CDNs configured" do it "returns false for emoji when app and S3 CDNs configured" do
set_cdn_url "https://mydomain.cdn/test" setup_s3
SiteSetting.s3_upload_bucket = "some-bucket-on-s3"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.s3_cdn_url = "https://s3.cdn.com" SiteSetting.s3_cdn_url = "https://s3.cdn.com"
SiteSetting.enable_s3_uploads = true set_cdn_url "https://mydomain.cdn/test"
src = UrlHelper.cook_url(Emoji.url_for("testemoji.png")) src = UrlHelper.cook_url(Emoji.url_for("testemoji.png"))
expect(subject.should_download_image?(src)).to eq(false) expect(subject.should_download_image?(src)).to eq(false)
@ -503,22 +508,8 @@ describe Jobs::PullHotlinkedImages do
end end
end end
def enable_secure_media
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
SiteSetting.secure_media = true
end
def stub_s3(upload) def stub_s3(upload)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/") stub_upload(upload)
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{upload.sha1}.#{upload.extension}?acl"
)
stub_request(:get, "https:" + upload.url).to_return(status: 200, body: file_from_fixtures("smallest.png")) stub_request(:get, "https:" + upload.url).to_return(status: 200, body: file_from_fixtures("smallest.png"))
# stub_request(:get, /#{SiteSetting.s3_upload_bucket}\.s3\.amazonaws\.com/)
end end
end end

View File

@ -5,9 +5,8 @@ require "file_store/s3_store"
describe Jobs::UpdateS3Inventory do describe Jobs::UpdateS3Inventory do
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "abc" SiteSetting.s3_upload_bucket = "special-bucket"
SiteSetting.s3_secret_access_key = "def"
SiteSetting.enable_s3_inventory = true SiteSetting.enable_s3_inventory = true
store = FileStore::S3Store.new store = FileStore::S3Store.new
@ -21,17 +20,17 @@ describe Jobs::UpdateS3Inventory do
path = File.join(S3Inventory::INVENTORY_PREFIX, S3Inventory::INVENTORY_VERSION) path = File.join(S3Inventory::INVENTORY_PREFIX, S3Inventory::INVENTORY_VERSION)
@client.expects(:put_bucket_policy).with( @client.expects(:put_bucket_policy).with(
bucket: "bucket", bucket: "special-bucket",
policy: %Q|{"Version":"2012-10-17","Statement":[{"Sid":"InventoryAndAnalyticsPolicy","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":["s3:PutObject"],"Resource":["arn:aws:s3:::bucket/#{path}/*"],"Condition":{"ArnLike":{"aws:SourceArn":"arn:aws:s3:::bucket"},"StringEquals":{"s3:x-amz-acl":"bucket-owner-full-control"}}}]}| policy: %Q|{"Version":"2012-10-17","Statement":[{"Sid":"InventoryAndAnalyticsPolicy","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":["s3:PutObject"],"Resource":["arn:aws:s3:::special-bucket/#{path}/*"],"Condition":{"ArnLike":{"aws:SourceArn":"arn:aws:s3:::special-bucket"},"StringEquals":{"s3:x-amz-acl":"bucket-owner-full-control"}}}]}|
) )
@client.expects(:put_bucket_inventory_configuration) @client.expects(:put_bucket_inventory_configuration)
@client.expects(:put_bucket_inventory_configuration).with( @client.expects(:put_bucket_inventory_configuration).with(
bucket: "bucket", bucket: "special-bucket",
id: id, id: id,
inventory_configuration: { inventory_configuration: {
destination: { destination: {
s3_bucket_destination: { s3_bucket_destination: {
bucket: "arn:aws:s3:::bucket", bucket: "arn:aws:s3:::special-bucket",
prefix: path, prefix: path,
format: "CSV" format: "CSV"
} }

View File

@ -18,9 +18,7 @@ describe Jobs::VacateLegacyPrefixBackups, type: :multisite do
end end
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "abc"
SiteSetting.s3_secret_access_key = "def"
SiteSetting.s3_backup_bucket = bucket_name SiteSetting.s3_backup_bucket = bucket_name
SiteSetting.backup_location = BackupLocationSiteSetting::S3 SiteSetting.backup_location = BackupLocationSiteSetting::S3
end end

View File

@ -369,10 +369,7 @@ describe BackupRestore::UploadsRestorer do
context "currently stored on S3" do context "currently stored on S3" do
before do before do
SiteSetting.s3_upload_bucket = "s3-upload-bucket" setup_s3
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
end end
let!(:store_class) { FileStore::S3Store } let!(:store_class) { FileStore::S3Store }

View File

@ -72,15 +72,8 @@ describe ShrinkUploadedImage do
let(:upload) { Fabricate(:s3_image_upload, width: 200, height: 200) } let(:upload) { Fabricate(:s3_image_upload, width: 200, height: 200) }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "fakeid7974664" stub_s3_store
SiteSetting.s3_secret_access_key = "fakesecretid7974664"
store = FileStore::S3Store.new
s3_helper = store.instance_variable_get(:@s3_helper)
client = Aws::S3::Client.new(stub_responses: true)
s3_helper.stubs(:s3_client).returns(client)
Discourse.stubs(:store).returns(store)
end end
it "resizes the image" do it "resizes the image" do

View File

@ -30,7 +30,12 @@ describe TopicUploadSecurityManager do
let(:category) { Fabricate(:private_category, group: group) } let(:category) { Fabricate(:private_category, group: group) }
context "when secure media is enabled" do context "when secure media is enabled" do
before { enable_secure_media } before do
setup_s3
SiteSetting.secure_media = true
[upload, upload2, upload3].each { |upl| stub_upload(upl) }
end
it "does not change any upload statuses or update ACLs or rebake" do it "does not change any upload statuses or update ACLs or rebake" do
expect_upload_status_not_to_change expect_upload_status_not_to_change
@ -57,7 +62,12 @@ describe TopicUploadSecurityManager do
let(:topic) { Fabricate(:private_message_topic, category: category, user: user) } let(:topic) { Fabricate(:private_message_topic, category: category, user: user) }
context "when secure media is enabled" do context "when secure media is enabled" do
before { enable_secure_media } before do
setup_s3
SiteSetting.secure_media = true
[upload, upload2, upload3].each { |upl| stub_upload(upl) }
end
it "does not change any upload statuses or update ACLs or rebake" do it "does not change any upload statuses or update ACLs or rebake" do
expect_upload_status_not_to_change expect_upload_status_not_to_change
@ -82,7 +92,12 @@ describe TopicUploadSecurityManager do
context "when the topic is public" do context "when the topic is public" do
context "when secure media is enabled" do context "when secure media is enabled" do
before { enable_secure_media } before do
setup_s3
SiteSetting.secure_media = true
[upload, upload2, upload3].each { |upl| stub_upload(upl) }
end
context "when login required is enabled" do context "when login required is enabled" do
before do before do
@ -111,7 +126,10 @@ describe TopicUploadSecurityManager do
let!(:upload3) { Fabricate(:upload) } let!(:upload3) { Fabricate(:upload) }
before do before do
enable_secure_media setup_s3
SiteSetting.secure_media = true
[upload, upload2, upload3].each { |upl| stub_upload(upl) }
end end
context "when this is the first post the upload has appeared in" do context "when this is the first post the upload has appeared in" do
@ -155,24 +173,6 @@ describe TopicUploadSecurityManager do
end end
end end
def enable_secure_media
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
SiteSetting.secure_media = true
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
# because the ACLs will be changing...
[upload, upload2, upload3].each do |upl|
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{upl.sha1}.#{upl.extension}?acl"
)
end
end
def expect_upload_status_not_to_change def expect_upload_status_not_to_change
Post.any_instance.expects(:rebake!).never Post.any_instance.expects(:rebake!).never
subject.run subject.run

View File

@ -193,7 +193,9 @@ RSpec.describe UploadCreator do
let(:opts) { { type: "composer" } } let(:opts) { { type: "composer" } }
before do before do
enable_s3_uploads setup_s3
stub_s3_store
SiteSetting.secure_media = true SiteSetting.secure_media = true
SiteSetting.authorized_extensions = 'pdf|svg|jpg' SiteSetting.authorized_extensions = 'pdf|svg|jpg'
end end
@ -221,7 +223,8 @@ RSpec.describe UploadCreator do
let(:opts) { { type: "composer" } } let(:opts) { { type: "composer" } }
before do before do
enable_s3_uploads setup_s3
stub_s3_store
end end
it 'should store the file and return etag' do it 'should store the file and return etag' do
@ -280,7 +283,9 @@ RSpec.describe UploadCreator do
context "when SiteSetting.secure_media is enabled" do context "when SiteSetting.secure_media is enabled" do
before do before do
enable_s3_uploads setup_s3
stub_s3_store
SiteSetting.secure_media = true SiteSetting.secure_media = true
end end
@ -298,7 +303,9 @@ RSpec.describe UploadCreator do
context "when SiteSetting.secure_media enabled" do context "when SiteSetting.secure_media enabled" do
before do before do
enable_s3_uploads setup_s3
stub_s3_store
SiteSetting.secure_media = true SiteSetting.secure_media = true
end end
@ -434,18 +441,4 @@ RSpec.describe UploadCreator do
end end
end end
end end
def enable_s3_uploads
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.s3_region = 'us-west-1'
SiteSetting.enable_s3_uploads = true
store = FileStore::S3Store.new
s3_helper = store.instance_variable_get(:@s3_helper)
client = Aws::S3::Client.new(stub_responses: true)
s3_helper.stubs(:s3_client).returns(client)
Discourse.stubs(:store).returns(store)
end
end end

View File

@ -12,10 +12,7 @@ RSpec.describe UploadSecurity do
context "when secure media is enabled" do context "when secure media is enabled" do
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
SiteSetting.secure_media = true SiteSetting.secure_media = true
end end

View File

@ -293,11 +293,7 @@ describe OptimizedImage do
describe "external store" do describe "external store" do
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.s3_region = "us-east-1"
end end
context "when we have a bad file returned" do context "when we have a bad file returned" do
@ -318,8 +314,7 @@ describe OptimizedImage do
before do before do
stub_request(:head, "http://#{s3_upload.url}").to_return(status: 200) stub_request(:head, "http://#{s3_upload.url}").to_return(status: 200)
stub_request(:get, "http://#{s3_upload.url}").to_return(status: 200, body: file_from_fixtures("logo.png")) stub_request(:get, "http://#{s3_upload.url}").to_return(status: 200, body: file_from_fixtures("logo.png"))
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/") stub_request(:put, "https://#{SiteSetting.s3_upload_bucket}.s3.#{SiteSetting.s3_region}.amazonaws.com#{optimized_path}")
stub_request(:put, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com#{optimized_path}")
.to_return(status: 200, headers: { "ETag" => "someetag" }) .to_return(status: 200, headers: { "ETag" => "someetag" })
end end
@ -330,14 +325,14 @@ describe OptimizedImage do
expect(oi.extension).to eq(".png") expect(oi.extension).to eq(".png")
expect(oi.width).to eq(100) expect(oi.width).to eq(100)
expect(oi.height).to eq(200) expect(oi.height).to eq(200)
expect(oi.url).to eq("//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-east-1.amazonaws.com#{optimized_path}") expect(oi.url).to eq("//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-west-1.amazonaws.com#{optimized_path}")
expect(oi.filesize).to be > 0 expect(oi.filesize).to be > 0
oi.filesize = nil oi.filesize = nil
stub_request( stub_request(
:get, :get,
"http://#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-east-1.amazonaws.com#{optimized_path}" "http://#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-west-1.amazonaws.com#{optimized_path}"
).to_return(status: 200, body: file_from_fixtures("resized.png")) ).to_return(status: 200, body: file_from_fixtures("resized.png"))
expect(oi.filesize).to be > 0 expect(oi.filesize).to be > 0

View File

@ -164,7 +164,11 @@ describe Post do
end end
context "when secure media is enabled" do context "when secure media is enabled" do
before { enable_secure_media_and_s3 } before do
setup_s3
SiteSetting.authorized_extensions = "pdf|png|jpg|csv"
SiteSetting.secure_media = true
end
context "if login_required" do context "if login_required" do
before { SiteSetting.login_required = true } before { SiteSetting.login_required = true }
@ -1426,7 +1430,11 @@ describe Post do
end end
context "when secure media is enabled" do context "when secure media is enabled" do
before { enable_secure_media_and_s3 } before do
setup_s3
SiteSetting.authorized_extensions = "pdf|png|jpg|csv"
SiteSetting.secure_media = true
end
it "sets the access_control_post_id on uploads in the post that don't already have the value set" do it "sets the access_control_post_id on uploads in the post that don't already have the value set" do
other_post = Fabricate(:post) other_post = Fabricate(:post)
@ -1464,19 +1472,14 @@ describe Post do
end end
before do before do
enable_secure_media_and_s3 setup_s3
SiteSetting.authorized_extensions = "pdf|png|jpg|csv"
SiteSetting.secure_media = true
attachment_upload.update!(original_filename: "hello.csv") attachment_upload.update!(original_filename: "hello.csv")
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/") stub_upload(attachment_upload)
stub_upload(image_upload)
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{attachment_upload.sha1}.#{attachment_upload.extension}?acl"
)
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{image_upload.sha1}.#{image_upload.extension}?acl"
)
end end
it "marks image and attachment uploads as secure in PMs when secure_media is ON" do it "marks image and attachment uploads as secure in PMs when secure_media is ON" do
@ -1643,7 +1646,10 @@ describe Post do
end end
it "correctly identifies secure uploads" do it "correctly identifies secure uploads" do
enable_secure_media_and_s3 setup_s3
SiteSetting.authorized_extensions = "pdf|png|jpg|csv"
SiteSetting.secure_media = true
upload1 = Fabricate(:upload_s3, secure: true) upload1 = Fabricate(:upload_s3, secure: true)
upload2 = Fabricate(:upload_s3, secure: true) upload2 = Fabricate(:upload_s3, secure: true)
@ -1690,11 +1696,7 @@ describe Post do
end end
it "should skip external urls with upload url in query string" do it "should skip external urls with upload url in query string" do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.s3_cdn_url = "https://cdn.s3.amazonaws.com"
urls = [] urls = []
upload = Fabricate(:upload_s3) upload = Fabricate(:upload_s3)
@ -1703,13 +1705,4 @@ describe Post do
expect(urls).to be_empty expect(urls).to be_empty
end end
end end
def enable_secure_media_and_s3
SiteSetting.authorized_extensions = "pdf|png|jpg|csv"
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.secure_media = true
end
end end

View File

@ -166,10 +166,8 @@ describe TopicLinkClick do
context "s3 cdns" do context "s3 cdns" do
it "works with s3 urls" do it "works with s3 urls" do
setup_s3
SiteSetting.s3_cdn_url = "https://discourse-s3-cdn.global.ssl.fastly.net" SiteSetting.s3_cdn_url = "https://discourse-s3-cdn.global.ssl.fastly.net"
SiteSetting.s3_access_key_id = 'X'
SiteSetting.s3_secret_access_key = 'X'
SiteSetting.enable_s3_uploads = true
post = Fabricate(:post, topic: @topic, raw: "[test](//test.localhost/uploads/default/my-test-link)") post = Fabricate(:post, topic: @topic, raw: "[test](//test.localhost/uploads/default/my-test-link)")
TopicLink.extract_from(post) TopicLink.extract_from(post)

View File

@ -179,10 +179,7 @@ describe Upload do
let(:path) { upload.url.sub(SiteSetting.Upload.s3_base_url, '') } let(:path) { upload.url.sub(SiteSetting.Upload.s3_base_url, '') }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
end end
it "should return the right upload when using base url (not CDN) for s3" do it "should return the right upload when using base url (not CDN) for s3" do
@ -407,22 +404,12 @@ describe Upload do
end end
def enable_secure_media def enable_secure_media
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
SiteSetting.secure_media = true SiteSetting.secure_media = true
stub_upload(upload)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{upload.sha1}.#{upload.extension}?acl"
)
end end
context '.destroy' do context '.destroy' do
it "can correctly clear information when destroying an upload" do it "can correctly clear information when destroying an upload" do
upload = Fabricate(:upload) upload = Fabricate(:upload)
user = Fabricate(:user) user = Fabricate(:user)

View File

@ -8,13 +8,11 @@ RSpec.describe 'Multisite Post', type: :multisite do
let(:upload2) { Fabricate(:upload_s3) } let(:upload2) { Fabricate(:upload_s3) }
let(:upload3) { Fabricate(:upload_s3) } let(:upload3) { Fabricate(:upload_s3) }
it "correctly identifies all upload urls" do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket" end
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.s3_cdn_url = "https://cdn.s3.amazonaws.com"
it "correctly identifies all upload urls" do
upload3.url.sub!(RailsMultisite::ConnectionManagement.current_db, "secondsite") upload3.url.sub!(RailsMultisite::ConnectionManagement.current_db, "secondsite")
upload3.save! upload3.save!

View File

@ -15,10 +15,7 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
context 'uploading to s3' do context 'uploading to s3' do
before(:each) do before(:each) do
SiteSetting.s3_upload_bucket = "some-really-cool-bucket" setup_s3
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
end end
describe "#store_upload" do describe "#store_upload" do
@ -79,7 +76,7 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
test_multisite_connection('default') do test_multisite_connection('default') do
upload = build_upload upload = build_upload
expect(store.store_upload(uploaded_file, upload)).to eq( expect(store.store_upload(uploaded_file, upload)).to eq(
"//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-east-1.amazonaws.com/#{upload_path}/original/1X/c530c06cf89c410c0355d7852644a73fc3ec8c04.png" "//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-west-1.amazonaws.com/#{upload_path}/original/1X/c530c06cf89c410c0355d7852644a73fc3ec8c04.png"
) )
expect(upload.etag).to eq("ETag") expect(upload.etag).to eq("ETag")
end end
@ -88,7 +85,7 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
upload_path = Discourse.store.upload_path upload_path = Discourse.store.upload_path
upload = build_upload upload = build_upload
expect(store.store_upload(uploaded_file, upload)).to eq( expect(store.store_upload(uploaded_file, upload)).to eq(
"//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-east-1.amazonaws.com/#{upload_path}/original/1X/c530c06cf89c410c0355d7852644a73fc3ec8c04.png" "//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-west-1.amazonaws.com/#{upload_path}/original/1X/c530c06cf89c410c0355d7852644a73fc3ec8c04.png"
) )
expect(upload.etag).to eq("ETag") expect(upload.etag).to eq("ETag")
end end
@ -98,11 +95,7 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
context 'removal from s3' do context 'removal from s3' do
before do before do
SiteSetting.s3_region = 'us-west-1' setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
end end
describe "#remove_upload" do describe "#remove_upload" do
@ -180,10 +173,8 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
let(:s3_object) { stub } let(:s3_object) { stub }
before(:each) do before(:each) do
setup_s3
SiteSetting.s3_upload_bucket = "some-really-cool-bucket" SiteSetting.s3_upload_bucket = "some-really-cool-bucket"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
SiteSetting.authorized_extensions = "pdf|png|jpg|gif" SiteSetting.authorized_extensions = "pdf|png|jpg|gif"
end end
@ -202,7 +193,7 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
s3_object.expects(:presigned_url).with(:get, expires_in: S3Helper::DOWNLOAD_URL_EXPIRES_AFTER_SECONDS) s3_object.expects(:presigned_url).with(:get, expires_in: S3Helper::DOWNLOAD_URL_EXPIRES_AFTER_SECONDS)
expect(store.store_upload(uploaded_file, upload)).to eq( expect(store.store_upload(uploaded_file, upload)).to eq(
"//some-really-cool-bucket.s3.dualstack.us-east-1.amazonaws.com/#{upload_path}/original/1X/#{upload.sha1}.pdf" "//some-really-cool-bucket.s3.dualstack.us-west-1.amazonaws.com/#{upload_path}/original/1X/#{upload.sha1}.pdf"
) )
expect(store.url_for(upload)).not_to eq(upload.url) expect(store.url_for(upload)).not_to eq(upload.url)
@ -270,18 +261,11 @@ RSpec.describe 'Multisite s3 uploads', type: :multisite do
describe "#has_been_uploaded?" do describe "#has_been_uploaded?" do
before do before do
SiteSetting.s3_region = 'us-west-1' setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket/test" SiteSetting.s3_upload_bucket = "s3-upload-bucket/test"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
end end
let(:store) { FileStore::S3Store.new } let(:store) { FileStore::S3Store.new }
let(:client) { Aws::S3::Client.new(stub_responses: true) }
let(:resource) { Aws::S3::Resource.new(client: client) }
let(:s3_bucket) { resource.bucket(SiteSetting.s3_upload_bucket) }
let(:s3_helper) { store.s3_helper }
it "returns false for blank urls and bad urls" do it "returns false for blank urls and bad urls" do
expect(store.has_been_uploaded?("")).to eq(false) expect(store.has_been_uploaded?("")).to eq(false)

View File

@ -173,6 +173,7 @@ RSpec.configure do |config|
config.include WebauthnIntegrationHelpers config.include WebauthnIntegrationHelpers
config.include SiteSettingsHelpers config.include SiteSettingsHelpers
config.include SidekiqHelpers config.include SidekiqHelpers
config.include UploadsHelpers
config.mock_framework = :mocha config.mock_framework = :mocha
config.order = 'random' config.order = 'random'
config.infer_spec_type_from_file_location! config.infer_spec_type_from_file_location!

View File

@ -1092,23 +1092,20 @@ RSpec.describe SessionController do
it 'handles non local content correctly' do it 'handles non local content correctly' do
SiteSetting.avatar_sizes = "100|49" SiteSetting.avatar_sizes = "100|49"
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "XXX"
SiteSetting.s3_secret_access_key = "XXX"
SiteSetting.s3_upload_bucket = "test"
SiteSetting.s3_cdn_url = "http://cdn.com" SiteSetting.s3_cdn_url = "http://cdn.com"
stub_request(:any, /test.s3.dualstack.us-east-1.amazonaws.com/).to_return(status: 200, body: "", headers: { referer: "fgdfds" }) stub_request(:any, /s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/).to_return(status: 200, body: "", headers: { referer: "fgdfds" })
@user.create_user_avatar! @user.create_user_avatar!
upload = Fabricate(:upload, url: "//test.s3.dualstack.us-east-1.amazonaws.com/something") upload = Fabricate(:upload, url: "//s3-upload-bucket.s3.dualstack.us-west-1.amazonaws.com/something")
Fabricate(:optimized_image, Fabricate(:optimized_image,
sha1: SecureRandom.hex << "A" * 8, sha1: SecureRandom.hex << "A" * 8,
upload: upload, upload: upload,
width: 98, width: 98,
height: 98, height: 98,
url: "//test.s3.amazonaws.com/something/else" url: "//s3-upload-bucket.s3.amazonaws.com/something/else"
) )
@user.update_columns(uploaded_avatar_id: upload.id) @user.update_columns(uploaded_avatar_id: upload.id)

View File

@ -52,9 +52,7 @@ describe StaticController do
end end
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = 'X'
SiteSetting.s3_secret_access_key = 'X'
end end
it 'can proxy a favicon correctly' do it 'can proxy a favicon correctly' do

View File

@ -10,17 +10,15 @@ describe UploadsController do
let(:upload) { Fabricate(:upload_s3) } let(:upload) { Fabricate(:upload_s3) }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "fakeid7974664"
SiteSetting.s3_secret_access_key = "fakesecretid7974664"
end end
context "when upload is secure and secure media enabled" do context "when upload is secure and secure media enabled" do
before do before do
SiteSetting.secure_media = true SiteSetting.secure_media = true
upload.update(secure: true) upload.update(secure: true)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
end end
context "when running on a multisite connection", type: :multisite do context "when running on a multisite connection", type: :multisite do
it "redirects to the signed_url_for_path with the multisite DB name in the url" do it "redirects to the signed_url_for_path with the multisite DB name in the url" do
sign_in(user) sign_in(user)

View File

@ -240,9 +240,7 @@ describe UploadsController do
fab!(:upload) { upload_file("small.pdf", "pdf") } fab!(:upload) { upload_file("small.pdf", "pdf") }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "fakeid7974664"
SiteSetting.s3_secret_access_key = "fakesecretid7974664"
end end
it "returns 404 " do it "returns 404 " do
@ -383,9 +381,7 @@ describe UploadsController do
let(:upload) { Fabricate(:upload_s3) } let(:upload) { Fabricate(:upload_s3) }
before do before do
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_access_key_id = "fakeid7974664"
SiteSetting.s3_secret_access_key = "fakesecretid7974664"
end end
it "should redirect to the s3 URL" do it "should redirect to the s3 URL" do
@ -398,7 +394,6 @@ describe UploadsController do
before do before do
SiteSetting.secure_media = true SiteSetting.secure_media = true
upload.update(secure: true) upload.update(secure: true)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
end end
it "redirects to the signed_url_for_path" do it "redirects to the signed_url_for_path" do
@ -448,22 +443,9 @@ describe UploadsController do
let(:upload) { Fabricate(:upload_s3) } let(:upload) { Fabricate(:upload_s3) }
let(:secure_url) { upload.url.sub(SiteSetting.Upload.absolute_base_url, "/secure-media-uploads") } let(:secure_url) { upload.url.sub(SiteSetting.Upload.absolute_base_url, "/secure-media-uploads") }
def sign_in_and_stub_head
sign_in(user)
stub_head
end
def stub_head
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
end
before do before do
setup_s3
SiteSetting.authorized_extensions = "*" SiteSetting.authorized_extensions = "*"
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "fakeid7974664"
SiteSetting.s3_secret_access_key = "fakesecretid7974664"
SiteSetting.s3_region = "us-east-1"
SiteSetting.secure_media = true SiteSetting.secure_media = true
end end
@ -473,8 +455,7 @@ describe UploadsController do
end end
it "should return signed url for legitimate request" do it "should return signed url for legitimate request" do
sign_in_and_stub_head sign_in(user)
get secure_url get secure_url
expect(response.status).to eq(302) expect(response.status).to eq(302)
@ -494,7 +475,7 @@ describe UploadsController do
context "when the upload cannot be found from the URL" do context "when the upload cannot be found from the URL" do
it "returns a 404" do it "returns a 404" do
sign_in_and_stub_head sign_in(user)
upload.update(sha1: 'test') upload.update(sha1: 'test')
get secure_url get secure_url
@ -507,13 +488,13 @@ describe UploadsController do
let!(:private_category) { Fabricate(:private_category, group: Fabricate(:group)) } let!(:private_category) { Fabricate(:private_category, group: Fabricate(:group)) }
before do before do
sign_in_and_stub_head sign_in(user)
upload.update(access_control_post_id: post.id) upload.update(access_control_post_id: post.id)
end end
context "when the user has access to the post via guardian" do context "when the user has access to the post via guardian" do
it "should return signed url for legitimate request" do it "should return signed url for legitimate request" do
sign_in_and_stub_head sign_in(user)
get secure_url get secure_url
expect(response.status).to eq(302) expect(response.status).to eq(302)
expect(response.redirect_url).to match("Amz-Expires") expect(response.redirect_url).to match("Amz-Expires")
@ -526,7 +507,7 @@ describe UploadsController do
end end
it "returns a 403" do it "returns a 403" do
sign_in_and_stub_head sign_in(user)
get secure_url get secure_url
expect(response.status).to eq(403) expect(response.status).to eq(403)
end end
@ -538,7 +519,7 @@ describe UploadsController do
upload.update(original_filename: 'test.pdf') upload.update(original_filename: 'test.pdf')
end end
it "redirects to the signed_url_for_path" do it "redirects to the signed_url_for_path" do
sign_in_and_stub_head sign_in(user)
get secure_url get secure_url
expect(response.status).to eq(302) expect(response.status).to eq(302)
expect(response.redirect_url).to match("Amz-Expires") expect(response.redirect_url).to match("Amz-Expires")
@ -554,7 +535,7 @@ describe UploadsController do
end end
it "returns a 403" do it "returns a 403" do
sign_in_and_stub_head sign_in(user)
get secure_url get secure_url
expect(response.status).to eq(403) expect(response.status).to eq(403)
end end
@ -564,8 +545,8 @@ describe UploadsController do
before do before do
SiteSetting.prevent_anons_from_downloading_files = true SiteSetting.prevent_anons_from_downloading_files = true
end end
it "returns a 404" do it "returns a 404" do
stub_head
delete "/session/#{user.username}.json" delete "/session/#{user.username}.json"
get secure_url get secure_url
expect(response.status).to eq(404) expect(response.status).to eq(404)
@ -586,8 +567,6 @@ describe UploadsController do
it "should redirect to the regular show route" do it "should redirect to the regular show route" do
secure_url = upload.url.sub(SiteSetting.Upload.absolute_base_url, "/secure-media-uploads") secure_url = upload.url.sub(SiteSetting.Upload.absolute_base_url, "/secure-media-uploads")
sign_in(user) sign_in(user)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
get secure_url get secure_url
expect(response.status).to eq(302) expect(response.status).to eq(302)
@ -603,8 +582,6 @@ describe UploadsController do
it "should redirect to the presigned URL still otherwise we will get a 403" do it "should redirect to the presigned URL still otherwise we will get a 403" do
secure_url = upload.url.sub(SiteSetting.Upload.absolute_base_url, "/secure-media-uploads") secure_url = upload.url.sub(SiteSetting.Upload.absolute_base_url, "/secure-media-uploads")
sign_in(user) sign_in(user)
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
get secure_url get secure_url
expect(response.status).to eq(302) expect(response.status).to eq(302)
@ -632,11 +609,8 @@ describe UploadsController do
let(:upload) { Fabricate(:upload_s3, secure: true) } let(:upload) { Fabricate(:upload_s3, secure: true) }
before do before do
setup_s3
SiteSetting.authorized_extensions = "pdf|png" SiteSetting.authorized_extensions = "pdf|png"
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.enable_s3_uploads = true
SiteSetting.secure_media = true SiteSetting.secure_media = true
end end

View File

@ -69,25 +69,22 @@ describe UserAvatarsController do
end end
it 'handles non local content correctly' do it 'handles non local content correctly' do
setup_s3
SiteSetting.avatar_sizes = "100|49" SiteSetting.avatar_sizes = "100|49"
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_access_key_id = "XXX"
SiteSetting.s3_secret_access_key = "XXX"
SiteSetting.s3_upload_bucket = "test"
SiteSetting.s3_cdn_url = "http://cdn.com"
SiteSetting.unicode_usernames = true SiteSetting.unicode_usernames = true
SiteSetting.s3_cdn_url = "http://cdn.com"
stub_request(:get, "http://cdn.com/something/else").to_return(body: 'image') stub_request(:get, "#{SiteSetting.s3_cdn_url}/something/else").to_return(body: 'image')
set_cdn_url("http://awesome.com/boom") set_cdn_url("http://awesome.com/boom")
upload = Fabricate(:upload, url: "//test.s3.dualstack.us-east-1.amazonaws.com/something") upload = Fabricate(:upload, url: "//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-west-1.amazonaws.com/something")
optimized_image = Fabricate(:optimized_image, optimized_image = Fabricate(:optimized_image,
sha1: SecureRandom.hex << "A" * 8, sha1: SecureRandom.hex << "A" * 8,
upload: upload, upload: upload,
width: 98, width: 98,
height: 98, height: 98,
url: "//test.s3.dualstack.us-east-1.amazonaws.com/something/else", url: "//#{SiteSetting.s3_upload_bucket}.s3.dualstack.us-west-1.amazonaws.com/something/else",
version: OptimizedImage::VERSION version: OptimizedImage::VERSION
) )

View File

@ -29,7 +29,7 @@ RSpec.describe UploadSerializer do
context "when secure media is enabled" do context "when secure media is enabled" do
before do before do
enable_s3_uploads setup_s3
SiteSetting.secure_media = true SiteSetting.secure_media = true
end end
@ -39,18 +39,4 @@ RSpec.describe UploadSerializer do
end end
end end
end end
def enable_s3_uploads
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "s3-access-key-id"
SiteSetting.s3_secret_access_key = "s3-secret-access-key"
SiteSetting.s3_region = 'us-west-1'
SiteSetting.enable_s3_uploads = true
store = FileStore::S3Store.new
s3_helper = store.instance_variable_get(:@s3_helper)
client = Aws::S3::Client.new(stub_responses: true)
s3_helper.stubs(:s3_client).returns(client)
Discourse.stubs(:store).returns(store)
end
end end

View File

@ -654,10 +654,7 @@ RSpec.describe InlineUploads do
before do before do
upload3 upload3
SiteSetting.enable_s3_uploads = true setup_s3
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secret key"
SiteSetting.s3_cdn_url = "https://s3.cdn.com" SiteSetting.s3_cdn_url = "https://s3.cdn.com"
end end

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
module UploadsHelpers
def setup_s3
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_region = 'us-west-1'
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.#{SiteSetting.s3_region}.amazonaws.com/")
end
def stub_upload(upload)
url = "https://#{SiteSetting.s3_upload_bucket}.s3.#{SiteSetting.s3_region}.amazonaws.com/original/1X/#{upload.sha1}.#{upload.extension}?acl"
stub_request(:put, url)
end
def stub_s3_store
store = FileStore::S3Store.new
client = Aws::S3::Client.new(stub_responses: true)
store.s3_helper.stubs(:s3_client).returns(client)
Discourse.stubs(:store).returns(store)
end
end

View File

@ -50,7 +50,8 @@ RSpec.describe "tasks/uploads" do
context "when store is external" do context "when store is external" do
before do before do
enable_s3_uploads(uploads) setup_s3
uploads.each { |upload| stub_upload(upload) }
end end
context "when secure media is enabled" do context "when secure media is enabled" do
@ -125,7 +126,11 @@ RSpec.describe "tasks/uploads" do
upload_to_mark_not_secure = Fabricate(:upload_s3, secure: true) upload_to_mark_not_secure = Fabricate(:upload_s3, secure: true)
post_for_upload = Fabricate(:post) post_for_upload = Fabricate(:post)
PostUpload.create(post: post_for_upload, upload: upload_to_mark_not_secure) PostUpload.create(post: post_for_upload, upload: upload_to_mark_not_secure)
enable_s3_uploads(uploads.concat([upload_to_mark_not_secure]))
setup_s3
uploads.each { |upload| stub_upload(upload) }
stub_upload(upload_to_mark_not_secure)
invoke_task invoke_task
expect(upload_to_mark_not_secure.reload.secure).to eq(false) expect(upload_to_mark_not_secure.reload.secure).to eq(false)
end end
@ -154,7 +159,10 @@ RSpec.describe "tasks/uploads" do
before do before do
global_setting :s3_bucket, 'file-uploads/folder' global_setting :s3_bucket, 'file-uploads/folder'
global_setting :s3_region, 'us-east-1' global_setting :s3_region, 'us-east-1'
enable_s3_uploads(uploads)
setup_s3
uploads.each { |upload| stub_upload(upload) }
upload1.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload1.base62_sha1}.png" upload1.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload1.base62_sha1}.png"
upload1.save! upload1.save!
upload2.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload2.base62_sha1}.png" upload2.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload2.base62_sha1}.png"
@ -206,7 +214,9 @@ RSpec.describe "tasks/uploads" do
before do before do
global_setting :s3_bucket, 'file-uploads/folder' global_setting :s3_bucket, 'file-uploads/folder'
global_setting :s3_region, 'us-east-1' global_setting :s3_region, 'us-east-1'
enable_s3_uploads(uploads) setup_s3
uploads.each { |upload| stub_upload(upload) }
upload1.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload1.base62_sha1}.png" upload1.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload1.base62_sha1}.png"
upload1.save! upload1.save!
upload2.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload2.base62_sha1}.png" upload2.url = "//#{SiteSetting.s3_upload_bucket}.amazonaws.com/original/1X/#{upload2.base62_sha1}.png"
@ -251,7 +261,9 @@ RSpec.describe "tasks/uploads" do
end end
before do before do
enable_s3_uploads(uploads) setup_s3
uploads.each { |upload| stub_upload(upload) }
SiteSetting.secure_media = true SiteSetting.secure_media = true
PostUpload.create(post: post1, upload: upload1) PostUpload.create(post: post1, upload: upload1)
PostUpload.create(post: post1, upload: upload2) PostUpload.create(post: post1, upload: upload2)
@ -300,20 +312,4 @@ RSpec.describe "tasks/uploads" do
invoke_task invoke_task
end end
end end
def enable_s3_uploads(uploads)
SiteSetting.enable_s3_uploads = true
SiteSetting.s3_upload_bucket = "s3-upload-bucket"
SiteSetting.s3_access_key_id = "some key"
SiteSetting.s3_secret_access_key = "some secrets3_region key"
stub_request(:head, "https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/")
uploads.each do |upload|
stub_request(
:put,
"https://#{SiteSetting.s3_upload_bucket}.s3.amazonaws.com/original/1X/#{upload.sha1}.#{upload.extension}?acl"
)
end
end
end end