Skip to content

Commit

Permalink
Improvements and more test coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
BDQ committed Nov 21, 2011
1 parent d8178c5 commit 400f660
Show file tree
Hide file tree
Showing 11 changed files with 122 additions and 61 deletions.
28 changes: 22 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,29 @@
SpreeSkrill
===========
# Spree Skrill (Moneybookers)

Introduction goes here.
Add support for Skrill / MoneyBookers Quick checkout as a payment
method.

## Installation

Example
=======
1. Add the following to your Gemfile

<pre>
gem 'spree_skrill', :git => 'git://github.com/spree/spree_skrill.git'
</pre>

2. Run `bundle install`

3. To copy and apply migrations run: `rails g spree_skrill:install`

## Configuring

1. Add a new Payment Method, using: `BillingIntegration::Skrill::QuickCheckout` as the `Prodivder`

2. Click `Create`, and enter your Store's Skrill / MoneyBookers Merchant
ID (also called Customer ID) in the field provide.

3. `Save` and enjoy!

Example goes here.

Testing
-------
Expand Down
4 changes: 1 addition & 3 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ require 'rake/testtask'
require 'rake/packagetask'
require 'rubygems/package_task'
require 'rspec/core/rake_task'
require 'cucumber/rake/task'
require 'spree_core/testing_support/common_rake'

RSpec::Core::RakeTask.new
Cucumber::Rake::Task.new

task :default => [:spec, :cucumber ]
task :default => [ :spec ]

spec = eval(File.read('spree_skrill.gemspec'))

Expand Down
36 changes: 27 additions & 9 deletions app/controllers/checkout_controller_decorator.rb
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
CheckoutController.class_eval do
before_filter :redirect_to_skrill_if_needed, :only => [:update]
skip_before_filter :load_order, :only => [:skrill_success]
skip_before_filter :check_authorization, :only => [:skrill_success]

def skrill_cancel
flash[:error] = t(:payment_has_been_cancelled)
redirect_to edit_order_path(@order)
end

def skrill_success
@order = Order.where(:number => params[:order_id]).first

if @order.user == current_user

def skrill_return
#need to force checkout to complete state
until @order.state == "complete"
if @order.next!
@order.update!
state_callback(:after)
if @order.payments.where(:source_type => 'SkrillAccount').present?

#need to force checkout to complete state
until @order.state == "complete"
if @order.next!
@order.update!
state_callback(:after)
end
end
end

flash.notice = t(:order_processed_successfully)
redirect_to completion_route
else
redirect_to root_url
end

redirect_to completion_route
end

private
Expand All @@ -38,9 +56,9 @@ def redirect_to_skrill_if_needed
opts = {}
opts[:transaction_id] = payment.id
opts[:amount] = payment.amount
opts[:return_url] = skrill_return_order_checkout_url(@order)
opts[:return_url] = skrill_success_order_checkout_url(@order)
opts[:cancel_url] = skrill_cancel_order_checkout_url(@order)
opts[:status_url] = skrill_status_update_url
opts[:cancel_url] = order_url(@order)

payment.started_processing!
payment.pend!
Expand Down
23 changes: 13 additions & 10 deletions app/controllers/skrill_status_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@ class SkrillStatusController < ApplicationController
def update
payment = Payment.find(params[:transaction_id])

case params[:status]
when "0"
payment.pend #may already be pending
when "2" #processed / captured
payment.complete!
when "-1", "-2"
payment.failure!
else
raise "Unexpected payment status"
end
unless payment.completed?

case params[:status]
when "0"
payment.pend #may already be pending
when "2" #processed / captured
payment.complete!
when "-1", "-2"
payment.failure!
else
raise "Unexpected payment status"
end

end

render :text => ""
end
Expand Down
2 changes: 0 additions & 2 deletions app/helpers/skrill_status_helper.rb

This file was deleted.

1 change: 0 additions & 1 deletion app/models/billing_integration/skrill/quick_checkout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ def redirect_url(order, opts = {})

skrill = self.provider
sid = skrill.setup_payment_session(opts)
puts opts

skrill.session_url(sid)
end
Expand Down
2 changes: 0 additions & 2 deletions app/views/shared/_skrill_status.html.erb
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
<% if @order.outstanding_balance? %>
<h4>Thank you for your order, however we're still waiting to hear from Skrill about your payment status.</h4>
<p>Your payment is currently <em>Pending</em>, once its completed we'll start processing your shipment.</p>
<% else %>
<p>Your payment has been received from Skrill.</p>
<% end %>
5 changes: 3 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
resources :orders do
resource :checkout, :controller => 'checkout' do
member do
get :skrill_return
get :skrill_cancel
get :skrill_success
end
end
end

match '/skrill' => 'skrill_status#update', :as => :skrill_status_update
match '/skrill' => 'skrill_status#update', :via => :post, :as => :skrill_status_update

end
11 changes: 0 additions & 11 deletions lib/generators/spree_skrill/install/install_generator.rb
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
module SpreeSkrill
module Generators
class InstallGenerator < Rails::Generators::Base

def add_javascripts
append_file "app/assets/javascripts/store/all.js", "//= require store/spree_skrill\n"
append_file "app/assets/javascripts/admin/all.js", "//= require admin/spree_skrill\n"
end

def add_stylesheets
inject_into_file "app/assets/stylesheets/store/all.css", " *= require store/spree_skrill\n", :before => /\*\//, :verbose => true
inject_into_file "app/assets/stylesheets/admin/all.css", " *= require admin/spree_skrill\n", :before => /\*\//, :verbose => true
end

def add_migrations
run 'bundle exec rake railties:install:migrations FROM=spree_skrill'
end
Expand Down
56 changes: 56 additions & 0 deletions spec/controllers/checkout_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
require 'spec_helper'

describe CheckoutController do
let(:skrill_gateway) { BillingIntegration::Skrill::QuickCheckout.new :id => 123, :preferred_merchant_id => '987654321' }
let(:order) { Factory(:order, :state => "payment") }

before do
controller.stub(:current_order => order, :check_authorization => true, :current_user => order.user)
order.stub(:checkout_allowed? => true, :completed? => false)
order.update!
end

it "should understand skrill routes" do
assert_routing("/orders/#{order.number}/checkout/skrill_success", {:controller => "checkout", :action => "skrill_success", :order_id => order.number })
assert_routing("/orders/#{order.number}/checkout/skrill_cancel", {:controller => "checkout", :action => "skrill_cancel", :order_id => order.number })
end

context "during payment selection on checkout" do
it "should setup a purchase transaction and redirect" do
PaymentMethod.should_receive(:find).at_least(1).with("123").and_return(skrill_gateway)
ActiveMerchant::Billing::Skrill.any_instance.should_receive(:setup_payment_session).and_return('abc123')
post :update, {:order_id => order.number, :state => 'payment', :order => {:payments_attributes => [:payment_method_id => "123" ] } }

response.should redirect_to 'https://www.moneybookers.com/app/payment.pl?sid=abc123'

order.payments.size.should == 1
order.payments.first.source_type.should == 'SkrillAccount'
order.payments.first.pending?.should be_true
end

end

context "with response from Skrill" do
before { Factory(:payment, :order_id => order.id, :source => SkrillAccount.find_or_create_by_email(order.email)) }

it "should redirect to cart on cancel" do
get :skrill_cancel, :order_id => order.number

response.should redirect_to edit_order_url(order)
end

it "should complete order on first success" do
Order.should_receive(:where).with(:number => order.number).and_return([order])

order.state.should == 'payment'
get :skrill_success, :order_id => order.number
order.state.should == 'complete'

order.completed_at.should_not be_nil

response.should redirect_to order_path(order)
end
end

end

15 changes: 0 additions & 15 deletions spec/helpers/skrill_status_helper_spec.rb

This file was deleted.

0 comments on commit 400f660

Please sign in to comment.