From a9f159634f46ab69348bad5db8367a5c39a62ec1 Mon Sep 17 00:00:00 2001 From: Jonas Thiel Date: Fri, 24 Feb 2023 10:52:11 +0100 Subject: [PATCH] Don't define constants in blocks Blocks will leak out these constants to global scope --- .../subscription_verification_spec.rb | 16 ++++---- spec/app_store/verification_spec.rb | 14 ++++++- spec/app_store/verifier_spec.rb | 28 +++++-------- spec/cli/commands/app_store_spec.rb | 23 +++++------ .../product_purchase_spec.rb | 27 ++----------- .../subscription_purchase_spec.rb | 40 ++++--------------- spec/play_store/verification_failure_spec.rb | 10 +++-- 7 files changed, 61 insertions(+), 97 deletions(-) diff --git a/spec/app_store/subscription_verification_spec.rb b/spec/app_store/subscription_verification_spec.rb index 40e4cd2..a848542 100644 --- a/spec/app_store/subscription_verification_spec.rb +++ b/spec/app_store/subscription_verification_spec.rb @@ -88,19 +88,21 @@ private - DummyClient = Struct.new(:response) do - attr_reader :receipt_data, :secret + let(:dummy_client_class) do + Struct.new(:response) do + attr_reader :receipt_data, :secret - def verify(receipt_data, secret) - @receipt_data = receipt_data - @secret = secret - response + def verify(receipt_data, secret) + @receipt_data = receipt_data + @secret = secret + response + end end end def with_mocked_response(response) recorded = [] - dummy = DummyClient.new(response) + dummy = dummy_client_class.new(response) stub = proc do |*args| recorded << args dummy diff --git a/spec/app_store/verification_spec.rb b/spec/app_store/verification_spec.rb index 89dd10d..58b0f06 100644 --- a/spec/app_store/verification_spec.rb +++ b/spec/app_store/verification_spec.rb @@ -43,9 +43,21 @@ private + let(:dummy_client_class) do + Struct.new(:response) do + attr_reader :receipt_data, :secret + + def verify(receipt_data, secret) + @receipt_data = receipt_data + @secret = secret + response + end + end + end + def with_mocked_response(response) recorded = [] - dummy = DummyClient.new(response) + dummy = dummy_client_class.new(response) stub = proc do |*args| recorded << args dummy diff --git a/spec/app_store/verifier_spec.rb b/spec/app_store/verifier_spec.rb index fc62c84..140fbb1 100644 --- a/spec/app_store/verifier_spec.rb +++ b/spec/app_store/verifier_spec.rb @@ -125,11 +125,21 @@ private + let(:dummy_verification_class) do + Struct.new(:endpoint, :data, :secret, :product_ids) do + attr_accessor :results + + def call! + results.shift + end + end + end + def with_mocked_verifier(*results, &block) @recorded ||= [] stub = proc do |*args| @recorded << args - DummyAppStoreVerification.new(*args).tap { |v| v.results = results } + dummy_verification_class.new(*args).tap { |v| v.results = results } end CandyCheck::AppStore::Verification.stub :new, stub, &block end @@ -141,20 +151,4 @@ def assert_recorded(*calls) def get_failure(code) CandyCheck::AppStore::VerificationFailure.fetch(code) end - - class DummyAppStoreVerification - attr_reader :endpoint, :data, :secret, :product_ids - attr_accessor :results - - def initialize(endpoint, data, secret, product_ids = nil) - @endpoint = endpoint - @data = data - @secret = secret - @product_ids = product_ids - end - - def call! - results.shift - end - end end diff --git a/spec/cli/commands/app_store_spec.rb b/spec/cli/commands/app_store_spec.rb index 9fb2606..857c494 100644 --- a/spec/cli/commands/app_store_spec.rb +++ b/spec/cli/commands/app_store_spec.rb @@ -10,10 +10,20 @@ environment: :sandbox, } end + let(:dummy_verifier_class) do + Struct.new(:config) do + attr_reader :arguments + + def verify(*arguments) + @arguments = arguments + { result: :stubbed } + end + end + end before do stub = proc do |*args| - @verifier = DummyAppStoreVerifier.new(*args) + @verifier = dummy_verifier_class.new(*args) end CandyCheck::AppStore::Verifier.stub :new, stub do run_command! @@ -42,15 +52,4 @@ _(out.lines).must_equal ["Hash:", { result: :stubbed }] end end - - private - - DummyAppStoreVerifier = Struct.new(:config) do - attr_reader :arguments - - def verify(*arguments) - @arguments = arguments - { result: :stubbed } - end - end end diff --git a/spec/play_store/product_purchases/product_purchase_spec.rb b/spec/play_store/product_purchases/product_purchase_spec.rb index fd8b7a8..092a2c6 100644 --- a/spec/play_store/product_purchases/product_purchase_spec.rb +++ b/spec/play_store/product_purchases/product_purchase_spec.rb @@ -5,7 +5,7 @@ describe "valid and non-consumed product" do let(:fake_product_purchase) do - FakeProductPurchase.new( + OpenStruct.new( consumption_state: 0, developer_payload: "payload that gets stored and returned", kind: "androidpublisher#productPurchase", @@ -51,7 +51,7 @@ describe "valid and consumed product" do let(:fake_product_purchase) do - FakeProductPurchase.new( + OpenStruct.new( consumption_state: 1, developer_payload: "payload that gets stored and returned", kind: "androidpublisher#productPurchase", @@ -72,7 +72,7 @@ describe "non-valid product" do let(:fake_product_purchase) do - FakeProductPurchase.new( + OpenStruct.new( consumption_state: 0, developer_payload: "payload that gets stored and returned", kind: "androidpublisher#productPurchase", @@ -86,25 +86,4 @@ _(subject.valid?).must_be_false end end - - private - - class FakeProductPurchase - FIELDS = %i( - consumption_state - developer_payload - kind - order_id - purchase_state - purchase_time_millis - ).freeze - - attr_accessor(*FIELDS) - - def initialize(hash) - FIELDS.each do |key| - public_send("#{key}=", hash[key]) - end - end - end end diff --git a/spec/play_store/subscription_purchases/subscription_purchase_spec.rb b/spec/play_store/subscription_purchases/subscription_purchase_spec.rb index 4dab1da..6e8a8ac 100644 --- a/spec/play_store/subscription_purchases/subscription_purchase_spec.rb +++ b/spec/play_store/subscription_purchases/subscription_purchase_spec.rb @@ -5,7 +5,7 @@ describe "expired and canceled subscription" do let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: 1_462_132_088_610, @@ -66,8 +66,9 @@ describe "unexpired and renewing subscription" do two_days_from_now = DateTime.now + 2 + let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: (two_days_from_now.to_time.to_i * 1000), @@ -89,7 +90,7 @@ describe "expired due to payment failure" do let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: 1_462_132_088_610, @@ -112,7 +113,7 @@ describe "subscription cancelation by user" do describe "when subscription is not canceled" do let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: 1_462_132_088_610, @@ -137,7 +138,7 @@ describe "when subscription is canceled" do let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: 1_462_132_088_610, @@ -166,7 +167,7 @@ describe "expired with pending payment" do let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: 1_462_132_088_610, @@ -188,7 +189,7 @@ describe "trial" do let(:fake_subscription_purchase) do - FakeSubscriptionPurchase.new( + OpenStruct.new( kind: "androidpublisher#subscriptionPurchase", start_time_millis: 1_459_540_113_244, expiry_time_millis: 1_462_132_088_610, @@ -209,29 +210,4 @@ _(subject.price_currency_code).must_equal "SOMECODE" end end - - private - - class FakeSubscriptionPurchase - FIELDS = %i( - kind - start_time_millis - expiry_time_millis - user_cancellation_time_millis - auto_renewing - developer_payload - cancel_reason - payment_state - price_amount_micros - price_currency_code - ).freeze - - attr_accessor(*FIELDS) - - def initialize(hash) - FIELDS.each do |key| - public_send("#{key}=", hash[key]) - end - end - end end diff --git a/spec/play_store/verification_failure_spec.rb b/spec/play_store/verification_failure_spec.rb index fa31f5f..ec579a3 100644 --- a/spec/play_store/verification_failure_spec.rb +++ b/spec/play_store/verification_failure_spec.rb @@ -3,9 +3,13 @@ describe CandyCheck::PlayStore::VerificationFailure do subject { CandyCheck::PlayStore::VerificationFailure.new(fake_error) } + let(:fake_error_class) do + Struct.new(:status_code, :message) + end + describe "denied" do let(:fake_error) do - FakeError.new("401", "The current user has insufficient permissions") + fake_error_class.new("401", "The current user has insufficient permissions") end it "returns the code" do @@ -19,7 +23,7 @@ describe "empty" do let(:fake_error) do - FakeError.new(nil, nil) + fake_error_class.new(nil, nil) end it "returns an unknown code" do @@ -30,6 +34,4 @@ _(subject.message).must_equal "Unknown error" end end - - FakeError = Struct.new(:status_code, :message) end