From 775835dc1b9a8f79cdd53d450fd6cd35f131b4a6 Mon Sep 17 00:00:00 2001 From: claucece Date: Mon, 5 Oct 2015 21:57:05 -0500 Subject: add test to payments and subscriptions --- Gemfile | 4 +- Gemfile.lock | 1 - .../app/views/payments/_customer_form.html.haml | 8 +- engines/billing/config/routes.rb | 9 +- engines/billing/test/factories.rb | 3 +- .../test/functional/customer_controller_test.rb | 124 --------------------- .../test/functional/customers_controller_test.rb | 62 ----------- .../test/functional/payments_controller_test.rb | 69 +++++++----- .../functional/subscriptions_controller_test.rb | 81 ++++++++++++-- engines/billing/test/test_helper.rb | 1 + engines/billing/test/unit/customer_test.rb | 38 ------- .../test/unit/customer_with_payment_info_test.rb | 40 ------- test/support/browser_integration_test.rb | 3 +- 13 files changed, 128 insertions(+), 315 deletions(-) delete mode 100644 engines/billing/test/functional/customer_controller_test.rb delete mode 100644 engines/billing/test/functional/customers_controller_test.rb delete mode 100644 engines/billing/test/unit/customer_test.rb delete mode 100644 engines/billing/test/unit/customer_with_payment_info_test.rb diff --git a/Gemfile b/Gemfile index e87573d..58ad6c3 100644 --- a/Gemfile +++ b/Gemfile @@ -46,8 +46,8 @@ group :production do # this must not be included in development mode, or js # will get included twice. gem 'therubyracer', "~> 0.12.2", :platforms => :ruby - # ^^ See https://github.com/sstephenson/execjs#readme - # for list of supported runtimes. + #^^ See https://github.com/sstephenson/execjs#readme + # for list of supported runtimes. end ## diff --git a/Gemfile.lock b/Gemfile.lock index 9cb6229..3d72ff3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -216,7 +216,6 @@ GEM rdiscount (2.1.7.1) rdoc (3.12.2) json (~> 1.4) - ref (2.0.0) rest-client (1.6.9) mime-types (~> 1.16) ruby-srp (0.2.1) diff --git a/engines/billing/app/views/payments/_customer_form.html.haml b/engines/billing/app/views/payments/_customer_form.html.haml index df61d3d..70b9b97 100644 --- a/engines/billing/app/views/payments/_customer_form.html.haml +++ b/engines/billing/app/views/payments/_customer_form.html.haml @@ -1,10 +1,10 @@ %p - = t(:personal_info) + = t(:personal_info) %div = text_field_tag :first_name, "",placeholder: "#{t(:first_name)}", class: "radius" %div - = text_field_tag :last_name, "",placeholder: "#{t(:last_name)}", class: "radius" + = text_field_tag :last_name, "",placeholder: "#{t(:last_name)}", class: "radius" %div - = text_field_tag :company, "",placeholder: "#{t(:company)}", class: "radius" + = text_field_tag :company, "",placeholder: "#{t(:company)}", class: "radius" %div - = text_field_tag :phone, "",placeholder: "#{t(:phone)}", class: "radius" + = text_field_tag :phone, "",placeholder: "#{t(:phone)}", class: "radius" diff --git a/engines/billing/config/routes.rb b/engines/billing/config/routes.rb index 229641f..357c55b 100644 --- a/engines/billing/config/routes.rb +++ b/engines/billing/config/routes.rb @@ -1,10 +1,13 @@ Rails.application.routes.draw do scope "(:locale)", :locale => CommonLanguages.match_available do - match 'payments/new' => 'payments#new', :as => :new_payment - match 'payments/confirm' => 'payments#confirm', :as => :confirm_payment + + get 'payments/new' => 'payments#new', :as => :new_payment + post 'payments/confirm' => 'payments#confirm', :as => :confirm_payment + # match 'payments/new' => 'payments#new', :as => :new_payment + # match 'payments/confirm' => 'payments#confirm', :as => :confirm_payment #resources :users do - # resources :payments, :only => [:index] + # resources :payments, :only => [:new, :confirm] # resources :subscriptions, :only => [:index, :destroy] #end resources :subscriptions, :only => [:index, :show] do diff --git a/engines/billing/test/factories.rb b/engines/billing/test/factories.rb index 87543b2..6352211 100644 --- a/engines/billing/test/factories.rb +++ b/engines/billing/test/factories.rb @@ -14,7 +14,8 @@ FactoryGirl.define do first_name 'Big' last_name 'Spender' credit_card number: TEST_CC_NUMBER, expiration_date: '04/2016' - initialize_with { Braintree::Customer.create(attributes).customer } + initialize_with { Braintree::Configuration.environment = :sandbox + Braintree::Customer.create(attributes).customer } skip_create factory :broken_customer do diff --git a/engines/billing/test/functional/customer_controller_test.rb b/engines/billing/test/functional/customer_controller_test.rb deleted file mode 100644 index d943e23..0000000 --- a/engines/billing/test/functional/customer_controller_test.rb +++ /dev/null @@ -1,124 +0,0 @@ -require 'test_helper' -require 'fake_braintree' - -class CustomerControllerTest < ActionController::TestCase - include CustomerTestHelper - - test "new assigns redirect url" do - login - get :new - - assert_response :success - assert assigns(:tr_data) - tr_data = Braintree::Util.parse_query_string(assigns(:tr_data)) - assert_equal confirm_customer_url, tr_data[:redirect_url] - end - - test "new requires login" do - get :new - - assert_response :redirect - assert_redirected_to login_path - end - - test "edit uses params[:id]" do - customer = stub_customer - login customer.user - get :edit, id: customer.user.id - - assert_response :success - assert assigns(:tr_data) - tr_data = Braintree::Util.parse_query_string(assigns(:tr_data)) - assert_equal customer.braintree_customer_id, tr_data[:customer_id] - assert_equal confirm_customer_url, tr_data[:redirect_url] - end - - test "confirm customer creation" do - login - Braintree::TransparentRedirect.expects(:confirm).returns(success_response) - # to_confirm = prepare_confirmation :create_customer_data, - # customer: FactoryGirl.attributes_for(:braintree_customer), - # redirect_url: confirm_customer_url - - assert_difference("Customer.count") do - post :confirm, braintree: :query - end - - assert_response :success - assert result = assigns(:result) - assert result.success? - assert result.customer.id - end - - test "customer update" do - customer = stub_customer - customer.expects(:save) - login customer.user - Braintree::TransparentRedirect.expects(:confirm). - returns(success_response(customer)) - - assert_no_difference("Customer.count") do - post :confirm, query: :from_braintree - end - - assert_response :success - assert result = assigns(:result) - assert result.success? - assert_equal customer.braintree_customer, result.customer - end - - test "failed customer creation" do - skip "can't get customer creation to fail" - login - FakeBraintree.decline_all_cards! - # what is prepare_confirmation ?? this method isn't found - to_confirm = prepare_confirmation :create_customer_data, - customer: FactoryGirl.attributes_for(:broken_customer), - redirect_url: confirm_customer_url - post :confirm, to_confirm - - FakeBraintree.clear! - assert_response :success - assert result = assigns(:result) - assert !result.success? - end - - test "failed customer creation with stubbing" do - login - Braintree::TransparentRedirect.expects(:confirm).returns(failure_response) - post :confirm, bla: :blub - - assert_response :success - assert_template :new - end - - test "failed customer update with stubbing" do - customer = stub_customer - login customer.user - Braintree::TransparentRedirect.expects(:confirm).returns(failure_response) - post :confirm, bla: :blub - - assert_response :success - assert_template :edit - end - - def failure_response - stub success?: false, - errors: stub(for: nil, size: 0), - params: {} - end - - def success_response(customer = nil) - stub success?: true, - customer: braintree_customer(customer) - end - - def braintree_customer(customer) - if customer - customer.braintree_customer - else - FactoryGirl.build :braintree_customer - end - end - -end diff --git a/engines/billing/test/functional/customers_controller_test.rb b/engines/billing/test/functional/customers_controller_test.rb deleted file mode 100644 index 4d84fb0..0000000 --- a/engines/billing/test/functional/customers_controller_test.rb +++ /dev/null @@ -1,62 +0,0 @@ -require 'test_helper' -require 'fake_braintree' - -class CustomersControllerTest < ActionController::TestCase - tests CustomerController - - setup do - InviteCodeValidator.any_instance.stubs(:validate) - @user = FactoryGirl.create :user - @other_user = FactoryGirl.create :user - #FakeBraintree.clear! - #FakeBraintree.verify_all_cards! - testid = 'testid' - #this wasn't actually being used - #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 "no access if not logged in" do - get :new - assert_login_required - get :show, :id => @customer.braintree_customer_id - assert_login_required - get :edit, :id => @customer.braintree_customer_id - assert_login_required - end - - - test "should get new if logged in and not customer" do - login @user - get :new - assert_not_nil assigns(:tr_data) - assert_response :success - end - - test "new should direct edit if user is already a customer" do - login @other_user - get :new - assert_response :redirect - assert_equal edit_customer_url(@customer.user), response.header['Location'] - end - - - test "show" do - skip "show customer" - login @other_user - # Below will fail, as when we go to fetch the customer data, Braintree::Customer.find(params[:id]) won't find the customer as it is a FakeBraintree customer. - #get :show, :id => @customer.braintree_customer_id - - end - -end diff --git a/engines/billing/test/functional/payments_controller_test.rb b/engines/billing/test/functional/payments_controller_test.rb index 90b7582..e015a07 100644 --- a/engines/billing/test/functional/payments_controller_test.rb +++ b/engines/billing/test/functional/payments_controller_test.rb @@ -4,47 +4,56 @@ require 'fake_braintree' class PaymentsControllerTest < ActionController::TestCase include CustomerTestHelper - test "payment when unauthorized" do - get :new - assert_not_nil assigns(:tr_data) - assert_response :success + def setup + FakeBraintree.activate! end - test "successful confirmation renders confirm" do - Braintree::TransparentRedirect.expects(:confirm).returns(success_response) - get :confirm - - assert_response :success - assert_template :confirm + def teardown + FakeBraintree.clear! end - test "failed confirmation renders new" do - Braintree::TransparentRedirect.expects(:confirm).returns(failure_response) - get :confirm + test "payment new" do + get :new + assert_not_nil assigns(:client_token) 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) + test "sucess confirmation" do + #already included with FakeBraintree + #Braintree::Transaction.sale.expects(:confirm).returns(success_response) + post :confirm, { + amount: "100", + payment_method_nonce: "fake-valid-nonce", + customer: { + first_name: "Test", + last_name: "Testing", + company: "RGSoC", + email: "any@email.com", + phone: "555-888-1234" } + } + + assert assigns(:result).success? + assert_not_nil flash[:success] end - def success_response - stub success?: true, - transaction: stub_transaction + test "failed confirmation renders new" do + FakeBraintree.decline_all_cards! + post :confirm, { + amount: "100", + payment_method_nonce: "fake-valid-nonce", + customer: { + first_name: "Test", + last_name: "Testing", + company: "RGSoC", + email: "any@email.com", + phone: "555-888-1234" } + } + + assert !assigns(:result).success? + assert_not_nil flash[:error] + FakeBraintree.clear! 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 diff --git a/engines/billing/test/functional/subscriptions_controller_test.rb b/engines/billing/test/functional/subscriptions_controller_test.rb index a6a1057..1e98eff 100644 --- a/engines/billing/test/functional/subscriptions_controller_test.rb +++ b/engines/billing/test/functional/subscriptions_controller_test.rb @@ -4,13 +4,78 @@ require 'fake_braintree' class SubscriptionsControllerTest < ActionController::TestCase include CustomerTestHelper - test "destroy cancels subscription" do - customer = stub_customer - login customer.user - result = Braintree::Subscription.create plan_id: 'my_plan', - payment_method_token: customer.braintree_customer.credit_cards.first.token - subscription = result.subscription - delete :destroy, id: subscription.id, user_id: customer.user.id - assert_equal "Canceled", Braintree::Subscription.find(subscription.id).status + def setup + FakeBraintree.activate! end + + def teardown + FakeBraintree.clear! + end + + test "get all subscriptions when the user doesn't have an active subscription" do + user = find_record :user + login user + plans = [stub(:id => 1, :name => "First Plan", :price => 10), stub(:id => 2, :name => "Other Plan", :price => 30)] + Braintree::Plan.expects(:all).returns(plans) + + get :index + + assert assigns(:subscriptions) + assert_response :success + end + + test "get subscriptions when user has an active subscription" do + user = find_record :user + login user + plans = [stub(:id => 1, :name => "First Plan", :price => 10), stub(:id => 2, :name => "Other Plan", :price => 30)] + Braintree::Plan.expects(:all).returns(plans) + result = Braintree::Subscription.create(payment_method_token: 'user_token', plan_id: 1) + user.subscription_id = result.subscription.id + + get :index + + assert assigns(:subscription) + assert assigns(:plan) + assert_response :success + end + + test "subscriptions show" do + user = find_record :user + login user + plans = [stub(:id => "1", :name => "First Plan", :price => 10), stub(:id => "2", :name => "Other Plan", :price => 30)] + Braintree::Plan.expects(:all).returns(plans) + + get :show, :id => "1" + + assert assigns(:plan) + assert_response :success + end + + test "subscribe creates subscription" do + user = find_record :user + user.expects(:save).returns(true) + login user + payment_methods = [stub(:token => 'user_token')] + Braintree::Customer.any_instance.stubs(:payment_methods).returns(payment_methods) + user.expects(:save).returns(true) + + post :subscribe, :id => "1", :first_name => "Test", :last_name => "Testing", :company => "RGSoC", :email => "any@email.com", :phone => "555-888-1234" + + assert assigns(:result).success? + assert_not_nil flash[:success] + end + + test "unsubscribe cancels subscription" do + user = find_record :user + user.expects(:save).returns(true) + result = Braintree::Subscription.create(payment_method_token: 'user_token', plan_id: '1') + user.subscription_id = result.subscription.id + login user + + delete :unsubscribe, :id => "1" + + assert assigns(:result).success? + assert_not_nil flash[:success] + end + end diff --git a/engines/billing/test/test_helper.rb b/engines/billing/test/test_helper.rb index 57cdd63..14e453e 100644 --- a/engines/billing/test/test_helper.rb +++ b/engines/billing/test/test_helper.rb @@ -2,6 +2,7 @@ ENV["RAILS_ENV"] = "test" require "rails/test_help" +require 'mocha/setup' Rails.backtrace_cleaner.remove_silencers! diff --git a/engines/billing/test/unit/customer_test.rb b/engines/billing/test/unit/customer_test.rb deleted file mode 100644 index 6156f87..0000000 --- a/engines/billing/test/unit/customer_test.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'test_helper' - -class CustomerTest < ActiveSupport::TestCase - include StubRecordHelper - - setup do - @user = find_record :user - @customer = FactoryGirl.build(:customer, user: @user) - end - - test "test set of attributes should be valid" do - @customer.valid? - assert_equal Hash.new, @customer.errors.messages - end - - test "customer belongs to user" do - assert_equal User, @customer.user.class - end - - test "user validation" do - @customer.user = nil - assert !@customer.valid? - end - - test "has no payment info" do - assert !@customer.braintree_customer_id - assert !@customer.has_payment_info? - end - - test "with no braintree data" do - assert_equal @customer, @customer.with_braintree_data! - end - - test "without default credit card" do - assert_nil @customer.default_credit_card - end - -end diff --git a/engines/billing/test/unit/customer_with_payment_info_test.rb b/engines/billing/test/unit/customer_with_payment_info_test.rb deleted file mode 100644 index 0589a59..0000000 --- a/engines/billing/test/unit/customer_with_payment_info_test.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'test_helper' -require 'fake_braintree' - -class CustomerWithPaymentInfoTest < ActiveSupport::TestCase - include StubRecordHelper - - setup do - @user = find_record :user - @customer = FactoryGirl.build(:customer_with_payment_info, user: @user) - end - - test "has payment_info" do - assert @customer.braintree_customer_id - assert @customer.has_payment_info? - end - - test "constructs customer with braintree data" do - @customer.with_braintree_data! - assert_equal 'Big', @customer.first_name - assert_equal 'Spender', @customer.last_name - assert_equal 1, @customer.credit_cards.size - assert_equal Hash.new, @customer.custom_fields - end - - test "can access braintree_customer after reload" do - @customer.save - @customer = Customer.find_by_user_id(@customer.user_id) - @customer.with_braintree_data! - assert_equal 'Big', @customer.first_name - assert_equal 'Spender', @customer.last_name - assert_equal 1, @customer.credit_cards.size - assert_equal Hash.new, @customer.custom_fields - @customer.destroy - end - - test "sets default_credit_card" do - @customer.with_braintree_data! - assert_equal @customer.credit_cards.first, @customer.default_credit_card - end -end diff --git a/test/support/browser_integration_test.rb b/test/support/browser_integration_test.rb index 35887cc..9a02abe 100644 --- a/test/support/browser_integration_test.rb +++ b/test/support/browser_integration_test.rb @@ -28,8 +28,7 @@ class BrowserIntegrationTest < ActionDispatch::IntegrationTest Capybara.app_host = 'http://lvh.me:3003' Capybara.server_port = 3003 Capybara.javascript_driver = :poltergeist - Capybara.default_wait_time = 5 - + Capybara.default_max_wait_time = 5 # Make the Capybara DSL available include Capybara::DSL -- cgit v1.2.3