braintree 2.4.0 → 2.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +4 -0
- data/lib/braintree.rb +43 -32
- data/lib/braintree/add_on.rb +4 -0
- data/lib/braintree/address.rb +18 -72
- data/lib/braintree/address_gateway.rb +76 -0
- data/lib/braintree/advanced_search.rb +31 -13
- data/lib/braintree/base_module.rb +6 -0
- data/lib/braintree/configuration.rb +57 -39
- data/lib/braintree/credit_card.rb +75 -129
- data/lib/braintree/credit_card_gateway.rb +133 -0
- data/lib/braintree/credit_card_verification.rb +8 -0
- data/lib/braintree/customer.rb +70 -123
- data/lib/braintree/customer_gateway.rb +121 -0
- data/lib/braintree/digest.rb +2 -2
- data/lib/braintree/discount.rb +4 -0
- data/lib/braintree/error_codes.rb +50 -5
- data/lib/braintree/error_result.rb +4 -18
- data/lib/braintree/errors.rb +1 -2
- data/lib/braintree/exceptions.rb +11 -16
- data/lib/braintree/gateway.rb +39 -0
- data/lib/braintree/http.rb +30 -26
- data/lib/braintree/modification.rb +23 -0
- data/lib/braintree/resource_collection.rb +1 -1
- data/lib/braintree/subscription.rb +29 -129
- data/lib/braintree/subscription_gateway.rb +122 -0
- data/lib/braintree/subscription_search.rb +6 -7
- data/lib/braintree/successful_result.rb +1 -12
- data/lib/braintree/test/credit_card_numbers.rb +4 -2
- data/lib/braintree/test/transaction_amounts.rb +3 -0
- data/lib/braintree/transaction.rb +83 -243
- data/lib/braintree/transaction/credit_card_details.rb +4 -4
- data/lib/braintree/transaction_gateway.rb +124 -0
- data/lib/braintree/transaction_search.rb +5 -3
- data/lib/braintree/transparent_redirect.rb +19 -112
- data/lib/braintree/transparent_redirect_gateway.rb +105 -0
- data/lib/braintree/util.rb +4 -0
- data/lib/braintree/validation_error.rb +1 -0
- data/lib/braintree/validation_error_collection.rb +5 -23
- data/lib/braintree/version.rb +2 -2
- data/lib/braintree/xml/parser.rb +1 -1
- data/lib/braintree/xml/rexml.rb +2 -2
- data/spec/integration/braintree/advanced_search_spec.rb +532 -0
- data/spec/integration/braintree/credit_card_spec.rb +5 -8
- data/spec/integration/braintree/http_spec.rb +53 -39
- data/spec/integration/braintree/subscription_spec.rb +678 -213
- data/spec/integration/braintree/transaction_search_spec.rb +318 -43
- data/spec/integration/braintree/transaction_spec.rb +134 -3
- data/spec/integration/braintree/transparent_redirect_spec.rb +1 -1
- data/spec/spec_helper.rb +55 -4
- data/spec/unit/braintree/address_spec.rb +8 -8
- data/spec/unit/braintree/base_module_spec.rb +1 -1
- data/spec/unit/braintree/configuration_spec.rb +34 -29
- data/spec/unit/braintree/credit_card_spec.rb +14 -12
- data/spec/unit/braintree/credit_card_verification_spec.rb +16 -0
- data/spec/unit/braintree/customer_spec.rb +10 -8
- data/spec/unit/braintree/digest_spec.rb +8 -17
- data/spec/unit/braintree/error_result_spec.rb +12 -2
- data/spec/unit/braintree/http_spec.rb +2 -2
- data/spec/unit/braintree/subscription_search_spec.rb +77 -0
- data/spec/unit/braintree/subscription_spec.rb +16 -8
- data/spec/unit/braintree/transaction_spec.rb +17 -12
- data/spec/unit/braintree/transparent_redirect_spec.rb +12 -12
- data/spec/unit/braintree/util_spec.rb +24 -0
- data/spec/unit/braintree/xml/parser_spec.rb +1 -1
- data/spec/unit/braintree_spec.rb +1 -1
- metadata +16 -5
@@ -18,49 +18,53 @@ describe Braintree::Transaction, "search" do
|
|
18
18
|
transaction = Braintree::Transaction.sale!(
|
19
19
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
20
20
|
:credit_card => {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
21
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
22
|
+
:expiration_date => "05/2012",
|
23
|
+
:cardholder_name => "Tom Smith",
|
24
|
+
:token => token,
|
25
|
+
},
|
26
|
+
:billing => {
|
27
|
+
:company => "Braintree",
|
28
|
+
:country_name => "United States of America",
|
29
|
+
:extended_address => "Suite 123",
|
30
|
+
:first_name => first_name,
|
31
|
+
:last_name => "Smith",
|
32
|
+
:locality => "Chicago",
|
33
|
+
:postal_code => "12345",
|
34
|
+
:region => "IL",
|
35
|
+
:street_address => "123 Main St"
|
36
|
+
},
|
37
|
+
:customer => {
|
38
|
+
:company => "Braintree",
|
39
|
+
:email => "smith@example.com",
|
40
|
+
:fax => "5551231234",
|
41
|
+
:first_name => "Tom",
|
42
|
+
:id => customer_id,
|
43
|
+
:last_name => "Smith",
|
44
|
+
:phone => "5551231234",
|
45
|
+
:website => "http://example.com",
|
46
|
+
},
|
47
|
+
:options => {
|
48
|
+
:store_in_vault => true,
|
49
|
+
:submit_for_settlement => true
|
50
|
+
},
|
50
51
|
:order_id => "myorder",
|
51
52
|
:shipping => {
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
53
|
+
:company => "Braintree P.S.",
|
54
|
+
:country_name => "Mexico",
|
55
|
+
:extended_address => "Apt 456",
|
56
|
+
:first_name => "Thomas",
|
57
|
+
:last_name => "Smithy",
|
58
|
+
:locality => "Braintree",
|
59
|
+
:postal_code => "54321",
|
60
|
+
:region => "MA",
|
61
|
+
:street_address => "456 Road"
|
62
|
+
}
|
62
63
|
)
|
63
64
|
|
65
|
+
SpecHelper.settle_transaction transaction.id
|
66
|
+
transaction = Braintree::Transaction.find(transaction.id)
|
67
|
+
|
64
68
|
search_criteria = {
|
65
69
|
:billing_company => "Braintree",
|
66
70
|
:billing_country_name => "United States of America",
|
@@ -85,6 +89,7 @@ describe Braintree::Transaction, "search" do
|
|
85
89
|
:order_id => "myorder",
|
86
90
|
:payment_method_token => token,
|
87
91
|
:processor_authorization_code => transaction.processor_authorization_code,
|
92
|
+
:settlement_batch_id => transaction.settlement_batch_id,
|
88
93
|
:shipping_company => "Braintree P.S.",
|
89
94
|
:shipping_country_name => "Mexico",
|
90
95
|
:shipping_extended_address => "Apt 456",
|
@@ -416,7 +421,7 @@ describe Braintree::Transaction, "search" do
|
|
416
421
|
},
|
417
422
|
:options => { :submit_for_settlement => true }
|
418
423
|
)
|
419
|
-
|
424
|
+
SpecHelper.settle_transaction transaction.id
|
420
425
|
|
421
426
|
refund_transaction = transaction.refund.new_transaction
|
422
427
|
|
@@ -612,9 +617,9 @@ describe Braintree::Transaction, "search" do
|
|
612
617
|
transaction = Braintree::Transaction.sale!(
|
613
618
|
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
614
619
|
:credit_card => {
|
615
|
-
|
616
|
-
|
617
|
-
|
620
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
621
|
+
:expiration_date => "05/12"
|
622
|
+
}
|
618
623
|
)
|
619
624
|
|
620
625
|
collection = Braintree::Transaction.search do |search|
|
@@ -629,6 +634,276 @@ describe Braintree::Transaction, "search" do
|
|
629
634
|
collection.first.id.should == transaction.id
|
630
635
|
end
|
631
636
|
end
|
637
|
+
|
638
|
+
context "status date ranges" do
|
639
|
+
it "finds transactions authorized in a given range" do
|
640
|
+
transaction = Braintree::Transaction.sale!(
|
641
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
642
|
+
:credit_card => {
|
643
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
644
|
+
:expiration_date => "05/12"
|
645
|
+
}
|
646
|
+
)
|
647
|
+
|
648
|
+
collection = Braintree::Transaction.search do |search|
|
649
|
+
search.id.is transaction.id
|
650
|
+
search.authorized_at.between(
|
651
|
+
Date.today - 2,
|
652
|
+
Date.today - 1
|
653
|
+
)
|
654
|
+
end
|
655
|
+
|
656
|
+
collection.maximum_size.should == 0
|
657
|
+
|
658
|
+
collection = Braintree::Transaction.search do |search|
|
659
|
+
search.id.is transaction.id
|
660
|
+
search.authorized_at.between(
|
661
|
+
Date.today - 1,
|
662
|
+
Date.today + 1
|
663
|
+
)
|
664
|
+
end
|
665
|
+
|
666
|
+
collection.maximum_size.should == 1
|
667
|
+
collection.first.id.should == transaction.id
|
668
|
+
end
|
669
|
+
|
670
|
+
it "finds transactions failed in a given range" do
|
671
|
+
transaction = Braintree::Transaction.sale(
|
672
|
+
:amount => Braintree::Test::TransactionAmounts::Fail,
|
673
|
+
:credit_card => {
|
674
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
675
|
+
:expiration_date => "05/12"
|
676
|
+
}
|
677
|
+
).transaction
|
678
|
+
|
679
|
+
collection = Braintree::Transaction.search do |search|
|
680
|
+
search.id.is transaction.id
|
681
|
+
search.failed_at.between(
|
682
|
+
Date.today - 2,
|
683
|
+
Date.today - 1
|
684
|
+
)
|
685
|
+
end
|
686
|
+
|
687
|
+
collection.maximum_size.should == 0
|
688
|
+
|
689
|
+
collection = Braintree::Transaction.search do |search|
|
690
|
+
search.id.is transaction.id
|
691
|
+
search.failed_at.between(
|
692
|
+
Date.today - 1,
|
693
|
+
Date.today + 1
|
694
|
+
)
|
695
|
+
end
|
696
|
+
|
697
|
+
collection.maximum_size.should == 1
|
698
|
+
collection.first.id.should == transaction.id
|
699
|
+
end
|
700
|
+
|
701
|
+
it "finds transactions gateway_rejected in a given range" do
|
702
|
+
old_merchant = Braintree::Configuration.merchant_id
|
703
|
+
old_public_key = Braintree::Configuration.public_key
|
704
|
+
old_private_key = Braintree::Configuration.private_key
|
705
|
+
|
706
|
+
begin
|
707
|
+
Braintree::Configuration.merchant_id = "processing_rules_merchant_id"
|
708
|
+
Braintree::Configuration.public_key = "processing_rules_public_key"
|
709
|
+
Braintree::Configuration.private_key = "processing_rules_private_key"
|
710
|
+
|
711
|
+
transaction = Braintree::Transaction.sale(
|
712
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
713
|
+
:credit_card => {
|
714
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
715
|
+
:expiration_date => "05/12",
|
716
|
+
:cvv => "200"
|
717
|
+
}
|
718
|
+
).transaction
|
719
|
+
|
720
|
+
collection = Braintree::Transaction.search do |search|
|
721
|
+
search.id.is transaction.id
|
722
|
+
search.gateway_rejected_at.between(
|
723
|
+
Date.today - 2,
|
724
|
+
Date.today - 1
|
725
|
+
)
|
726
|
+
end
|
727
|
+
|
728
|
+
collection.maximum_size.should == 0
|
729
|
+
|
730
|
+
collection = Braintree::Transaction.search do |search|
|
731
|
+
search.id.is transaction.id
|
732
|
+
search.gateway_rejected_at.between(
|
733
|
+
Date.today - 1,
|
734
|
+
Date.today + 1
|
735
|
+
)
|
736
|
+
end
|
737
|
+
|
738
|
+
collection.maximum_size.should == 1
|
739
|
+
collection.first.id.should == transaction.id
|
740
|
+
ensure
|
741
|
+
Braintree::Configuration.merchant_id = old_merchant
|
742
|
+
Braintree::Configuration.public_key = old_public_key
|
743
|
+
Braintree::Configuration.private_key = old_private_key
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
it "finds transactions processor declined in a given range" do
|
748
|
+
transaction = Braintree::Transaction.sale(
|
749
|
+
:amount => Braintree::Test::TransactionAmounts::Decline,
|
750
|
+
:credit_card => {
|
751
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
752
|
+
:expiration_date => "05/12"
|
753
|
+
}
|
754
|
+
).transaction
|
755
|
+
|
756
|
+
collection = Braintree::Transaction.search do |search|
|
757
|
+
search.id.is transaction.id
|
758
|
+
search.processor_declined_at.between(
|
759
|
+
Date.today - 2,
|
760
|
+
Date.today - 1
|
761
|
+
)
|
762
|
+
end
|
763
|
+
|
764
|
+
collection.maximum_size.should == 0
|
765
|
+
|
766
|
+
collection = Braintree::Transaction.search do |search|
|
767
|
+
search.id.is transaction.id
|
768
|
+
search.processor_declined_at.between(
|
769
|
+
Date.today - 1,
|
770
|
+
Date.today + 1
|
771
|
+
)
|
772
|
+
end
|
773
|
+
|
774
|
+
collection.maximum_size.should == 1
|
775
|
+
collection.first.id.should == transaction.id
|
776
|
+
end
|
777
|
+
|
778
|
+
it "finds transactions settled in a given range" do
|
779
|
+
transaction = Braintree::Transaction.sale(
|
780
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
781
|
+
:credit_card => {
|
782
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
783
|
+
:expiration_date => "05/12"
|
784
|
+
},
|
785
|
+
:options => {
|
786
|
+
:submit_for_settlement => true
|
787
|
+
}
|
788
|
+
).transaction
|
789
|
+
|
790
|
+
SpecHelper.settle_transaction transaction.id
|
791
|
+
|
792
|
+
collection = Braintree::Transaction.search do |search|
|
793
|
+
search.id.is transaction.id
|
794
|
+
search.settled_at.between(
|
795
|
+
Date.today - 2,
|
796
|
+
Date.today - 1
|
797
|
+
)
|
798
|
+
end
|
799
|
+
|
800
|
+
collection.maximum_size.should == 0
|
801
|
+
|
802
|
+
collection = Braintree::Transaction.search do |search|
|
803
|
+
search.id.is transaction.id
|
804
|
+
search.settled_at.between(
|
805
|
+
Date.today - 1,
|
806
|
+
Date.today + 1
|
807
|
+
)
|
808
|
+
end
|
809
|
+
|
810
|
+
collection.maximum_size.should == 1
|
811
|
+
collection.first.id.should == transaction.id
|
812
|
+
end
|
813
|
+
|
814
|
+
it "finds transactions submitted for settlement in a given range" do
|
815
|
+
transaction = Braintree::Transaction.sale(
|
816
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
817
|
+
:credit_card => {
|
818
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
819
|
+
:expiration_date => "05/12"
|
820
|
+
},
|
821
|
+
:options => {
|
822
|
+
:submit_for_settlement => true
|
823
|
+
}
|
824
|
+
).transaction
|
825
|
+
|
826
|
+
collection = Braintree::Transaction.search do |search|
|
827
|
+
search.id.is transaction.id
|
828
|
+
search.submitted_for_settlement_at.between(
|
829
|
+
Date.today - 2,
|
830
|
+
Date.today - 1
|
831
|
+
)
|
832
|
+
end
|
833
|
+
|
834
|
+
collection.maximum_size.should == 0
|
835
|
+
|
836
|
+
collection = Braintree::Transaction.search do |search|
|
837
|
+
search.id.is transaction.id
|
838
|
+
search.submitted_for_settlement_at.between(
|
839
|
+
Date.today - 1,
|
840
|
+
Date.today + 1
|
841
|
+
)
|
842
|
+
end
|
843
|
+
|
844
|
+
collection.maximum_size.should == 1
|
845
|
+
collection.first.id.should == transaction.id
|
846
|
+
end
|
847
|
+
|
848
|
+
it "finds transactions voided in a given range" do
|
849
|
+
transaction = Braintree::Transaction.sale!(
|
850
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
851
|
+
:credit_card => {
|
852
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
853
|
+
:expiration_date => "05/12"
|
854
|
+
}
|
855
|
+
)
|
856
|
+
transaction = Braintree::Transaction.void(transaction.id).transaction
|
857
|
+
|
858
|
+
collection = Braintree::Transaction.search do |search|
|
859
|
+
search.id.is transaction.id
|
860
|
+
search.voided_at.between(
|
861
|
+
Date.today - 2,
|
862
|
+
Date.today - 1
|
863
|
+
)
|
864
|
+
end
|
865
|
+
|
866
|
+
collection.maximum_size.should == 0
|
867
|
+
|
868
|
+
collection = Braintree::Transaction.search do |search|
|
869
|
+
search.id.is transaction.id
|
870
|
+
search.voided_at.between(
|
871
|
+
Date.today - 1,
|
872
|
+
Date.today + 1
|
873
|
+
)
|
874
|
+
end
|
875
|
+
|
876
|
+
collection.maximum_size.should == 1
|
877
|
+
collection.first.id.should == transaction.id
|
878
|
+
end
|
879
|
+
end
|
880
|
+
|
881
|
+
it "allows searching on multiple statuses" do
|
882
|
+
transaction = Braintree::Transaction.sale!(
|
883
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
884
|
+
:credit_card => {
|
885
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
886
|
+
:expiration_date => "05/12"
|
887
|
+
},
|
888
|
+
:options => {
|
889
|
+
:submit_for_settlement => true
|
890
|
+
}
|
891
|
+
)
|
892
|
+
|
893
|
+
collection = Braintree::Transaction.search do |search|
|
894
|
+
search.id.is transaction.id
|
895
|
+
search.authorized_at.between(
|
896
|
+
Date.today - 1,
|
897
|
+
Date.today + 1
|
898
|
+
)
|
899
|
+
search.submitted_for_settlement_at.between(
|
900
|
+
Date.today - 1,
|
901
|
+
Date.today + 1
|
902
|
+
)
|
903
|
+
end
|
904
|
+
|
905
|
+
collection.maximum_size.should > 0
|
906
|
+
end
|
632
907
|
end
|
633
908
|
|
634
909
|
it "returns multiple results" do
|
@@ -231,7 +231,7 @@ describe Braintree::Transaction do
|
|
231
231
|
}
|
232
232
|
)
|
233
233
|
result.success?.should == false
|
234
|
-
result.transaction.gateway_rejection_reason.should == Braintree::Transaction::GatewayRejectionReason::
|
234
|
+
result.transaction.gateway_rejection_reason.should == Braintree::Transaction::GatewayRejectionReason::AVSAndCVV
|
235
235
|
ensure
|
236
236
|
Braintree::Configuration.merchant_id = old_merchant
|
237
237
|
Braintree::Configuration.public_key = old_public_key
|
@@ -446,6 +446,72 @@ describe Braintree::Transaction do
|
|
446
446
|
result.transaction.vault_credit_card.masked_number.should == "401288******1881"
|
447
447
|
end
|
448
448
|
end
|
449
|
+
|
450
|
+
it "snapshots add_ons and discounts from subscription" do
|
451
|
+
customer = Braintree::Customer.create!(
|
452
|
+
:credit_card => {
|
453
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
454
|
+
:expiration_date => "05/2010"
|
455
|
+
}
|
456
|
+
)
|
457
|
+
|
458
|
+
result = Braintree::Subscription.create(
|
459
|
+
:payment_method_token => customer.credit_cards.first.token,
|
460
|
+
:plan_id => SpecHelper::TriallessPlan[:id],
|
461
|
+
:add_ons => {
|
462
|
+
:add => [
|
463
|
+
{
|
464
|
+
:amount => BigDecimal.new("11.00"),
|
465
|
+
:inherited_from_id => SpecHelper::AddOnIncrease10,
|
466
|
+
:quantity => 2,
|
467
|
+
:number_of_billing_cycles => 5
|
468
|
+
},
|
469
|
+
{
|
470
|
+
:amount => BigDecimal.new("21.00"),
|
471
|
+
:inherited_from_id => SpecHelper::AddOnIncrease20,
|
472
|
+
:quantity => 3,
|
473
|
+
:number_of_billing_cycles => 6
|
474
|
+
}
|
475
|
+
]
|
476
|
+
},
|
477
|
+
:discounts => {
|
478
|
+
:add => [
|
479
|
+
{
|
480
|
+
:amount => BigDecimal.new("7.50"),
|
481
|
+
:inherited_from_id => SpecHelper::Discount7,
|
482
|
+
:quantity => 2,
|
483
|
+
:never_expires => true
|
484
|
+
}
|
485
|
+
]
|
486
|
+
}
|
487
|
+
)
|
488
|
+
|
489
|
+
result.success?.should be_true
|
490
|
+
transaction = result.subscription.transactions.first
|
491
|
+
|
492
|
+
transaction.add_ons.size.should == 2
|
493
|
+
add_ons = transaction.add_ons.sort_by { |add_on| add_on.id }
|
494
|
+
|
495
|
+
add_ons.first.id.should == "increase_10"
|
496
|
+
add_ons.first.amount.should == BigDecimal.new("11.00")
|
497
|
+
add_ons.first.quantity.should == 2
|
498
|
+
add_ons.first.number_of_billing_cycles.should == 5
|
499
|
+
add_ons.first.never_expires?.should be_false
|
500
|
+
|
501
|
+
add_ons.last.id.should == "increase_20"
|
502
|
+
add_ons.last.amount.should == BigDecimal.new("21.00")
|
503
|
+
add_ons.last.quantity.should == 3
|
504
|
+
add_ons.last.number_of_billing_cycles.should == 6
|
505
|
+
add_ons.last.never_expires?.should be_false
|
506
|
+
|
507
|
+
transaction.discounts.size.should == 1
|
508
|
+
|
509
|
+
transaction.discounts.first.id.should == "discount_7"
|
510
|
+
transaction.discounts.first.amount.should == BigDecimal.new("7.50")
|
511
|
+
transaction.discounts.first.quantity.should == 2
|
512
|
+
transaction.discounts.first.number_of_billing_cycles.should be_nil
|
513
|
+
transaction.discounts.first.never_expires?.should be_true
|
514
|
+
end
|
449
515
|
end
|
450
516
|
|
451
517
|
describe "self.create!" do
|
@@ -480,6 +546,71 @@ describe Braintree::Transaction do
|
|
480
546
|
end
|
481
547
|
end
|
482
548
|
|
549
|
+
describe "self.refund" do
|
550
|
+
context "partial refunds" do
|
551
|
+
it "allows partial refunds" do
|
552
|
+
transaction = create_transaction_to_refund
|
553
|
+
result = Braintree::Transaction.refund(transaction.id, transaction.amount / 2)
|
554
|
+
result.success?.should == true
|
555
|
+
result.transaction.type.should == "credit"
|
556
|
+
end
|
557
|
+
|
558
|
+
it "does not allow multiple refunds" do
|
559
|
+
transaction = create_transaction_to_refund
|
560
|
+
Braintree::Transaction.refund(transaction.id, transaction.amount / 2)
|
561
|
+
result = Braintree::Transaction.refund(transaction.id, BigDecimal.new("1"))
|
562
|
+
result.success?.should == false
|
563
|
+
result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::HasAlreadyBeenRefunded
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
it "returns a successful result if successful" do
|
568
|
+
transaction = create_transaction_to_refund
|
569
|
+
transaction.status.should == Braintree::Transaction::Status::Settled
|
570
|
+
result = Braintree::Transaction.refund(transaction.id)
|
571
|
+
result.success?.should == true
|
572
|
+
result.transaction.type.should == "credit"
|
573
|
+
end
|
574
|
+
|
575
|
+
it "assigns the refund_id on the original transaction" do
|
576
|
+
transaction = create_transaction_to_refund
|
577
|
+
refund_transaction = Braintree::Transaction.refund(transaction.id).transaction
|
578
|
+
transaction = Braintree::Transaction.find(transaction.id)
|
579
|
+
|
580
|
+
transaction.refund_id.should == refund_transaction.id
|
581
|
+
end
|
582
|
+
|
583
|
+
it "assigns the refunded_transaction_id to the original transaction" do
|
584
|
+
transaction = create_transaction_to_refund
|
585
|
+
refund_transaction = Braintree::Transaction.refund(transaction.id).transaction
|
586
|
+
|
587
|
+
refund_transaction.refunded_transaction_id.should == transaction.id
|
588
|
+
end
|
589
|
+
|
590
|
+
it "returns an error if already refunded" do
|
591
|
+
transaction = create_transaction_to_refund
|
592
|
+
result = Braintree::Transaction.refund(transaction.id)
|
593
|
+
result.success?.should == true
|
594
|
+
result = Braintree::Transaction.refund(transaction.id)
|
595
|
+
result.success?.should == false
|
596
|
+
result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::HasAlreadyBeenRefunded
|
597
|
+
end
|
598
|
+
|
599
|
+
it "returns an error result if unsettled" do
|
600
|
+
transaction = Braintree::Transaction.create!(
|
601
|
+
:type => "sale",
|
602
|
+
:amount => Braintree::Test::TransactionAmounts::Authorize,
|
603
|
+
:credit_card => {
|
604
|
+
:number => Braintree::Test::CreditCardNumbers::Visa,
|
605
|
+
:expiration_date => "05/2009"
|
606
|
+
}
|
607
|
+
)
|
608
|
+
result = Braintree::Transaction.refund(transaction.id)
|
609
|
+
result.success?.should == false
|
610
|
+
result.errors.for(:transaction).on(:base)[0].code.should == Braintree::ErrorCodes::Transaction::CannotRefundUnlessSettled
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
483
614
|
describe "self.sale" do
|
484
615
|
it "returns a successful result with type=sale if successful" do
|
485
616
|
result = Braintree::Transaction.sale(
|
@@ -1260,7 +1391,7 @@ describe Braintree::Transaction do
|
|
1260
1391
|
result.new_transaction.type.should == "credit"
|
1261
1392
|
end
|
1262
1393
|
|
1263
|
-
it "does not
|
1394
|
+
it "does not allow multiple refunds" do
|
1264
1395
|
transaction = create_transaction_to_refund
|
1265
1396
|
transaction.refund(transaction.amount / 2)
|
1266
1397
|
result = transaction.refund(BigDecimal.new("1"))
|
@@ -1544,7 +1675,7 @@ describe Braintree::Transaction do
|
|
1544
1675
|
}
|
1545
1676
|
)
|
1546
1677
|
|
1547
|
-
response = Braintree::
|
1678
|
+
response = Braintree::Configuration.instantiate.http.put "/transactions/#{transaction.id}/settle"
|
1548
1679
|
Braintree::Transaction.find(transaction.id)
|
1549
1680
|
end
|
1550
1681
|
end
|