i_contact 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,220 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://app.sandbox.icontact.com/icp/a/413323/c/124667/contacts
6
+ body:
7
+ encoding: UTF-8
8
+ string: ! '[{"email":"subscriber@example.com"}]'
9
+ headers:
10
+ Api-Appid:
11
+ - <APP_ID>
12
+ Api-Username:
13
+ - <USER_NAME>
14
+ Api-Password:
15
+ - <PASSWORD>
16
+ Api-Version:
17
+ - '2.2'
18
+ Accept:
19
+ - application/json
20
+ Content-Type:
21
+ - application/json
22
+ User-Agent:
23
+ - Ruby
24
+ response:
25
+ status:
26
+ code: 200
27
+ message: OK
28
+ headers:
29
+ Date:
30
+ - Sat, 09 Jun 2012 20:25:49 GMT
31
+ Server:
32
+ - Apache
33
+ Vary:
34
+ - Accept-Encoding
35
+ Content-Length:
36
+ - '291'
37
+ Connection:
38
+ - close
39
+ Content-Type:
40
+ - text/html; charset=utf-8
41
+ body:
42
+ encoding: US-ASCII
43
+ string: ! '{"contacts":[{"contactId":"66695798","prefix":"","firstName":"","lastName":"","suffix":"","street":"","street2":"","city":"","state":"","postalCode":"","phone":"","fax":"","business":"","email":"subscriber@example.com","createDate":"2012-06-09
44
+ 16:25:49","bounceCount":"","status":"normal"}]}'
45
+ http_version:
46
+ recorded_at: Sat, 09 Jun 2012 20:25:49 GMT
47
+ - request:
48
+ method: post
49
+ uri: https://app.sandbox.icontact.com/icp/a/413323/c/124667/lists
50
+ body:
51
+ encoding: UTF-8
52
+ string: ! '[{"name":"Test Subscription List"}]'
53
+ headers:
54
+ Api-Appid:
55
+ - <APP_ID>
56
+ Api-Username:
57
+ - <USER_NAME>
58
+ Api-Password:
59
+ - <PASSWORD>
60
+ Api-Version:
61
+ - '2.2'
62
+ Accept:
63
+ - application/json
64
+ Content-Type:
65
+ - application/json
66
+ User-Agent:
67
+ - Ruby
68
+ response:
69
+ status:
70
+ code: 200
71
+ message: OK
72
+ headers:
73
+ Date:
74
+ - Sat, 09 Jun 2012 20:25:50 GMT
75
+ Server:
76
+ - Apache
77
+ Vary:
78
+ - Accept-Encoding
79
+ Content-Length:
80
+ - '187'
81
+ Connection:
82
+ - close
83
+ Content-Type:
84
+ - text/html; charset=utf-8
85
+ body:
86
+ encoding: US-ASCII
87
+ string: ! '{"lists":[{"listId":"205305","name":"Test Subscription List","publicname":"","description":"","emailOwnerOnChange":1,"welcomeOnManualAdd":0,"welcomeOnSignupAdd":0,"welcomeMessageId":""}]}'
88
+ http_version:
89
+ recorded_at: Sat, 09 Jun 2012 20:25:49 GMT
90
+ - request:
91
+ method: post
92
+ uri: https://app.sandbox.icontact.com/icp/a/413323/c/124667/subscriptions
93
+ body:
94
+ encoding: UTF-8
95
+ string: ! '[{"contactId":66695798,"listId":205305,"status":"normal"}]'
96
+ headers:
97
+ Api-Appid:
98
+ - <APP_ID>
99
+ Api-Username:
100
+ - <USER_NAME>
101
+ Api-Password:
102
+ - <PASSWORD>
103
+ Api-Version:
104
+ - '2.2'
105
+ Accept:
106
+ - application/json
107
+ Content-Type:
108
+ - application/json
109
+ User-Agent:
110
+ - Ruby
111
+ response:
112
+ status:
113
+ code: 200
114
+ message: OK
115
+ headers:
116
+ Date:
117
+ - Sat, 09 Jun 2012 20:25:50 GMT
118
+ Server:
119
+ - Apache
120
+ Vary:
121
+ - Accept-Encoding
122
+ Content-Length:
123
+ - '153'
124
+ Connection:
125
+ - close
126
+ Content-Type:
127
+ - text/html; charset=utf-8
128
+ body:
129
+ encoding: US-ASCII
130
+ string: ! '{"subscriptions":[{"addDate":"2012-06-09T16:25:50-04:00","contactId":"66695798","listId":"205305","status":"normal","subscriptionId":"205305_66695798"}]}'
131
+ http_version:
132
+ recorded_at: Sat, 09 Jun 2012 20:25:50 GMT
133
+ - request:
134
+ method: post
135
+ uri: https://app.sandbox.icontact.com/icp/a/413323/c/124667/contacts/66695798
136
+ body:
137
+ encoding: UTF-8
138
+ string: ! '{"status":"deleted"}'
139
+ headers:
140
+ Api-Appid:
141
+ - <APP_ID>
142
+ Api-Username:
143
+ - <USER_NAME>
144
+ Api-Password:
145
+ - <PASSWORD>
146
+ Api-Version:
147
+ - '2.2'
148
+ Accept:
149
+ - application/json
150
+ Content-Type:
151
+ - application/json
152
+ User-Agent:
153
+ - Ruby
154
+ response:
155
+ status:
156
+ code: 400
157
+ message: Bad Request
158
+ headers:
159
+ Date:
160
+ - Sat, 09 Jun 2012 20:25:51 GMT
161
+ Server:
162
+ - Apache
163
+ Vary:
164
+ - Accept-Encoding
165
+ Content-Length:
166
+ - '134'
167
+ Connection:
168
+ - close
169
+ Content-Type:
170
+ - text/html; charset=utf-8
171
+ body:
172
+ encoding: US-ASCII
173
+ string: ! '{"errors":["The status value you provided was not valid. status can
174
+ be either donotcontact or normal. Please provide a valid status"]}'
175
+ http_version:
176
+ recorded_at: Sat, 09 Jun 2012 20:25:50 GMT
177
+ - request:
178
+ method: delete
179
+ uri: https://app.sandbox.icontact.com/icp/a/413323/c/124667/lists/205305
180
+ body:
181
+ encoding: US-ASCII
182
+ string: ''
183
+ headers:
184
+ Api-Appid:
185
+ - <APP_ID>
186
+ Api-Username:
187
+ - <USER_NAME>
188
+ Api-Password:
189
+ - <PASSWORD>
190
+ Api-Version:
191
+ - '2.2'
192
+ Accept:
193
+ - application/json
194
+ Content-Type:
195
+ - application/json
196
+ User-Agent:
197
+ - Ruby
198
+ response:
199
+ status:
200
+ code: 200
201
+ message: OK
202
+ headers:
203
+ Date:
204
+ - Sat, 09 Jun 2012 20:25:51 GMT
205
+ Server:
206
+ - Apache
207
+ Vary:
208
+ - Accept-Encoding
209
+ Content-Length:
210
+ - '2'
211
+ Connection:
212
+ - close
213
+ Content-Type:
214
+ - text/html; charset=utf-8
215
+ body:
216
+ encoding: US-ASCII
217
+ string: ! '[]'
218
+ http_version:
219
+ recorded_at: Sat, 09 Jun 2012 20:25:51 GMT
220
+ recorded_with: VCR 2.1.1
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::Account do
4
+ use_vcr_cassette
5
+
6
+ it 'allows me to fetch my account details' do
7
+ account = IContact::Account.get.first
8
+ account.account_id.should_not be_nil
9
+ end
10
+ end
11
+
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::ClientFolder do
4
+ use_vcr_cassette
5
+
6
+ it 'returns a valid contact folder' do
7
+ folder = IContact::ClientFolder.get.first
8
+ folder.client_folder_id.to_s.should eql(IContact.configuration.client_folder_id)
9
+ end
10
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::Configuration do
4
+ let(:app_id) { 'app_id' }
5
+ let(:user_name) { 'user_name' }
6
+ let(:password) { 'password' }
7
+ let(:account_id) { 'account_id' }
8
+ let(:client_folder_id) { 'client_folder_id' }
9
+
10
+ let(:configuration) do
11
+ IContact::Configuration.new do |config|
12
+ config.app_id = app_id
13
+ config.user_name = user_name
14
+ config.password = password
15
+ config.account_id = account_id
16
+ config.client_folder_id = client_folder_id
17
+ end
18
+ end
19
+
20
+ it 'has an api key' do
21
+ configuration.app_id.should eql(app_id)
22
+ end
23
+
24
+ it 'has a user name' do
25
+ configuration.user_name.should eql(user_name)
26
+ end
27
+
28
+ it 'has a password' do
29
+ configuration.password.should eql(password)
30
+ end
31
+
32
+ it 'defaults the api version to 2.2' do
33
+ configuration.api_version = '2.2'
34
+ end
35
+
36
+ it 'defaults to sandbox mode' do
37
+ configuration.mode = :sandbox
38
+ end
39
+
40
+ describe 'validity' do
41
+ it 'is invalid if I do not specify an app_id' do
42
+ configuration.app_id = nil
43
+ configuration.should_not be_valid
44
+ end
45
+
46
+ it 'is invalid if I do not specify a user_name' do
47
+ configuration.user_name = nil
48
+ configuration.should_not be_valid
49
+ end
50
+
51
+ it 'is invalid if I do not specify a password' do
52
+ configuration.password = nil
53
+ configuration.should_not be_valid
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::Contact do
4
+ let(:email) { "user@example.com" }
5
+
6
+ has_attr :contact_id, Integer
7
+ has_attr :email, String
8
+ has_attr :first_name, String
9
+ has_attr :last_name, String
10
+ has_attr :suffix, String
11
+ has_attr :street, String
12
+ has_attr :street2, String
13
+ has_attr :city, String
14
+ has_attr :state, String
15
+ has_attr :postalCode, String
16
+ has_attr :phone, String
17
+ has_attr :fax, String
18
+ has_attr :business, String
19
+
20
+ use_vcr_cassette
21
+
22
+ it 'allows me to create a contact' do
23
+ contact = IContact::Contact.new(:email => email)
24
+ contact.save.should be_true
25
+ end
26
+
27
+ it 'allows me to get all the contacts that are unlisted' do
28
+ contacts = IContact::Contact.unlisted
29
+ contacts.should_not be_empty
30
+ end
31
+
32
+ it 'handles for when something goes wrong' do
33
+ contact = IContact::Contact.new(:email => nil)
34
+ contact.save.should be_false
35
+ end
36
+
37
+ it 'destroys a contact' do
38
+ contact = IContact::Contact.unlisted(:email => email).first
39
+ if contact.nil?
40
+ contact = IContact::Contact.new(:email => email).save!
41
+ end
42
+ lambda { contact.destroy }.should_not raise_error
43
+ end
44
+ end
45
+
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::List do
4
+ use_vcr_cassette
5
+
6
+ it 'can be created' do
7
+ list = IContact::List.new(:name => "Test List")
8
+ list.save.should be_true
9
+ list.should be_persisted
10
+ lambda { list.destroy }.should_not raise_error
11
+ end
12
+ end
13
+
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::Model do
4
+ class TestModel
5
+ include IContact::Model
6
+
7
+ key_attribute :test_model_id
8
+ attribute :email, :type => String
9
+ end
10
+
11
+ let(:email) { 'user@example.com' }
12
+ let(:model) { TestModel.new(:email => email) }
13
+
14
+
15
+ it 'has a getter and setter for a declared model' do
16
+ new_email = 'another_user@example.com'
17
+ model.email.should eql(email)
18
+ model.email = new_email
19
+ model.email.should eql(new_email)
20
+ end
21
+
22
+ it 'defaults to a resource name a demodulized version of the class name' do
23
+ model.class.resource_name.should eql('testmodel')
24
+ end
25
+
26
+ it 'uses the IContact http connection' do
27
+ TestModel.connection.should eql(IContact.connection)
28
+ end
29
+
30
+ it 'is persisted if the key attribute is populated' do
31
+ model.test_model_id = 1234
32
+ model.should be_persisted
33
+
34
+ model.test_model_id = nil
35
+ model.attributes = { :test_model_id => 1234 }
36
+ model.test_model_id.should_not be_nil
37
+ end
38
+
39
+ it 'appropriately parses json when an array is specified' do
40
+ mock_resp = mock
41
+ mock_resp.stubs(:valid?).returns(false)
42
+ mock_resp.stubs(:body).returns({:testmodels => [{:email => email}]}.to_json)
43
+ mock_resp.stubs(:status).returns(200)
44
+ result = model.class.parse(mock_resp)
45
+ result.size.should eql(1)
46
+ result.first.email.should eql(email)
47
+ end
48
+ end
49
+
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::Response do
4
+ let(:mock_raw_resp) do
5
+ mock_resp = mock.tap do |m|
6
+ m.stubs(:body).returns('{"errors":["Resource Or Version Not Implemented"]}')
7
+ m.stubs(:status).returns(200)
8
+ end
9
+ end
10
+
11
+ let(:response) { IContact::Response.new(mock_raw_resp) }
12
+
13
+ it 'finds errors when present' do
14
+ response.errors.should eql(JSON.parse(mock_raw_resp.body)["errors"])
15
+ end
16
+
17
+ it 'is invalid when errors are present' do
18
+ response.stubs(:errors).returns(['something is wonky'])
19
+ response.should_not be_valid
20
+ end
21
+
22
+ it 'is valid when errors are present' do
23
+ response.stubs(:errors).returns([])
24
+ response.should be_valid
25
+ end
26
+ end
27
+
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe IContact::Subscription do
4
+ let(:email) { "subscriber@example.com" }
5
+
6
+ use_vcr_cassette
7
+
8
+ let(:contact) do
9
+ c = IContact::Contact.new(:email => email)
10
+ c.save
11
+ c
12
+ end
13
+
14
+ let(:list) do
15
+ l = IContact::List.new(:name => "Test Subscription List")
16
+ l.save
17
+ l
18
+ end
19
+
20
+ after(:each) do
21
+ contact.destroy
22
+ list.destroy
23
+ end
24
+
25
+ it 'allows me to add a list subscription for a given contact' do
26
+ sub = IContact::Subscription.new({
27
+ :contact_id => contact.contact_id,
28
+ :list_id => list.list_id,
29
+ :status => 'normal'
30
+ });
31
+
32
+ sub.save.should be_true
33
+ end
34
+ end
35
+