pag_seguro 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pag_seguro/checkout.xml.haml +1 -1
  3. data/lib/pag_seguro/day_of_year.rb +4 -3
  4. data/lib/pag_seguro/errors/unauthorized.rb +1 -1
  5. data/lib/pag_seguro/errors/unknown_error.rb +1 -1
  6. data/lib/pag_seguro/item.rb +5 -5
  7. data/lib/pag_seguro/notification.rb +5 -4
  8. data/lib/pag_seguro/payment.rb +39 -23
  9. data/lib/pag_seguro/payment_method.rb +12 -12
  10. data/lib/pag_seguro/pre_approval.rb +7 -4
  11. data/lib/pag_seguro/query.rb +12 -8
  12. data/lib/pag_seguro/sender.rb +10 -10
  13. data/lib/pag_seguro/shipping.rb +12 -11
  14. data/lib/pag_seguro/transaction.rb +31 -27
  15. data/lib/pag_seguro/version.rb +1 -1
  16. data/lib/pagseguro_decimal_validator.rb +4 -2
  17. data/spec/factories.rb +1 -1
  18. data/spec/pag_seguro/checkout_xml_spec.rb +9 -9
  19. data/spec/pag_seguro/convert_field_to_digit_spec.rb +2 -2
  20. data/spec/pag_seguro/day_of_year_spec.rb +1 -1
  21. data/spec/pag_seguro/errors/unknown_error_spec.rb +2 -2
  22. data/spec/pag_seguro/integration/checkout_spec.rb +4 -4
  23. data/spec/pag_seguro/integration/notification_spec.rb +3 -3
  24. data/spec/pag_seguro/integration/query_spec.rb +2 -2
  25. data/spec/pag_seguro/item_spec.rb +6 -4
  26. data/spec/pag_seguro/payment_method_spec.rb +10 -10
  27. data/spec/pag_seguro/payment_spec.rb +11 -10
  28. data/spec/pag_seguro/pre_approval_spec.rb +3 -2
  29. data/spec/pag_seguro/query_spec.rb +2 -2
  30. data/spec/pag_seguro/sender_spec.rb +5 -5
  31. data/spec/pag_seguro/shipping_spec.rb +3 -3
  32. data/spec/pag_seguro/transaction_spec.rb +2 -2
  33. data/spec/pag_seguro/version_spec.rb +1 -1
  34. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c0937b68bd3486b76533ac074e27c701f0bf774
4
- data.tar.gz: 8b67ac524102ac11165316d175a174cc85d40cea
3
+ metadata.gz: 3bbfb84a631ab24786de12bc5e7a16a107d09790
4
+ data.tar.gz: a9c38a18d3194f2962e58d9813597c162aac5cc6
5
5
  SHA512:
6
- metadata.gz: 0c8812098218850c3a40e7c462820b6f0463b45b26dcdc7b41e56e2dae8f2b84f61086aae1d12023e85f6ac0ed7a81bbc6adff5574bac2eef55bff8855132d03
7
- data.tar.gz: 098eb62f65f0e469e29d6f5144de0a64e7ac1694523119c62c948d07fb544169a2c369e797fa47b9118f09ee6a2d8b011604188c4b107c9ad5767bd9f4a53672
6
+ metadata.gz: bf1a7901bec996be24ca3b9f85adde8508a7cea7a5e0c05ba143c086a628be9cc110aa7976861a5251dab76107ad5eba3bf8ad6f890307ecc894615fe0b31e50
7
+ data.tar.gz: 0438005dd35769dc354816e7be964d892e68b4e2c60d444ca2bfeea5a8c2c8b9f3088b7344cbfebbc16ecfed5dd707f696052edc9fbaaaa6b12b823d3bc27d8c
@@ -79,4 +79,4 @@
79
79
  - if pre_approval.initial_date.present?
80
80
  %initialDate= pre_approval.initial_date.iso8601
81
81
  - if pre_approval.review_URL.present?
82
- %reviewURL= pre_approval.review_URL
82
+ %reviewURL= pre_approval.review_URL
@@ -21,15 +21,16 @@ module PagSeguro
21
21
  "#{"%02d" % @month}-#{"%02d" % @day}"
22
22
  end
23
23
 
24
+ # very simple date validation, just to smoke test possible
25
+ # errors of switching day with month
24
26
  def valid?
25
- # very simple date validation, just to smoke test possible errors of switching day with month
26
27
  @day < 31 && @month < 12
27
28
  end
28
29
 
29
30
  def <=>(other_day_of_the_year)
30
- return 1 if @month > other_day_of_the_year.month
31
+ return 1 if @month > other_day_of_the_year.month
31
32
  return -1 if @month < other_day_of_the_year.month
32
33
  @day <=> other_day_of_the_year.day
33
34
  end
34
35
  end
35
- end
36
+ end
@@ -6,4 +6,4 @@ module PagSeguro
6
6
  end
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -6,4 +6,4 @@ module PagSeguro
6
6
  end
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -2,17 +2,17 @@ module PagSeguro
2
2
  class Item
3
3
  include ActiveModel::Validations
4
4
  extend PagSeguro::ConvertFieldToDigit
5
-
5
+
6
6
  attr_accessor :id, :description, :amount, :quantity, :shipping_cost, :weight
7
7
  attr_reader_as_digit :amount, :shipping_cost
8
-
8
+
9
9
  validates :id, presence: true
10
10
  validates :description, presence: true
11
11
  validates :amount, pagseguro_decimal: true, presence: true
12
12
  validates :shipping_cost, pagseguro_decimal: true
13
13
  validates :weight, numericality: { only_integer: true, greater_than: 0, allow_blank: true }
14
14
  validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0, less_than: 1000 }
15
-
15
+
16
16
  def initialize(attributes = {})
17
17
  @id = attributes[:id]
18
18
  @description = attributes[:description]
@@ -21,9 +21,9 @@ module PagSeguro
21
21
  @shipping_cost = attributes[:shipping_cost]
22
22
  @weight = attributes[:weight]
23
23
  end
24
-
24
+
25
25
  def description
26
26
  @description.present? && @description.size > 100 ? @description[0..99] : @description
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -1,16 +1,17 @@
1
1
  module PagSeguro
2
2
  class Notification < Transaction
3
-
4
- def initialize(email = nil, token = nil, notification_code=nil)
3
+
4
+ def initialize(email, token, notification_code)
5
5
  raise "Needs a notification code" if notification_code.blank?
6
6
  raise "Needs an email" if email.blank?
7
7
  raise "Needs a token" if token.blank?
8
8
  @data = transaction_data(email, token, notification_code)
9
9
  end
10
-
10
+
11
11
  private
12
12
  def transaction_data(email, token, notification_code)
13
- super RestClient.get "#{PAGSEGURO_TRANSACTIONS_URL}/notifications/#{notification_code}", params: {email: email, token: token}
13
+ notification_url = "#{PAGSEGURO_TRANSACTIONS_URL}/notifications/#{notification_code}"
14
+ super RestClient.get notification_url, params: {email: email, token: token}
14
15
  end
15
16
  end
16
17
  end
@@ -3,15 +3,17 @@ module PagSeguro
3
3
  include ActiveModel::Validations
4
4
  extend PagSeguro::ConvertFieldToDigit
5
5
 
6
- attr_accessor :id, :email, :token, :items, :sender, :shipping, :extra_amount,
7
- :redirect_url, :max_uses, :max_age, :response, :pre_approval
6
+ attr_accessor :id, :email, :token, :items, :sender, :shipping,
7
+ :extra_amount, :redirect_url, :max_uses, :max_age,
8
+ :response, :pre_approval
9
+
8
10
  attr_reader_as_digit :extra_amount
9
-
11
+
10
12
  validates_presence_of :email, :token
11
13
  validates :extra_amount, pagseguro_decimal: true
12
14
  validates_format_of :redirect_url, with: URI::regexp(%w(http https)), message: " must give a correct url for redirection", allow_blank: true
13
15
  validate :max_uses_number, :max_age_number, :valid_pre_approval, :valid_items
14
-
16
+
15
17
  def initialize(email = nil, token = nil, options = {})
16
18
  @email = email unless email.nil?
17
19
  @token = token unless token.nil?
@@ -25,60 +27,74 @@ module PagSeguro
25
27
  @max_age = options[:max_age]
26
28
  @pre_approval = options[:pre_approval]
27
29
  end
28
-
30
+
29
31
  def self.checkout_payment_url(code)
30
32
  "https://pagseguro.uol.com.br/v2/checkout/payment.html?code=#{code}"
31
33
  end
32
-
34
+
33
35
  def checkout_xml
34
36
  xml_content = File.open( File.dirname(__FILE__) + "/checkout.xml.haml" ).read
35
37
  haml_engine = Haml::Engine.new(xml_content)
36
- haml_engine.render(Object.new, items: @items, payment: self, sender: @sender, shipping: @shipping, pre_approval: @pre_approval)
38
+
39
+ haml_engine.render Object.new,
40
+ items: @items,
41
+ payment: self,
42
+ sender: @sender,
43
+ shipping: @shipping,
44
+ pre_approval: @pre_approval
37
45
  end
38
-
46
+
39
47
  def checkout_url_with_params
40
48
  "https://ws.pagseguro.uol.com.br/v2/checkout?email=#{@email}&token=#{@token}"
41
49
  end
42
-
50
+
43
51
  def checkout_payment_url
44
52
  self.class.checkout_payment_url(code)
45
53
  end
46
-
54
+
47
55
  def code
48
56
  response || parse_checkout_response
49
57
  parse_code
50
58
  end
51
-
59
+
52
60
  def date
53
61
  response || parse_checkout_response
54
62
  parse_date
55
63
  end
56
-
64
+
57
65
  def reset!
58
66
  @response = nil
59
67
  end
60
-
68
+
61
69
  protected
62
70
  def max_uses_number
63
- errors.add(:max_uses, " must be an integer greater than 0") if @max_uses.present? && @max_uses.to_i <= 0
71
+ if @max_uses.present? && @max_uses.to_i <= 0
72
+ errors.add(:max_uses, " must be an integer greater than 0")
73
+ end
64
74
  end
65
-
75
+
66
76
  def max_age_number
67
- errors.add(:max_age, " must be an integer grater or equal to 30") if @max_age.present? && @max_age.to_i < 30
77
+ if @max_age.present? && @max_age.to_i < 30
78
+ errors.add(:max_age, " must be an integer grater or equal to 30")
79
+ end
68
80
  end
69
81
 
70
82
  def valid_pre_approval
71
- errors.add(:pre_approval, " must be valid") if pre_approval && !pre_approval.valid?
83
+ if pre_approval && !pre_approval.valid?
84
+ errors.add(:pre_approval, " must be valid")
85
+ end
72
86
  end
73
87
 
74
88
  def valid_items
75
- errors.add(:items, " must be all valid") if items.blank? || !items.all?(&:valid?)
89
+ if items.blank? || !items.all?(&:valid?)
90
+ errors.add(:items, " must be all valid")
91
+ end
76
92
  end
77
-
93
+
78
94
  def send_checkout
79
95
  RestClient.post(checkout_url_with_params, checkout_xml, content_type: "application/xml"){|resp, request, result| resp }
80
96
  end
81
-
97
+
82
98
  def parse_checkout_response
83
99
  res = send_checkout
84
100
  raise Errors::Unauthorized if res.code == 401
@@ -86,11 +102,11 @@ module PagSeguro
86
102
  raise Errors::UnknownError.new(res) if res.code != 200
87
103
  @response = res.body
88
104
  end
89
-
105
+
90
106
  def parse_date
91
- DateTime.iso8601( Nokogiri::XML(response.body).css("checkout date").first.content )
107
+ DateTime.iso8601(Nokogiri::XML(response.body).css("checkout date").first.content)
92
108
  end
93
-
109
+
94
110
  def parse_code
95
111
  Nokogiri::XML(response.body).css("checkout code").first.content
96
112
  end
@@ -2,47 +2,47 @@
2
2
  module PagSeguro
3
3
  class PaymentMethod
4
4
  attr_accessor :code, :type
5
-
5
+
6
6
  # Payment Method types
7
7
  CREDIT_CARD = 1
8
8
  BANK_BILL = 2
9
9
  ONLINE_DEBIT = 3
10
10
  PAG_SEGURO_BALANCE = 4
11
11
  OI_PAGGO = 5
12
-
12
+
13
13
  def initialize(options = {})
14
14
  @code = options[:code]
15
15
  @type = options[:type]
16
16
  end
17
-
17
+
18
18
  def code
19
19
  @code.to_i
20
20
  end
21
-
21
+
22
22
  def type
23
23
  @type.to_i
24
24
  end
25
-
25
+
26
26
  def credit_card?
27
27
  CREDIT_CARD == type
28
28
  end
29
-
29
+
30
30
  def bank_bill?
31
31
  BANK_BILL == type
32
32
  end
33
-
33
+
34
34
  def online_debit?
35
35
  ONLINE_DEBIT == type
36
36
  end
37
-
37
+
38
38
  def pag_seguro_balance?
39
39
  PAG_SEGURO_BALANCE == type
40
40
  end
41
-
41
+
42
42
  def oi_paggo?
43
43
  OI_PAGGO == type
44
44
  end
45
-
45
+
46
46
  def name
47
47
  case code
48
48
  when 101 then "Cartão de crédito Visa"
@@ -61,7 +61,7 @@ module PagSeguro
61
61
  when 303 then "Débito online Unibanco"
62
62
  when 304 then "Débito online Banco do Brasil"
63
63
  when 305 then "Débito online Banco Real"
64
- when 306 then "Débito online Banrisul"
64
+ when 306 then "Débito online Banrisul"
65
65
  when 307 then "Débito online HSBC"
66
66
  when 401 then "Saldo PagSeguro"
67
67
  when 501 then "Oi Paggo"
@@ -69,4 +69,4 @@ module PagSeguro
69
69
  end
70
70
  end
71
71
  end
72
- end
72
+ end
@@ -7,8 +7,11 @@ module PagSeguro
7
7
  DAYS_OF_WEEK = %w(monday tuesday wednesday thursday friday saturday sunday)
8
8
  DATE_RANGE = 17856.hours
9
9
 
10
- attr_accessor :name, :details, :amount_per_payment, :period, :day_of_week, :day_of_month,
11
- :day_of_year, :initial_date, :final_date, :max_amount_per_period, :max_total_amount, :review_URL
10
+ attr_accessor :name, :details, :amount_per_payment, :period,
11
+ :day_of_week, :day_of_month, :day_of_year, :initial_date,
12
+ :final_date, :max_amount_per_period, :max_total_amount,
13
+ :review_URL
14
+
12
15
  attr_reader_as_digit :amount_per_payment, :max_amount_per_period, :max_total_amount
13
16
 
14
17
  validates_presence_of :name, :period, :final_date, :max_total_amount, :max_amount_per_period
@@ -16,7 +19,7 @@ module PagSeguro
16
19
  validates_inclusion_of :day_of_week, in: DAYS_OF_WEEK, if: :weekly?
17
20
  validates_inclusion_of :day_of_month, in: (1..28), if: :monthly?
18
21
  validates_presence_of :day_of_year, if: :yearly?
19
- validates_format_of :day_of_year, with: /^\d{2}-\d{2}$/, if: :yearly?
22
+ validates_format_of :day_of_year, with: /\A\d{2}-\d{2}\z/, if: :yearly?
20
23
  validate :initial_date_range, :final_date_range
21
24
  validates :max_amount_per_period, pagseguro_decimal: true
22
25
  validates :max_total_amount, pagseguro_decimal: true
@@ -81,4 +84,4 @@ module PagSeguro
81
84
  errors.add(:final_date) if final_date > (initial_date || Time.now) + DATE_RANGE
82
85
  end
83
86
  end
84
- end
87
+ end
@@ -1,25 +1,28 @@
1
1
  module PagSeguro
2
2
  class Query < Transaction
3
-
4
- def initialize(email = nil, token = nil, transaction_code=nil)
3
+
4
+ def initialize(email, token, transaction_code)
5
5
  raise "Needs a transaction code" if transaction_code.blank?
6
6
  raise "Needs an email" if email.blank?
7
7
  raise "Needs a token" if token.blank?
8
8
  @data = transaction_data(email, token, transaction_code)
9
9
  end
10
-
10
+
11
11
  def self.find(email, token, options={})
12
12
  url = Transaction::PAGSEGURO_TRANSACTIONS_URL
13
13
  url += "/abandoned" if options[:abandoned]
14
+
14
15
  transactions_data = Nokogiri::XML(RestClient.get url, params: search_params(email, token, options))
15
- transactions_data.css("transaction").map{|transaction_xml| Transaction.new(transaction_xml) }
16
+ transactions_data.css("transaction").map do |transaction_xml|
17
+ Transaction.new(transaction_xml)
18
+ end
16
19
  end
17
20
 
18
21
  def self.search_params(email, token, options={})
19
22
  params = {email: email, token: token}
20
23
  params[:initialDate], params[:finalDate] = parse_dates(options)
21
- params[:page] = options[:page] if options[:page]
22
- params[:maxPageResults] = options[:max_page_results] if options[:max_page_results]
24
+ params[:page] = options[:page] if options[:page]
25
+ params[:maxPageResults] = options[:max_page_results] if options[:max_page_results]
23
26
  params
24
27
  end
25
28
 
@@ -34,10 +37,11 @@ module PagSeguro
34
37
 
35
38
  return initial_date.to_time.iso8601, final_date.to_time.iso8601
36
39
  end
37
-
40
+
38
41
  private
39
42
  def transaction_data(email, token, transaction_code)
40
- super RestClient.get "#{PAGSEGURO_TRANSACTIONS_URL}/#{transaction_code}", params: {email: email, token: token}
43
+ transaction_url = "#{PAGSEGURO_TRANSACTIONS_URL}/#{transaction_code}"
44
+ super RestClient.get transaction_url, params: {email: email, token: token}
41
45
  end
42
46
  end
43
47
  end
@@ -1,37 +1,37 @@
1
1
  module PagSeguro
2
2
  class Sender
3
3
  attr_accessor :name, :email, :phone_ddd, :phone_number
4
-
4
+
5
5
  def initialize(options = {})
6
6
  @name = options[:name]
7
7
  @email = options[:email]
8
8
  @phone_ddd = options[:phone_ddd]
9
9
  @phone_number = options[:phone_number]
10
10
  end
11
-
11
+
12
12
  def email
13
13
  valid_email? ? @email : nil
14
14
  end
15
15
 
16
16
  def valid_email?
17
- @email =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i && @email.size <= 60
17
+ @email =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i && @email.size <= 60
18
18
  end
19
-
19
+
20
20
  def name
21
21
  return nil unless valid_name?
22
22
  @name.gsub(/ +/, " ")[0..49]
23
23
  end
24
-
24
+
25
25
  def valid_name?
26
26
  @name =~ /\S+ +\S+/
27
27
  end
28
-
28
+
29
29
  def phone_ddd
30
- @phone_ddd if @phone_ddd.to_s =~ /^\d{2}$/
30
+ @phone_ddd if @phone_ddd.to_s =~ /\A\d{2}\z/
31
31
  end
32
-
32
+
33
33
  def phone_number
34
- @phone_number if @phone_number.to_s =~/^\d{8,9}$/
34
+ @phone_number if @phone_number.to_s =~/\A\d{8,9}\z/
35
35
  end
36
36
  end
37
- end
37
+ end
@@ -1,15 +1,16 @@
1
1
  module PagSeguro
2
2
  class Shipping
3
3
  include ActiveModel::Validations
4
-
4
+
5
5
  PAC = 1
6
6
  SEDEX = 2
7
7
  UNIDENTIFIED = 3
8
-
8
+
9
9
  validates :postal_code, numericality: true, length: {is: 8}
10
-
11
- attr_accessor :type, :state, :city, :postal_code, :district, :street, :number, :complement, :cost
12
-
10
+
11
+ attr_accessor :type, :state, :city, :postal_code, :district,
12
+ :street, :number, :complement, :cost
13
+
13
14
  def initialize(attributes = {})
14
15
  @type = attributes[:type] || UNIDENTIFIED
15
16
  @state = attributes[:state]
@@ -21,25 +22,25 @@ module PagSeguro
21
22
  @complement = attributes[:complement]
22
23
  @cost = attributes[:cost]
23
24
  end
24
-
25
+
25
26
  def postal_code
26
27
  @postal_code if @postal_code.present? && @postal_code.to_s.size == 8
27
28
  end
28
-
29
+
29
30
  def type
30
31
  @type.to_i
31
32
  end
32
-
33
+
33
34
  def pac?
34
35
  PAC == type
35
36
  end
36
-
37
+
37
38
  def sedex?
38
39
  SEDEX == type
39
40
  end
40
-
41
+
41
42
  def unidentified?
42
43
  UNIDENTIFIED == type
43
44
  end
44
45
  end
45
- end
46
+ end
@@ -6,7 +6,7 @@ module PagSeguro
6
6
  attr_accessor :data
7
7
 
8
8
  PAGSEGURO_TRANSACTIONS_URL = "https://ws.pagseguro.uol.com.br/v2/transactions"
9
-
9
+
10
10
  # possible status values
11
11
  PAGSEGURO_PROCESSING = 1
12
12
  PAGSEGURO_IN_ANALYSIS = 2
@@ -15,14 +15,14 @@ module PagSeguro
15
15
  PAGSEGURO_DISPUTED = 5
16
16
  PAGSEGURO_RETURNED = 6
17
17
  PAGSEGURO_CANCELLED = 7
18
-
18
+
19
19
  # possible type values
20
20
  PAGSEGURO_PAYMENT = 1
21
21
  PAGSEGURO_TRANSFER = 2
22
22
  PAGSEGURO_ADDITION_OF_FUNDS = 3
23
23
  PAGSEGURO_CHARGE = 4
24
24
  PAGSEGURO_BONUS = 5
25
-
25
+
26
26
  def self.status_for(status_code)
27
27
  case status_code
28
28
  when PAGSEGURO_PROCESSING then :processing
@@ -42,7 +42,7 @@ module PagSeguro
42
42
  def id
43
43
  @data.css("reference").first.content
44
44
  end
45
-
45
+
46
46
  def gross_amount
47
47
  @data.css("grossAmount").first.content
48
48
  end
@@ -66,29 +66,33 @@ module PagSeguro
66
66
  def installment_count
67
67
  @data.css("installmentCount").first.content.to_i
68
68
  end
69
-
69
+
70
70
  def item_count
71
71
  @data.css("itemCount").first.content.to_i
72
72
  end
73
-
73
+
74
74
  def transaction_id
75
75
  @data.css("code").first.content
76
76
  end
77
-
77
+
78
78
  def date
79
79
  DateTime.iso8601( @data.css("date").first.content )
80
80
  end
81
-
81
+
82
82
  def items
83
83
  @data.css("items item").map do |i|
84
- Item.new(id: parse_item(i, "id"), description: parse_item(i, "description"), quantity: parse_item(i, "quantity"), amount: parse_item(i, "amount"))
84
+ Item.new id: parse_item(i, "id"),
85
+ description: parse_item(i, "description"),
86
+ quantity: parse_item(i, "quantity"),
87
+ amount: parse_item(i, "amount")
85
88
  end
86
89
  end
87
-
90
+
88
91
  def payment_method
89
- PaymentMethod.new code: parse_css("paymentMethod code"), type: parse_css("paymentMethod type")
92
+ PaymentMethod.new code: parse_css("paymentMethod code"),
93
+ type: parse_css("paymentMethod type")
90
94
  end
91
-
95
+
92
96
  def sender
93
97
  sn = Sender.new
94
98
  sn.name = parse_css("sender name")
@@ -97,7 +101,7 @@ module PagSeguro
97
101
  sn.phone_number = parse_css("sender phone number")
98
102
  sn
99
103
  end
100
-
104
+
101
105
  def shipping
102
106
  sh = Shipping.new
103
107
  sh.type = parse_css("shipping type")
@@ -111,7 +115,7 @@ module PagSeguro
111
115
  sh.complement = parse_css("shipping address complement")
112
116
  sh
113
117
  end
114
-
118
+
115
119
  def status
116
120
  @data.css("status").first.content.to_i
117
121
  end
@@ -123,7 +127,7 @@ module PagSeguro
123
127
  def processing?
124
128
  PAGSEGURO_PROCESSING == status
125
129
  end
126
-
130
+
127
131
  def in_analysis?
128
132
  PAGSEGURO_IN_ANALYSIS == status
129
133
  end
@@ -131,43 +135,43 @@ module PagSeguro
131
135
  def approved?
132
136
  PAGSEGURO_APPROVED == status
133
137
  end
134
-
138
+
135
139
  def available?
136
140
  PAGSEGURO_AVAILABLE == status
137
141
  end
138
-
142
+
139
143
  def disputed?
140
144
  PAGSEGURO_DISPUTED == status
141
145
  end
142
-
146
+
143
147
  def returned?
144
148
  PAGSEGURO_RETURNED == status
145
149
  end
146
-
150
+
147
151
  def cancelled?
148
152
  PAGSEGURO_CANCELLED == status
149
153
  end
150
-
154
+
151
155
  def payment?
152
156
  PAGSEGURO_PAYMENT == type
153
157
  end
154
-
158
+
155
159
  def transfer?
156
160
  PAGSEGURO_TRANSFER == type
157
161
  end
158
-
162
+
159
163
  def addition_of_funds?
160
164
  PAGSEGURO_ADDITION_OF_FUNDS == type
161
165
  end
162
-
166
+
163
167
  def charge?
164
168
  PAGSEGURO_CHARGE == type
165
169
  end
166
-
170
+
167
171
  def bonus?
168
172
  PAGSEGURO_BONUS == type
169
173
  end
170
-
174
+
171
175
  protected
172
176
  def transaction_data(transaction_xml)
173
177
  transaction_xml.instance_of?(Nokogiri::XML::Element) ? transaction_xml : Nokogiri::XML(transaction_xml)
@@ -176,10 +180,10 @@ module PagSeguro
176
180
  def parse_item(data, attribute)
177
181
  data.css(attribute).first.content
178
182
  end
179
-
183
+
180
184
  def parse_css(selector)
181
185
  value = @data.css(selector).first
182
186
  value.nil? ? nil : value.content
183
- end
187
+ end
184
188
  end
185
189
  end
@@ -1,3 +1,3 @@
1
1
  module PagSeguro
2
- VERSION = "0.5.3"
2
+ VERSION = "0.5.4"
3
3
  end
@@ -1,9 +1,11 @@
1
1
  class PagseguroDecimalValidator < ActiveModel::EachValidator
2
2
  def validate_each(object, attribute, value)
3
- object.errors.add(attribute, error_message) unless value.nil? || value =~ /^\d+\.\d{2}$/
3
+ unless value.nil? || value =~ /\A\d+\.\d{2}\z/
4
+ object.errors.add(attribute, error_message)
5
+ end
4
6
  end
5
7
 
6
8
  def error_message
7
9
  " must be a decimal and have 2 digits after the dot"
8
10
  end
9
- end
11
+ end
data/spec/factories.rb CHANGED
@@ -134,4 +134,4 @@ FactoryGirl.define do
134
134
  phone_ddd 11
135
135
  phone_number 993430994
136
136
  end
137
- end
137
+ end
@@ -18,9 +18,9 @@ describe PagSeguro::Payment do
18
18
  it 'should be a valid xml' do
19
19
  expect { Nokogiri::XML(payment.checkout_xml) { |config| config.options = Nokogiri::XML::ParseOptions::STRICT } }.to_not raise_error
20
20
  end
21
-
21
+
22
22
  its(:checkout_xml){ should match(/^<\?xml.+encoding="UTF-8".+\?>$/) }
23
-
23
+
24
24
  describe 'settings' do
25
25
  it { xml_content('checkout reference').should be_empty }
26
26
  it { xml_content('checkout extraAmount').should be_empty }
@@ -33,22 +33,22 @@ describe PagSeguro::Payment do
33
33
  before{ payment.id = 305 }
34
34
  it { xml_content('checkout reference').should == '305' }
35
35
  end
36
-
36
+
37
37
  context 'with extra amount' do
38
38
  before{ payment.extra_amount = '10.50' }
39
39
  it { xml_content('checkout extraAmount').should == '10.50' }
40
40
  end
41
-
41
+
42
42
  context 'with redirect url' do
43
43
  before{ payment.redirect_url = 'http://heavenstudio.com.br' }
44
44
  it { xml_content('checkout redirectURL').should == 'http://heavenstudio.com.br' }
45
45
  end
46
-
46
+
47
47
  context 'with max uses' do
48
48
  before{ payment.max_uses = '10' }
49
49
  it { xml_content('checkout maxUses').should == '10' }
50
50
  end
51
-
51
+
52
52
  context 'with max age' do
53
53
  before{ payment.max_age = '5000' }
54
54
  it { xml_content('checkout maxAge').should == '5000' }
@@ -65,12 +65,12 @@ describe PagSeguro::Payment do
65
65
  it { xml_collection('checkout items item quantity').should == ['4', '1', '2', '89'] }
66
66
  it { xml_collection('checkout items item shippingCost').should == ['1.00', '12.00'] }
67
67
  it { xml_collection('checkout items item weight').should == ['10', '300', '400'] }
68
-
68
+
69
69
  it 'should escape html in item description' do
70
70
  payment.checkout_xml.should include('A Book &amp; Cover')
71
71
  end
72
72
  end
73
-
73
+
74
74
  describe 'sender info' do
75
75
  context 'without sender' do
76
76
  it { xml_content('checkout sender name').should be_empty }
@@ -88,7 +88,7 @@ describe PagSeguro::Payment do
88
88
  it { xml_content('checkout sender phone number').should == '993430994' }
89
89
  end
90
90
  end
91
-
91
+
92
92
  describe 'shipping info' do
93
93
  context 'without shipping' do
94
94
  it { xml_content('checkout shipping').should be_empty }
@@ -7,7 +7,7 @@ end
7
7
  describe PagSeguro::ConvertFieldToDigit do
8
8
  subject{ MyObject.new }
9
9
 
10
- context "normal object" do
10
+ context "normal object" do
11
11
  context "with numeric price" do
12
12
  before{ subject.price = 10.02 }
13
13
  its(:price){ should == 10.02 }
@@ -65,4 +65,4 @@ describe PagSeguro::ConvertFieldToDigit do
65
65
  its(:amount){ should == nil }
66
66
  end
67
67
  end
68
- end
68
+ end
@@ -46,4 +46,4 @@ describe PagSeguro::DayOfYear do
46
46
  build(:day_of_year).should be == build(:day_of_year)
47
47
  end
48
48
  end
49
- end
49
+ end
@@ -4,7 +4,7 @@ class MockResponse
4
4
  def code
5
5
  10000
6
6
  end
7
-
7
+
8
8
  def body
9
9
  " error description"
10
10
  end
@@ -14,4 +14,4 @@ describe PagSeguro::Errors::UnknownError do
14
14
  it "should be able to raise an unknown error" do
15
15
  lambda { raise PagSeguro::Errors::UnknownError.new(MockResponse.new) }.should raise_error(PagSeguro::Errors::UnknownError, "Unknown response code (10000):\n error description")
16
16
  end
17
- end
17
+ end
@@ -9,7 +9,7 @@ describe PagSeguro::Payment do
9
9
  pending "You need to set your token for your PagSeguro account in spec/pag_seguro/integration/config.yml in order to run this spec"
10
10
  end
11
11
  end
12
-
12
+
13
13
  context "with all fields" do
14
14
  let(:payment){ build :payment_with_all_fields, email: EMAIL, token: TOKEN }
15
15
  subject { payment }
@@ -37,7 +37,7 @@ describe PagSeguro::Payment do
37
37
  context "with items" do
38
38
  let(:payment){ build :payment_with_items, email: EMAIL, token: TOKEN }
39
39
  subject { payment }
40
-
40
+
41
41
  its('code.size'){ should == 32 }
42
42
  its(:date){ should be_an_instance_of(DateTime) }
43
43
 
@@ -52,9 +52,9 @@ describe PagSeguro::Payment do
52
52
  expect { payment.code }.to raise_error(PagSeguro::Errors::InvalidData)
53
53
  end
54
54
  end
55
-
55
+
56
56
  it "should raise unauthorized error if email and token do not match" do
57
57
  payment = build :payment, email: "not_a_user@not_an_email.com", token: "NOTATOKEN7F048A09A8AEFDD1E5A7B91"
58
58
  expect { payment.code }.to raise_error(PagSeguro::Errors::Unauthorized)
59
59
  end
60
- end
60
+ end
@@ -13,7 +13,7 @@ describe PagSeguro::Notification do
13
13
  @notification = PagSeguro::Notification.new(EMAIL, TOKEN, NOTIFICATION_CODE)
14
14
  end
15
15
  end
16
-
16
+
17
17
  it { @notification.transaction_id.should be_present }
18
18
  it { @notification.date.should be_present }
19
19
  it { @notification.id.should be_present }
@@ -38,7 +38,7 @@ describe PagSeguro::Notification do
38
38
  item.quantity.should be_present
39
39
  end
40
40
  end
41
-
41
+
42
42
  it { @notification.sender.email.should be_present }
43
43
  it { @notification.shipping.type.should be_present }
44
- end
44
+ end
@@ -14,7 +14,7 @@ describe PagSeguro::Query do
14
14
  @query = PagSeguro::Query.new(EMAIL, TOKEN, TRANSACTION_ID)
15
15
  end
16
16
  end
17
-
17
+
18
18
  it { @query.transaction_id.should be_present }
19
19
  it { @query.date.should be_present }
20
20
  it { @query.id.should be_present }
@@ -39,7 +39,7 @@ describe PagSeguro::Query do
39
39
  item.quantity.should be_present
40
40
  end
41
41
  end
42
-
42
+
43
43
  it { @query.sender.email.should be_present }
44
44
  it { @query.shipping.type.should be_present }
45
45
  end
@@ -15,7 +15,7 @@ describe PagSeguro::Item do
15
15
  it { should validate_presence_of :id }
16
16
  it { should validate_presence_of :description }
17
17
  it { should validate_presence_of :amount }
18
-
18
+
19
19
  it { should_not allow_value(nil).for(:quantity) }
20
20
  it { should_not allow_value(0).for(:quantity) }
21
21
  it { should_not allow_value(1000).for(:quantity) }
@@ -25,13 +25,15 @@ describe PagSeguro::Item do
25
25
  it { should_not allow_value("10,50").for(:amount) }
26
26
  it { should_not allow_value("R$ 10.50").for(:amount) }
27
27
  it { should_not allow_value("-10.50").for(:amount) }
28
+ it { should_not allow_value("10.50\nanything").for(:amount) }
28
29
  it { should allow_value("10.50").for(:amount) }
29
30
  it { should allow_value(10).for(:amount) }
30
31
  it { should allow_value(BigDecimal.new("10.5")).for(:amount) }
31
-
32
+
32
33
  it { should_not allow_value("10,50").for(:shipping_cost) }
33
34
  it { should_not allow_value("R$ 10.50").for(:shipping_cost) }
34
35
  it { should_not allow_value("-10.50").for(:shipping_cost) }
36
+ it { should_not allow_value("10.50\nanything").for(:shipping_cost) }
35
37
  it { should allow_value("10.50").for(:shipping_cost) }
36
38
  it { should allow_value(10).for(:shipping_cost) }
37
39
  it { should allow_value(BigDecimal.new("10.5")).for(:shipping_cost) }
@@ -41,7 +43,7 @@ describe PagSeguro::Item do
41
43
  it { should_not allow_value("0").for(:quantity) }
42
44
  it { should_not allow_value("-1").for(:quantity) }
43
45
  it { should allow_value("1").for(:quantity) }
44
-
46
+
45
47
  it { should_not allow_value("-10").for(:weight) }
46
48
  it { should_not allow_value("10.5").for(:weight) }
47
49
  it { should_not allow_value("10,5").for(:weight) }
@@ -50,4 +52,4 @@ describe PagSeguro::Item do
50
52
  it "should trim description to 100 characters if it has more than 100 characters" do
51
53
  PagSeguro::Item.new(description: "-" * 101).description.size.should == 100
52
54
  end
53
- end
55
+ end
@@ -3,28 +3,28 @@ require 'spec_helper'
3
3
 
4
4
  describe PagSeguro::PaymentMethod do
5
5
  it { should have_attribute_accessor(:code) }
6
- it { should have_attribute_accessor(:type) }
7
-
6
+ it { should have_attribute_accessor(:type) }
7
+
8
8
  context "initalized with code and type" do
9
9
  subject { build :payment_method, code: "101", type: "1" }
10
10
 
11
11
  its(:code){ should == 101 }
12
12
  its(:type){ should == 1 }
13
13
  end
14
-
14
+
15
15
  describe "types" do
16
16
  let(:payment_method){ PagSeguro::PaymentMethod.new }
17
-
17
+
18
18
  context "with type 1" do
19
19
  subject { build :payment_method, type: 1 }
20
20
  it { should be_credit_card }
21
21
  end
22
-
22
+
23
23
  context "with if type 2" do
24
24
  subject { build :payment_method, type: 2 }
25
25
  it { should be_bank_bill }
26
26
  end
27
-
27
+
28
28
  context "with if type 3" do
29
29
  subject { build :payment_method, type: 3 }
30
30
  it { should be_online_debit }
@@ -34,18 +34,18 @@ describe PagSeguro::PaymentMethod do
34
34
  subject { build :payment_method, type: 4 }
35
35
  it { should be_pag_seguro_balance }
36
36
  end
37
-
37
+
38
38
  context "with type 5" do
39
39
  subject { build :payment_method, type: 5 }
40
40
  it { should be_oi_paggo }
41
41
  end
42
42
  end
43
-
43
+
44
44
  describe "codes" do
45
45
  def should_have_meaning_for_code(meaning, code)
46
46
  PagSeguro::PaymentMethod.new(code: code).name.should be == meaning
47
47
  end
48
-
48
+
49
49
  it { should_have_meaning_for_code("Cartão de crédito Visa", 101) }
50
50
  it { should_have_meaning_for_code("Cartão de crédito MasterCard", 102) }
51
51
  it { should_have_meaning_for_code("Cartão de crédito American Express", 103) }
@@ -68,4 +68,4 @@ describe PagSeguro::PaymentMethod do
68
68
  it { should_have_meaning_for_code("Oi Paggo", 501) }
69
69
  it { should_have_meaning_for_code("Desconhecido", 0) }
70
70
  end
71
- end
71
+ end
@@ -48,14 +48,15 @@ describe PagSeguro::Payment do
48
48
 
49
49
  it { validate_presence_of :email }
50
50
  it { validate_presence_of :token }
51
-
51
+
52
52
  it { should_not allow_value('10,50').for(:extra_amount) }
53
53
  it { should_not allow_value('R$ 10.50').for(:extra_amount) }
54
54
  it { should_not allow_value('-10.50').for(:extra_amount) }
55
+ it { should_not allow_value('10.50\nanything').for(:extra_amount) }
55
56
  it { should allow_value('10.50').for(:extra_amount) }
56
57
  it { should allow_value(10).for(:extra_amount) }
57
58
  it { should allow_value(BigDecimal.new('10.5')).for(:extra_amount) }
58
-
59
+
59
60
  it { should_not allow_value('something.com.br').for(:redirect_url)}
60
61
  it { should allow_value('http://something.com.br').for(:redirect_url)}
61
62
 
@@ -85,17 +86,17 @@ describe PagSeguro::Payment do
85
86
  subject { build :payment_with_item }
86
87
  it { should be_valid }
87
88
  end
88
-
89
+
89
90
  context 'checking out' do
90
91
  let(:payment){ build(:payment) }
91
92
  it 'should generate a checkout url with an external code' do
92
93
  PagSeguro::Payment.checkout_payment_url('aabbcc').should == 'https://pagseguro.uol.com.br/v2/checkout/payment.html?code=aabbcc'
93
94
  end
94
-
95
+
95
96
  it 'should have a checkout_url_with_params' do
96
97
  payment.checkout_url_with_params.should == 'https://ws.pagseguro.uol.com.br/v2/checkout?email=myemail&token=mytoken'
97
98
  end
98
-
99
+
99
100
  it 'should generate a checkout url based on the received response' do
100
101
  payment.stub code: 'aabbcc'
101
102
  payment.checkout_payment_url.should == 'https://pagseguro.uol.com.br/v2/checkout/payment.html?code=aabbcc'
@@ -109,18 +110,18 @@ describe PagSeguro::Payment do
109
110
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :body){ 'some body info' }
110
111
  expect { payment.send(:parse_checkout_response) }.to_not raise_error
111
112
  end
112
-
113
+
113
114
  it 'should raise PagSeguro::Errors::InvalidData if response code is 400' do
114
115
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :code){ 400 }
115
116
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :body){ 'some error description' }
116
117
  expect { payment.send(:parse_checkout_response) }.to raise_error(PagSeguro::Errors::InvalidData)
117
118
  end
118
-
119
+
119
120
  it 'should raise PagSeguro::Errors::Unauthorized if response code is 400' do
120
121
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :code){ 401 }
121
122
  expect { payment.send(:parse_checkout_response) }.to raise_error(PagSeguro::Errors::Unauthorized)
122
123
  end
123
-
124
+
124
125
  it 'should raise PagSeguro::Errors::UnknownError if response code is not 200, 400 or 401' do
125
126
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :code){ 300 }
126
127
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :body){ 'some response body' }
@@ -132,7 +133,7 @@ describe PagSeguro::Payment do
132
133
  PagSeguro::Payment.any_instance.stub_chain(:send_checkout, :body){ 'some response body' }
133
134
  expect { payment.send(:parse_checkout_response) }.to change { payment.response }.from(nil).to('some response body')
134
135
  end
135
-
136
+
136
137
  it 'should be able to reset response' do
137
138
  payment.response = 'something'
138
139
  expect { payment.reset! }.to change{ payment.response }.from('something').to(nil)
@@ -179,4 +180,4 @@ describe PagSeguro::Payment do
179
180
  payment.date
180
181
  end
181
182
  end
182
- end
183
+ end
@@ -47,7 +47,7 @@ describe PagSeguro::PreApproval do
47
47
  it { should_not allow_value( Time.now - 10.minutes + 5.days ).for(:final_date) }
48
48
  it { should allow_value( Time.now + 5.days ).for(:final_date) }
49
49
  it { should allow_value( (PagSeguro::PreApproval::DATE_RANGE - 5.minutes + 5.days).from_now ).for(:final_date) }
50
- it { should_not allow_value( PagSeguro::PreApproval::DATE_RANGE.from_now + 5.minutes + 5.days ).for(:final_date) }
50
+ it { should_not allow_value( PagSeguro::PreApproval::DATE_RANGE.from_now + 5.minutes + 5.days ).for(:final_date) }
51
51
  end
52
52
 
53
53
  describe "initialized with minimum attributes" do
@@ -101,6 +101,7 @@ describe PagSeguro::PreApproval do
101
101
  it { should allow_value('01-01').for(:day_of_year) }
102
102
  it { should allow_value(PagSeguro::DayOfYear.new(month: 1, day: 1)).for(:day_of_year) }
103
103
  it { should_not allow_value('1-1').for(:day_of_year) }
104
+ it { should_not allow_value("10-22\nanything").for(:day_of_year) }
104
105
 
105
106
  its(:period){ should == 'yearly' }
106
107
  its(:day_of_year){ should == '03-01' }
@@ -109,4 +110,4 @@ describe PagSeguro::PreApproval do
109
110
  it { should be_yearly }
110
111
  end
111
112
  end
112
- end
113
+ end
@@ -33,7 +33,7 @@ describe PagSeguro::Query do
33
33
  PagSeguro::Query.stub(search_params: params)
34
34
  RestClient.should_receive(:get).with("https://ws.pagseguro.uol.com.br/v2/transactions/abandoned", params: params)
35
35
  PagSeguro::Query.find "email", "token", abandoned: true
36
- end
36
+ end
37
37
  end
38
38
 
39
39
  context "with a stubbed response" do
@@ -60,7 +60,7 @@ describe PagSeguro::Query do
60
60
  it { search_params.keys.should_not include :page }
61
61
  it { search_params[:finalDate].should include Date.today.iso8601 }
62
62
  it { search_params[:initialDate].should include Date.yesterday.iso8601 }
63
-
63
+
64
64
  it "should call parse_dates" do
65
65
  PagSeguro::Query.should_receive(:parse_dates)
66
66
  search_params
@@ -2,12 +2,12 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe PagSeguro::Sender do
5
- context "instance" do
5
+ context "instance" do
6
6
  it { should have_attribute_accessor(:email) }
7
7
  it { should have_attribute_accessor(:name) }
8
8
  it { should have_attribute_accessor(:phone_ddd) }
9
9
  it { should have_attribute_accessor(:phone_number) }
10
-
10
+
11
11
  context "initialized with all attributes" do
12
12
  subject { PagSeguro::Sender.new attributes_for(:sender) }
13
13
  its(:name){ should == "Stefano Diem Benatti" }
@@ -15,7 +15,7 @@ describe PagSeguro::Sender do
15
15
  its(:phone_ddd){ should == 11 }
16
16
  its(:phone_number){ should == 993430994 }
17
17
  end
18
-
18
+
19
19
  context "with invalid e-mail" do
20
20
  subject { build :sender, email: "nothing" }
21
21
  its(:email){ should be_nil }
@@ -50,7 +50,7 @@ describe PagSeguro::Sender do
50
50
  it { should be_a_valid_name }
51
51
  its(:name){ should == "a" * 50 }
52
52
  end
53
-
53
+
54
54
  context "with double spaces in name" do
55
55
  subject { build :sender, name: "Stefano Benatti" }
56
56
  it { should be_a_valid_name }
@@ -67,4 +67,4 @@ describe PagSeguro::Sender do
67
67
  its(:phone_number){ should be_nil }
68
68
  end
69
69
  end
70
- end
70
+ end
@@ -18,14 +18,14 @@ describe PagSeguro::Shipping do
18
18
 
19
19
  describe "instance" do
20
20
  subject{ build(:shipping) }
21
-
21
+
22
22
  it { should be_valid }
23
23
  its(:cost){ should == "12.13" }
24
24
  its(:postal_code){ should == "05363000" }
25
25
 
26
26
  context "with invalid postal_code" do
27
27
  subject{ build(:shipping, postal_code: 1234567) }
28
- its(:postal_code){ should be_blank }
28
+ its(:postal_code){ should be_blank }
29
29
  end
30
30
 
31
31
  context "with type 1" do
@@ -43,4 +43,4 @@ describe PagSeguro::Shipping do
43
43
  it { should be_unidentified }
44
44
  end
45
45
  end
46
- end
46
+ end
@@ -5,6 +5,6 @@ require 'spec_helper'
5
5
  describe PagSeguro::Transaction do
6
6
  let(:transaction){ PagSeguro::Transaction.new(transaction_xml) }
7
7
  subject{ PagSeguro::Transaction }
8
-
8
+
9
9
  it_behaves_like "a transaction"
10
- end
10
+ end
@@ -4,4 +4,4 @@ describe PagSeguro do
4
4
  it "should have a version" do
5
5
  PagSeguro::VERSION.should_not be_empty
6
6
  end
7
- end
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pag_seguro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Diem Benatti
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-04 00:00:00.000000000 Z
11
+ date: 2013-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel