summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--billing/app/controllers/payments_controller.rb11
-rw-r--r--billing/app/models/customer.rb2
-rw-r--r--billing/app/views/customer/edit.html.haml4
-rw-r--r--billing/app/views/payments/_customer_data.html.haml8
-rw-r--r--billing/test/functional/payments_controller_test.rb65
5 files changed, 50 insertions, 40 deletions
diff --git a/billing/app/controllers/payments_controller.rb b/billing/app/controllers/payments_controller.rb
index 97e0353..99b7af8 100644
--- a/billing/app/controllers/payments_controller.rb
+++ b/billing/app/controllers/payments_controller.rb
@@ -1,4 +1,4 @@
-class PaymentsController < ApplicationController
+class PaymentsController < BillingBaseController
before_filter :authorize, :only => [:index]
def new
@@ -28,17 +28,18 @@ class PaymentsController < ApplicationController
def fetch_transparent_redirect
if current_user
if @customer = Customer.find_by_user_id(current_user.id)
- @braintree_data = Braintree::Customer.find(@customer.braintree_customer_id)
- @default_cc = @customer.default_credit_card(@braintree_data)
+ @customer.with_braintree_data!
braintree_customer_id = @customer.braintree_customer_id
+ @default_cc = @customer.default_credit_card
else
# TODO: this requires user to add self to vault before making payment. Is that desired functionality?
redirect_to new_customer_path, :notice => 'Before making payment, please add your customer data'
end
end
- @tr_data = Braintree::TransparentRedirect.transaction_data(:redirect_url => confirm_payment_url,
- :transaction => {:type => "sale", :customer_id => braintree_customer_id, :options => {:submit_for_settlement => true } })
+ # TODO: What is this supposed to do if braintree_customer_id was not set yet?
+ @tr_data = Braintree::TransparentRedirect.transaction_data redirect_url: confirm_payment_url,
+ transaction: { type: "sale", customer_id: braintree_customer_id, options: {submit_for_settlement: true } }
end
end
diff --git a/billing/app/models/customer.rb b/billing/app/models/customer.rb
index 747f17f..515e204 100644
--- a/billing/app/models/customer.rb
+++ b/billing/app/models/customer.rb
@@ -33,7 +33,7 @@ class Customer < CouchRest::Model::Base
self
end
- def default_credit_card(braintree_data = nil)
+ def default_credit_card
return unless has_payment_info?
credit_cards.find { |cc| cc.default? }
diff --git a/billing/app/views/customer/edit.html.haml b/billing/app/views/customer/edit.html.haml
index dfc932e..f11e948 100644
--- a/billing/app/views/customer/edit.html.haml
+++ b/billing/app/views/customer/edit.html.haml
@@ -2,7 +2,7 @@
#total-errors{:style => "color:red;"}
= h(@result.errors.size)
error(s)
-= form_for :customer, :url => Braintree::TransparentRedirect.url, :params => @result && @result.params[:customer],:existing => @customer, :builder => BraintreeHelper::BraintreeFormBuilder, :errors => @result && @result.errors.for(:customer) do |f| |
+= form_for :customer, url: Braintree::TransparentRedirect.url, params: @result && @result.params[:customer], existing: @customer, builder: BraintreeFormHelper::BraintreeFormBuilder, errors: @result && @result.errors.for(:customer) do |f| |
= field_set_tag "Customer" do
%dl
%dt= f.label :first_name, 'First Name'
@@ -19,4 +19,4 @@
= link_to 'Change credit card', edit_credit_card_info_path(:id => @default_cc.token), :class => :btn
= hidden_field_tag :tr_data, @tr_data
= f.submit 'Save Customer Info', :class => :btn
-= link_to 'Show Customer Information', show_customer_path(@braintree_data.id), :class=> :btn \ No newline at end of file
+= link_to 'Show Customer Information', show_customer_path(@customer), :class=> :btn
diff --git a/billing/app/views/payments/_customer_data.html.haml b/billing/app/views/payments/_customer_data.html.haml
index d46065c..71a5eaf 100644
--- a/billing/app/views/payments/_customer_data.html.haml
+++ b/billing/app/views/payments/_customer_data.html.haml
@@ -1,15 +1,15 @@
%h2 Customer Information
%dl
%dt First Name
- %dd= @braintree_data.first_name
+ %dd= @customer.first_name
%dt Last Name
- %dd= @braintree_data.last_name
+ %dd= @customer.last_name
%dt Phone
- %dd= @braintree_data.phone
+ %dd= @customer.phone
%h2 Credit Card Information
%dl
%dt Number
%dd= @default_cc.masked_number
%dt Expiration Date
%dd= @default_cc.expiration_date
-= link_to 'Edit Saved Data', edit_customer_path(@customer.braintree_customer_id), :class => :btn
+= link_to 'Edit Saved Data', edit_customer_path(@customer), :class => :btn
diff --git a/billing/test/functional/payments_controller_test.rb b/billing/test/functional/payments_controller_test.rb
index c8ef205..8f3bfe7 100644
--- a/billing/test/functional/payments_controller_test.rb
+++ b/billing/test/functional/payments_controller_test.rb
@@ -1,27 +1,8 @@
require 'test_helper'
+require 'fake_braintree'
class PaymentsControllerTest < ActionController::TestCase
- setup do
- FakeBraintree.clear!
- @user = FactoryGirl.create :user
- @other_user = FactoryGirl.create :user
- FakeBraintree.clear!
- FakeBraintree.verify_all_cards!
- testid = 'testid'
- FakeBraintree::Customer.new({:credit_cards => [{:number=>"5105105105105100", :expiration_date=>"05/2013"}]}, {:id => testid, :merchant_id => Braintree::Configuration.merchant_id})
- # any reason to call the create instance method on the FakeBraintree::Customer ?
- @customer = Customer.new(:user_id => @other_user.id)
- @customer.braintree_customer_id = testid
- @customer.save
- end
-
- teardown do
- @user.destroy
- @other_user.destroy
- @customer.destroy
- end
-
test "payment when unauthorized" do
get :new
assert_not_nil assigns(:tr_data)
@@ -29,27 +10,55 @@ class PaymentsControllerTest < ActionController::TestCase
end
test "authenticated user must create account before making payment" do
- login @user
+ login
get :new
assert_response :redirect
assert_equal new_customer_url, response.header['Location']
end
test "payment when authenticated as customer" do
+ customer = FactoryGirl.create :customer_with_payment_info
+ login customer.user
get :new
assert_not_nil assigns(:tr_data)
assert_response :success
- #TODO check more here
end
- # what would we test with something like this?
- test "fake transaction" do
- transaction = FakeBraintree.generate_transaction(:amount => '20.00',
- #:status => Braintree::Transaction::Status::Settled,
- #:subscription_id => 'foobar',
- )
+ test "successful confirmation renders confirm" do
+ Braintree::TransparentRedirect.expects(:confirm).returns(success_response)
+ get :confirm
+ assert_response :success
+ assert_template :confirm
end
+ test "failed confirmation renders new" do
+ Braintree::TransparentRedirect.expects(:confirm).returns(failure_response)
+ get :confirm
+
+ assert_response :success
+ assert_not_nil assigns(:tr_data)
+ assert_template :new
+ end
+
+ def failure_response
+ stub success?: false,
+ errors: stub(for: nil, size: 0),
+ params: {},
+ transaction: stub(status: nil)
+ end
+
+ def success_response
+ stub success?: true,
+ transaction: stub_transaction
+ end
+
+ # that's what you get when not following the law of demeter...
+ def stub_transaction
+ stub amount: "100.00",
+ id: "ASDF",
+ customer_details: FactoryGirl.build(:braintree_customer),
+ credit_card_details: FactoryGirl.build(:braintree_customer).credit_cards.first
+ end
end