1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-02-19 13:54:25 +01:00

test payzen endpoints

This commit is contained in:
Sylvain 2021-06-09 18:48:51 +02:00
parent c5db9e36ba
commit 13fae70277
6 changed files with 199 additions and 18 deletions

View File

@ -34,7 +34,7 @@ class Footprintable < ApplicationRecord
FootprintService.debug_footprint(self.class, self)
end
protected
#protected
def compute_footprint
FootprintService.compute_footprint(self.class, self)

View File

@ -16,9 +16,9 @@ class CartService
items = []
cart_items[:items].each do |item|
if item.keys.first == 'subscription'
if ['subscription', :subscription].include?(item.keys.first)
items.push(CartItem::Subscription.new(plan_info[:plan], @customer)) if plan_info[:new_subscription]
elsif item.keys.first == 'reservation'
elsif ['reservation', :reservation].include?(item.keys.first)
items.push(reservable_from_hash(item[:reservation], plan_info))
end
end
@ -66,8 +66,8 @@ class CartService
def plan(cart_items)
new_plan_being_bought = false
plan = if cart_items[:items].any? { |item| item.keys.first == 'subscription' }
index = cart_items[:items].index { |item| item.keys.first == 'subscription' }
plan = if cart_items[:items].any? { |item| ['subscription', :subscription].include?(item.keys.first) }
index = cart_items[:items].index { |item| ['subscription', :subscription].include?(item.keys.first) }
if cart_items[:items][index][:subscription][:plan_id]
new_plan_being_bought = true
Plan.find(cart_items[:items][index][:subscription][:plan_id])

37
lib/pay_zen/pci/charge.rb Normal file
View File

@ -0,0 +1,37 @@
# frozen_string_literal: true
require 'pay_zen/client'
# PayZen PCI endpoints
module PayZen::PCI; end
# PCI/Charge/* endpoints of the PayZen REST API
class PayZen::PCI::Charge < PayZen::Client
def initialize(base_url: nil, username: nil, password: nil)
super(base_url: base_url, username: username, password: password)
end
##
# @see https://payzen.io/en-EN/rest/V4.0/api/playground/PCI/Charge/CreatePayment/
##
def create_payment(amount: 0,
currency: Setting.get('payzen_currency'),
order_id: nil,
form_action: 'PAYMENT',
contrib: "fab-manager #{Version.current}",
customer: nil,
device: nil,
payment_forms: nil)
post('/PCI/Charge/CreatePayment',
amount: amount,
currency: currency,
orderId: order_id,
formAction: form_action,
contrib: contrib,
customer: customer,
device: device,
paymentForms: payment_forms)
end
end

View File

@ -71,7 +71,7 @@ namespace :fablab do
end
def chain_history_values
HistoryValue.order(:id).all.each(&:chain_record)
HistoryValue.order(:created_at).all.each(&:chain_record)
end
desc 'assign all footprints to existing PaymentSchedule records'

View File

@ -756,55 +756,55 @@ history_value_78:
history_value_79:
id: 79
setting_id: 79
value: ''
value: 69876357
created_at: '2020-04-15 14:38:40.000421'
updated_at: '2021-05-31 15:00:37.503801'
footprint: 6bce8d94ae14b39a89f220d8c73f4daf44a795888ca011bf1a11da3a35eaf171
footprint: 55d2a2354a3a12ed7bba0a3854f9f4559aed546c81040fbe35cd94d80b8bb811
invoicing_profile_id: 1
history_value_80:
id: 80
setting_id: 80
value: ''
value: testpassword_DEMOPRIVATEKEY23G4475zXZQ2UA5x7M
created_at: '2020-04-15 14:38:40.000421'
updated_at: '2021-05-31 15:00:37.518625'
footprint: b1b314da439b81e95281909992e79f4d118e08633607010f777d6ef40ad28d8e
footprint: a0f076a64824b3473c60dacd18892da21d14830dedd7bb959c442faa59d1313d
invoicing_profile_id: 1
history_value_81:
id: 81
setting_id: 81
value: ''
value: https://api.payzen.eu
created_at: '2020-04-15 14:38:40.000421'
updated_at: '2021-05-31 15:00:37.535175'
footprint: 57dac418c605a111ab2a9c253704f9d9b182dfbb74068fc6596f3d20c611fb42
footprint: 2d0d3090a7976a5b41fb4ccaa1e87e8ee61116813691280f3a2f19c574f0bea5
invoicing_profile_id: 1
history_value_82:
id: 82
setting_id: 82
value: ''
value: 69876357:testpublickey_DEMOPUBLICKEY95me92597fd28tGD4r5
created_at: '2020-04-15 14:38:40.000421'
updated_at: '2021-05-31 15:00:37.551956'
footprint: 68a9d660f03f0e1408ee406ccf7df781147f3a7a2e5ac158a8d3ee4aaaca655a
footprint: 9fbe6418520003f7dc9e37c5a9a3256adc4963d7a5d2402ded929d4154d17a81
invoicing_profile_id: 1
history_value_83:
id: 83
setting_id: 83
value: ''
value: 83daf5e7b80d990f037407bab78dff9904aaf3c19
created_at: '2020-04-15 14:38:40.000421'
updated_at: '2021-05-31 15:00:37.568426'
footprint: 5a984dc2686c93d0380e04c017ce8ec05d18cb3c4c0fec8d4154605986078903
footprint: b0d7f03eff084c39cb87dbf01e3d05f217203d776b0e01ce002a55b426abfe23
invoicing_profile_id: 1
history_value_84:
id: 84
setting_id: 84
value: ''
value: EUR
created_at: '2020-04-15 14:38:40.000421'
updated_at: '2021-05-31 15:00:37.593645'
footprint: bdf31d00b03e511c0a2a1bf18f628462655f32834b6ee6822d1a883055a191f4
footprint: 3545edef1b4367afd0d36742e30e35832e56c32882f3876dba76fc69211950db
invoicing_profile_id: 1
history_value_85:

View File

@ -0,0 +1,144 @@
# frozen_string_literal: true
require 'test_helper'
class PayzenTest < ActionDispatch::IntegrationTest
def setup
@user = User.members.first
login_as(@user, scope: :user)
Setting.set('payment_gateway', 'payzen')
end
test 'create payment with payzen' do
training = Training.first
availability = training.availabilities.first
plan = Plan.find_by(group_id: @user.group.id, type: 'Plan')
VCR.use_cassette('create_payzen_payment_token_success') do
post '/api/payzen/create_payment',
params: {
customer_id: @user.id,
cart_items: {
items: [
{
reservation: {
reservable_id: training.id,
reservable_type: training.class.name,
slots_attributes: [
{
start_at: availability.start_at.to_s(:iso8601),
end_at: availability.end_at.to_s(:iso8601),
availability_id: availability.id
}
]
}
},
{
subscription: {
plan_id: plan.id
}
}
]
}
}.to_json, headers: default_headers
end
# Check the response
assert_equal 200, response.status
payment = json_response(response.body)
assert_not_nil payment[:formToken]
assert_not_nil payment[:orderId]
end
test 'confirm payment with payzen' do
require 'pay_zen/helper'
require 'pay_zen/pci/charge'
training = Training.first
availability = training.availabilities.first
plan = Plan.find_by(group_id: @user.group.id, type: 'Plan')
reservations_count = Reservation.count
availabilities_count = Availability.count
invoices_count = Invoice.count
slots_count = Slot.count
cart_items = {
items: [
{
reservation: {
reservable_id: training.id,
reservable_type: training.class.name,
slots_attributes: [
{
start_at: availability.start_at.to_s(:iso8601),
end_at: availability.end_at.to_s(:iso8601),
availability_id: availability.id
}
]
}
},
{
subscription: {
plan_id: plan.id
}
}
]
}
cs = CartService.new(@user)
cart = cs.from_hash(cart_items)
amount = cart.total[:total]
id = PayZen::Helper.generate_ref(cart_items, @user.id)
VCR.use_cassette('confirm_payzen_payment_success') do
client = PayZen::PCI::Charge.new
result = client.create_payment(amount: amount,
order_id: id,
customer: PayZen::Helper.generate_customer(@user.id, @user.id, cart_items),
device: {
deviceType: 'BROWSER',
acceptHeader: 'text/html',
userAgent: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101',
ip: '69.89.31.226',
javaEnabled: true,
language: 'fr-FR',
colorDepth: '32',
screenHeight: 768,
screenWidth: 1258,
timeZoneOffset: -120
},
payment_forms: [{
paymentMethodType: 'CARD',
pan: '4970100000000055',
expiryMonth: 12,
expiryYear: DateTime.current.strftime('%y'),
securityCode: 123
}])
assert_equal 'PAID', result['answer']['orderStatus'], 'Order is not PAID, something went wrong with PayZen'
assert_equal id, result['answer']['orderDetails']['orderId'], 'Order ID does not match, something went wrong with PayZen'
post '/api/payzen/confirm_payment',
params: {
cart_items: cart_items,
order_id: result['answer']['orderDetails']['orderId']
}.to_json, headers: default_headers
end
# Check the response
assert_equal 201, response.status
invoice = json_response(response.body)
assert_equal Invoice.last.id, invoice[:id]
assert_equal amount / 100.0, invoice[:total]
assert_equal reservations_count + 1, Reservation.count
assert_equal invoices_count + 1, Invoice.count
assert_equal slots_count + 1, Slot.count
assert_equal availabilities_count, Availability.count
end
end