diff --git a/lib/itunes/receipt.rb b/lib/itunes/receipt.rb index 9f82022..4dbd414 100644 --- a/lib/itunes/receipt.rb +++ b/lib/itunes/receipt.rb @@ -31,6 +31,9 @@ def initialize(attributes = {}) :bvrs, :download_id, :expires_date, + :cancellation_date, + :cancellation_date_ms, + :cancellation_date_pst, :in_app, :is_trial_period, :itunes_env, @@ -61,6 +64,15 @@ def initialize(attributes = {}) @expires_date = if receipt_attributes[:expires_date] Time.at(receipt_attributes[:expires_date].to_i / 1000) end + @cancellation_date = if receipt_attributes[:cancellation_date] + Time.parse receipt_attributes[:cancellation_date].sub('Etc/GMT', 'GMT') + end + @cancellation_date_ms = if receipt_attributes[:cancellation_date_ms] + receipt_attributes[:cancellation_date_ms].to_i + end + @cancellation_date_pst = if receipt_attributes[:cancellation_date_pst] + Time.parse receipt_attributes[:cancellation_date_pst].sub('America/Los_Angeles', 'PST') + end @in_app = if receipt_attributes[:in_app] receipt_attributes[:in_app].map { |ia| self.class.new(:receipt => ia) } end diff --git a/spec/fake_json/autorenew_subscription_cancelled.json b/spec/fake_json/autorenew_subscription_cancelled.json new file mode 100644 index 0000000..a007161 --- /dev/null +++ b/spec/fake_json/autorenew_subscription_cancelled.json @@ -0,0 +1,2 @@ +{"receipt":{"original_purchase_date_pst":"2012-10-11 07:45:40 America/Los_Angeles", "unique_identifier":"4d69cc362c5c58ce62da68ee43721ea670907bad", "original_transaction_id":"1000000057005439", "expires_date":"1350157508197", "cancellation_date":"2012-10-13 19:42:08 Etc/GMT", "cancellation_date_ms":"1350157328197", "cancellation_date_pst":"2012-10-13 12:42:08 America/Los_Angeles", "transaction_id":"1000000055076747", "quantity":"1", "product_id":"com.notkeepingitreal.fizzbuzz.subscription.autorenew1m", "original_purchase_date_ms":"1349966740000", "bid":"com.notkeepingitreal.fizzbuzz", "web_order_line_item_id":"1000000026553289", "bvrs":"1.0", "expires_date_formatted":"2012-10-13 19:45:08 Etc/GMT", "purchase_date":"2012-10-13 19:40:08 Etc/GMT", "purchase_date_ms":"1350157208197", "expires_date_formatted_pst":"2012-10-13 12:45:08 America/Los_Angeles", "purchase_date_pst":"2012-10-13 12:40:08 America/Los_Angeles", "original_purchase_date":"2012-10-11 14:45:40 Etc/GMT", "item_id":"570504929"}, "latest_receipt_info":{"original_purchase_date_pst":"2012-10-11 07:45:40 America/Los_Angeles", "unique_identifier":"4d79cc562c5c58ce62da68ee43721ea670907bad", "original_transaction_id":"1000000057005439", "expires_date":"1350157808000", "cancellation_date":"2012-10-13 19:42:08 Etc/GMT", "cancellation_date_ms":"1350157328197", "cancellation_date_pst":"2012-10-13 12:42:08 America/Los_Angeles", "transaction_id":"1000000052076747", "quantity":"1", "product_id":"com.notkeepingitreal.fizzbuzz.subscription.autorenew1m", "original_purchase_date_ms":"1349966740000", "bid":"com.notkeepingitreal.fizzbuzz", "web_order_line_item_id":"1000000027293289", "bvrs":"1.0", "expires_date_formatted":"2012-10-13 19:50:08 Etc/GMT", "purchase_date":"2012-10-13 19:40:08 Etc/GMT", "purchase_date_ms":"1350157208000", "expires_date_formatted_pst":"2012-10-13 12:50:08 America/Los_Angeles", "purchase_date_pst":"2012-10-13 12:40:08 America/Los_Angeles", "original_purchase_date":"2012-10-11 14:45:40 Etc/GMT", "item_id":"570504929"}, "status":0, "latest_receipt":"junk="} + diff --git a/spec/itunes/receipt_spec.rb b/spec/itunes/receipt_spec.rb index f849b6b..1da8ddc 100644 --- a/spec/itunes/receipt_spec.rb +++ b/spec/itunes/receipt_spec.rb @@ -90,8 +90,10 @@ receipt.original.quantity.should be_nil receipt.original.transaction_id.should == '1000000001479608' receipt.original.purchase_date.should == Time.utc(2011, 2, 17, 6, 20, 57) + receipt.original.cancellation_date.should be_nil receipt.expires_date.should be_nil receipt.receipt_data.should be_nil + receipt.cancellation_date.should be_nil receipt.itunes_env.should == :production # Those attributes are not returned from iTunes Connect Sandbox @@ -143,6 +145,7 @@ receipt.bid.should be_nil receipt.bvrs.should be_nil receipt.expires_date.should be_nil + receipt.cancellation_date.should be_nil receipt.receipt_data.should be_nil receipt.itunes_env.should == :production @@ -172,6 +175,7 @@ receipt.original.transaction_id.should == original_transaction_id receipt.original.purchase_date.should == original_purchase_date receipt.expires_date.should == Time.utc(2012, 10, 13, 19, 45, 8) + receipt.cancellation_date.should be_nil receipt.receipt_data.should be_nil # Those attributes are not returned from iTunes Connect Sandbox @@ -185,6 +189,7 @@ latest.transaction_id.should == '1000000052076747' latest.purchase_date.should == Time.utc(2012, 10, 13, 19, 40, 8) latest.expires_date.should == Time.utc(2012, 10, 13, 19, 50, 8) # five minutes after the "old" receipt + latest.cancellation_date.should be_nil latest.bid.should == 'com.notkeepingitreal.fizzbuzz' latest.bvrs.should == '1.0' latest.original.quantity.should be_nil @@ -213,6 +218,21 @@ end + context 'when cancelled autorenew subscription' do + before do + fake_json :autorenew_subscription_cancelled + end + + it 'should return valid Receipt instance for autorenew subscription, with the cancellation_date field set' do + receipt = Itunes::Receipt.verify! 'autorenew_subscription_cancelled' + receipt.should be_instance_of Itunes::Receipt + receipt.purchase_date.should == Time.utc(2012, 10, 13, 19, 40, 8) + receipt.expires_date.should == Time.utc(2012, 10, 13, 19, 45, 8) + receipt.cancellation_date.should == Time.utc(2012, 10, 13, 19, 42, 8) # user cancelled via Apple Customer Support 2 minutes after their subscription began + end + + end + context 'when offline' do before do fake_json :offline