braintree 2.76.0 → 2.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/braintree.rb +12 -0
  3. data/lib/braintree/apple_pay.rb +29 -0
  4. data/lib/braintree/apple_pay_card.rb +1 -1
  5. data/lib/braintree/apple_pay_gateway.rb +37 -0
  6. data/lib/braintree/apple_pay_options.rb +19 -0
  7. data/lib/braintree/authorization_adjustment.rb +20 -0
  8. data/lib/braintree/dispute.rb +78 -9
  9. data/lib/braintree/dispute/evidence.rb +18 -0
  10. data/lib/braintree/dispute/history_event.rb +14 -0
  11. data/lib/braintree/dispute/transaction.rb +18 -0
  12. data/lib/braintree/dispute_gateway.rb +118 -0
  13. data/lib/braintree/dispute_search.rb +30 -0
  14. data/lib/braintree/document_upload.rb +34 -0
  15. data/lib/braintree/document_upload_gateway.rb +32 -0
  16. data/lib/braintree/error_codes.rb +17 -0
  17. data/lib/braintree/facilitated_details.rb +19 -0
  18. data/lib/braintree/gateway.rb +12 -0
  19. data/lib/braintree/http.rb +60 -12
  20. data/lib/braintree/successful_result.rb +1 -1
  21. data/lib/braintree/test/credit_card.rb +6 -0
  22. data/lib/braintree/transaction.rb +4 -0
  23. data/lib/braintree/version.rb +1 -1
  24. data/lib/braintree/webhook_testing_gateway.rb +196 -19
  25. data/spec/fixtures/files/bt_logo.png +0 -0
  26. data/spec/fixtures/files/gif_extension_bt_logo.gif +0 -0
  27. data/spec/fixtures/files/malformed_pdf.pdf +1 -0
  28. data/spec/httpsd.pid +1 -1
  29. data/spec/integration/braintree/apple_pay_spec.rb +92 -0
  30. data/spec/integration/braintree/coinbase_spec.rb +15 -12
  31. data/spec/integration/braintree/dispute_search_spec.rb +49 -0
  32. data/spec/integration/braintree/dispute_spec.rb +216 -0
  33. data/spec/integration/braintree/document_upload_spec.rb +55 -0
  34. data/spec/integration/braintree/http_spec.rb +8 -0
  35. data/spec/integration/braintree/payment_method_spec.rb +5 -16
  36. data/spec/integration/braintree/transaction_spec.rb +21 -4
  37. data/spec/spec_helper.rb +3 -2
  38. data/spec/unit/braintree/apple_pay_card_spec.rb +6 -0
  39. data/spec/unit/braintree/dispute_search_spec.rb +59 -0
  40. data/spec/unit/braintree/dispute_spec.rb +331 -8
  41. data/spec/unit/braintree/document_upload_spec.rb +35 -0
  42. data/spec/unit/braintree/http_spec.rb +21 -0
  43. data/spec/unit/braintree/transaction_spec.rb +17 -0
  44. data/spec/unit/braintree/webhook_notification_spec.rb +74 -51
  45. metadata +24 -3
@@ -69,6 +69,14 @@ describe Braintree::Http do
69
69
  end
70
70
  end
71
71
 
72
+ it "posts multipart for file uploads" do
73
+ config = Braintree::Configuration.instantiate
74
+ file = File.new("#{File.dirname(__FILE__)}/../../fixtures/files/bt_logo.png", "r")
75
+ response = config.http.post("#{config.base_merchant_path}/document_uploads", {"document_upload[kind]" => "evidence_document"}, file)
76
+ response[:document_upload][:content_type].should == "image/png"
77
+ response[:document_upload][:id].should_not be_nil
78
+ end
79
+
72
80
  describe "user_agent" do
73
81
  after do
74
82
  Braintree::Configuration.custom_user_agent = nil
@@ -1223,29 +1223,18 @@ describe Braintree::PaymentMethod do
1223
1223
  end
1224
1224
 
1225
1225
  context "coinbase accounts" do
1226
- it "can make a coinbase account the default payment method" do
1226
+ it "cannot create a payment method token with Coinbase" do
1227
1227
  customer = Braintree::Customer.create!
1228
- result = Braintree::CreditCard.create(
1229
- :customer_id => customer.id,
1230
- :number => Braintree::Test::CreditCardNumbers::Visa,
1231
- :expiration_date => "05/2009",
1232
- :options => {:make_default => true}
1233
- )
1234
- result.should be_success
1235
1228
 
1236
1229
  nonce = Braintree::Test::Nonce::Coinbase
1237
- original_token = Braintree::PaymentMethod.create(
1230
+ result = Braintree::PaymentMethod.create(
1238
1231
  :payment_method_nonce => nonce,
1239
1232
  :customer_id => customer.id
1240
- ).payment_method.token
1241
-
1242
- updated_result = Braintree::PaymentMethod.update(
1243
- original_token,
1244
- :options => {:make_default => true}
1245
1233
  )
1246
1234
 
1247
- updated_customer = Braintree::Customer.find(customer.id)
1248
- updated_customer.default_payment_method.token.should == original_token
1235
+ result.should_not be_success
1236
+
1237
+ result.errors.for(:coinbase_account).first.code.should == Braintree::ErrorCodes::PaymentMethod::PaymentMethodNoLongerSupported
1249
1238
  end
1250
1239
  end
1251
1240
 
@@ -4329,6 +4329,19 @@ describe Braintree::Transaction do
4329
4329
  end
4330
4330
  end
4331
4331
 
4332
+ describe "authorization_adjustments" do
4333
+ it "includes authorization adjustments on found transactions" do
4334
+ found_transaction = Braintree::Transaction.find("authadjustmenttransaction")
4335
+
4336
+ found_transaction.authorization_adjustments.count.should == 1
4337
+
4338
+ authorization_adjustment = found_transaction.authorization_adjustments.first
4339
+ authorization_adjustment.amount.should == "-20.00"
4340
+ authorization_adjustment.success.should == true
4341
+ authorization_adjustment.timestamp.should be_a Time
4342
+ end
4343
+ end
4344
+
4332
4345
  describe "vault_credit_card" do
4333
4346
  it "returns the Braintree::CreditCard if the transaction credit card is stored in the vault" do
4334
4347
  customer = Braintree::Customer.create!(
@@ -4700,6 +4713,9 @@ describe Braintree::Transaction do
4700
4713
  :payment_method_nonce => grant_result.payment_method_nonce.nonce,
4701
4714
  :amount => Braintree::Test::TransactionAmounts::Authorize
4702
4715
  )
4716
+ result.transaction.facilitated_details.merchant_id.should == "integration_merchant_id"
4717
+ result.transaction.facilitated_details.merchant_name.should == "14ladders"
4718
+ result.transaction.facilitated_details.payment_method_nonce.should == grant_result.payment_method_nonce.nonce
4703
4719
  result.transaction.facilitator_details.should_not == nil
4704
4720
  result.transaction.facilitator_details.oauth_application_client_id.should == "client_id$#{Braintree::Configuration.environment}$integration_client_id"
4705
4721
  result.transaction.facilitator_details.oauth_application_name.should == "PseudoShop"
@@ -4715,9 +4731,7 @@ describe Braintree::Transaction do
4715
4731
  )
4716
4732
 
4717
4733
  result.transaction.billing_details.postal_code == "95131"
4718
- end
4719
-
4720
-
4734
+ end
4721
4735
 
4722
4736
  it "allows transactions to be created with a shared payment method, customer, billing and shipping addresses" do
4723
4737
  result = @granting_gateway.transaction.sale(
@@ -4732,11 +4746,14 @@ describe Braintree::Transaction do
4732
4746
  result.transaction.billing_details.first_name.should == @address.first_name
4733
4747
  end
4734
4748
 
4735
- it "oauth app details are returned on transaction created via a shared_payment_method_token" do
4749
+ it "facilitated details are returned on transaction created via a shared_payment_method_token" do
4736
4750
  result = @granting_gateway.transaction.sale(
4737
4751
  :shared_payment_method_token => @credit_card.token,
4738
4752
  :amount => Braintree::Test::TransactionAmounts::Authorize
4739
4753
  )
4754
+ result.transaction.facilitated_details.merchant_id.should == "integration_merchant_id"
4755
+ result.transaction.facilitated_details.merchant_name.should == "14ladders"
4756
+ result.transaction.facilitated_details.payment_method_nonce.should == nil
4740
4757
  result.transaction.facilitator_details.should_not == nil
4741
4758
  result.transaction.facilitator_details.oauth_application_client_id.should == "client_id$#{Braintree::Configuration.environment}$integration_client_id"
4742
4759
  result.transaction.facilitator_details.oauth_application_name.should == "PseudoShop"
@@ -145,8 +145,9 @@ unless defined?(SPEC_HELPER_LOADED)
145
145
  def self.simulate_form_post_for_tr(tr_data_string, form_data_hash, url = Braintree::TransparentRedirect.url)
146
146
  response = nil
147
147
  config = Braintree::Configuration.instantiate
148
- Net::HTTP.start(config.server, config.port) do |http|
149
- http.use_ssl = config.ssl?
148
+ http = Net::HTTP.new(config.server, config.port)
149
+ http.use_ssl = config.ssl?
150
+ http.start do |http|
150
151
  request = Net::HTTP::Post.new("/" + url.split("/", 4)[3])
151
152
  request.add_field "Content-Type", "application/x-www-form-urlencoded"
152
153
  request.body = Braintree::Util.hash_to_query_string({:tr_data => tr_data_string}.merge(form_data_hash))
@@ -1,6 +1,12 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
2
 
3
3
  describe Braintree::ApplePayCard do
4
+ describe "bin" do
5
+ it "returns Apple pay card bin" do
6
+ Braintree::ApplePayCard._new(:gateway, bin: '411111').bin.should == '411111'
7
+ end
8
+ end
9
+
4
10
  describe "default?" do
5
11
  it "is true if the Apple pay card is the default payment method for the customer" do
6
12
  Braintree::ApplePayCard._new(:gateway, :default => true).default?.should == true
@@ -0,0 +1,59 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::DisputeSearch do
4
+ it "overrides previous 'is' with new 'is' for the same field" do
5
+ search = Braintree::DisputeSearch.new
6
+ search.id.is "dispute1"
7
+ search.id.is "dispute2"
8
+ search.to_hash.should == {:id => {:is => "dispute2"}}
9
+ end
10
+
11
+ it "overrides previous 'in' with new 'in' for the same field" do
12
+ search = Braintree::DisputeSearch.new
13
+ search.status.in Braintree::Dispute::Status::Open
14
+ search.status.in Braintree::Dispute::Status::Won
15
+ search.to_hash.should == {:status => [Braintree::Dispute::Status::Won]}
16
+ end
17
+
18
+ [
19
+ :amount_disputed,
20
+ :amount_won,
21
+ :case_number,
22
+ :id,
23
+ :merchant_account_id,
24
+ :reason_code,
25
+ :received_date,
26
+ :reference_number,
27
+ :reply_by_date,
28
+ :transaction_id,
29
+ ].each do |field|
30
+ it "allows searching on #{field}" do
31
+ search = Braintree::DisputeSearch.new
32
+
33
+ expect do
34
+ search.send(field).is "hello"
35
+ end.not_to raise_error
36
+ end
37
+ end
38
+
39
+ [
40
+ :kind,
41
+ :reason,
42
+ :status,
43
+ :transaction_source,
44
+ ].each do |field|
45
+ it "raises if provided an unknown #{field} value" do
46
+ search = Braintree::DisputeSearch.new
47
+ expect do
48
+ search.send(field).is "unknown value"
49
+ end.to raise_error(/Invalid argument/)
50
+ end
51
+ end
52
+
53
+ it "raises if no operator is provided" do
54
+ search = Braintree::DisputeSearch.new
55
+ expect do
56
+ search.id "one"
57
+ end.to raise_error(RuntimeError, "An operator is required")
58
+ end
59
+ end
@@ -1,15 +1,338 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
2
 
3
3
  describe Braintree::Dispute do
4
+ let(:attributes) do
5
+ {
6
+ :id => "open_dispute",
7
+ :amount => "31.00",
8
+ :amount_disputed => "500.00",
9
+ :amount_won => "0.00",
10
+ :created_at => Time.utc(2009, 3, 9, 10, 50, 39),
11
+ :date_opened => "2009-03-09",
12
+ :date_won => "2009-04-15",
13
+ :original_dispute_id => "original_dispute_id",
14
+ :received_date => "2009-03-09",
15
+ :reply_by_date => nil,
16
+ :updated_at => Time.utc(2009, 3, 9, 10, 50, 39),
17
+ :evidence => [
18
+ {
19
+ comment: nil,
20
+ created_at: Time.utc(2009, 3, 10, 12, 5, 20),
21
+ id: "evidence1",
22
+ sent_to_processor_at: nil,
23
+ url: "url_of_file_evidence",
24
+ },
25
+ {
26
+ comment: "text evidence",
27
+ created_at: Time.utc(2009, 3, 10, 12, 5, 21),
28
+ id: "evidence2",
29
+ sent_to_processor_at: "2009-03-13",
30
+ url: nil,
31
+ }
32
+ ],
33
+ :status_history => [
34
+ {
35
+ :effective_date => "2009-03-09",
36
+ :status => "open",
37
+ :timestamp => Time.utc(2009, 3, 9, 10, 50, 39),
38
+ }
39
+ ],
40
+ :transaction => {
41
+ :amount => "31.00",
42
+ :id => "open_disputed_transaction",
43
+ :created_at => Time.utc(2009, 2, 9, 12, 59, 59),
44
+ :order_id => nil,
45
+ :purchase_order_number => "po",
46
+ :payment_instrument_subtype => "Visa",
47
+ }
48
+ }
49
+ end
50
+
51
+ [
52
+ :accept,
53
+ :finalize,
54
+ :find
55
+ ].each do |method_name|
56
+ describe "self.#{method_name}" do
57
+ it "raises an exception if the id is blank" do
58
+ expect do
59
+ Braintree::Dispute.public_send(method_name, " ")
60
+ end.to raise_error(ArgumentError)
61
+ end
62
+
63
+ it "raises an exception if the id is nil" do
64
+ expect do
65
+ Braintree::Dispute.public_send(method_name, nil)
66
+ end.to raise_error(ArgumentError)
67
+ end
68
+
69
+ it "does not raise an exception if the id is a fixnum" do
70
+ Braintree::Http.stub(:new).and_return double.as_null_object
71
+ Braintree::Dispute.stub(:_new).and_return nil
72
+ Braintree::ErrorResult.stub(:new).and_return nil
73
+
74
+ expect do
75
+ Braintree::Dispute.public_send(method_name, 8675309)
76
+ end.to_not raise_error
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "self.add_file_evidence" do
82
+ it "raises an exception if the dispute_id is blank" do
83
+ expect do
84
+ Braintree::Dispute.add_file_evidence(" ", "doc_upload_id")
85
+ end.to raise_error(ArgumentError)
86
+ end
87
+
88
+ it "raises an exception if the dispute_id is nil" do
89
+ expect do
90
+ Braintree::Dispute.add_file_evidence(nil, "doc_upload_id")
91
+ end.to raise_error(ArgumentError)
92
+ end
93
+
94
+ it "raises an exception if the dispute_id contains invalid characters" do
95
+ expect do
96
+ Braintree::Dispute.add_file_evidence("@#$%", "doc_upload_id")
97
+ end.to raise_error(ArgumentError)
98
+ end
99
+
100
+ it "does not raise an exception if the dispute_id is a fixnum" do
101
+ Braintree::Http.stub(:new).and_return double.as_null_object
102
+ Braintree::Dispute.stub(:_new).and_return nil
103
+ expect do
104
+ Braintree::Dispute.add_file_evidence(8675309, "doc_upload_id")
105
+ end.to_not raise_error
106
+ end
107
+
108
+ it "raises an exception if the document_upload_id is blank" do
109
+ expect do
110
+ Braintree::Dispute.add_file_evidence("dispute_id", " ")
111
+ end.to raise_error(ArgumentError)
112
+ end
113
+
114
+ it "raises an exception if the document_upload_id is nil" do
115
+ expect do
116
+ Braintree::Dispute.add_file_evidence("dispute_id", nil)
117
+ end.to raise_error(ArgumentError)
118
+ end
119
+
120
+ it "raises an exception if the document_upload_id contains invalid characters" do
121
+ expect do
122
+ Braintree::Dispute.add_file_evidence("dispute_id", "@#$%")
123
+ end.to raise_error(ArgumentError)
124
+ end
125
+
126
+ it "does not raise an exception if the document_upload_id is a fixnum" do
127
+ Braintree::Http.stub(:new).and_return double.as_null_object
128
+ Braintree::Dispute.stub(:_new).and_return nil
129
+ expect do
130
+ Braintree::Dispute.add_file_evidence("dispute_id", 8675309)
131
+ end.to_not raise_error
132
+ end
133
+ end
134
+
135
+ describe "self.add_text_evidence" do
136
+ it "raises an exception if the id is blank" do
137
+ expect do
138
+ Braintree::Dispute.add_text_evidence(" ", "text evidence")
139
+ end.to raise_error(ArgumentError)
140
+ end
141
+
142
+ it "raises an exception if the id is nil" do
143
+ expect do
144
+ Braintree::Dispute.add_text_evidence(nil, "text evidence")
145
+ end.to raise_error(ArgumentError)
146
+ end
147
+
148
+ it "raises an exception if the id contains invalid characters" do
149
+ expect do
150
+ Braintree::Dispute.add_text_evidence("@#$%", "text evidence")
151
+ end.to raise_error(ArgumentError)
152
+ end
153
+
154
+ it "does not raise an exception if the id is a fixnum" do
155
+ Braintree::Http.stub(:new).and_return double.as_null_object
156
+ Braintree::Dispute.stub(:_new).and_return nil
157
+ expect do
158
+ Braintree::Dispute.add_text_evidence(8675309, "text evidence")
159
+ end.to_not raise_error
160
+ end
161
+
162
+ it "raises an exception if the content is blank" do
163
+ expect do
164
+ Braintree::Dispute.add_text_evidence("dispute_id", " ")
165
+ end.to raise_error(ArgumentError)
166
+ end
167
+
168
+ it "raises an exception if the content is nil" do
169
+ expect do
170
+ Braintree::Dispute.add_text_evidence("dispute_id", nil)
171
+ end.to raise_error(ArgumentError)
172
+ end
173
+ end
174
+
175
+ describe "self.remove_evidence" do
176
+ it "raises an exception if the dispute_id is blank" do
177
+ expect do
178
+ Braintree::Dispute.remove_evidence(" ")
179
+ end.to raise_error(ArgumentError)
180
+ end
181
+
182
+ it "raises an exception if the dispute_id is nil" do
183
+ expect do
184
+ Braintree::Dispute.remove_evidence(nil)
185
+ end.to raise_error(ArgumentError)
186
+ end
187
+
188
+ it "raises an exception if the content is blank" do
189
+ expect do
190
+ Braintree::Dispute.remove_evidence("dispute_id", " ")
191
+ end.to raise_error(ArgumentError)
192
+ end
193
+
194
+ it "raises an exception if the content is nil" do
195
+ expect do
196
+ Braintree::Dispute.remove_evidence("dispute_id", nil)
197
+ end.to raise_error(ArgumentError)
198
+ end
199
+
200
+ it "raises an exception if the dispute_id contains invalid characters" do
201
+ expect do
202
+ Braintree::Dispute.remove_evidence("@#$%", "evidence_id")
203
+ end.to raise_error(ArgumentError)
204
+ end
205
+
206
+ it "raises an exception if the evidence_id contains invalid characters" do
207
+ expect do
208
+ Braintree::Dispute.remove_evidence("dispute_id", "@#$%")
209
+ end.to raise_error(ArgumentError)
210
+ end
211
+ end
212
+
4
213
  describe "initialize" do
5
- it "handles nil reply_by_date" do
6
- dispute = Braintree::Dispute._new(
7
- :amount => "500.00",
8
- :received_date => "2014-03-01",
9
- :reply_by_date => nil
10
- )
11
-
12
- dispute.reply_by_date.should == nil
214
+ it "converts string amount_dispute and amount_won" do
215
+ dispute = Braintree::Dispute._new(attributes)
216
+
217
+ dispute.amount_disputed.should == 500.0
218
+ dispute.amount_won.should == 0.0
219
+ end
220
+
221
+ [
222
+ :reply_by_date,
223
+ :amount,
224
+ :date_opened,
225
+ :date_won,
226
+ :status_history,
227
+ ].each do |field|
228
+ it "handles nil #{field}" do
229
+ attributes.delete(field)
230
+
231
+ dispute = Braintree::Dispute._new(attributes)
232
+
233
+ dispute.send(field).should == nil
234
+ end
235
+ end
236
+
237
+ it "converts date_opened, date_won, reply_by_date, received_date from String to Date" do
238
+ dispute = Braintree::Dispute._new(attributes.merge(:reply_by_date => "2009-03-14"))
239
+
240
+ dispute.date_opened.should == Date.new(2009, 3, 9)
241
+ dispute.date_won.should == Date.new(2009, 4, 15)
242
+ dispute.received_date.should == Date.new(2009, 3, 9)
243
+ dispute.reply_by_date.should == Date.new(2009, 3, 14)
244
+ end
245
+
246
+ it "converts transaction hash into a Dispute::TransactionDetails object first" do
247
+ dispute = Braintree::Dispute._new(attributes)
248
+
249
+ dispute.transaction_details.id.should == "open_disputed_transaction"
250
+ dispute.transaction_details.amount.should == 31.00
251
+ end
252
+
253
+ it "converts transaction hash into a Dispute::Transaction object" do
254
+ dispute = Braintree::Dispute._new(attributes)
255
+
256
+ dispute.transaction.amount.should == 31.00
257
+ dispute.transaction.id.should == "open_disputed_transaction"
258
+ dispute.transaction.order_id.should == nil
259
+ dispute.transaction.purchase_order_number.should == "po"
260
+ dispute.transaction.payment_instrument_subtype.should == "Visa"
261
+ end
262
+
263
+ it "converts status_history hash into an array of Dispute::HistoryEvent objects" do
264
+ dispute = Braintree::Dispute._new(attributes)
265
+
266
+ dispute.status_history.length.should == 1
267
+ status_history_1 = dispute.status_history.first
268
+ status_history_1.status.should == Braintree::Dispute::Status::Open
269
+ status_history_1.timestamp.should == Time.utc(2009, 3, 9, 10, 50, 39)
270
+ end
271
+
272
+ it "converts evidence hash into an array of Dispute::Evidence objects" do
273
+ dispute = Braintree::Dispute._new(attributes)
274
+
275
+ dispute.evidence.length.should ==2
276
+ evidence1 = dispute.evidence.first
277
+ evidence1.comment.should == nil
278
+ evidence1.created_at.should == Time.utc(2009, 3, 10, 12, 5, 20)
279
+ evidence1.id.should == "evidence1"
280
+ evidence1.sent_to_processor_at.should == nil
281
+ evidence1.url.should == "url_of_file_evidence"
282
+
283
+ evidence2 = dispute.evidence.last
284
+ evidence2.comment.should == "text evidence"
285
+ evidence2.created_at.should == Time.utc(2009, 3, 10, 12, 5, 21)
286
+ evidence2.id.should == "evidence2"
287
+ evidence2.sent_to_processor_at.should == Date.new(2009, 3, 13)
288
+ evidence2.url.should == nil
289
+ end
290
+
291
+ it "handles nil evidence" do
292
+ attributes.delete(:evidence)
293
+
294
+ dispute = Braintree::Dispute._new(attributes)
295
+
296
+ dispute.evidence.should == nil
297
+ end
298
+
299
+ it "sets the older webhook fields for backwards compatibility" do
300
+ dispute = Braintree::Dispute._new(attributes)
301
+
302
+ dispute.amount.should == 31.00
303
+ dispute.date_opened.should == Date.new(2009, 3, 9)
304
+ dispute.date_won.should == Date.new(2009, 4, 15)
305
+ end
306
+ end
307
+
308
+ describe "==" do
309
+ it "returns true when given a dispute with the same id" do
310
+ first = Braintree::Dispute._new(attributes)
311
+ second = Braintree::Dispute._new(attributes)
312
+
313
+ first.should == second
314
+ second.should == first
315
+ end
316
+
317
+ it "returns false when given a dispute with a different id" do
318
+ first = Braintree::Dispute._new(attributes)
319
+ second = Braintree::Dispute._new(attributes.merge(:id => "1234"))
320
+
321
+ first.should_not == second
322
+ second.should_not == first
323
+ end
324
+
325
+ it "returns false when not given a dispute" do
326
+ dispute = Braintree::Dispute._new(attributes)
327
+ dispute.should_not == "not a dispute"
328
+ end
329
+ end
330
+
331
+ describe "new" do
332
+ it "is protected" do
333
+ expect do
334
+ Braintree::Dispute.new
335
+ end.to raise_error(NoMethodError, /protected method .new/)
13
336
  end
14
337
  end
15
338
  end