From b0e62f3d0d5a09e46f2186c424aed823ed5cb734 Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Tue, 24 Mar 2026 12:05:05 +0000 Subject: [PATCH] CLDC-4280: also apply with_timecop to s3 --- app/helpers/timecop_helper.rb | 9 ++++ app/mailers/devise_notify_mailer.rb | 11 +---- app/mailers/notify_mailer.rb | 11 +---- app/services/storage/s3_service.rb | 76 ++++++++++++++++++----------- 4 files changed, 61 insertions(+), 46 deletions(-) create mode 100644 app/helpers/timecop_helper.rb diff --git a/app/helpers/timecop_helper.rb b/app/helpers/timecop_helper.rb new file mode 100644 index 000000000..2780cc918 --- /dev/null +++ b/app/helpers/timecop_helper.rb @@ -0,0 +1,9 @@ +module TimecopHelper + def without_timecop(&block) + if defined?(Timecop) + Timecop.return(&block) + else + yield + end + end +end diff --git a/app/mailers/devise_notify_mailer.rb b/app/mailers/devise_notify_mailer.rb index 6e7b1f6fc..d023ca843 100644 --- a/app/mailers/devise_notify_mailer.rb +++ b/app/mailers/devise_notify_mailer.rb @@ -1,4 +1,5 @@ class DeviseNotifyMailer < Devise::Mailer + include TimecopHelper require "notifications/client" def notify_client @@ -8,15 +9,7 @@ class DeviseNotifyMailer < Devise::Mailer def send_email(email_address, template_id, personalisation) return true if intercept_send?(email_address) - if defined?(Timecop) - Timecop.return do - notify_client.send_email( - email_address:, - template_id:, - personalisation:, - ) - end - else + without_timecop do notify_client.send_email( email_address:, template_id:, diff --git a/app/mailers/notify_mailer.rb b/app/mailers/notify_mailer.rb index 3c19de54f..93187a749 100644 --- a/app/mailers/notify_mailer.rb +++ b/app/mailers/notify_mailer.rb @@ -1,4 +1,5 @@ class NotifyMailer < ApplicationMailer + include TimecopHelper require "notifications/client" def notify_client @@ -8,15 +9,7 @@ class NotifyMailer < ApplicationMailer def send_email(email, template_id, personalisation) return true if intercept_send?(email) - if defined?(Timecop) - Timecop.return do - notify_client.send_email( - email_address: email, - template_id:, - personalisation:, - ) - end - else + without_timecop do notify_client.send_email( email_address: email, template_id:, diff --git a/app/services/storage/s3_service.rb b/app/services/storage/s3_service.rb index a6eef7d49..c94a418b7 100644 --- a/app/services/storage/s3_service.rb +++ b/app/services/storage/s3_service.rb @@ -1,5 +1,7 @@ module Storage class S3Service < StorageService + include TimecopHelper + attr_reader :configuration def initialize(config_service, instance_name) @@ -11,61 +13,79 @@ module Storage end def list_files(folder) - @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder) - .flat_map { |response| response.contents.map(&:key) } + without_timecop do + @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder) + .flat_map { |response| response.contents.map(&:key) } + end end def folder_present?(folder) - response = @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder, max_keys: 1) - response.key_count == 1 + without_timecop do + response = @client.list_objects_v2(bucket: @configuration.bucket_name, prefix: folder, max_keys: 1) + response.key_count == 1 + end end def get_presigned_url(file_name, duration, response_content_disposition: nil) - Aws::S3::Presigner - .new({ client: @client }) - .presigned_url(:get_object, bucket: @configuration.bucket_name, key: file_name, expires_in: duration, response_content_disposition:) + without_timecop do + Aws::S3::Presigner + .new({ client: @client }) + .presigned_url(:get_object, bucket: @configuration.bucket_name, key: file_name, expires_in: duration, response_content_disposition:) + end end def get_file_io(file_name) - @client.get_object(bucket: @configuration.bucket_name, key: file_name) - .body + without_timecop do + @client.get_object(bucket: @configuration.bucket_name, key: file_name) + .body + end end def get_file(file_name) - @client.get_object(bucket: @configuration.bucket_name, key: file_name) - .body.read + without_timecop do + @client.get_object(bucket: @configuration.bucket_name, key: file_name) + .body.read + end end def write_file(file_name, data, content_type: nil) - if content_type.nil? - @client.put_object( - body: data, - bucket: @configuration.bucket_name, - key: file_name, - ) - else - @client.put_object( - body: data, - bucket: @configuration.bucket_name, - key: file_name, - content_type:, - ) + without_timecop do + if content_type.nil? + @client.put_object( + body: data, + bucket: @configuration.bucket_name, + key: file_name, + ) + else + @client.put_object( + body: data, + bucket: @configuration.bucket_name, + key: file_name, + content_type:, + ) + end end end def get_file_metadata(file_name) - @client.head_object(bucket: @configuration.bucket_name, key: file_name) + without_timecop do + @client.head_object(bucket: @configuration.bucket_name, key: file_name) + end end def file_exists?(file_name) - @client.head_object(bucket: @configuration.bucket_name, key: file_name) - true + without_timecop do + @client.head_object(bucket: @configuration.bucket_name, key: file_name) + true + end rescue Aws::S3::Errors::NotFound false end def delete_file(file_name) - @client.delete_object(bucket: @configuration.bucket_name, key: file_name) + without_timecop do + @client.delete_object(bucket: @configuration.bucket_name, key: file_name) + end end private