Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ Gemfile.lock
coverage
.ruby-version
pkg
.env
7 changes: 7 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,15 @@ source "https://rubygems.org"
branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
gem "solidus", github: "solidusio/solidus", branch: branch

# ActiveMerchant v1.58 through v1.59 introduced a breaking change
# to the stripe gateway.
#
# This was resolved in v1.60, but we still need to skip 1.58 & 1.59.
gem "activemerchant", "~> 1.48", "!= 1.58.0", "!= 1.59.0", github: "dynamomtl/active_merchant_new", branch: 'feature/shopify/prototype-implementation'

group :development, :test do
gem "pry-rails"
gem "dotenv-rails", require: 'dotenv/rails-now'
end

gem 'pg'
Expand Down
46 changes: 46 additions & 0 deletions app/models/spree/gateway/shopify_gateway.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
module Spree
class Gateway::ShopifyGateway < Gateway
preference :api_key, :string
preference :password, :string
preference :shop_name, :string

def provider_class
ActiveMerchant::Billing::ShopifyGateway
end

def method_type
'shopify'
end

def credit(money, transaction_id, gateway_options)
refund = gateway_options[:originator]
options = { order_id: refund.pos_order_id, reason: refund.reason.name }
provider.refund(money, transaction_id, options)
end

def void(transaction_id, gateway_options)
pos_order_id = gateway_options[:originator].pos_order_id
provider.void(transaction_id, order_id: pos_order_id)
end

def cancel(_transaction_id)
raise NotImplementedError
end

def purchase(_money, _creditcard, _gateway_options)
raise NotImplementedError
end

def authorize(_money, _creditcard, _gateway_options)
raise NotImplementedError
end

def capture(_money, _response_code, _gateway_options)
raise NotImplementedError
end

def create_profile(_payment)
raise NotImplementedError
end
end
end
1 change: 1 addition & 0 deletions lib/spree_gateway/engine.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class Engine < Rails::Engine
app.config.spree.payment_methods << Spree::Gateway::Paymill
app.config.spree.payment_methods << Spree::Gateway::PayflowPro
app.config.spree.payment_methods << Spree::Gateway::SecurePayAU
app.config.spree.payment_methods << Spree::Gateway::ShopifyGateway
app.config.spree.payment_methods << Spree::Gateway::Maxipago
app.config.spree.payment_methods << Spree::Gateway::Migs
app.config.spree.payment_methods << Spree::Gateway::SpreedlyCoreGateway
Expand Down
11 changes: 4 additions & 7 deletions solidus_gateway.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Gem::Specification.new do |s|
s.version = SolidusGateway::VERSION
s.summary = "Additional Payment Gateways for Solidus"
s.description = s.summary
s.required_ruby_version = ">= 2.1"
s.required_ruby_version = ">= 2.3"

s.author = "Solidus Team"
s.email = "contact@solidus.io"
Expand All @@ -25,12 +25,6 @@ Gem::Specification.new do |s|

s.add_dependency "solidus_core", "~> 1.1"

# ActiveMerchant v1.58 through v1.59 introduced a breaking change
# to the stripe gateway.
#
# This was resolved in v1.60, but we still need to skip 1.58 & 1.59.
s.add_dependency "activemerchant", "~> 1.48", "!= 1.58.0", "!= 1.59.0"

s.add_development_dependency "braintree", "~> 2.0"
s.add_development_dependency "rspec-rails", "~> 3.2"
s.add_development_dependency "simplecov"
Expand All @@ -41,4 +35,7 @@ Gem::Specification.new do |s|
s.add_development_dependency "capybara"
s.add_development_dependency "poltergeist", "~> 1.9"
s.add_development_dependency "database_cleaner", "1.2.0"

s.add_development_dependency "shopify_api", "~> 4.0"
# s.add_development_dependency "dotenv-rails"
end
63 changes: 63 additions & 0 deletions spec/models/gateway/shopify_gateway_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
require 'spec_helper'

describe Spree::Gateway::ShopifyGateway do
let(:transaction_id) { '0xDEADBEEF' }
let(:pos_order_id) { '0xBAADF00D' }
let(:refund) { double('refund', pos_order_id: pos_order_id) }
let(:refund_reason) { double('refund_reason', name: 'Product not working') }
let(:gateway_options) { { originator: refund } }

let(:provider_class) { ActiveMerchant::Billing::ShopifyGateway }
let(:provider_instance) { double('provider', refund: true, void: true) }

before do
subject.preferences = { api_key: ENV['SHOPIFY_API_KEY'],
password: ENV['SHOPIFY_PASSWORD'],
shop_name: ENV['SHOPIFY_SHOP_NAME'] }
allow(provider_class).to receive(:new).and_return(provider_instance)
end

context '.void' do
it 'calls the provider void method once' do
expect(provider_instance).to receive(:void).once
void!
end

private

def void!
subject.void(transaction_id, gateway_options)
end
end

context '.cancel' do
it 'throws an error because it\'s not implemented' do
expect { cancel! }.to raise_error(NotImplementedError)
end

private

def cancel!
subject.cancel(transaction_id)
end
end

context '.credit' do
let(:amount_in_cents) { '100' }

before do
allow(refund).to receive(:reason).and_return(refund_reason)
end

it 'calls the provider refund method once' do
expect(provider_instance).to receive(:refund).once
refund!
end

private

def refund!
subject.credit(amount_in_cents, transaction_id, originator: refund)
end
end
end
1 change: 1 addition & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
require "database_cleaner"
require "braintree"
require "ffaker"
require "dotenv-rails"

require "spree/testing_support/factories"
require "spree/testing_support/order_walkthrough"
Expand Down