dpickett-monkey_party 0.0.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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Dan Pickett
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,26 @@
1
+ = monkey_party
2
+
3
+ An extremely young API for interacting with the MailChimp API
4
+
5
+ Uses the excellent HTTParty and HappyMapper tools and is well tested
6
+
7
+ Currently only supports
8
+
9
+ * adding api keys
10
+ * finding lists by name
11
+ * batch subscribing
12
+ * unsubscribing
13
+
14
+ == Example Usage
15
+
16
+ account = MonkeyParty::Account.login("monkey_username", "party_password")
17
+ list = MonkeyParty::List.find_by_name("list_name")
18
+ list.create_subscribers([MonkeyParty::Subscriber.new("user@example.com")])
19
+
20
+ == TODO
21
+ * Batch subscribe does not allow you to resubscribe members - implement individual subscribe method
22
+ * Clean up after cucumber features are run
23
+
24
+ == Copyright
25
+
26
+ Copyright (c) 2009 Dan Pickett. See LICENSE for details.
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 0
4
+ :patch: 1
@@ -0,0 +1,48 @@
1
+ module MonkeyParty
2
+ class Account < Base
3
+ attr_accessor :user_name, :password, :keys
4
+
5
+ def initialize(attrs = {})
6
+ self.keys ||= []
7
+ self.keys << attrs.delete(:api_key) if attrs[:api_key]
8
+ super
9
+ end
10
+
11
+ def api_key
12
+ self.keys[0]
13
+ end
14
+
15
+ class << self
16
+ def login(user_name, password)
17
+ response = get("", :query => {
18
+ :method => "login",
19
+ :username => user_name,
20
+ :password => password
21
+ })["MCAPI"]
22
+
23
+ account = new
24
+
25
+ account.keys << response
26
+ account.user_name = user_name
27
+ account.password = password
28
+
29
+ #set a global api key
30
+ configatron.mailchimp.api_key = response
31
+
32
+ account
33
+ end
34
+ end
35
+
36
+ def add_api_key
37
+ response = self.class.get("", :query => {
38
+ :method => "apikeyAdd",
39
+ :username => self.user_name,
40
+ :password => self.password,
41
+ :apikey => self.api_key
42
+ })["MCAPI"]
43
+
44
+ self.keys << response
45
+ response
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,30 @@
1
+ require "ruby-debug"
2
+ module MonkeyParty
3
+ class Base
4
+ include HTTParty
5
+ base_uri 'http://api.mailchimp.com/1.1/'
6
+ default_params :output => "xml"
7
+
8
+ def initialize(attrs = {})
9
+ attrs.each{ |key, value| self.send("#{key}=", value) }
10
+ end
11
+
12
+ class << self
13
+ def get(path, options = {})
14
+ #fix the format because Mail Chimp doesn't pass the proper header
15
+ options[:format] = :xml
16
+ result = super
17
+
18
+ if result.body =~ /<error /i
19
+ raise MonkeyParty::Error.parse(result.body)
20
+ end
21
+ result
22
+ end
23
+
24
+ def api_key
25
+ configatron.mailchimp.api_key
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ module MonkeyParty
2
+ class Error < Exception
3
+ include HappyMapper
4
+
5
+ tag 'MCAPI'
6
+ element :message, String, :tag => "error"
7
+ element :code, Integer
8
+ end
9
+ end
@@ -0,0 +1,95 @@
1
+ module MonkeyParty
2
+ class List < Base
3
+ include HappyMapper
4
+ tag "struct"
5
+
6
+ element :id, String
7
+ element :web_id, String
8
+ element :name, String
9
+ element :date_created, Time
10
+ element :member_count, Integer
11
+
12
+ def create_subscribers(array_of_subscribers, options = {})
13
+ options[:double_optin] ||= true
14
+ options[:update_existing] ||= false
15
+ options[:replace_interests] ||= true
16
+
17
+ batch_hash = {}
18
+ index = 0
19
+ array_of_subscribers.each do |s|
20
+ batch_hash["batch[#{index}]"] = s.to_mailchimp_hash
21
+ index += 1
22
+ end
23
+
24
+ response = self.class.get("", :query => {
25
+ :apikey => self.class.api_key,
26
+ :id => self.id,
27
+ :method => "listBatchSubscribe",
28
+ }.merge(options).merge(batch_hash))
29
+
30
+ #response[1] is the error count
31
+ if !response["MCAPI"].nil? && response["MCAPI"][1] > 0
32
+ attach_errors_to_subscribers(array_of_subscribers, response.body)
33
+ end
34
+
35
+ array_of_subscribers
36
+ end
37
+
38
+ def destroy_subscribers(array_of_unsubscribers, options = {})
39
+ options[:delete_member] ||= false
40
+ options[:send_goodbye] ||= true
41
+ options[:send_notify] ||= false
42
+
43
+ batch_hash = {}
44
+ index = 0
45
+ array_of_unsubscribers.each do |s|
46
+ batch_hash["emails[#{index}]"] = s.email
47
+ end
48
+
49
+ response = self.class.get("", :query => {
50
+ :apikey => self.class.api_key,
51
+ :id => self.id,
52
+ :method => "listBatchUnsubscribe"
53
+ }.merge(options).merge(batch_hash))
54
+
55
+ if !response["MCAPI"].nil? && response["MCAPI"][1] > 0
56
+ attach_errors_to_subscribers(array_of_unsubscribers, response.body)
57
+ end
58
+
59
+ array_of_unsubscribers
60
+ end
61
+
62
+ class << self
63
+ def all
64
+ response = get("", :query => {
65
+ :apikey => api_key,
66
+ :method => "lists"
67
+ })
68
+
69
+ parse(response.body)
70
+ end
71
+
72
+ def find_by_name(name)
73
+ all.each do |list|
74
+ return list if list.name.downcase == name.downcase
75
+ end
76
+
77
+ return nil
78
+ end
79
+ end
80
+
81
+ private
82
+ def attach_errors_to_subscribers(subscribers, response)
83
+ #parse errors and update subscriber
84
+ error_nodes = XML::Parser.string(response).parse.root.find("/MCAPI/errors/struct")
85
+ error_nodes.each do |n|
86
+
87
+ sub_error = MonkeyParty::Error.new
88
+ sub_error.message = n.find_first("message").content
89
+ sub_error.code = n.find_first("code").content
90
+
91
+ subscribers[n.attributes["key"].to_i].error = sub_error
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,30 @@
1
+ module MonkeyParty
2
+ class Subscriber
3
+ attr_accessor :email, :merge_fields, :error
4
+
5
+ def initialize(email, merge_fields = {})
6
+ self.email = email
7
+ self.merge_fields = merge_fields
8
+ self.error = nil
9
+ end
10
+
11
+ def to_h
12
+ {
13
+ :email => self.email
14
+ }.merge(self.merge_fields)
15
+ end
16
+
17
+ def to_mailchimp_hash
18
+ chimp_hash = {}
19
+ self.to_h.each do |key, value|
20
+ chimp_hash[key.to_s.upcase] = value
21
+ end
22
+
23
+ chimp_hash
24
+ end
25
+
26
+ def valid?
27
+ self.error.nil?
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ require "rubygems"
2
+ require "httparty"
3
+ require "happymapper"
4
+
5
+ require "configatron"
6
+
7
+ require "monkey_party/error"
8
+
9
+ require "monkey_party/base"
10
+
11
+ require "monkey_party/subscriber"
12
+ require "monkey_party/account"
13
+ require "monkey_party/list"
14
+
@@ -0,0 +1,28 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <MCAPI type="array">
8
+ <success_count type="integer">0</success_count>
9
+ <error_count type="integer">2</error_count>
10
+ <errors type="array">
11
+ <struct key="0" type="array">
12
+ <code type="integer">214</code>
13
+ <message type="string">user@example.com is already subscribed to list Testing</message>
14
+ <row type="array">
15
+ <EMAIL type="string">user@example.com</EMAIL>
16
+ </row>
17
+ </struct>
18
+ <struct key="1" type="array">
19
+
20
+ <code type="integer">214</code>
21
+ <message type="string">user@3example.com is already subscribed to list Testing</message>
22
+ <row type="array">
23
+ <EMAIL type="string">user@3example.com</EMAIL>
24
+ </row>
25
+ </struct>
26
+ </errors>
27
+ </MCAPI>
28
+
@@ -0,0 +1,12 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <mcapi type="array">
8
+ <success_count type="integer">2</success_count>
9
+ <error_count type="integer">0</error_count>
10
+ <errors type="array">
11
+ </errors></mcapi>
12
+
@@ -0,0 +1,19 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <MCAPI type="array">
8
+ <success_count type="integer">0</success_count>
9
+ <error_count type="integer">1</error_count>
10
+ <errors type="array">
11
+ <struct key="0" type="array">
12
+ <code type="integer">232</code>
13
+ <message type="string">There is no record of &quot;user3@example.com&quot; in the database</message>
14
+ <email type="string">user3@example.com</email>
15
+ </struct>
16
+
17
+ </errors>
18
+ </MCAPI>
19
+
@@ -0,0 +1,12 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <mcapi type="array">
8
+ <success_count type="integer">1</success_count>
9
+ <error_count type="integer">0</error_count>
10
+ <errors type="array">
11
+ </errors></mcapi>
12
+
@@ -0,0 +1,11 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <MCAPI type="array">
8
+ <error type="string">Invalid Mailchimp API Key: fdasf</error>
9
+ <code type="integer">104</code>
10
+ </MCAPI>
11
+
@@ -0,0 +1,16 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <MCAPI type="array">
8
+ <struct key="0" type="array">
9
+ <id type="string">d40bbc3056</id>
10
+ <web_id type="integer">63816</web_id>
11
+ <name type="string">Testing</name>
12
+ <date_created type="string">Mar 27, 2009 07:00 pm</date_created>
13
+ <member_count type="double">0</member_count>
14
+ </struct>
15
+ </MCAPI>
16
+
@@ -0,0 +1,11 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <MCAPI type="array">
8
+ <error type="string">I&apos;m sorry, that username/password could not be found</error>
9
+ <code type="integer">100</code>
10
+ </MCAPI>
11
+
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Wed, 04 Feb 2009 03:42:26 GMT
3
+ Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch11
4
+ Content-Type: application/xml
5
+ Transfer-Encoding: chunked
6
+
7
+ <MCAPI type="string">2491541245g978jkasf</MCAPI>
8
+
@@ -0,0 +1,91 @@
1
+ require "test_helper"
2
+
3
+ class MonkeyParty::AccountTest < Test::Unit::TestCase
4
+ context "successfully logging in" do
5
+ setup do
6
+ configatron.mailchimp.api_key
7
+
8
+ mock_login_response(true)
9
+
10
+ @account = MonkeyParty::Account.login(@user_name, @password)
11
+ end
12
+
13
+ should "return an api key" do
14
+ assert_not_nil @account.api_key
15
+ end
16
+
17
+ should "set the user_name" do
18
+ assert_not_nil @account.user_name
19
+ end
20
+
21
+ should "set the global api key" do
22
+ assert_not_nil configatron.mailchimp.api_key
23
+ end
24
+ end
25
+
26
+ context "logging in with invalid credentials" do
27
+ setup do
28
+ mock_login_response(false)
29
+ end
30
+
31
+ should "raise an error" do
32
+ assert_raises MonkeyParty::Error do
33
+ MonkeyParty::Account.login(@user_name, @password)
34
+ end
35
+ end
36
+ end
37
+
38
+ context "adding an api key" do
39
+ setup do
40
+ @account = MonkeyParty::Account.new(
41
+ :user_name => "test",
42
+ :password => "password",
43
+ :api_key => "api_key")
44
+ end
45
+
46
+ context "with proper credentials" do
47
+ setup do
48
+ mock_response("password=#{@account.password}&" +
49
+ "apikey=#{@account.api_key}&method=apikeyAdd&" +
50
+ "output=xml&username=#{@account.user_name}",
51
+ "login_successful")
52
+ end
53
+
54
+ should "return an api key" do
55
+ response = @account.add_api_key
56
+ assert_kind_of String, response
57
+ end
58
+
59
+ should "add the resulting api key to extra keys" do
60
+ response = @account.add_api_key
61
+ assert @account.keys.include?(response)
62
+ end
63
+ end
64
+
65
+ context "with improper credentials" do
66
+ setup do
67
+ mock_response("password=#{@account.password}&" +
68
+ "apikey=#{@account.api_key}&method=apikeyAdd&" +
69
+ "output=xml&username=#{@account.user_name}",
70
+ "login_failed")
71
+ end
72
+
73
+ should "raise an error if I don't have the right credentials" do
74
+ assert_raise MonkeyParty::Error do
75
+ @account.add_api_key
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ private
82
+ def mock_login_response(successful = true)
83
+ @user_name = "test_user"
84
+ @password = "password"
85
+
86
+ mock_response("method=login&username=#{@user_name}" +
87
+ "&password=#{@password}&output=xml",
88
+ successful ? "login_successful" : "login_failed")
89
+
90
+ end
91
+ end
@@ -0,0 +1,18 @@
1
+ require "test_helper"
2
+
3
+ class MonkeyParty::ErrorTest < Test::Unit::TestCase
4
+ context "An error" do
5
+ setup do
6
+ error_body = File.read(xml_fixture_path("login_failed")).gsub(/.*<MCAPI/m, "<MCAPI")
7
+ @error = MonkeyParty::Error.parse(error_body)
8
+ end
9
+
10
+ should "have a code" do
11
+ assert_not_nil @error.code
12
+ end
13
+
14
+ should "have an error message" do
15
+ assert_not_nil @error.message
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,173 @@
1
+ require "test_helper"
2
+
3
+ class MonkeyParty::ListTest < Test::Unit::TestCase
4
+ context "a list" do
5
+ should "have a set of members" do
6
+
7
+ end
8
+
9
+ should "allow me to add members to the list" do
10
+ end
11
+
12
+ should "allow me to unsubscribe members from the list" do
13
+
14
+ end
15
+
16
+ should "have an id" do
17
+
18
+ end
19
+
20
+ should "have a web_id" do
21
+
22
+ end
23
+
24
+ should "have a name" do
25
+
26
+ end
27
+
28
+ should "have a date of creation" do
29
+
30
+ end
31
+
32
+ should "have a member count" do
33
+
34
+ end
35
+
36
+ end
37
+
38
+ context "when subscribing" do
39
+
40
+ setup do
41
+ mock_all_response
42
+
43
+ @list = MonkeyParty::List.all[0]
44
+
45
+ @subscribers = []
46
+ @subscribers << MonkeyParty::Subscriber.new("user@example.com",
47
+ {:fname => "A User"})
48
+ @subscribers << MonkeyParty::Subscriber.new("user3@example.com",
49
+ {:fname => "Another User"})
50
+
51
+
52
+ end
53
+
54
+ context "successfully" do
55
+ setup do
56
+ mock_subscription
57
+ @resultant_subscribers = @list.create_subscribers(@subscribers)
58
+ end
59
+
60
+ should "return an array of subscribers" do
61
+ assert_kind_of MonkeyParty::Subscriber, @resultant_subscribers[0]
62
+ end
63
+
64
+ should "indicate that each subscription was valid" do
65
+ @resultant_subscribers.each do |s|
66
+ assert s.valid?
67
+ end
68
+ end
69
+ end
70
+
71
+ context "resulting in error(s)" do
72
+ setup do
73
+ mock_subscription(false)
74
+ @resultant_subscribers = @list.create_subscribers(@subscribers)
75
+ end
76
+
77
+ should "have invalid subscribers" do
78
+ assert !@resultant_subscribers[0].valid?
79
+ end
80
+
81
+ should "have a subscriber with an error" do
82
+ assert_not_nil @resultant_subscribers[0].error
83
+ assert_kind_of MonkeyParty::Error, @resultant_subscribers[0].error
84
+ end
85
+ end
86
+ end
87
+
88
+ context "when unsubscribing" do
89
+ setup do
90
+ mock_all_response
91
+ @list = MonkeyParty::List.all[0]
92
+ @unsubscribers = [
93
+ MonkeyParty::Subscriber.new("user@example.com"),
94
+ MonkeyParty::Subscriber.new("user3@example.com")
95
+ ]
96
+ end
97
+
98
+ context "successfully" do
99
+ setup do
100
+ mock_unsubscription
101
+
102
+ @resultant_unsubscribers = @list.destroy_subscribers(@unsubscribers)
103
+ end
104
+
105
+ should "have all valid subscribers" do
106
+ @resultant_unsubscribers.each do |s|
107
+ assert s.valid?
108
+ end
109
+ end
110
+ end
111
+
112
+ context "resulting in errors(s)" do
113
+ setup do
114
+ mock_unsubscription(false)
115
+ @resultant_unsubscribers = @list.destroy_subscribers(@unsubscribers)
116
+ end
117
+
118
+ should "have an invalid subscriber" do
119
+ assert !@resultant_unsubscribers[0].valid?
120
+ end
121
+
122
+ should "have a usable error for the invalid subscriber" do
123
+ assert_not_nil @resultant_unsubscribers[0].error.message
124
+ end
125
+ end
126
+ end
127
+
128
+ context "lists" do
129
+ should "retrieving all of the lists" do
130
+ mock_all_response
131
+ lists = MonkeyParty::List.all
132
+ assert_kind_of Array, lists
133
+ assert_not_nil lists[0]
134
+ assert_not_nil lists[0].name
135
+ end
136
+
137
+ should "raise an error if something goes wrong" do
138
+ mock_all_response(false)
139
+ assert_raises MonkeyParty::Error do
140
+ lists = MonkeyParty::List.all
141
+ end
142
+ end
143
+
144
+ should "find by name" do
145
+ mock_all_response
146
+ assert_equal "Testing", MonkeyParty::List.find_by_name("Testing").name
147
+ end
148
+ end
149
+
150
+ private
151
+ def mock_all_response(success = true)
152
+ mock_response("apikey=2491541245g978jkasf&method=lists&output=xml",
153
+ success ? "lists_successful" : "lists_failed")
154
+ end
155
+
156
+ def mock_subscription(success = true)
157
+ mock_response(
158
+ "double_optin=true&update_existing=false&replace_interests=true&" +
159
+ "method=listBatchSubscribe&batch[1][EMAIL]=user3%40example.com&" +
160
+ "batch[1][FNAME]=Another%20User&output=xml&" +
161
+ "batch[0][EMAIL]=user%40example.com&batch[0][FNAME]=A%20User&"+
162
+ "apikey=2491541245g978jkasf&id=d40bbc3056",
163
+ success ? "batch_subscribe_successful" : "batch_subscribe_failed")
164
+ end
165
+
166
+ def mock_unsubscription(success = true)
167
+ mock_response(
168
+ "delete_member=false&send_goodbye=true&method=listBatchUnsubscribe&" +
169
+ "send_notify=false&output=xml&apikey=2491541245g978jkasf&id=d40bbc3056&" +
170
+ "emails[0]=user3%40example.com",
171
+ success ? "batch_unsubscribe_successful" : "batch_unsubscribe_failed")
172
+ end
173
+ end
@@ -0,0 +1,37 @@
1
+ require "test_helper"
2
+
3
+ class MonkeyParty::SubscriberTest < Test::Unit::TestCase
4
+ context "A subscriber" do
5
+ setup do
6
+ @merge_vars = {:merge_var => "MERGE VAR 1"}
7
+ @email = "user@example.com"
8
+ @subscriber = MonkeyParty::Subscriber.new(@email, @merge_vars)
9
+ end
10
+
11
+ should "have an email" do
12
+ assert_equal @email, @subscriber.email
13
+ end
14
+
15
+ should "have a list of merge fields" do
16
+ assert_equal @merge_vars, @subscriber.merge_fields
17
+ end
18
+
19
+ should "have a hashed version of all the attributes" do
20
+ intended_hash = {
21
+ :email => @email
22
+ }.merge(@merge_vars)
23
+
24
+ assert_equal intended_hash, @subscriber.to_h
25
+ end
26
+
27
+ should "have a mailchimp style hash of all the attributes" do
28
+ intended_hash = {}
29
+ intended_hash["EMAIL"] = @email
30
+ @merge_vars.each do |key, value|
31
+ intended_hash[key.to_s.upcase] = value
32
+ end
33
+
34
+ assert_equal intended_hash, @subscriber.to_mailchimp_hash
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ begin
6
+ require "redgreen"
7
+ rescue LoadError; end
8
+
9
+ require 'fake_web'
10
+
11
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
12
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
13
+ require 'monkey_party'
14
+
15
+ FakeWeb.allow_net_connect = false
16
+
17
+ configatron.mailchimp.api_key = "api_key"
18
+
19
+ class Test::Unit::TestCase
20
+ protected
21
+ def mock_response(path, fixture)
22
+ FakeWeb.register_uri(
23
+ "http://api.mailchimp.com/1.1?#{path}",
24
+ :response => xml_fixture_path(fixture))
25
+ end
26
+
27
+ def xml_fixture_path(fixture)
28
+ File.join(File.dirname(__FILE__), "fixtures", "#{fixture}.xml")
29
+ end
30
+
31
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dpickett-monkey_party
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dan Pickett
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-02 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: jnunemaker-httparty
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.3.1
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: jnunemaker-happymapper
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.2
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: configatron
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.2.2
44
+ version:
45
+ description:
46
+ email: dpickett@enlightsolutions.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - README.rdoc
53
+ - LICENSE
54
+ files:
55
+ - README.rdoc
56
+ - VERSION.yml
57
+ - lib/monkey_party
58
+ - lib/monkey_party/account.rb
59
+ - lib/monkey_party/base.rb
60
+ - lib/monkey_party/error.rb
61
+ - lib/monkey_party/list.rb
62
+ - lib/monkey_party/subscriber.rb
63
+ - lib/monkey_party.rb
64
+ - test/fixtures
65
+ - test/fixtures/batch_subscribe_failed.xml
66
+ - test/fixtures/batch_subscribe_successful.xml
67
+ - test/fixtures/batch_unsubscribe_failed.xml
68
+ - test/fixtures/batch_unsubscribe_successful.xml
69
+ - test/fixtures/lists_failed.xml
70
+ - test/fixtures/lists_successful.xml
71
+ - test/fixtures/login_failed.xml
72
+ - test/fixtures/login_successful.xml
73
+ - test/monkey_party
74
+ - test/monkey_party/account_test.rb
75
+ - test/monkey_party/error_test.rb
76
+ - test/monkey_party/list_test.rb
77
+ - test/monkey_party/subscriber_test.rb
78
+ - test/test_helper.rb
79
+ - LICENSE
80
+ has_rdoc: true
81
+ homepage: http://github.com/dpickett/monkey_party
82
+ post_install_message:
83
+ rdoc_options:
84
+ - --inline-source
85
+ - --charset=UTF-8
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "0"
93
+ version:
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: "0"
99
+ version:
100
+ requirements: []
101
+
102
+ rubyforge_project:
103
+ rubygems_version: 1.2.0
104
+ signing_key:
105
+ specification_version: 2
106
+ summary: TODO
107
+ test_files: []
108
+