conekta 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmQ0MDY4MjFjZDhlMmJiNGE0ZjM4ODg1NTEzY2I1NjAxOGM4NTg0MA==
5
+ data.tar.gz: !binary |-
6
+ MGIwODM1ZWJjNWE4N2Y2OWM3MjcyNzIxOGJmZjcwNmY0MjA2YjcyOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZTk3NDg4NDJkYWExOTgwZDM0ZTc5MzA0YWNlNWI4MWNmMzgxNTIyNTA0MmZm
10
+ ODkyM2YwMGJlZTc3N2UxNDhjZjkwZTgwYmNjOWRmZDM4ZjFlMzU0MWIzNGU0
11
+ NzgxODk4MjE3MGFjMjk3YzRhMzdjNmJjNzQ5MDIwZWNjYmE1NDk=
12
+ data.tar.gz: !binary |-
13
+ ZmE1OTFjOTU4YWJhOTQwNDIxZWFiYWNiMzQ0ZTc2YTZhNjE0NzBkZDc2ZjQ3
14
+ OWU5MmY4ZDM5YWJkNmRmMjQyOTVhZGM3MzgwYmJjNzBjM2Q4NmE5MDc0N2Ni
15
+ M2U4NDlkNDI2OWIxMWU4MWYzNjhiYWVkMWFmNmY5N2YxNDlmNjk=
data/.gitignore CHANGED
@@ -1,4 +1,9 @@
1
1
  *.gem
2
+ *.swo
3
+ *.swn
4
+ *.swm
5
+ *.swp
6
+ *~
2
7
  *.rbc
3
8
  .bundle
4
9
  .config
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- conekta (0.2.0)
4
+ conekta (0.3.1)
5
5
  multi_json (>= 1.0.4, < 2)
6
6
  rest-client (~> 1.4)
7
7
 
@@ -5,7 +5,11 @@
5
5
  You don't need this source code unless you want to modify the gem. If
6
6
  you want to install the gem via bundler you should add this line to your gemfile:
7
7
 
8
- gem 'conekta', :git => 'git://github.com/conekta/conekta-ruby.git'
8
+ gem "conekta", "~> 0.3.0"
9
+
10
+ You can also install this gem by running:
11
+
12
+ gem install conekta
9
13
 
10
14
  If you want to build the gem from source:
11
15
 
@@ -19,4 +23,4 @@ If you want to build the gem from source:
19
23
 
20
24
  == Development
21
25
 
22
- Test cases can be run with: `bundle exec rake test`
26
+ Test cases can be run with: `bundle exec rake spec`
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -15,6 +15,8 @@ require 'conekta/api_operations/create'
15
15
  require 'conekta/api_operations/update'
16
16
  require 'conekta/api_operations/delete'
17
17
  require 'conekta/api_operations/list'
18
+ require 'conekta/api_operations/modify_member'
19
+ require 'conekta/api_operations/create_member'
18
20
 
19
21
  # Resources
20
22
  require 'conekta/util'
@@ -25,6 +27,11 @@ require 'conekta/singleton_api_resource'
25
27
  require 'conekta/account'
26
28
  require 'conekta/list_object'
27
29
  require 'conekta/charge'
30
+ require 'conekta/subscription'
31
+ require 'conekta/customer'
32
+ require 'conekta/card'
33
+ require 'conekta/token'
34
+ require 'conekta/plan'
28
35
  require 'conekta/event'
29
36
  require 'conekta/log'
30
37
 
@@ -0,0 +1,25 @@
1
+ module Conekta
2
+ module APIOperations
3
+ module CreateMember
4
+ module ClassMethods
5
+ def create_member(member, params={}, api_key=nil)
6
+ path = "#{path}/#{member}"
7
+ response, api_key = Conekta.request(:post, path, api_key, params)
8
+ obj = Util.convert_to_conekta_object(response, api_key)
9
+ obj.try("#{parent}".to_sym) = self
10
+ if obj.class == ConektaObject
11
+ count = self.try("#{member}".to_sym).count
12
+ self.try("#{member}".to_sym)[count] = obj
13
+ else
14
+ self.try("#{member}".to_sym) = obj
15
+ end
16
+ obj
17
+ end
18
+ end
19
+
20
+ def self.included(base)
21
+ base.extend(ClassMethods)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ module Conekta
2
+ module APIOperations
3
+ module ModifyMember
4
+ module ClassMethods
5
+ def modify_member(parent, member, params={}, action, method, api_key=nil)
6
+ path = "#{path}/#{member}/#{action}"
7
+ response, api_key = Conekta.request(method.to_sym, path, api_key, params)
8
+ self.try("#{parent}".to_sym).try("#{member}".to_sym) = self
9
+ self
10
+ end
11
+ end
12
+
13
+ def self.included(base)
14
+ base.extend(ClassMethods)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -6,7 +6,7 @@ module Conekta
6
6
  values = {}
7
7
  @unsaved_values.each { |k| values[k] = @values[k] }
8
8
  values.delete(:id)
9
- response, api_key = Conekta.request(:post, url, @api_key, values)
9
+ response, api_key = Conekta.request(:put, url, @api_key, values)
10
10
  refresh_from(response, api_key)
11
11
  end
12
12
  self
@@ -0,0 +1,30 @@
1
+ module Conekta
2
+ class Card < APIResource
3
+ include Conekta::APIOperations::Update
4
+
5
+ def delete
6
+ response, api_key = Conekta.request(:delete, url, @api_key)
7
+ refresh_from(response, api_key)
8
+ deleted_card = self
9
+ i = 0
10
+ for card in self.customer.cards
11
+ if deleted_card.id == card.id
12
+ self.customer.cards.delete_at(i)
13
+ break
14
+ end
15
+ i = i + 1
16
+ end
17
+ deleted_card
18
+ end
19
+
20
+ def url
21
+ unless id = self['id']
22
+ raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{id.inspect}", 'id')
23
+ end
24
+ unless customer = self.customer
25
+ raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid customer: #{customer.inspect}", 'customer')
26
+ end
27
+ "#{Conekta::Customer.url}/#{CGI.escape(customer.id)}/cards/#{CGI.escape(id)}"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ module Conekta
2
+ class Customer < APIResource
3
+ include Conekta::APIOperations::Create
4
+ include Conekta::APIOperations::Delete
5
+ include Conekta::APIOperations::Update
6
+ include Conekta::APIOperations::List
7
+ include Conekta::APIOperations::CreateMember
8
+
9
+ def create_subscription(params={})
10
+ self.create_member('subscription', params)
11
+ end
12
+
13
+ def create_card(params={})
14
+ self.create_member('cards', params)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ module Conekta
2
+ class Plan < APIResource
3
+ include Conekta::APIOperations::Create
4
+ include Conekta::APIOperations::Delete
5
+ include Conekta::APIOperations::List
6
+ include Conekta::APIOperations::Update
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ module Conekta
2
+ class Subscription < APIResource
3
+ include Conekta::APIOperations::Update
4
+ include Conekta::APIOperations::ModifyMember
5
+
6
+ def cancel
7
+ self.modify_member("customer", "subscription", nil, "cancel", "post")
8
+ end
9
+
10
+ def pause
11
+ self.modify_member("customer", "subscription", nil, "pause", "post")
12
+ end
13
+
14
+ def resume
15
+ self.modify_member("customer", "subscription", nil, "resume", "post")
16
+ end
17
+
18
+ def url
19
+ unless customer = self.customer
20
+ raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid customer: #{customer.inspect}", 'customer')
21
+ end
22
+ "#{Conekta::Customer.url}/#{CGI.escape(customer.id)}/subscription"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ module Conekta
2
+ class Token < APIResource
3
+ include Conekta::APIOperations::Create
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Conekta
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
@@ -157,7 +157,7 @@ class ConektaTest < Test::Unit::TestCase
157
157
  Conekta.api_key = nil
158
158
 
159
159
  Conekta.should_receive(:execute_request){|opts|
160
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
160
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
161
161
  test_response(test_charge)
162
162
  }
163
163
 
@@ -169,7 +169,7 @@ class ConektaTest < Test::Unit::TestCase
169
169
  Conekta.api_key = "global"
170
170
 
171
171
  Conekta.should_receive(:execute_request){|opts|
172
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
172
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
173
173
  test_response(test_charge)
174
174
  }
175
175
 
@@ -182,12 +182,12 @@ class ConektaTest < Test::Unit::TestCase
182
182
 
183
183
  Conekta.should_receive(:execute_request){|opts|
184
184
  opts[:url].should eq("#{Conekta.api_base}/charges/ch_test_charge.json")
185
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
185
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
186
186
  test_response(test_charge)
187
187
  }
188
188
  Conekta.should_receive(:execute_request){|opts|
189
189
  opts[:url].should eq("#{Conekta.api_base}/charges/ch_test_charge/refund.json")
190
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
190
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
191
191
  test_response(test_charge)
192
192
  }
193
193
 
@@ -352,7 +352,7 @@ class ConektaTest < Test::Unit::TestCase
352
352
  @mock.should_receive(:post){|url, api_key, params|
353
353
  "#{Conekta.api_base}/charges.json".should eq(url)
354
354
  api_key.should eq(nil)
355
- {:amount => 50, :currency=>'usd', :card=>{}}.should eq(params)
355
+ {:amount => 50, :currency=>'usd', :card=>{}}.should eq(JSON.parse(params).symbolize_keys)
356
356
 
357
357
  test_response({ :count => 1, :data => [test_charge] })
358
358
  }
@@ -405,7 +405,7 @@ class ConektaTest < Test::Unit::TestCase
405
405
  params = { :amount => 100, :currency => 'usd', :card => 'sc_token' }
406
406
  @mock.should_receive(:post){|url, get, post|
407
407
  get.should eq(nil)
408
- post.should eq({:amount => 100, :currency => 'usd', :card => 'sc_token'})
408
+ JSON.parse(post).symbolize_keys.should eq({:amount => 100, :currency => 'usd', :card => 'sc_token'})
409
409
  test_response(test_charge)
410
410
  }
411
411
  c = Conekta::Charge.create(params)
@@ -463,7 +463,7 @@ class ConektaTest < Test::Unit::TestCase
463
463
  @mock.should_receive(:post){|url, api_key, params|
464
464
  url.should eq("#{Conekta.api_base}/charges/ch_test_charge.json")
465
465
  api_key.should eq(nil)
466
- params.should eq({:mnemonic => 'another_mn'})
466
+ JSON.parse(params).symbolize_keys.should eq({:mnemonic => 'another_mn'})
467
467
  test_response(test_charge)
468
468
  }.once
469
469
  c = Conekta::Charge.construct_from(test_charge)
@@ -582,6 +582,102 @@ class ConektaTest < Test::Unit::TestCase
582
582
  end
583
583
  end
584
584
 
585
+ describe "customer with token tests" do
586
+ it "execute should return a new customer" do
587
+ @mock = double
588
+ Conekta.mock_rest_client = @mock
589
+
590
+ @mock.should_receive(:post){|url, api_key, params|
591
+ url.should eq("#{Conekta.api_base}/customers.json")
592
+ api_key.should eq(nil)
593
+ JSON.parse(params).symbolize_keys.should eq({
594
+ :cards=>["TOKEN_ID"]
595
+ })
596
+
597
+ test_response(test_customer)
598
+ }.once
599
+
600
+ c = Conekta::Customer.create({
601
+ :cards => ["TOKEN_ID"],
602
+ })
603
+ c.cards.first.last4.should eq("4242")
604
+
605
+ Conekta.mock_rest_client = nil
606
+ end
607
+ end
608
+
609
+ describe "plan tests" do
610
+ it "execute should return a new plan" do
611
+ @mock = double
612
+ Conekta.mock_rest_client = @mock
613
+
614
+ @mock.should_receive(:post){|url, api_key, params|
615
+ url.should eq("#{Conekta.api_base}/plans.json")
616
+ api_key.should eq(nil)
617
+ JSON.parse(params).symbolize_keys.should eq({
618
+ :id => "gold-plan",
619
+ :name => "Gold Plan",
620
+ :amount => 10000,
621
+ :currency => "MXN",
622
+ :interval => "month",
623
+ :frequency => 1,
624
+ :trial_period_days => 15,
625
+ :expiry_count => 12
626
+ })
627
+
628
+ test_response(test_plan)
629
+ }.once
630
+
631
+ p = Conekta::Plan.create({
632
+ :id => "gold-plan",
633
+ :name => "Gold Plan",
634
+ :amount => 10000,
635
+ :currency => "MXN",
636
+ :interval => "month",
637
+ :frequency => 1,
638
+ :trial_period_days => 15,
639
+ :expiry_count => 12
640
+ })
641
+ p.id.should eq("gold-plan")
642
+
643
+ Conekta.mock_rest_client = nil
644
+ end
645
+ end
646
+
647
+ describe "token tests" do
648
+ it "execute should return a new token" do
649
+ @mock = double
650
+ Conekta.mock_rest_client = @mock
651
+
652
+ @mock.should_receive(:post){|url, api_key, params|
653
+ url.should eq("#{Conekta.api_base}/tokens.json")
654
+ api_key.should eq(nil)
655
+ params = JSON.parse(params).symbolize_keys
656
+ params[:card] = params[:card].symbolize_keys
657
+ params.should eq({
658
+ :card => {
659
+ :number => "4242424242424242",
660
+ :exp_month => 11,
661
+ :exp_year => 2012,
662
+ }
663
+ })
664
+
665
+ test_response(test_token)
666
+ }.once
667
+
668
+ t = Conekta::Token.create({
669
+ :card => {
670
+ :number => "4242424242424242",
671
+ :exp_month => 11,
672
+ :exp_year => 2012,
673
+ }
674
+ })
675
+ t.used.should eq(false)
676
+
677
+ Conekta.mock_rest_client = nil
678
+ end
679
+ end
680
+
585
681
 
586
682
  describe "charge tests" do
587
683
  it "charges should be listable" do
@@ -657,7 +753,9 @@ class ConektaTest < Test::Unit::TestCase
657
753
 
658
754
  @mock.should_receive(:post){|url, api_key, params|
659
755
  url.should eq("#{Conekta.api_base}/charges.json")
660
- api_key.should eq(nil)
756
+ api_key.should eq(nil)
757
+ params = JSON.parse(params).symbolize_keys
758
+ params[:card] = params[:card].symbolize_keys
661
759
  params.should eq({
662
760
  :currency => 'usd',
663
761
  :amount => 100,
@@ -34,6 +34,29 @@ def test_response(body, code=200)
34
34
  m
35
35
  end
36
36
 
37
+ def test_plan(params={})
38
+ {
39
+ :id => "gold-plan",
40
+ :name => "Gold Plan",
41
+ :amount => 10000,
42
+ :frequency => "month",
43
+ :trial_period_days => 15,
44
+ :object => "plan",
45
+ :expiry_count => 12
46
+ }
47
+ end
48
+
49
+ def test_token(params={})
50
+ {
51
+ :livemode => false,
52
+ :used => false,
53
+ :object => "token",
54
+ :id => "c_test_token",
55
+ :created => 1304114758,
56
+ :card => test_token_card
57
+ }.merge(params)
58
+ end
59
+
37
60
  def test_customer(params={})
38
61
  {
39
62
  :subscription_history => [],
@@ -103,6 +126,19 @@ def test_card_array(customer_id)
103
126
  }
104
127
  end
105
128
 
129
+ def test_token_card(params={})
130
+ {
131
+ :type => "Visa",
132
+ :last4 => "4242",
133
+ :exp_month => 11,
134
+ :country => "US",
135
+ :exp_year => 2012,
136
+ :id => "cc_test_card",
137
+ :customer => 'c_test_token',
138
+ :object => "card"
139
+ }.merge(params)
140
+ end
141
+
106
142
  def test_card(params={})
107
143
  {
108
144
  :type => "Visa",
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conekta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.3.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Leo Fischer
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-12-13 00:00:00.000000000 Z
12
+ date: 2013-12-18 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rest-client
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: multi_json
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ! '>='
37
33
  - !ruby/object:Gem::Version
@@ -42,7 +38,6 @@ dependencies:
42
38
  type: :runtime
43
39
  prerelease: false
44
40
  version_requirements: !ruby/object:Gem::Requirement
45
- none: false
46
41
  requirements:
47
42
  - - ! '>='
48
43
  - !ruby/object:Gem::Version
@@ -53,7 +48,6 @@ dependencies:
53
48
  - !ruby/object:Gem::Dependency
54
49
  name: shoulda
55
50
  requirement: !ruby/object:Gem::Requirement
56
- none: false
57
51
  requirements:
58
52
  - - ~>
59
53
  - !ruby/object:Gem::Version
@@ -61,7 +55,6 @@ dependencies:
61
55
  type: :development
62
56
  prerelease: false
63
57
  version_requirements: !ruby/object:Gem::Requirement
64
- none: false
65
58
  requirements:
66
59
  - - ~>
67
60
  - !ruby/object:Gem::Version
@@ -69,7 +62,6 @@ dependencies:
69
62
  - !ruby/object:Gem::Dependency
70
63
  name: rspec
71
64
  requirement: !ruby/object:Gem::Requirement
72
- none: false
73
65
  requirements:
74
66
  - - ! '>='
75
67
  - !ruby/object:Gem::Version
@@ -77,7 +69,6 @@ dependencies:
77
69
  type: :development
78
70
  prerelease: false
79
71
  version_requirements: !ruby/object:Gem::Requirement
80
- none: false
81
72
  requirements:
82
73
  - - ! '>='
83
74
  - !ruby/object:Gem::Version
@@ -85,7 +76,6 @@ dependencies:
85
76
  - !ruby/object:Gem::Dependency
86
77
  name: rake
87
78
  requirement: !ruby/object:Gem::Requirement
88
- none: false
89
79
  requirements:
90
80
  - - ! '>='
91
81
  - !ruby/object:Gem::Version
@@ -93,7 +83,6 @@ dependencies:
93
83
  type: :development
94
84
  prerelease: false
95
85
  version_requirements: !ruby/object:Gem::Requirement
96
- none: false
97
86
  requirements:
98
87
  - - ! '>='
99
88
  - !ruby/object:Gem::Version
@@ -124,12 +113,16 @@ files:
124
113
  - lib/conekta.rb
125
114
  - lib/conekta/account.rb
126
115
  - lib/conekta/api_operations/create.rb
116
+ - lib/conekta/api_operations/create_member.rb
127
117
  - lib/conekta/api_operations/delete.rb
128
118
  - lib/conekta/api_operations/list.rb
119
+ - lib/conekta/api_operations/modify_member.rb
129
120
  - lib/conekta/api_operations/update.rb
130
121
  - lib/conekta/api_resource.rb
122
+ - lib/conekta/card.rb
131
123
  - lib/conekta/charge.rb
132
124
  - lib/conekta/conekta_object.rb
125
+ - lib/conekta/customer.rb
133
126
  - lib/conekta/errors/api_connection_error.rb
134
127
  - lib/conekta/errors/api_error.rb
135
128
  - lib/conekta/errors/authentication_error.rb
@@ -142,7 +135,10 @@ files:
142
135
  - lib/conekta/json.rb
143
136
  - lib/conekta/list_object.rb
144
137
  - lib/conekta/log.rb
138
+ - lib/conekta/plan.rb
145
139
  - lib/conekta/singleton_api_resource.rb
140
+ - lib/conekta/subscription.rb
141
+ - lib/conekta/token.rb
146
142
  - lib/conekta/util.rb
147
143
  - lib/conekta/version.rb
148
144
  - lib/data/ca-certificates.crt
@@ -151,27 +147,26 @@ files:
151
147
  - spec/test_helper.rb
152
148
  homepage: http://conekta.mx/doc
153
149
  licenses: []
150
+ metadata: {}
154
151
  post_install_message:
155
152
  rdoc_options: []
156
153
  require_paths:
157
154
  - lib
158
155
  required_ruby_version: !ruby/object:Gem::Requirement
159
- none: false
160
156
  requirements:
161
157
  - - ! '>='
162
158
  - !ruby/object:Gem::Version
163
159
  version: '0'
164
160
  required_rubygems_version: !ruby/object:Gem::Requirement
165
- none: false
166
161
  requirements:
167
162
  - - ! '>='
168
163
  - !ruby/object:Gem::Version
169
164
  version: '0'
170
165
  requirements: []
171
166
  rubyforge_project:
172
- rubygems_version: 1.8.23
167
+ rubygems_version: 2.1.11
173
168
  signing_key:
174
- specification_version: 3
169
+ specification_version: 4
175
170
  summary: Ruby bindings for the Conekta API
176
171
  test_files: []
177
172
  has_rdoc: