constantcontact 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/README.md +132 -0
  4. data/constantcontact.gemspec +32 -0
  5. data/lib/constantcontact.rb +75 -0
  6. data/lib/constantcontact/api.rb +541 -0
  7. data/lib/constantcontact/auth/oauth2.rb +82 -0
  8. data/lib/constantcontact/auth/session_data_store.rb +69 -0
  9. data/lib/constantcontact/components/account/verified_email_address.rb +27 -0
  10. data/lib/constantcontact/components/activities/activity.rb +44 -0
  11. data/lib/constantcontact/components/activities/activity_error.rb +27 -0
  12. data/lib/constantcontact/components/activities/add_contacts.rb +117 -0
  13. data/lib/constantcontact/components/activities/add_contacts_import_data.rb +45 -0
  14. data/lib/constantcontact/components/activities/export_contacts.rb +30 -0
  15. data/lib/constantcontact/components/component.rb +23 -0
  16. data/lib/constantcontact/components/contacts/address.rb +28 -0
  17. data/lib/constantcontact/components/contacts/contact.rb +86 -0
  18. data/lib/constantcontact/components/contacts/contact_list.rb +27 -0
  19. data/lib/constantcontact/components/contacts/custom_field.rb +27 -0
  20. data/lib/constantcontact/components/contacts/email_address.rb +34 -0
  21. data/lib/constantcontact/components/contacts/note.rb +25 -0
  22. data/lib/constantcontact/components/email_marketing/campaign.rb +83 -0
  23. data/lib/constantcontact/components/email_marketing/click_through_details.rb +28 -0
  24. data/lib/constantcontact/components/email_marketing/message_footer.rb +30 -0
  25. data/lib/constantcontact/components/email_marketing/schedule.rb +29 -0
  26. data/lib/constantcontact/components/email_marketing/test_send.rb +45 -0
  27. data/lib/constantcontact/components/result_set.rb +27 -0
  28. data/lib/constantcontact/components/tracking/bounce_activity.rb +29 -0
  29. data/lib/constantcontact/components/tracking/click_activity.rb +28 -0
  30. data/lib/constantcontact/components/tracking/forward_activity.rb +28 -0
  31. data/lib/constantcontact/components/tracking/open_activity.rb +28 -0
  32. data/lib/constantcontact/components/tracking/send_activity.rb +28 -0
  33. data/lib/constantcontact/components/tracking/tracking_activity.rb +27 -0
  34. data/lib/constantcontact/components/tracking/tracking_summary.rb +28 -0
  35. data/lib/constantcontact/components/tracking/unsubscribe_activity.rb +29 -0
  36. data/lib/constantcontact/exceptions/ctct_exception.rb +25 -0
  37. data/lib/constantcontact/exceptions/illegal_argument_exception.rb +11 -0
  38. data/lib/constantcontact/exceptions/oauth2_exception.rb +11 -0
  39. data/lib/constantcontact/services/account_service.rb +29 -0
  40. data/lib/constantcontact/services/activity_service.rb +107 -0
  41. data/lib/constantcontact/services/base_service.rb +37 -0
  42. data/lib/constantcontact/services/campaign_schedule_service.rb +107 -0
  43. data/lib/constantcontact/services/campaign_tracking_service.rb +159 -0
  44. data/lib/constantcontact/services/contact_service.rb +114 -0
  45. data/lib/constantcontact/services/contact_tracking_service.rb +159 -0
  46. data/lib/constantcontact/services/email_marketing_service.rb +87 -0
  47. data/lib/constantcontact/services/list_service.rb +85 -0
  48. data/lib/constantcontact/util/config.rb +140 -0
  49. data/lib/constantcontact/util/helpers.rb +27 -0
  50. data/lib/constantcontact/version.rb +12 -0
  51. data/spec/constantcontact/api_spec.rb +183 -0
  52. data/spec/constantcontact/auth/oauth2_spec.rb +48 -0
  53. data/spec/constantcontact/components/contacts/address_spec.rb +18 -0
  54. data/spec/constantcontact/components/contacts/contact_list_spec.rb +18 -0
  55. data/spec/constantcontact/components/contacts/contact_spec.rb +18 -0
  56. data/spec/constantcontact/components/contacts/custom_field_spec.rb +18 -0
  57. data/spec/constantcontact/components/contacts/email_address_spec.rb +18 -0
  58. data/spec/constantcontact/services/contact_service_spec.rb +105 -0
  59. data/spec/constantcontact/services/list_service_spec.rb +69 -0
  60. data/spec/spec_helper.rb +13 -0
  61. metadata +134 -0
@@ -0,0 +1,87 @@
1
+ #
2
+ # email_marketing_service.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Services
9
+ class EmailMarketingService < BaseService
10
+ class << self
11
+
12
+ # Create a new campaign
13
+ # @param [String] access_token - Constant Contact OAuth2 access token
14
+ # @param [Campaign] campaign - Campaign to be created
15
+ # @return [Campaign]
16
+ def add_campaign(access_token, campaign)
17
+ url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.campaigns')
18
+ url = build_url(url)
19
+ payload = campaign.to_json
20
+ response = RestClient.post(url, payload, get_headers(access_token))
21
+ Components::Campaign.create(JSON.parse(response.body))
22
+ end
23
+
24
+
25
+ # Get a set of campaigns
26
+ # @param [String] access_token - Constant Contact OAuth2 access token
27
+ # @param [Hash] param - query parameters to be appended to the request
28
+ # @return [ResultSet<Campaign>]
29
+ def get_campaigns(access_token, param = nil)
30
+ url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.campaigns')
31
+ url = build_url(url, param)
32
+
33
+ response = RestClient.get(url, get_headers(access_token))
34
+ body = JSON.parse(response.body)
35
+
36
+ campaigns = []
37
+ body['results'].each do |campaign|
38
+ campaigns << Components::Campaign.create_summary(campaign)
39
+ end
40
+
41
+ Components::ResultSet.new(campaigns, body['meta'])
42
+ end
43
+
44
+
45
+ # Get campaign details for a specific campaign
46
+ # @param [String] access_token - Constant Contact OAuth2 access token
47
+ # @param [Integer] campaign_id - Valid campaign id
48
+ # @return [Campaign]
49
+ def get_campaign(access_token, campaign_id)
50
+ url = Util::Config.get('endpoints.base_url') +
51
+ sprintf(Util::Config.get('endpoints.campaign'), campaign_id)
52
+ url = build_url(url)
53
+ response = RestClient.get(url, get_headers(access_token))
54
+ Components::Campaign.create(JSON.parse(response.body))
55
+ end
56
+
57
+
58
+ # Delete an email campaign
59
+ # @param [String] access_token - Constant Contact OAuth2 access token
60
+ # @param [Integer] campaign_id - Valid campaign id
61
+ # @return [Boolean]
62
+ def delete_campaign(access_token, campaign_id)
63
+ url = Util::Config.get('endpoints.base_url') +
64
+ sprintf(Util::Config.get('endpoints.campaign'), campaign_id)
65
+ url = build_url(url)
66
+ response = RestClient.delete(url, get_headers(access_token))
67
+ response.code == 204
68
+ end
69
+
70
+
71
+ # Update a specific email campaign
72
+ # @param [String] access_token - Constant Contact OAuth2 access token
73
+ # @param [Campaign] campaign - Campaign to be updated
74
+ # @return [Campaign]
75
+ def update_campaign(access_token, campaign)
76
+ url = Util::Config.get('endpoints.base_url') +
77
+ sprintf(Util::Config.get('endpoints.campaign'), campaign.id)
78
+ url = build_url(url)
79
+ payload = campaign.to_json
80
+ response = RestClient.put(url, payload, get_headers(access_token))
81
+ Components::Campaign.create(JSON.parse(response.body))
82
+ end
83
+
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,85 @@
1
+ #
2
+ # list_service.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Services
9
+ class ListService < BaseService
10
+ class << self
11
+
12
+ # Get lists within an account
13
+ # @param [String] access_token - Constant Contact OAuth2 access token
14
+ # @return [Array<ContactList>]
15
+ def get_lists(access_token)
16
+ url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.lists')
17
+ url = build_url(url)
18
+ response = RestClient.get(url, get_headers(access_token))
19
+ lists = []
20
+ JSON.parse(response.body).each do |contact|
21
+ lists << Components::ContactList.create(contact)
22
+ end
23
+ lists
24
+ end
25
+
26
+
27
+ # Add a new list to the Constant Contact account
28
+ # @param [String] access_token - Constant Contact OAuth2 access token
29
+ # @param [ContactList] list
30
+ # @return [ContactList]
31
+ def add_list(access_token, list)
32
+ url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.lists')
33
+ url = build_url(url)
34
+ payload = list.to_json
35
+ response = RestClient.post(url, payload, get_headers(access_token))
36
+ Components::ContactList.create(JSON.parse(response.body))
37
+ end
38
+
39
+
40
+ # Update a Contact List
41
+ # @param [String] access_token - Constant Contact OAuth2 access token
42
+ # @param [ContactList] list - ContactList to be updated
43
+ # @return [ContactList]
44
+ def update_list(access_token, list)
45
+ url = Util::Config.get('endpoints.base_url') + sprintf(Util::Config.get('endpoints.list'), list.id)
46
+ url = build_url(url)
47
+ payload = list.to_json
48
+ response = RestClient.put(url, payload, get_headers(access_token))
49
+ Components::ContactList.create(JSON.parse(response.body))
50
+ end
51
+
52
+
53
+ # Get an individual contact list
54
+ # @param [String] access_token - Constant Contact OAuth2 access token
55
+ # @param [Integer] list_id - list id
56
+ # @return [ContactList]
57
+ def get_list(access_token, list_id)
58
+ url = Util::Config.get('endpoints.base_url') + sprintf(Util::Config.get('endpoints.list'), list_id)
59
+ url = build_url(url)
60
+ response = RestClient.get(url, get_headers(access_token))
61
+ Components::ContactList.create(JSON.parse(response.body))
62
+ end
63
+
64
+
65
+ # Get all contacts from an individual list
66
+ # @param [String] access_token - Constant Contact OAuth2 access token
67
+ # @param [Integer] list_id - list id to retrieve contacts for
68
+ # @param [Hash] param - query parameters to attach to request
69
+ # @return [Array<Contact>]
70
+ def get_contacts_from_list(access_token, list_id, param = nil)
71
+ url = Util::Config.get('endpoints.base_url') + sprintf(Util::Config.get('endpoints.list_contacts'), list_id)
72
+ url = build_url(url, param)
73
+ response = RestClient.get(url, get_headers(access_token))
74
+ contacts = []
75
+ body = JSON.parse(response.body)
76
+ body['results'].each do |contact|
77
+ contacts << Components::Contact.create(contact)
78
+ end
79
+ Components::ResultSet.new(contacts, body['meta'])
80
+ end
81
+
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,140 @@
1
+ #
2
+ # config.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Util
9
+ class Config
10
+
11
+ class << self
12
+
13
+ # Return a hash of configuration strings
14
+ # @return [Hash] - hash of configuration properties
15
+ def props
16
+ {
17
+ # REST endpoints
18
+ :endpoints => {
19
+ :base_url => 'https://api.constantcontact.com/v2/',
20
+
21
+ :activity => 'activities/%s',
22
+ :activities => 'activities',
23
+ :export_contacts_activity => 'activities/exportcontacts',
24
+ :clear_lists_activity => 'activities/clearlists',
25
+ :remove_from_lists_activity => 'activities/removefromlists',
26
+ :add_contacts_activity => 'activities/addcontacts',
27
+
28
+ :account_verified_addresses => 'account/verifiedemailaddresses',
29
+
30
+ :contact => 'contacts/%s',
31
+ :contacts => 'contacts',
32
+ :lists => 'lists',
33
+ :list => 'lists/%s',
34
+ :list_contacts => 'lists/%s/contacts',
35
+ :contact_lists => 'contacts/%s/lists',
36
+ :contact_list => 'contacts/%s/lists/%s',
37
+
38
+ :campaigns => 'emailmarketing/campaigns',
39
+ :campaign => 'emailmarketing/campaigns/%s',
40
+ :campaign_schedules => 'emailmarketing/campaigns/%s/schedules',
41
+ :campaign_schedule => 'emailmarketing/campaigns/%s/schedules/%s',
42
+ :campaign_test_sends => 'emailmarketing/campaigns/%s/tests',
43
+ :campaign_tracking_summary => 'emailmarketing/campaigns/%s/tracking/reports/summary',
44
+ :campaign_tracking_bounces => 'emailmarketing/campaigns/%s/tracking/bounces',
45
+ :campaign_tracking_clicks => 'emailmarketing/campaigns/%s/tracking/clicks',
46
+ :campaign_tracking_forwards => 'emailmarketing/campaigns/%s/tracking/forwards',
47
+ :campaign_tracking_opens => 'emailmarketing/campaigns/%s/tracking/opens',
48
+ :campaign_tracking_sends => 'emailmarketing/campaigns/%s/tracking/sends',
49
+ :campaign_tracking_unsubscribes => 'emailmarketing/campaigns/%s/tracking/unsubscribes',
50
+ :campaign_tracking_link => 'emailmarketing/campaigns/%s/tracking/clicks/%s',
51
+
52
+ :contact_tracking_summary => 'contacts/%s/tracking/reports/summary',
53
+ :contact_tracking_bounces => 'contacts/%s/tracking/bounces',
54
+ :contact_tracking_clicks => 'contacts/%s/tracking/clicks',
55
+ :contact_tracking_forwards => 'contacts/%s/tracking/forwards',
56
+ :contact_tracking_opens => 'contacts/%s/tracking/opens',
57
+ :contact_tracking_sends => 'contacts/%s/tracking/sends',
58
+ :contact_tracking_unsubscribes => 'contacts/%s/tracking/unsubscribes',
59
+ :contact_tracking_link => 'contacts/%s/tracking/clicks/%s'
60
+ },
61
+
62
+ # OAuth2 Authorization related configuration options
63
+ :auth => {
64
+ :base_url => 'https://oauth2.constantcontact.com/oauth2/',
65
+ :response_type_code => 'code',
66
+ :response_type_token => 'token',
67
+ :authorization_code_grant_type => 'authorization_code',
68
+ :authorization_endpoint => 'oauth/siteowner/authorize',
69
+ :token_endpoint => 'oauth/token'
70
+ },
71
+
72
+ # Column names used with bulk activities
73
+ :activities_columns => {
74
+ :email => 'EMAIL',
75
+ :first_name => 'FIRST NAME',
76
+ :middle_name => 'MIDDLE NAME',
77
+ :last_name => 'LAST NAME',
78
+ :job_title => 'JOB TITLE',
79
+ :company_name => 'COMPANY NAME',
80
+ :work_phone => 'WORK PHONE',
81
+ :home_phone => 'HOME PHONE',
82
+ :address1 => 'ADDRESS LINE 1',
83
+ :address2 => 'ADDRESS LINE 2',
84
+ :address3 => 'ADDRESS LINE 3',
85
+ :city => 'CITY',
86
+ :state => 'STATE',
87
+ :state_province => 'US STATE/CA PROVINCE',
88
+ :country => 'COUNTRY',
89
+ :postal_code => 'ZIP/POSTAL CODE',
90
+ :sub_postal_code => 'SUB ZIP/POSTAL CODE',
91
+ :custom_field_1 => 'CUSTOM FIELD 1',
92
+ :custom_field_2 => 'CUSTOM FIELD 2',
93
+ :custom_field_3 => 'CUSTOM FIELD 3',
94
+ :custom_field_4 => 'CUSTOM FIELD 4',
95
+ :custom_field_5 => 'CUSTOM FIELD 5',
96
+ :custom_field_6 => 'CUSTOM FIELD 6',
97
+ :custom_field_7 => 'CUSTOM FIELD 7',
98
+ :custom_field_8 => 'CUSTOM FIELD 8',
99
+ :custom_field_9 => 'CUSTOM FIELD 9',
100
+ :custom_field_10 => 'CUSTOM FIELD 10',
101
+ :custom_field_11 => 'CUSTOM FIELD 11',
102
+ :custom_field_12 => 'CUSTOM FIELD 12',
103
+ :custom_field_13 => 'CUSTOM FIELD 13',
104
+ :custom_field_14 => 'CUSTOM FIELD 14',
105
+ :custom_field_15 => 'CUSTOM FIELD 15'
106
+ },
107
+
108
+ # Errors to be returned for various exceptions
109
+ :errors => {
110
+ :id_or_object => 'Only an id or %s object are allowed for this method.'
111
+ }
112
+ }
113
+ end
114
+
115
+ # Get a configuration property given a specified location, example usage: Config::get('auth.token_endpoint')
116
+ # @param [String] index - location of the property to obtain
117
+ # @return [String]
118
+ def get(index)
119
+ properties = index.split('.')
120
+ get_value(properties, props)
121
+ end
122
+
123
+ private
124
+
125
+ # Navigate through a config array looking for a particular index
126
+ # @param [Array] index The index sequence we are navigating down
127
+ # @param [Hash, String] value The portion of the config array to process
128
+ # @return [String]
129
+ def get_value(index, value)
130
+ index = index.is_a?(Array) ? index : [index]
131
+ key = index.shift.to_sym
132
+ value.is_a?(Hash) and value[key] and value[key].is_a?(Hash) ?
133
+ get_value(index, value[key]) :
134
+ value[key]
135
+ end
136
+ end
137
+
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,27 @@
1
+ #
2
+ # helpers.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Util
9
+ class Helpers
10
+ class << self
11
+
12
+ # Build the HTTP query from the given parameters
13
+ # @param [Hash] params
14
+ # @return [String] query string
15
+ def http_build_query(params)
16
+ params.collect{ |k,v| "#{k.to_s}=#{encode(v.to_s)}" }.reverse.join('&')
17
+ end
18
+
19
+ # Escape special characters
20
+ # @param [String] str
21
+ def encode(str)
22
+ CGI.escape(str).gsub('.', '%2E').gsub('-', '%2D')
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ #
2
+ # version.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module SDK
9
+ # Gem version
10
+ VERSION = "1.0.0"
11
+ end
12
+ end
@@ -0,0 +1,183 @@
1
+ #
2
+ # api_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Api do
10
+ before(:each) do
11
+ @api = ConstantContact::Api.new('api key')
12
+ end
13
+
14
+ describe "#get_contacts" do
15
+ it "returns an array of contacts" do
16
+ json = load_json('contacts.json')
17
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
18
+
19
+ response = RestClient::Response.create(json, net_http_resp, {})
20
+ RestClient.stub(:get).and_return(response)
21
+ contacts = @api.get_contacts('token')
22
+ contact = contacts.results[0]
23
+
24
+ contacts.should be_kind_of(ConstantContact::Components::ResultSet)
25
+ contact.should be_kind_of(ConstantContact::Components::Contact)
26
+ end
27
+ end
28
+
29
+ describe "#get_contact" do
30
+ it "returns a contact" do
31
+ json = load_json('contact.json')
32
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
33
+
34
+ response = RestClient::Response.create(json, net_http_resp, {})
35
+ RestClient.stub(:get).and_return(response)
36
+ contact = @api.get_contact('token', 1)
37
+
38
+ contact.should be_kind_of(ConstantContact::Components::Contact)
39
+ end
40
+ end
41
+
42
+ describe "#get_contact_by_email" do
43
+ it "returns a contact" do
44
+ json = load_json('contacts.json')
45
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
46
+
47
+ response = RestClient::Response.create(json, net_http_resp, {})
48
+ RestClient.stub(:get).and_return(response)
49
+ contacts = @api.get_contact_by_email('token', 'john.smith@gmail.com')
50
+ contact = contacts.results[0]
51
+
52
+ contact.should be_kind_of(ConstantContact::Components::Contact)
53
+ end
54
+ end
55
+
56
+ describe "#add_contact" do
57
+ it "adds a contact" do
58
+ json = load_json('contact.json')
59
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
60
+
61
+ response = RestClient::Response.create(json, net_http_resp, {})
62
+ RestClient.stub(:post).and_return(response)
63
+ contact = ConstantContact::Components::Contact.create(JSON.parse(json))
64
+ added = @api.add_contact('token', contact)
65
+
66
+ added.should respond_to(:status)
67
+ added.status.should eq('REMOVED')
68
+ end
69
+ end
70
+
71
+ describe "#delete_contact" do
72
+ it "deletes a contact" do
73
+ json = load_json('contact.json')
74
+ net_http_resp = Net::HTTPResponse.new(1.0, 204, 'No Content')
75
+
76
+ response = RestClient::Response.create('', net_http_resp, {})
77
+ RestClient.stub(:delete).and_return(response)
78
+ contact = ConstantContact::Components::Contact.create(JSON.parse(json))
79
+ @api.delete_contact('token', contact).should be_true
80
+ end
81
+ end
82
+
83
+ describe "#delete_contact_from_lists" do
84
+ it "deletes a contact" do
85
+ json = load_json('contact.json')
86
+ net_http_resp = Net::HTTPResponse.new(1.0, 204, 'No Content')
87
+
88
+ response = RestClient::Response.create('', net_http_resp, {})
89
+ RestClient.stub(:delete).and_return(response)
90
+ contact = ConstantContact::Components::Contact.create(JSON.parse(json))
91
+ @api.delete_contact_from_lists('token', contact).should be_true
92
+ end
93
+ end
94
+
95
+ describe "#delete_contact_from_list" do
96
+ it "deletes a contact" do
97
+ contact_json = load_json('contact.json')
98
+ list_json = load_json('list.json')
99
+ net_http_resp = Net::HTTPResponse.new(1.0, 204, 'No Content')
100
+
101
+ response = RestClient::Response.create('', net_http_resp, {})
102
+ RestClient.stub(:delete).and_return(response)
103
+ contact = ConstantContact::Components::Contact.create(JSON.parse(contact_json))
104
+ list = ConstantContact::Components::ContactList.create(JSON.parse(list_json))
105
+ @api.delete_contact_from_list('token', contact, list).should be_true
106
+ end
107
+ end
108
+
109
+ describe "#update_contact" do
110
+ it "updates a contact" do
111
+ json = load_json('contact.json')
112
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
113
+
114
+ response = RestClient::Response.create(json, net_http_resp, {})
115
+ RestClient.stub(:put).and_return(response)
116
+ contact = ConstantContact::Components::Contact.create(JSON.parse(json))
117
+ added = @api.update_contact('token', contact)
118
+
119
+ added.should respond_to(:status)
120
+ added.status.should eq('REMOVED')
121
+ end
122
+ end
123
+
124
+ describe "#get_lists" do
125
+ it "returns an array of lists" do
126
+ json = load_json('lists.json')
127
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
128
+
129
+ response = RestClient::Response.create(json, net_http_resp, {})
130
+ RestClient.stub(:get).and_return(response)
131
+ lists = @api.get_lists('token')
132
+ list = lists[0]
133
+
134
+ lists.should be_kind_of(Array)
135
+ list.should be_kind_of(ConstantContact::Components::ContactList)
136
+ end
137
+ end
138
+
139
+ describe "#get_list" do
140
+ it "returns a list" do
141
+ json = load_json('list.json')
142
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
143
+
144
+ response = RestClient::Response.create(json, net_http_resp, {})
145
+ RestClient.stub(:get).and_return(response)
146
+ contact = @api.get_list('token', 1)
147
+
148
+ contact.should be_kind_of(ConstantContact::Components::ContactList)
149
+ end
150
+ end
151
+
152
+ describe "#add_list" do
153
+ it "adds a list" do
154
+ json = load_json('list.json')
155
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
156
+
157
+ response = RestClient::Response.create(json, net_http_resp, {})
158
+ RestClient.stub(:post).and_return(response)
159
+ list = ConstantContact::Components::ContactList.create(JSON.parse(json))
160
+ added = @api.add_list('token', list)
161
+
162
+ added.should respond_to(:status)
163
+ added.status.should eq('ACTIVE')
164
+ end
165
+ end
166
+
167
+ describe "#get_contacts_from_list" do
168
+ it "returns an array of contacts" do
169
+ json_list = load_json('list.json')
170
+ json_contacts = load_json('contacts.json')
171
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
172
+
173
+ response = RestClient::Response.create(json_contacts, net_http_resp, {})
174
+ RestClient.stub(:get).and_return(response)
175
+ list = ConstantContact::Components::ContactList.create(JSON.parse(json_list))
176
+ contacts = @api.get_contacts_from_list('token', list)
177
+ contact = contacts.results[0]
178
+
179
+ contacts.should be_kind_of(ConstantContact::Components::ResultSet)
180
+ contact.should be_kind_of(ConstantContact::Components::Contact)
181
+ end
182
+ end
183
+ end