Skip to content

Commit 18bc892

Browse files
author
Bart de Water
authored
Merge pull request #238 from Shopify/active-job-integration
Add Active Job serializer for Money arguments
2 parents 67e791f + c8d9aef commit 18bc892

File tree

5 files changed

+66
-0
lines changed

5 files changed

+66
-0
lines changed

lib/money.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
require_relative 'money/accounting_money_parser'
1313
require_relative 'money/core_extensions'
1414
require_relative 'money_column' if defined?(ActiveRecord)
15+
require_relative 'money/railtie' if defined?(Rails::Railtie)
1516

1617
require_relative 'rubocop/cop/money' if defined?(RuboCop)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
class Money
4+
module Rails
5+
class JobArgumentSerializer < ::ActiveJob::Serializers::ObjectSerializer
6+
def serialize(money)
7+
super("value" => money.value, "currency" => money.currency.iso_code)
8+
end
9+
10+
def deserialize(hash)
11+
Money.new(hash["value"], hash["currency"])
12+
end
13+
14+
private
15+
16+
def klass
17+
Money
18+
end
19+
end
20+
end
21+
end
22+

lib/money/railtie.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
class Money
4+
class Railtie < Rails::Railtie
5+
initializer "shopify-money.setup_active_job_serializer" do
6+
ActiveSupport.on_load :active_job do
7+
require_relative "rails/job_argument_serializer"
8+
ActiveJob::Serializers.add_serializers ::Money::Rails::JobArgumentSerializer
9+
end
10+
end
11+
end
12+
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
require "rails_spec_helper"
4+
5+
RSpec.describe Money::Rails::JobArgumentSerializer do
6+
it "roundtrip a Money argument returns the same object" do
7+
job = MoneyTestJob.new(value: Money.new(10.21, "BRL"))
8+
9+
serialized_job = job.serialize
10+
serialized_value = serialized_job["arguments"][0]["value"]
11+
expect(serialized_value["_aj_serialized"]).to eq("Money::Rails::JobArgumentSerializer")
12+
expect(serialized_value["value"]).to eq(BigDecimal("10.21"))
13+
expect(serialized_value["currency"]).to eq("BRL")
14+
15+
job2 = MoneyTestJob.deserialize(serialized_job)
16+
job2.send(:deserialize_arguments_if_needed)
17+
18+
expect(job2.arguments.first[:value]).to eq(Money.new(10.21, "BRL"))
19+
end
20+
end

spec/rails_spec_helper.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# frozen_string_literal: true
2+
3+
require "active_job"
4+
require_relative "spec_helper"
5+
6+
Money::Railtie.initializers.each(&:run)
7+
8+
class MoneyTestJob < ActiveJob::Base
9+
def perform(_params)
10+
end
11+
end

0 commit comments

Comments
 (0)