ninjabutton_chargify_api_ares 0.3.1
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.
- data/.gitignore +2 -0
- data/LICENSE.txt +21 -0
- data/README.md +80 -0
- data/Rakefile +14 -0
- data/VERSION +1 -0
- data/chargify_api_ares.gemspec +68 -0
- data/lib/chargify_api_ares.rb +152 -0
- data/samples/customers.rb +51 -0
- data/samples/metered_components.rb +35 -0
- data/samples/products.rb +24 -0
- data/samples/subscriptions.rb +53 -0
- data/spec/base_spec.rb +10 -0
- data/spec/components_spec.rb +49 -0
- data/spec/customer_spec.rb +23 -0
- data/spec/factories.rb +62 -0
- data/spec/mocks/fake_resource.rb +82 -0
- data/spec/product_spec.rb +23 -0
- data/spec/spec_helper.rb +28 -0
- data/spec/subscription_spec.rb +67 -0
- data/spec/subscriptions_component_spec.rb +82 -0
- metadata +93 -0
data/.gitignore
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2009 Grasshopper Group, LLC
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
Chargify API wrapper for Ruby (using ActiveResource)
|
2
|
+
====================================================
|
3
|
+
|
4
|
+
chargify_api_ares
|
5
|
+
-----------------
|
6
|
+
|
7
|
+
This is a Ruby wrapper for the [Chargify](http://chargify.com) API that leverages ActiveResource.
|
8
|
+
It allows you to interface with the Chargify API using simple ActiveRecord-like syntax, i.e.:
|
9
|
+
|
10
|
+
Chargify::Subscription.create(
|
11
|
+
:customer_reference => 'moklett',
|
12
|
+
:product_handle => 'chargify-api-ares-test',
|
13
|
+
:credit_card_attributes => {
|
14
|
+
:first_name => "Michael",
|
15
|
+
:last_name => "Klett",
|
16
|
+
:expiration_month => 1,
|
17
|
+
:expiration_year => 2010,
|
18
|
+
:full_number => "1234-1234-1234-1234"
|
19
|
+
}
|
20
|
+
)
|
21
|
+
|
22
|
+
subscription.credit_card_attributes = {:expiration_year => 2013}
|
23
|
+
subscription.save
|
24
|
+
|
25
|
+
subscription.cancel
|
26
|
+
|
27
|
+
See the `samples` directory for more usage examples.
|
28
|
+
|
29
|
+
|
30
|
+
### Installation
|
31
|
+
|
32
|
+
This library can be installed as a gem. It is hosted on [Gemcutter](http://gemcutter.org).
|
33
|
+
|
34
|
+
If you don't have your system set up to use gemcutter, follow the instructions on their site
|
35
|
+
<http://gemcutter.org>, i.e.:
|
36
|
+
|
37
|
+
$ gem install gemcutter
|
38
|
+
$ gem tumble
|
39
|
+
|
40
|
+
This will install Gemcutter and set your gem sources to search the gemcutter repos.
|
41
|
+
|
42
|
+
Then you can install this library as a gem:
|
43
|
+
|
44
|
+
$ gem install chargify_api_ares
|
45
|
+
|
46
|
+
|
47
|
+
### Requirements
|
48
|
+
|
49
|
+
This library requires ActiveResource version 2.3.4 or 2.3.5.
|
50
|
+
|
51
|
+
$ gem install activeresource
|
52
|
+
|
53
|
+
|
54
|
+
### Usage
|
55
|
+
|
56
|
+
Simply require this library before you use it:
|
57
|
+
|
58
|
+
require 'chargify_api_ares'
|
59
|
+
|
60
|
+
|
61
|
+
If you're using Rails, you could include this gem in your configuration, i.e. in `environment.rb`
|
62
|
+
|
63
|
+
config.gem 'chargify_api_ares'
|
64
|
+
|
65
|
+
|
66
|
+
Now you'll have access to classes the interact with the Chargify API, such as:
|
67
|
+
|
68
|
+
`Chargify::Product`
|
69
|
+
`Chargify::Customer`
|
70
|
+
`Chargifiy::Subscription`
|
71
|
+
|
72
|
+
Check out the examples in the `samples` directory. If you're not familiar with how ActiveResource works,
|
73
|
+
you may be interested in some [ActiveResource Documentation](http://apidock.com/rails/ActiveResource/Base)
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
### Contributors
|
78
|
+
|
79
|
+
* Michael Klett (Grasshopper Labs and Chargify)
|
80
|
+
* The Lab Rats @ Phase Two Labs
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gemspec|
|
4
|
+
gemspec.name = "chargify_api_ares"
|
5
|
+
gemspec.summary = "A Chargify API wrapper for Ruby using ActiveResource"
|
6
|
+
gemspec.description = ""
|
7
|
+
gemspec.email = "mklett@grasshopper.com"
|
8
|
+
gemspec.homepage = "http://github.com/grasshopperlabs/chargify_api_ares"
|
9
|
+
gemspec.authors = ["Michael Klett", "The Lab Rats @ Phase Two Labs", "Brian Rose","Nathan Verni"]
|
10
|
+
Jeweler::GemcutterTasks.new
|
11
|
+
end
|
12
|
+
rescue LoadError
|
13
|
+
puts "Jeweler not available. Install it with: sudo gem install jeweler"
|
14
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.3.1
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ninjabutton_chargify_api_ares}
|
8
|
+
s.version = "0.3.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Michael Klett", "The Lab Rats @ Phase Two Labs", "Brian Rose", "Nathan Verni"]
|
12
|
+
s.date = %q{2010-04-16}
|
13
|
+
s.description = %q{}
|
14
|
+
s.email = %q{mklett@grasshopper.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".gitignore",
|
21
|
+
"LICENSE.txt",
|
22
|
+
"README.md",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"chargify_api_ares.gemspec",
|
26
|
+
"lib/chargify_api_ares.rb",
|
27
|
+
"samples/customers.rb",
|
28
|
+
"samples/metered_components.rb",
|
29
|
+
"samples/products.rb",
|
30
|
+
"samples/subscriptions.rb",
|
31
|
+
"spec/base_spec.rb",
|
32
|
+
"spec/components_spec.rb",
|
33
|
+
"spec/customer_spec.rb",
|
34
|
+
"spec/factories.rb",
|
35
|
+
"spec/mocks/fake_resource.rb",
|
36
|
+
"spec/product_spec.rb",
|
37
|
+
"spec/spec_helper.rb",
|
38
|
+
"spec/subscription_spec.rb",
|
39
|
+
"spec/subscriptions_component_spec.rb"
|
40
|
+
]
|
41
|
+
s.homepage = %q{http://github.com/grasshopperlabs/chargify_api_ares}
|
42
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
43
|
+
s.require_paths = ["lib"]
|
44
|
+
s.rubygems_version = %q{1.3.6}
|
45
|
+
s.summary = %q{A Chargify API wrapper for Ruby using ActiveResource}
|
46
|
+
s.test_files = [
|
47
|
+
"spec/base_spec.rb",
|
48
|
+
"spec/components_spec.rb",
|
49
|
+
"spec/customer_spec.rb",
|
50
|
+
"spec/factories.rb",
|
51
|
+
"spec/mocks/fake_resource.rb",
|
52
|
+
"spec/product_spec.rb",
|
53
|
+
"spec/spec_helper.rb",
|
54
|
+
"spec/subscription_spec.rb",
|
55
|
+
"spec/subscriptions_component_spec.rb"
|
56
|
+
]
|
57
|
+
|
58
|
+
if s.respond_to? :specification_version then
|
59
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
60
|
+
s.specification_version = 3
|
61
|
+
|
62
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
63
|
+
else
|
64
|
+
end
|
65
|
+
else
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# Chargify API Wrapper using ActiveResource.
|
2
|
+
#
|
3
|
+
begin
|
4
|
+
require 'active_resource'
|
5
|
+
rescue LoadError
|
6
|
+
begin
|
7
|
+
require 'rubygems'
|
8
|
+
require 'active_resource'
|
9
|
+
rescue LoadError
|
10
|
+
abort <<-ERROR
|
11
|
+
The 'activeresource' library could not be loaded. If you have RubyGems
|
12
|
+
installed you can install ActiveResource by doing "gem install activeresource".
|
13
|
+
ERROR
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
# Version check
|
19
|
+
module Chargify
|
20
|
+
ARES_VERSIONS = ['2.3.4', '2.3.5', '2.3.8']
|
21
|
+
end
|
22
|
+
require 'active_resource/version'
|
23
|
+
unless Chargify::ARES_VERSIONS.include?(ActiveResource::VERSION::STRING)
|
24
|
+
abort <<-ERROR
|
25
|
+
ActiveResource version #{Chargify::ARES_VERSIONS.join(' or ')} is required.
|
26
|
+
ERROR
|
27
|
+
end
|
28
|
+
|
29
|
+
# Patch ActiveResource version 2.3.4
|
30
|
+
if ActiveResource::VERSION::STRING == '2.3.4'
|
31
|
+
module ActiveResource
|
32
|
+
class Base
|
33
|
+
def save
|
34
|
+
save_without_validation
|
35
|
+
true
|
36
|
+
rescue ResourceInvalid => error
|
37
|
+
case error.response['Content-Type']
|
38
|
+
when /application\/xml/
|
39
|
+
errors.from_xml(error.response.body)
|
40
|
+
when /application\/json/
|
41
|
+
errors.from_json(error.response.body)
|
42
|
+
end
|
43
|
+
false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
module Chargify
|
51
|
+
|
52
|
+
class << self
|
53
|
+
attr_accessor :subdomain, :api_key, :site, :format
|
54
|
+
|
55
|
+
def configure
|
56
|
+
yield self
|
57
|
+
|
58
|
+
Base.user = api_key
|
59
|
+
Base.password = 'X'
|
60
|
+
|
61
|
+
if site.blank?
|
62
|
+
Base.site = "https://#{subdomain}.chargify.com"
|
63
|
+
Subscription::Component.site = "https://#{subdomain}.chargify.com/subscriptions/:subscription_id"
|
64
|
+
else
|
65
|
+
Base.site = site
|
66
|
+
Subscription::Component.site = site + "/subscriptions/:subscription_id"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Base < ActiveResource::Base
|
72
|
+
class << self
|
73
|
+
def element_name
|
74
|
+
name.split(/::/).last.underscore
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_xml(options = {})
|
79
|
+
options.merge!(:dasherize => false)
|
80
|
+
super
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class Customer < Base
|
85
|
+
def self.find_by_reference(reference)
|
86
|
+
Customer.new get(:lookup, :reference => reference)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class Subscription < Base
|
91
|
+
def self.find_by_customer_reference(reference)
|
92
|
+
customer = Customer.find_by_reference(reference)
|
93
|
+
find(:first, :params => {:customer_id => customer.id})
|
94
|
+
end
|
95
|
+
|
96
|
+
# Strip off nested attributes of associations before saving, or type-mismatch errors will occur
|
97
|
+
def save
|
98
|
+
self.attributes.delete('customer')
|
99
|
+
self.attributes.delete('product')
|
100
|
+
self.attributes.delete('credit_card')
|
101
|
+
super
|
102
|
+
end
|
103
|
+
|
104
|
+
def cancel
|
105
|
+
destroy
|
106
|
+
end
|
107
|
+
|
108
|
+
def component(id)
|
109
|
+
Component.find(id, :params => {:subscription_id => self.id})
|
110
|
+
end
|
111
|
+
|
112
|
+
def components(params = {})
|
113
|
+
params.merge!({:subscription_id => self.id})
|
114
|
+
Component.find(:all, :params => params)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Perform a one-time charge on an existing subscription.
|
118
|
+
# For more information, please see the one-time charge API docs available
|
119
|
+
# at: http://support.chargify.com/faqs/api/api-charges
|
120
|
+
def charge(attrs = {})
|
121
|
+
post :charges, :charge => attrs
|
122
|
+
end
|
123
|
+
|
124
|
+
class Component < Base
|
125
|
+
# All Subscription Components are considered already existing records, but the id isn't used
|
126
|
+
def id
|
127
|
+
self.component_id
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
class Product < Base
|
133
|
+
def self.find_by_handle(handle)
|
134
|
+
Product.new get(:lookup, :handle => handle)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
class ProductFamily < Base
|
139
|
+
end
|
140
|
+
|
141
|
+
class Usage < Base
|
142
|
+
def subscription_id=(i)
|
143
|
+
self.prefix_options[:subscription_id] = i
|
144
|
+
end
|
145
|
+
def component_id=(i)
|
146
|
+
self.prefix_options[:component_id] = i
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class Component < Base
|
151
|
+
end
|
152
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
|
3
|
+
require 'chargify_api_ares'
|
4
|
+
|
5
|
+
# You could load your credentials from a file...
|
6
|
+
chargify_config = YAML::load_file(File.join(File.dirname(__FILE__), '..', 'config', 'chargify.yml'))
|
7
|
+
|
8
|
+
Chargify.configure do |c|
|
9
|
+
c.subdomain = chargify_config['subdomain']
|
10
|
+
c.api_key = chargify_config['api_key']
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Retrieve a list of all your customers
|
15
|
+
Chargify::Customer.find(:all)
|
16
|
+
# => [#<Chargify::Customer:0x102d0cef8 @prefix_options={}, @attributes={"reference"=>"moklett", "updated_at"=>Mon Nov 16 23:19:25 UTC 2009, "id"=>325, "first_name"=>"Michael", "organization"=>"Chargify", "last_name"=>"Klett", "email"=>"moklett@example.com", "created_at"=>Mon Nov 16 23:19:25 UTC 2009}>]
|
17
|
+
|
18
|
+
|
19
|
+
customer = Chargify::Customer.find(325)
|
20
|
+
|
21
|
+
customer.first_name
|
22
|
+
# => Michael
|
23
|
+
|
24
|
+
customer.last_name
|
25
|
+
# => Klett
|
26
|
+
|
27
|
+
# Update a customer - success!
|
28
|
+
customer.first_name = "Miguel"
|
29
|
+
customer.save
|
30
|
+
# => true
|
31
|
+
|
32
|
+
customer.first_name
|
33
|
+
# => Miguel
|
34
|
+
|
35
|
+
# Update a customer - fail!
|
36
|
+
customer.first_name = ""
|
37
|
+
customer.save
|
38
|
+
# => false
|
39
|
+
|
40
|
+
customer.errors.full_messages.inspect
|
41
|
+
# => ["First name: cannot be blank."]
|
42
|
+
|
43
|
+
|
44
|
+
# Create a new customer - success!
|
45
|
+
Chargify::Customer.create(
|
46
|
+
:first_name => "Charlie",
|
47
|
+
:last_name => "Bull",
|
48
|
+
:email => "charlie@example.com",
|
49
|
+
:organization => "Chargify"
|
50
|
+
)
|
51
|
+
# => #<Chargify::Customer:0x102c27970 @prefix_options={}, @attributes={"reference"=>nil, "updated_at"=>Mon Nov 16 23:43:33 UTC 2009, "id"=>327, "organization"=>"Chargify", "first_name"=>"Charlie", "last_name"=>"Bull", "created_at"=>Mon Nov 16 23:43:33 UTC 2009, "email"=>"charlie@example.com"}>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
|
3
|
+
require 'chargify_api_ares'
|
4
|
+
|
5
|
+
# You could load your credentials from a file...
|
6
|
+
chargify_config = YAML::load_file(File.join(File.dirname(__FILE__), '..', 'config', 'chargify.yml'))
|
7
|
+
|
8
|
+
Chargify.configure do |c|
|
9
|
+
c.subdomain = chargify_config['subdomain']
|
10
|
+
c.api_key = chargify_config['api_key']
|
11
|
+
if chargify_config['site']
|
12
|
+
c.site = chargify_config['site']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# This assumes you have a product family with a metered component setup
|
18
|
+
#
|
19
|
+
product_family = Chargify::ProductFamily.find(:first)
|
20
|
+
component = Chargify::Component.find(:first, :params => {:product_family_id => product_family.id})
|
21
|
+
subscription = Chargify::Subscription.find(:first)
|
22
|
+
|
23
|
+
|
24
|
+
u = Chargify::Usage.new
|
25
|
+
u.subscription_id = subscription.id
|
26
|
+
u.component_id = component.id
|
27
|
+
u.quantity = 5
|
28
|
+
d = DateTime.now.to_s
|
29
|
+
u.memo = d
|
30
|
+
puts d
|
31
|
+
u.save
|
32
|
+
|
33
|
+
|
34
|
+
x = Chargify::Usage.find(:last, :params => {:subscription_id => subscription.id, :component_id => component.id})
|
35
|
+
puts x.memo == d
|
data/samples/products.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
|
3
|
+
require 'chargify_api_ares'
|
4
|
+
|
5
|
+
# You could load your credentials from a file...
|
6
|
+
chargify_config = YAML::load_file(File.join(File.dirname(__FILE__), '..', 'config', 'chargify.yml'))
|
7
|
+
|
8
|
+
Chargify.configure do |c|
|
9
|
+
c.subdomain = chargify_config['subdomain']
|
10
|
+
c.api_key = chargify_config['api_key']
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Retrieve a list of all your products
|
15
|
+
products = Chargify::Product.find(:all)
|
16
|
+
# => [#<Chargify::Product:0x102cdcac8 @prefix_options={}, @attributes={"name"=>"Chargify API Ares Test", "price_in_cents"=>0, "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x102cdbad8 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>78, "accounting_code"=>nil}>, "id"=>152, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>]
|
17
|
+
|
18
|
+
# Find a single product by id
|
19
|
+
product = Chargify::Product.find(products.first.id)
|
20
|
+
# => #<Chargify::Product:0x102ce7540 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x102ce6ca8 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>78, "accounting_code"=>nil}>, "id"=>152, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>
|
21
|
+
|
22
|
+
# Find a single product by its handle
|
23
|
+
product = Chargify::Product.find_by_handle(products.first.handle)
|
24
|
+
# => #<Chargify::Product:0x102c7a828 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x102c798b0 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>78, "accounting_code"=>nil}>, "id"=>152, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
$: << File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
|
3
|
+
require 'chargify_api_ares'
|
4
|
+
|
5
|
+
# You could load your credentials from a file...
|
6
|
+
chargify_config = YAML::load_file(File.join(File.dirname(__FILE__), '..', 'config', 'chargify.yml'))
|
7
|
+
|
8
|
+
Chargify.configure do |c|
|
9
|
+
c.subdomain = chargify_config['subdomain']
|
10
|
+
c.api_key = chargify_config['api_key']
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
# Retrieve a list of all your customers
|
15
|
+
subscription = Chargify::Subscription.find(:all)
|
16
|
+
# => [#<Chargify::Subscription:0x1020fff70 @prefix_options={}, @attributes={"cancellation_message"=>nil, "activated_at"=>Tue Nov 17 15:51:42 UTC 2009, "expires_at"=>nil, "updated_at"=>Tue Nov 17 15:51:41 UTC 2009, "credit_card"=>#<Chargify::Subscription::CreditCard:0x1020f24d8 @prefix_options={}, @attributes={"card_type"=>"bogus", "expiration_year"=>2015, "masked_card_number"=>"XXXX-XXXX-XXXX-2", "first_name"=>"Michael", "expiration_month"=>1, "last_name"=>"Klett"}>, "product"=>#<Chargify::Product:0x1020f5a70 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x1020f48f0 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>79, "accounting_code"=>nil}>, "id"=>153, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>, "trial_ended_at"=>nil, "id"=>328, "current_period_ends_at"=>Thu Dec 17 15:51:41 UTC 2009, "trial_started_at"=>nil, "customer"=>#<Chargify::Customer:0x1020f6d80 @prefix_options={}, @attributes={"reference"=>"moklett", "updated_at"=>Tue Nov 17 15:51:02 UTC 2009, "id"=>331, "first_name"=>"Michael", "organization"=>"Chargify", "last_name"=>"Klett", "email"=>"moklett@example.com", "created_at"=>Tue Nov 17 15:51:02 UTC 2009}>, "balance_in_cents"=>0, "current_period_started_at"=>Tue Nov 17 15:51:41 UTC 2009, "state"=>"canceled", "created_at"=>Tue Nov 17 15:51:41 UTC 2009}>]]
|
17
|
+
|
18
|
+
|
19
|
+
# Create a subscription from a customer reference
|
20
|
+
subscription = Chargify::Subscription.create(
|
21
|
+
:customer_reference => 'moklett',
|
22
|
+
:product_handle => 'chargify-api-ares-test',
|
23
|
+
:credit_card_attributes => {
|
24
|
+
:first_name => "Michael",
|
25
|
+
:last_name => "Klett",
|
26
|
+
:expiration_month => 1,
|
27
|
+
:expiration_year => 2020,
|
28
|
+
:full_number => "1"
|
29
|
+
}
|
30
|
+
)
|
31
|
+
# => #<Chargify::Subscription:0x1020ed4b0 @prefix_options={}, @attributes={"cancellation_message"=>nil, "activated_at"=>Tue Nov 17 16:00:17 UTC 2009, "expires_at"=>nil, "updated_at"=>Tue Nov 17 16:00:17 UTC 2009, "credit_card"=>#<Chargify::Subscription::CreditCard:0x102046b10 @prefix_options={}, @attributes={"card_type"=>"bogus", "expiration_year"=>2020, "masked_card_number"=>"XXXX-XXXX-XXXX-1", "first_name"=>"Michael", "expiration_month"=>1, "last_name"=>"Klett"}>, "product"=>#<Chargify::Product:0x10204a2d8 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x1020490b8 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>79, "accounting_code"=>nil}>, "id"=>153, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>, "credit_card_attributes"=>#<Chargify::Subscription::CreditCardAttributes:0x1020ecab0 @prefix_options={}, @attributes={"expiration_year"=>2020, "full_number"=>"1", "first_name"=>"Michael", "expiration_month"=>1, "last_name"=>"Klett"}>, "trial_ended_at"=>nil, "id"=>331, "current_period_ends_at"=>Thu Dec 17 16:00:17 UTC 2009, "product_handle"=>"chargify-api-ares-test", "trial_started_at"=>nil, "customer"=>#<Chargify::Customer:0x10204b688 @prefix_options={}, @attributes={"reference"=>"moklett", "updated_at"=>Tue Nov 17 15:51:02 UTC 2009, "id"=>331, "first_name"=>"Michael", "organization"=>"Chargify", "last_name"=>"Klett", "email"=>"moklett@example.com", "created_at"=>Tue Nov 17 15:51:02 UTC 2009}>, "balance_in_cents"=>0, "current_period_started_at"=>Tue Nov 17 16:00:17 UTC 2009, "state"=>"active", "created_at"=>Tue Nov 17 16:00:17 UTC 2009, "customer_reference"=>"moklett"}>
|
32
|
+
|
33
|
+
|
34
|
+
# Lookup up existing Subscription using the Customer's reference
|
35
|
+
Subscription.find_by_customer_reference('moklett')
|
36
|
+
# => #<Chargify::Subscription:0x1020ed4b0 @prefix_options={}, @attributes={"cancellation_message"=>nil, "activated_at"=>Tue Nov 17 16:00:17 UTC 2009, "expires_at"=>nil, "updated_at"=>Tue Nov 17 16:00:17 UTC 2009, "credit_card"=>#<Chargify::Subscription::CreditCard:0x102046b10 @prefix_options={}, @attributes={"card_type"=>"bogus", "expiration_year"=>2020, "masked_card_number"=>"XXXX-XXXX-XXXX-1", "first_name"=>"Michael", "expiration_month"=>1, "last_name"=>"Klett"}>, "product"=>#<Chargify::Product:0x10204a2d8 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x1020490b8 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>79, "accounting_code"=>nil}>, "id"=>153, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>, "trial_ended_at"=>nil, "id"=>331, "current_period_ends_at"=>Thu Dec 17 16:00:17 UTC 2009, "product_handle"=>"chargify-api-ares-test", "trial_started_at"=>nil, "customer"=>#<Chargify::Customer:0x10204b688 @prefix_options={}, @attributes={"reference"=>"moklett", "updated_at"=>Tue Nov 17 15:51:02 UTC 2009, "id"=>331, "first_name"=>"Michael", "organization"=>"Chargify", "last_name"=>"Klett", "email"=>"moklett@example.com", "created_at"=>Tue Nov 17 15:51:02 UTC 2009}>, "balance_in_cents"=>0, "current_period_started_at"=>Tue Nov 17 16:00:17 UTC 2009, "state"=>"active", "created_at"=>Tue Nov 17 16:00:17 UTC 2009, "customer_reference"=>"moklett"}>
|
37
|
+
|
38
|
+
|
39
|
+
# Update credit card information
|
40
|
+
subscription.credit_card_attributes = {:full_number => "2", :expiration_year => "2015"}
|
41
|
+
subscription.save
|
42
|
+
# => #<Chargify::Subscription:0x1020ed4b0 @prefix_options={}, @attributes={"cancellation_message"=>nil, "activated_at"=>Tue Nov 17 16:00:17 UTC 2009, "expires_at"=>nil, "updated_at"=>Tue Nov 17 16:00:17 UTC 2009, "credit_card"=>#<Chargify::Subscription::CreditCard:0x1023ba878 @prefix_options={}, @attributes={"card_type"=>"bogus", "expiration_year"=>2015, "masked_card_number"=>"XXXX-XXXX-XXXX-2", "first_name"=>"Michael", "expiration_month"=>1, "last_name"=>"Klett"}>, "product"=>#<Chargify::Product:0x1023baa80 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x1023c04d0 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>79, "accounting_code"=>nil}>, "id"=>153, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>, "credit_card_attributes"=>{:full_number=>"2", :expiration_year=>"2015"}, "trial_ended_at"=>nil, "id"=>331, "current_period_ends_at"=>Thu Dec 17 16:00:17 UTC 2009, "product_handle"=>"chargify-api-ares-test", "customer"=>#<Chargify::Customer:0x1023bae40 @prefix_options={}, @attributes={"reference"=>"moklett", "updated_at"=>Tue Nov 17 15:51:02 UTC 2009, "id"=>331, "first_name"=>"Michael", "organization"=>"Chargify", "last_name"=>"Klett", "email"=>"moklett@example.com", "created_at"=>Tue Nov 17 15:51:02 UTC 2009}>, "trial_started_at"=>nil, "balance_in_cents"=>0, "current_period_started_at"=>Tue Nov 17 16:00:17 UTC 2009, "state"=>"active", "created_at"=>Tue Nov 17 16:00:17 UTC 2009, "customer_reference"=>"moklett"}>
|
43
|
+
|
44
|
+
|
45
|
+
# Perform a one-time charge against an existing subscription
|
46
|
+
subscription.charge(:amount => 10.00, :memo => 'Extra service')
|
47
|
+
# => #<Net::HTTPCreated>
|
48
|
+
|
49
|
+
|
50
|
+
# Cancel a subscription
|
51
|
+
subscription.cancel
|
52
|
+
subscription.reload
|
53
|
+
# => #<Chargify::Subscription:0x1020ed4b0 @prefix_options={}, @attributes={"cancellation_message"=>nil, "activated_at"=>Tue Nov 17 16:00:17 UTC 2009, "expires_at"=>nil, "updated_at"=>Tue Nov 17 16:00:17 UTC 2009, "credit_card"=>#<Chargify::Subscription::CreditCard:0x10234f168 @prefix_options={}, @attributes={"card_type"=>"bogus", "expiration_year"=>2015, "masked_card_number"=>"XXXX-XXXX-XXXX-2", "first_name"=>"Michael", "expiration_month"=>1, "last_name"=>"Klett"}>, "product"=>#<Chargify::Product:0x10234f370 @prefix_options={}, @attributes={"price_in_cents"=>0, "name"=>"Chargify API Ares Test", "handle"=>"chargify-api-ares-test", "product_family"=>#<Chargify::Product::ProductFamily:0x102354708 @prefix_options={}, @attributes={"name"=>"Chargify API ARes Test", "handle"=>"chargify-api-ares-test", "id"=>79, "accounting_code"=>nil}>, "id"=>153, "accounting_code"=>nil, "interval_unit"=>"month", "interval"=>1}>, "credit_card_attributes"=>{:full_number=>"2", :expiration_year=>"2015"}, "trial_ended_at"=>nil, "id"=>331, "current_period_ends_at"=>Thu Dec 17 16:00:17 UTC 2009, "product_handle"=>"chargify-api-ares-test", "customer"=>#<Chargify::Customer:0x10234f730 @prefix_options={}, @attributes={"reference"=>"moklett", "updated_at"=>Tue Nov 17 15:51:02 UTC 2009, "id"=>331, "first_name"=>"Michael", "organization"=>"Chargify", "last_name"=>"Klett", "email"=>"moklett@example.com", "created_at"=>Tue Nov 17 15:51:02 UTC 2009}>, "trial_started_at"=>nil, "balance_in_cents"=>0, "current_period_started_at"=>Tue Nov 17 16:00:17 UTC 2009, "state"=>"canceled", "created_at"=>Tue Nov 17 16:00:17 UTC 2009, "customer_reference"=>"moklett"}>
|
data/spec/base_spec.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Chargify::Base do
|
4
|
+
|
5
|
+
it 'parses element names' do
|
6
|
+
Chargify::Base.stub!(:name).and_return("Test::Namespace::ElementName")
|
7
|
+
Chargify::Base.element_name.should eql('element_name')
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Chargify::Component do
|
4
|
+
describe "Recording usage" do
|
5
|
+
before do
|
6
|
+
@subscription = Factory(:subscription)
|
7
|
+
@component = Factory(:component)
|
8
|
+
@now = DateTime.now.to_s
|
9
|
+
puts test_domain
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should create a usage record" do
|
13
|
+
u = Chargify::Usage.new
|
14
|
+
u.subscription_id = @subscription.id
|
15
|
+
u.component_id = @component.id
|
16
|
+
u.quantity = 5
|
17
|
+
u.memo = @now
|
18
|
+
u.save
|
19
|
+
|
20
|
+
component = Chargify::Usage.find(:last, :params => {:subscription_id => @subscription.id, :component_id => @component.id})
|
21
|
+
component.memo.should == @now
|
22
|
+
component.quantity.should == 5
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "Listing usages" do
|
27
|
+
before do
|
28
|
+
@subscription = Factory(:subscription)
|
29
|
+
@component = Factory(:component)
|
30
|
+
@now = DateTime.now.to_s
|
31
|
+
create_usage
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return all usages for a component and subscription" do
|
35
|
+
component = Chargify::Usage.find(:last, :params => {:subscription_id => @subscription.id, :component_id => @component.id})
|
36
|
+
component.quantity.should == 5
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_usage
|
41
|
+
u = Chargify::Usage.new
|
42
|
+
u.subscription_id = @subscription.id
|
43
|
+
u.component_id = @component.id
|
44
|
+
u.quantity = 5
|
45
|
+
u.memo = @now
|
46
|
+
u.save
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Chargify::Customer do
|
4
|
+
|
5
|
+
context 'find by reference' do
|
6
|
+
before do
|
7
|
+
@reference = 'ref0123'
|
8
|
+
@existing_customer = Factory(:customer, :reference => @reference, :id => Factory.next(:customer_id))
|
9
|
+
FakeWeb.register_uri(:get, "#{test_domain}/customers/lookup.xml?reference=#{@existing_customer.reference}", :body => @existing_customer.attributes.to_xml)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'finds the correct customer by reference' do
|
13
|
+
customer = Chargify::Customer.find_by_reference(@reference)
|
14
|
+
customer.should eql(@existing_customer)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'is an instance of Chargify::Customer' do
|
18
|
+
customer = Chargify::Customer.find_by_reference(@reference)
|
19
|
+
customer.should be_instance_of(Chargify::Customer)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/spec/factories.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
Factory.sequence :email do |n|
|
2
|
+
"customer#{n}@example.com"
|
3
|
+
end
|
4
|
+
|
5
|
+
Factory.sequence :customer_id do |n|
|
6
|
+
n
|
7
|
+
end
|
8
|
+
|
9
|
+
Factory.define :customer, :class => Chargify::Customer do |c|
|
10
|
+
c.first_name { Faker::Name.first_name }
|
11
|
+
c.last_name { Faker::Name.last_name }
|
12
|
+
c.email { Factory.next(:email) }
|
13
|
+
c.organization { Faker::Company.name }
|
14
|
+
c.created_at { 2.days.ago }
|
15
|
+
c.updated_at { 1.hour.ago }
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
Factory.sequence :product_id do |n|
|
20
|
+
n
|
21
|
+
end
|
22
|
+
|
23
|
+
Factory.sequence :product_name do |n|
|
24
|
+
"Product #{n}"
|
25
|
+
end
|
26
|
+
|
27
|
+
Factory.define :product, :class => Chargify::Product do |p|
|
28
|
+
p.name { Factory.next(:product_name) }
|
29
|
+
end
|
30
|
+
|
31
|
+
Factory.sequence :subscription_id do |n|
|
32
|
+
n
|
33
|
+
end
|
34
|
+
|
35
|
+
Factory.define :subscription, :class => Chargify::Subscription do |s|
|
36
|
+
s.balance_in_cents 500
|
37
|
+
s.current_period_ends_at 3.days.from_now
|
38
|
+
end
|
39
|
+
|
40
|
+
Factory.define :subscription_with_extra_attrs, :parent => :subscription do |swea|
|
41
|
+
swea.customer Chargify::Customer.new
|
42
|
+
swea.product Chargify::Product.new
|
43
|
+
swea.credit_card "CREDIT CARD"
|
44
|
+
end
|
45
|
+
|
46
|
+
Factory.define :component, :class => Chargify::Component do |f|
|
47
|
+
f.name { Faker::Company.bs }
|
48
|
+
f.unit_name 'unit'
|
49
|
+
end
|
50
|
+
|
51
|
+
Factory.define :quantity_based_component, :class => Chargify::Component do |f|
|
52
|
+
f.name { Faker::Company.bs }
|
53
|
+
f.unit_name 'unit'
|
54
|
+
f.pricing_scheme 'tiered'
|
55
|
+
f.component_type 'quantity_based_component'
|
56
|
+
end
|
57
|
+
|
58
|
+
Factory.define :subscriptions_component, :class => Chargify::Subscription::Component do |f|
|
59
|
+
f.name { Faker::Company.bs }
|
60
|
+
f.unit_name 'unit'
|
61
|
+
f.component_type 'quantity_based_component'
|
62
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Taken from https://gist.github.com/238158/487a411c392e1fb2a0c00347e32444320f5cdd49
|
2
|
+
require 'FakeWeb'
|
3
|
+
|
4
|
+
module ActiveResource
|
5
|
+
|
6
|
+
#
|
7
|
+
# The FakeResource fakes ActiveResources so that no real resources are transferred. It catches the creation methods
|
8
|
+
# and stores the resources internally instead of sending to a remote service and responds these resources back on
|
9
|
+
# request.
|
10
|
+
#
|
11
|
+
# Additionally it adds a save! method and can be used in conjunction with Cucumber/Pickle/FactoryGirl to fully
|
12
|
+
# fake a back end service in the BDD cycle
|
13
|
+
#
|
14
|
+
module FakeResource
|
15
|
+
|
16
|
+
@@fake_resources = []
|
17
|
+
|
18
|
+
def self.clean
|
19
|
+
FakeWeb.clean_registry
|
20
|
+
@@fake_resources = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.included(base)
|
24
|
+
base.class_eval do
|
25
|
+
|
26
|
+
def save
|
27
|
+
@@fake_resources << self
|
28
|
+
update_fake_responses
|
29
|
+
end
|
30
|
+
|
31
|
+
def destroy
|
32
|
+
@@fake_resources.delete(self)
|
33
|
+
update_fake_responses
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.delete(id, options = {})
|
37
|
+
puts "delete"
|
38
|
+
@@fake_resources.delete_if {|r| r.id == id }
|
39
|
+
#update_fake_responses
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.exists?(id, options = {})
|
43
|
+
not @@fake_resources.select {|r| r.id == id}.blank?
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def save!
|
50
|
+
save
|
51
|
+
end
|
52
|
+
|
53
|
+
def save
|
54
|
+
super
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def update_fake_responses
|
60
|
+
FakeWeb.clean_registry
|
61
|
+
|
62
|
+
@@fake_resources.each do |r|
|
63
|
+
FakeWeb.register_uri(:get, element_uri, :body => r.to_xml)
|
64
|
+
end
|
65
|
+
|
66
|
+
FakeWeb.register_uri(:get, collection_uri, :body => @@fake_resources.to_xml)
|
67
|
+
end
|
68
|
+
|
69
|
+
def element_uri
|
70
|
+
"#{base_uri}#{element_path}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def collection_uri
|
74
|
+
"#{base_uri}#{collection_path}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def base_uri
|
78
|
+
"#{connection.site.scheme}://#{connection.user}:#{connection.password}@#{connection.site.host}:#{connection.site.port}"
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Chargify::Product do
|
4
|
+
|
5
|
+
context 'find by handle' do
|
6
|
+
before do
|
7
|
+
@handle = 'handle1'
|
8
|
+
@existing_product = Factory(:product, :handle => @handle, :id => Factory.next(:product_id))
|
9
|
+
FakeWeb.register_uri(:get, "#{test_domain}/products/lookup.xml?handle=#{@existing_product.handle}", :body => @existing_product.attributes.to_xml)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'finds the correct product by handle' do
|
13
|
+
product = Chargify::Product.find_by_handle(@handle)
|
14
|
+
product.should eql(@existing_product)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'is an instance of Chargify::Product' do
|
18
|
+
product = Chargify::Product.find_by_handle(@handle)
|
19
|
+
product.should be_instance_of(Chargify::Product)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
5
|
+
|
6
|
+
require 'chargify_api_ares'
|
7
|
+
|
8
|
+
require 'fakeweb'
|
9
|
+
require 'mocks/fake_resource'
|
10
|
+
ActiveResource::Base.send :include, ActiveResource::FakeResource
|
11
|
+
FakeWeb.allow_net_connect = false
|
12
|
+
require 'factory_girl'
|
13
|
+
require 'faker'
|
14
|
+
|
15
|
+
Chargify.configure do |c|
|
16
|
+
c.subdomain = 'test'
|
17
|
+
c.api_key = 'test'
|
18
|
+
end
|
19
|
+
|
20
|
+
Spec::Runner.configure do |config|
|
21
|
+
config.after(:each) do
|
22
|
+
ActiveResource::FakeResource.clean
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_domain
|
27
|
+
"#{Chargify::Base.connection.site.scheme}://#{Chargify::Base.connection.user}:#{Chargify::Base.connection.password}@#{Chargify::Base.connection.site.host}:#{Chargify::Base.connection.site.port}"
|
28
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Chargify::Subscription do
|
4
|
+
|
5
|
+
context 'strips nested association attributes before saving' do
|
6
|
+
before do
|
7
|
+
@subscription = Factory.build(:subscription_with_extra_attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'strips customer' do
|
11
|
+
@subscription.attributes['customer'].should_not be_blank
|
12
|
+
@subscription.save!
|
13
|
+
@subscription.attributes['customer'].should be_blank
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'strips product' do
|
17
|
+
@subscription.attributes['product'].should_not be_blank
|
18
|
+
@subscription.save!
|
19
|
+
@subscription.attributes['product'].should be_blank
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'strips credit card' do
|
23
|
+
@subscription.attributes['credit_card'].should_not be_blank
|
24
|
+
@subscription.save!
|
25
|
+
@subscription.attributes['credit_card'].should be_blank
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'doesn\'t strip other attrs' do
|
29
|
+
subscription = Factory.build(:subscription)
|
30
|
+
|
31
|
+
lambda { subscription.save! }.should_not change(subscription, :attributes)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'creates a one-time charge' do
|
36
|
+
id = Factory.next(:subscription_id)
|
37
|
+
subscription = Factory(:subscription, :id => id)
|
38
|
+
expected_response = {:charge => {:amount_in_cents => 1000, :memo => "one-time charge", :success => true}}.to_xml
|
39
|
+
FakeWeb.register_uri(:post, "#{test_domain}/subscriptions/#{id}/charges.xml?charge%5Bamount%5D=10.00&charge%5Bmemo%5D=one-time+charge", :status => 201, :body => expected_response)
|
40
|
+
|
41
|
+
response = subscription.charge(:amount => "10.00", "memo" => "one-time charge")
|
42
|
+
|
43
|
+
response.body.should == expected_response
|
44
|
+
response.should be_a(Net::HTTPCreated)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'finds by customer reference' do
|
48
|
+
customer = Factory(:customer, :reference => 'roger', :id => 10)
|
49
|
+
subscription = Factory(:subscription, :id => 11, :customer_id => customer.id, :product => Factory(:product))
|
50
|
+
|
51
|
+
expected_response = [subscription.attributes].to_xml(:root => 'subscriptions')
|
52
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions.xml?customer_id=#{customer.id}", :status => 200, :body => expected_response)
|
53
|
+
|
54
|
+
Chargify::Customer.stub!(:find_by_reference).with('roger').and_return(customer)
|
55
|
+
Chargify::Subscription.find_by_customer_reference('roger').should eql(subscription)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'cancels the subscription' do
|
59
|
+
@subscription = Factory(:subscription, :id => 1)
|
60
|
+
find_subscription = lambda { Chargify::Subscription.find(1) }
|
61
|
+
|
62
|
+
find_subscription.should_not raise_error
|
63
|
+
@subscription.cancel
|
64
|
+
find_subscription.should raise_error
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Chargify::Subscription::Component do
|
4
|
+
before(:each) do
|
5
|
+
@subscription = Chargify::Subscription.new(:id => 1)
|
6
|
+
@sc1 = Chargify::Subscription::Component.new(
|
7
|
+
:subscription_id => @subscription.id,
|
8
|
+
:component_id => 1,
|
9
|
+
:allocated_quantity => 0,
|
10
|
+
:name => "Paying Customers",
|
11
|
+
:unit_name => "customers",
|
12
|
+
:component_type => "quantity_based_component",
|
13
|
+
:pricing_scheme => "stairstep"
|
14
|
+
)
|
15
|
+
@sc2 = Chargify::Subscription::Component.new(
|
16
|
+
:subscription_id => @subscription.id,
|
17
|
+
:component_id => 2,
|
18
|
+
:unit_balance => 0,
|
19
|
+
:name => "Text Messages",
|
20
|
+
:unit_name => "text message",
|
21
|
+
:component_type => "metered_component"
|
22
|
+
)
|
23
|
+
@subscriptions_components = [@sc1, @sc2]
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "listing subscription components" do
|
27
|
+
before(:each) do
|
28
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}.xml", :body => @subscription.to_xml)
|
29
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}/components.xml", :body => @subscriptions_components.to_xml(:root => 'components'))
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns an array of components from Chargify::Subscription::Component.find(:all, :params => {:subscription_id => @subscription.id})" do
|
33
|
+
Chargify::Subscription::Component.find(:all, :params => {:subscription_id => @subscription.id}).should == @subscriptions_components
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns an array of components from Chargify::Subscription.find(2).components" do
|
37
|
+
subscription = Chargify::Subscription.find(@subscription.id)
|
38
|
+
subscription.components.should == @subscriptions_components
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "reading a subscription component" do
|
43
|
+
before(:each) do
|
44
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}.xml", :body => @subscription.to_xml)
|
45
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}/components/#{@sc1.component_id}.xml", :body => @sc1.to_xml)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns the subscription's component resource from Chargify::Subscription::Component.find(1, :params => {:subscription_id => 1})" do
|
49
|
+
Chargify::Subscription::Component.find(@sc1.component_id, :params => {:subscription_id => @subscription.id}).should == @sc1
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns the subscription's component resource from Chargify::Subscription.find(1).component(1)" do
|
53
|
+
subscription = Chargify::Subscription.find(@subscription.id)
|
54
|
+
subscription.component(@sc1.component_id).should == @sc1
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "updating a subscription component" do
|
59
|
+
before(:each) do
|
60
|
+
@new_allocated_quantity = @sc1.allocated_quantity + 5
|
61
|
+
|
62
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}.xml", :body => @subscription.to_xml)
|
63
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}/components/#{@sc1.component_id}.xml", :body => @sc1.to_xml)
|
64
|
+
|
65
|
+
@sc1_prime = @sc1
|
66
|
+
@sc1_prime.allocated_quantity = @new_allocated_quantity
|
67
|
+
|
68
|
+
FakeWeb.register_uri(:put, "#{test_domain}/subscriptions/#{@subscription.id}/components/#{@sc1.component_id}.xml", :body => @sc1_prime.to_xml)
|
69
|
+
FakeWeb.register_uri(:get, "#{test_domain}/subscriptions/#{@subscription.id}/components/#{@sc1.component_id}.xml", :body => @sc1_prime.to_xml)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "updates the subscription's component allocated quantity" do
|
73
|
+
component = Chargify::Subscription::Component.find(@sc1.component_id, :params => {:subscription_id => @subscription.id})
|
74
|
+
component.allocated_quantity = @new_allocated_quantity
|
75
|
+
|
76
|
+
result = component.save
|
77
|
+
result.should be_true
|
78
|
+
|
79
|
+
Chargify::Subscription::Component.find(@sc1.component_id, :params => {:subscription_id => @subscription.id}).should == @sc1_prime
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ninjabutton_chargify_api_ares
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 3
|
8
|
+
- 1
|
9
|
+
version: 0.3.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Michael Klett
|
13
|
+
- The Lab Rats @ Phase Two Labs
|
14
|
+
- Brian Rose
|
15
|
+
- Nathan Verni
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2010-04-16 00:00:00 -04:00
|
21
|
+
default_executable:
|
22
|
+
dependencies: []
|
23
|
+
|
24
|
+
description: ""
|
25
|
+
email: mklett@grasshopper.com
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- LICENSE.txt
|
32
|
+
- README.md
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- LICENSE.txt
|
36
|
+
- README.md
|
37
|
+
- Rakefile
|
38
|
+
- VERSION
|
39
|
+
- chargify_api_ares.gemspec
|
40
|
+
- lib/chargify_api_ares.rb
|
41
|
+
- samples/customers.rb
|
42
|
+
- samples/metered_components.rb
|
43
|
+
- samples/products.rb
|
44
|
+
- samples/subscriptions.rb
|
45
|
+
- spec/base_spec.rb
|
46
|
+
- spec/components_spec.rb
|
47
|
+
- spec/customer_spec.rb
|
48
|
+
- spec/factories.rb
|
49
|
+
- spec/mocks/fake_resource.rb
|
50
|
+
- spec/product_spec.rb
|
51
|
+
- spec/spec_helper.rb
|
52
|
+
- spec/subscription_spec.rb
|
53
|
+
- spec/subscriptions_component_spec.rb
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://github.com/grasshopperlabs/chargify_api_ares
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options:
|
60
|
+
- --charset=UTF-8
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.3.6
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: A Chargify API wrapper for Ruby using ActiveResource
|
84
|
+
test_files:
|
85
|
+
- spec/base_spec.rb
|
86
|
+
- spec/components_spec.rb
|
87
|
+
- spec/customer_spec.rb
|
88
|
+
- spec/factories.rb
|
89
|
+
- spec/mocks/fake_resource.rb
|
90
|
+
- spec/product_spec.rb
|
91
|
+
- spec/spec_helper.rb
|
92
|
+
- spec/subscription_spec.rb
|
93
|
+
- spec/subscriptions_component_spec.rb
|