constantcontact-ruby 2.2.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 (107) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/README.md +136 -0
  4. data/constantcontact-ruby.gemspec +31 -0
  5. data/lib/constantcontact/api.rb +1012 -0
  6. data/lib/constantcontact/auth/oauth2.rb +105 -0
  7. data/lib/constantcontact/auth/session_data_store.rb +69 -0
  8. data/lib/constantcontact/components/account/account_address.rb +26 -0
  9. data/lib/constantcontact/components/account/account_info.rb +38 -0
  10. data/lib/constantcontact/components/account/verified_email_address.rb +26 -0
  11. data/lib/constantcontact/components/activities/activity.rb +43 -0
  12. data/lib/constantcontact/components/activities/activity_error.rb +26 -0
  13. data/lib/constantcontact/components/activities/add_contacts.rb +127 -0
  14. data/lib/constantcontact/components/activities/add_contacts_import_data.rb +46 -0
  15. data/lib/constantcontact/components/activities/export_contacts.rb +30 -0
  16. data/lib/constantcontact/components/component.rb +48 -0
  17. data/lib/constantcontact/components/contacts/address.rb +27 -0
  18. data/lib/constantcontact/components/contacts/contact.rb +92 -0
  19. data/lib/constantcontact/components/contacts/contact_list.rb +26 -0
  20. data/lib/constantcontact/components/contacts/custom_field.rb +26 -0
  21. data/lib/constantcontact/components/contacts/email_address.rb +33 -0
  22. data/lib/constantcontact/components/contacts/note.rb +26 -0
  23. data/lib/constantcontact/components/email_marketing/campaign.rb +83 -0
  24. data/lib/constantcontact/components/email_marketing/campaign_preview.rb +29 -0
  25. data/lib/constantcontact/components/email_marketing/click_through_details.rb +27 -0
  26. data/lib/constantcontact/components/email_marketing/message_footer.rb +29 -0
  27. data/lib/constantcontact/components/email_marketing/schedule.rb +27 -0
  28. data/lib/constantcontact/components/email_marketing/test_send.rb +45 -0
  29. data/lib/constantcontact/components/event_spot/contact.rb +27 -0
  30. data/lib/constantcontact/components/event_spot/event.rb +69 -0
  31. data/lib/constantcontact/components/event_spot/event_address.rb +29 -0
  32. data/lib/constantcontact/components/event_spot/event_fee.rb +27 -0
  33. data/lib/constantcontact/components/event_spot/event_item.rb +36 -0
  34. data/lib/constantcontact/components/event_spot/event_item_attribute.rb +26 -0
  35. data/lib/constantcontact/components/event_spot/event_track.rb +31 -0
  36. data/lib/constantcontact/components/event_spot/guest.rb +31 -0
  37. data/lib/constantcontact/components/event_spot/guest_section.rb +34 -0
  38. data/lib/constantcontact/components/event_spot/notification_option.rb +27 -0
  39. data/lib/constantcontact/components/event_spot/online_meeting.rb +28 -0
  40. data/lib/constantcontact/components/event_spot/payment_address.rb +29 -0
  41. data/lib/constantcontact/components/event_spot/payment_summary.rb +33 -0
  42. data/lib/constantcontact/components/event_spot/promocode.rb +25 -0
  43. data/lib/constantcontact/components/event_spot/registrant.rb +52 -0
  44. data/lib/constantcontact/components/event_spot/registrant_fee.rb +29 -0
  45. data/lib/constantcontact/components/event_spot/registrant_field.rb +27 -0
  46. data/lib/constantcontact/components/event_spot/registrant_order.rb +39 -0
  47. data/lib/constantcontact/components/event_spot/registrant_promo_code.rb +31 -0
  48. data/lib/constantcontact/components/event_spot/registrant_promo_code_info.rb +27 -0
  49. data/lib/constantcontact/components/event_spot/registrant_section.rb +34 -0
  50. data/lib/constantcontact/components/event_spot/sale_item.rb +29 -0
  51. data/lib/constantcontact/components/library/file/library_file.rb +27 -0
  52. data/lib/constantcontact/components/library/folder/library_folder.rb +26 -0
  53. data/lib/constantcontact/components/library/info/library_summary.rb +26 -0
  54. data/lib/constantcontact/components/library/info/move_results.rb +26 -0
  55. data/lib/constantcontact/components/library/info/upload_status.rb +26 -0
  56. data/lib/constantcontact/components/result_set.rb +50 -0
  57. data/lib/constantcontact/components/tracking/bounce_activity.rb +28 -0
  58. data/lib/constantcontact/components/tracking/click_activity.rb +26 -0
  59. data/lib/constantcontact/components/tracking/forward_activity.rb +26 -0
  60. data/lib/constantcontact/components/tracking/open_activity.rb +26 -0
  61. data/lib/constantcontact/components/tracking/send_activity.rb +27 -0
  62. data/lib/constantcontact/components/tracking/tracking_activity.rb +26 -0
  63. data/lib/constantcontact/components/tracking/tracking_summary.rb +27 -0
  64. data/lib/constantcontact/components/tracking/unsubscribe_activity.rb +27 -0
  65. data/lib/constantcontact/exceptions/ctct_exception.rb +25 -0
  66. data/lib/constantcontact/exceptions/illegal_argument_exception.rb +11 -0
  67. data/lib/constantcontact/exceptions/oauth2_exception.rb +11 -0
  68. data/lib/constantcontact/exceptions/webhooks_exception.rb +11 -0
  69. data/lib/constantcontact/services/account_service.rb +39 -0
  70. data/lib/constantcontact/services/activity_service.rb +136 -0
  71. data/lib/constantcontact/services/base_service.rb +68 -0
  72. data/lib/constantcontact/services/campaign_schedule_service.rb +101 -0
  73. data/lib/constantcontact/services/campaign_tracking_service.rb +152 -0
  74. data/lib/constantcontact/services/contact_service.rb +105 -0
  75. data/lib/constantcontact/services/contact_tracking_service.rb +152 -0
  76. data/lib/constantcontact/services/email_marketing_service.rb +94 -0
  77. data/lib/constantcontact/services/event_spot_service.rb +448 -0
  78. data/lib/constantcontact/services/library_service.rb +281 -0
  79. data/lib/constantcontact/services/list_service.rb +81 -0
  80. data/lib/constantcontact/util/config.rb +180 -0
  81. data/lib/constantcontact/util/helpers.rb +27 -0
  82. data/lib/constantcontact/version.rb +12 -0
  83. data/lib/constantcontact/webhooks/helpers/validator.rb +30 -0
  84. data/lib/constantcontact/webhooks/models/billing_change_notification.rb +27 -0
  85. data/lib/constantcontact/webhooks/webhooks_util.rb +45 -0
  86. data/lib/constantcontact.rb +124 -0
  87. data/spec/constantcontact/api_spec.rb +1560 -0
  88. data/spec/constantcontact/auth/oauth2_spec.rb +125 -0
  89. data/spec/constantcontact/components/contacts/address_spec.rb +18 -0
  90. data/spec/constantcontact/components/contacts/contact_list_spec.rb +18 -0
  91. data/spec/constantcontact/components/contacts/contact_spec.rb +18 -0
  92. data/spec/constantcontact/components/contacts/custom_field_spec.rb +18 -0
  93. data/spec/constantcontact/components/contacts/email_address_spec.rb +18 -0
  94. data/spec/constantcontact/sdk_spec.rb +24 -0
  95. data/spec/constantcontact/services/account_service_spec.rb +46 -0
  96. data/spec/constantcontact/services/activity_service_spec.rb +244 -0
  97. data/spec/constantcontact/services/base_service_spec.rb +50 -0
  98. data/spec/constantcontact/services/campaign_schedule_service_spec.rb +115 -0
  99. data/spec/constantcontact/services/campaign_tracking_service_spec.rb +131 -0
  100. data/spec/constantcontact/services/contact_service_spec.rb +111 -0
  101. data/spec/constantcontact/services/contact_tracking_service_spec.rb +131 -0
  102. data/spec/constantcontact/services/email_marketing_spec.rb +100 -0
  103. data/spec/constantcontact/services/event_spot_spec.rb +423 -0
  104. data/spec/constantcontact/services/library_service_spec.rb +252 -0
  105. data/spec/constantcontact/services/list_service_spec.rb +89 -0
  106. data/spec/constantcontact/webhooks/webhooks_spec.rb +26 -0
  107. metadata +243 -0
@@ -0,0 +1,125 @@
1
+ #
2
+ # oauth2_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Auth::OAuth2 do
10
+
11
+ before(:all) {
12
+ ConstantContact::Util::Config.configure do |config|
13
+ config[:auth].delete :api_key
14
+ config[:auth].delete :api_secret
15
+ config[:auth].delete :redirect_uri
16
+ end
17
+ }
18
+
19
+ describe "#new" do
20
+ it "fails without arguments and no configuration" do
21
+ lambda {
22
+ ConstantContact::Auth::OAuth2.new
23
+ }.should raise_error(ArgumentError)
24
+ end
25
+
26
+ it "takes one argument" do
27
+ opts = {:api_key => 'api key', :api_secret => 'secret', :redirect_url => 'redirect url'}
28
+ lambda {
29
+ ConstantContact::Auth::OAuth2.new(opts)
30
+ }.should_not raise_error
31
+ end
32
+ end
33
+
34
+ context "with middle-ware configuration" do
35
+ before(:all) do
36
+ ConstantContact::Util::Config.configure do |config|
37
+ config[:auth][:api_key] = "config_api_key"
38
+ config[:auth][:api_secret] = "config_api_secret"
39
+ config[:auth][:redirect_uri] = "config_redirect_uri"
40
+ end
41
+ end
42
+ let(:proc) { lambda { ConstantContact::Auth::OAuth2.new } }
43
+ it "without error" do
44
+ proc.should_not raise_error
45
+ end
46
+ let(:oauth) { proc.call }
47
+ it "has correct api_key" do
48
+ oauth.client_id.should == "config_api_key"
49
+ end
50
+ it "has correct api_secret" do
51
+ oauth.client_secret.should == "config_api_secret"
52
+ end
53
+ it "has correct redirect_uri" do
54
+ oauth.redirect_uri.should == "config_redirect_uri"
55
+ end
56
+ end
57
+
58
+ context "with middle-ware configuration and explicit opts" do
59
+ before(:all) do
60
+ ConstantContact::Util::Config.configure do |config|
61
+ config[:auth][:api_key] = "config_api_key"
62
+ config[:auth][:api_secret] = "config_api_secret"
63
+ config[:auth][:redirect_uri] = "config_redirect_uri"
64
+ end
65
+ end
66
+ let(:proc) { lambda { ConstantContact::Auth::OAuth2.new :api_key => 'explicit_api_key', :api_secret => 'explicit_api_secret', :redirect_url => 'explicit_redirect_uri' } }
67
+ it "without error" do
68
+ proc.should_not raise_error
69
+ end
70
+ let(:oauth) { proc.call }
71
+ it "has correct api_key" do
72
+ oauth.client_id.should == "explicit_api_key"
73
+ end
74
+ it "has correct api_secret" do
75
+ oauth.client_secret.should == "explicit_api_secret"
76
+ end
77
+ it "has correct redirect_uri" do
78
+ oauth.redirect_uri.should == "explicit_redirect_uri"
79
+ end
80
+ end
81
+
82
+ it "with explicit arguments and no configuration" do
83
+ lambda {
84
+ ConstantContact::Auth::OAuth2.new :api_key => "api_key", :api_secret => "api_secret", :redirect_url => "redirect_uri"
85
+ }.should_not raise_error
86
+ end
87
+
88
+ let(:proc) { lambda { ConstantContact::Auth::OAuth2.new(:api_key => "api_key", :api_secret => "api_secret", :redirect_url => "redirect_uri") } }
89
+ let(:oauth) { proc.call }
90
+
91
+ describe "#get_authorization_url" do
92
+ it "returns a string" do
93
+ oauth.get_authorization_url.should be_kind_of(String)
94
+ oauth.get_authorization_url(true, 'my_param').should match('state=my_param')
95
+ end
96
+ end
97
+
98
+ describe "#get_access_token" do
99
+ it "returns a Hash" do
100
+ json = load_file('access_token.json')
101
+ RestClient.stub(:post).and_return(json)
102
+ oauth.get_access_token('token').should be_kind_of(Hash)
103
+ end
104
+
105
+ it "throws an OAuth2Exception in case of error" do
106
+ json = load_file('access_token_error.json')
107
+ RestClient.stub(:post).and_return(json)
108
+ lambda {
109
+ oauth.get_access_token('token')
110
+ }.should raise_exception(ConstantContact::Exceptions::OAuth2Exception,
111
+ 'The resource owner or authorization server denied the request.')
112
+ end
113
+ end
114
+
115
+ describe "#get_token_info" do
116
+ it "returns a Hash" do
117
+ json = load_file('token_info.json')
118
+ RestClient.stub(:post).and_return(json)
119
+ info = oauth.get_token_info('token')
120
+ info.should be_kind_of(Hash)
121
+ info['user_name'].should eq('ctcttest')
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # address_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Components::Address do
10
+ describe "#from_list" do
11
+ it "should return an address" do
12
+ json = load_file('address.json')
13
+ address = ConstantContact::Components::Address.create(JSON.parse(json))
14
+
15
+ address.line1.should eq('6 Main Street')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # contact_list_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Components::ContactList do
10
+ describe "#from_list" do
11
+ it "should return a list" do
12
+ json = load_file('list.json')
13
+ list = ConstantContact::Components::ContactList.create(JSON.parse(json))
14
+
15
+ list.name.should eq('Fake List')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # contact_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Components::Contact do
10
+ describe "#from_list" do
11
+ it "should return a contact" do
12
+ json = load_file('contact.json')
13
+ contact = ConstantContact::Components::Contact.create(JSON.parse(json))
14
+
15
+ contact.last_name.should eq('Smith')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # custom_field_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Components::CustomField do
10
+ describe "#from_list" do
11
+ it "should return a custom field" do
12
+ json = '{"name":"Property", "value":"Private"}'
13
+ field = ConstantContact::Components::CustomField.create(JSON.parse(json))
14
+
15
+ field.name.should eq('Property')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # email_address_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Components::EmailAddress do
10
+ describe "#from_list" do
11
+ it "should return an email address" do
12
+ json = load_file('email_address.json')
13
+ email = ConstantContact::Components::EmailAddress.create(JSON.parse(json))
14
+
15
+ email.email_address.should eq('wm2q7rwtp77m@roving.com')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
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::SDK do
10
+
11
+ let(:dummy_class) { Class.new { include ConstantContact::SDK } }
12
+
13
+ it "should respond to VERSION" do
14
+ expect((dummy_class.const_get("VERSION") rescue nil)).to be_true
15
+ end
16
+
17
+ it "should have a VERSION of type string" do
18
+ expect(dummy_class::VERSION).to be_a String
19
+ end
20
+
21
+ it "should have a VERSION of the format x.y.z" do
22
+ expect(dummy_class::VERSION.match(/[1-9]+\.\d+\.\d+/)).to_not be_nil
23
+ end
24
+ end
@@ -0,0 +1,46 @@
1
+ #
2
+ # account_service_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Services::AccountService do
10
+ before(:each) do
11
+ @request = double('http request', :user => nil, :password => nil, :url => 'http://example.com', :redirection_history => nil)
12
+ end
13
+
14
+ describe "#get_account_info" do
15
+ it "gets a summary of account information" do
16
+ json_response = load_file('account_info_response.json')
17
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
18
+
19
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
20
+ RestClient.stub(:get).and_return(response)
21
+
22
+ result = ConstantContact::Services::AccountService.get_account_info()
23
+ result.should be_kind_of(ConstantContact::Components::AccountInfo)
24
+ result.website.should eq('http://www.example.com')
25
+ result.organization_addresses.first.should be_kind_of(ConstantContact::Components::AccountAddress)
26
+ result.organization_addresses.first.city.should eq('Anytown')
27
+ end
28
+ end
29
+
30
+ describe "#get_verified_email_addresses" do
31
+ it "gets all verified email addresses associated with an account" do
32
+ json_response = load_file('verified_email_addresses_response.json')
33
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
34
+
35
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
36
+ RestClient.stub(:get).and_return(response)
37
+
38
+ params = {}
39
+ email_addresses = ConstantContact::Services::AccountService.get_verified_email_addresses(params)
40
+
41
+ email_addresses.should be_kind_of(Array)
42
+ email_addresses.first.should be_kind_of(ConstantContact::Components::VerifiedEmailAddress)
43
+ email_addresses.first.email_address.should eq('abc@def.com')
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,244 @@
1
+ #
2
+ # activity_service_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Services::ActivityService do
10
+ before(:each) do
11
+ @request = double('http request', :user => nil, :password => nil, :url => 'http://example.com', :redirection_history => nil)
12
+ end
13
+
14
+ describe "#get_activities" do
15
+ it "gets a set of activities" do
16
+ json_response = load_file('activities_response.json')
17
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
18
+
19
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
20
+ RestClient.stub(:get).and_return(response)
21
+
22
+ activities = ConstantContact::Services::ActivityService.get_activities()
23
+ activities.first.should be_kind_of(ConstantContact::Components::Activity)
24
+ activities.first.type.should eq('REMOVE_CONTACTS_FROM_LISTS')
25
+ end
26
+ end
27
+
28
+ describe "#get_activity" do
29
+ it "gets an activity" do
30
+ json_response = load_file('activity_response.json')
31
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
32
+
33
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
34
+ RestClient.stub(:get).and_return(response)
35
+
36
+ activity = ConstantContact::Services::ActivityService.get_activity('a07e1ilbm7shdg6ikeo')
37
+ activity.should be_kind_of(ConstantContact::Components::Activity)
38
+ activity.type.should eq('REMOVE_CONTACTS_FROM_LISTS')
39
+ end
40
+ end
41
+
42
+ describe "#create_add_contacts_activity" do
43
+ it "creates an Add Contacts Activity" do
44
+ json_request = load_file('add_contacts_request.json')
45
+ json_response = load_file('add_contacts_response.json')
46
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
47
+
48
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
49
+ RestClient.stub(:post).and_return(response)
50
+
51
+ contacts = []
52
+
53
+ # first contact
54
+ import = ConstantContact::Components::AddContactsImportData.new({
55
+ :first_name => "John",
56
+ :last_name => "Smith",
57
+ :birthday_month => "1",
58
+ :birthday_day => "25",
59
+ :anniversary => "03/12/2005",
60
+ :job_title => "",
61
+ :company_name => "My Company",
62
+ :home_phone => "5555551212"
63
+ })
64
+
65
+ # add emails
66
+ import.add_email("user1@example.com")
67
+
68
+ # add addresses
69
+ address = ConstantContact::Components::Address.create(
70
+ :line1 => "123 Partridge Lane",
71
+ :line2 => "Apt. 3",
72
+ :city => "Anytown",
73
+ :address_type => "PERSONAL",
74
+ :state_code => "NH",
75
+ :country_code => "US",
76
+ :postal_code => "02145"
77
+ )
78
+ import.add_address(address)
79
+
80
+ contacts << import
81
+
82
+ # second contact
83
+ import = ConstantContact::Components::AddContactsImportData.new({
84
+ :first_name => "Jane",
85
+ :last_name => "Doe",
86
+ :job_title => "",
87
+ :company_name => "Acme, Inc.",
88
+ :home_phone => "5555551213"
89
+ })
90
+
91
+ # add emails
92
+ import.add_email("user2@example.com")
93
+
94
+ # add addresses
95
+ address = ConstantContact::Components::Address.create(
96
+ :line1 => "456 Jones Road",
97
+ :city => "AnyTownShip",
98
+ :address_type => "PERSONAL",
99
+ :state_code => "DE",
100
+ :country_code => "US",
101
+ :postal_code => "01234"
102
+ )
103
+ import.add_address(address)
104
+
105
+ # add custom fields
106
+ custom_field = ConstantContact::Components::CustomField.create(
107
+ :name => "custom_field_6",
108
+ :value => "Blue Jeans"
109
+ )
110
+ import.add_custom_field(custom_field)
111
+
112
+ custom_field = ConstantContact::Components::CustomField.create(
113
+ :name => "custom_field_12",
114
+ :value => "Special Order"
115
+ )
116
+ import.add_custom_field(custom_field)
117
+
118
+ contacts << import
119
+
120
+ lists = ['4', '5', '6']
121
+
122
+ add_contact = ConstantContact::Components::AddContacts.new(contacts, lists)
123
+
124
+ JSON.parse(json_request).should eq(JSON.parse(JSON.generate(add_contact)))
125
+
126
+ activity = ConstantContact::Services::ActivityService.create_add_contacts_activity(add_contact)
127
+ activity.should be_kind_of(ConstantContact::Components::Activity)
128
+ activity.type.should eq('ADD_CONTACTS')
129
+ end
130
+ end
131
+
132
+ describe "#create_add_contacts_activity_from_file" do
133
+ it "creates an Add Contacts Activity from a file" do
134
+ content = load_file('add_contacts_request.csv')
135
+ json = load_file('add_contacts_response.json')
136
+ lists = 'list1, list2'
137
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
138
+
139
+ response = RestClient::Response.create(json, net_http_resp, {}, @request)
140
+ RestClient.stub(:post).and_return(response)
141
+
142
+ activity = ConstantContact::Services::ActivityService.create_add_contacts_activity_from_file(
143
+ 'contacts.txt', content, lists)
144
+ activity.should be_kind_of(ConstantContact::Components::Activity)
145
+ activity.type.should eq('ADD_CONTACTS')
146
+ end
147
+ end
148
+
149
+ describe "#add_clear_lists_activity" do
150
+ it "creates a Clear Lists Activity" do
151
+ json_clear_lists = load_file('clear_lists_response.json')
152
+ json_list = load_file('list_response.json')
153
+
154
+ lists = []
155
+ lists << ConstantContact::Components::ContactList.create(JSON.parse(json_list))
156
+
157
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
158
+
159
+ response = RestClient::Response.create(json_clear_lists, net_http_resp, {}, @request)
160
+ RestClient.stub(:post).and_return(response)
161
+
162
+ activity = ConstantContact::Services::ActivityService.add_clear_lists_activity(lists)
163
+ activity.should be_kind_of(ConstantContact::Components::Activity)
164
+ activity.type.should eq('CLEAR_CONTACTS_FROM_LISTS')
165
+ end
166
+ end
167
+
168
+ describe "#add_remove_contacts_from_lists_activity" do
169
+ it "creates a Remove Contacts From Lists Activity" do
170
+ json = load_file('remove_contacts_response.json')
171
+ lists = 'list1, list2'
172
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
173
+
174
+ response = RestClient::Response.create(json, net_http_resp, {}, @request)
175
+ RestClient.stub(:post).and_return(response)
176
+ email_addresses = ["djellesma@constantcontact.com"]
177
+
178
+ activity = ConstantContact::Services::ActivityService.add_remove_contacts_from_lists_activity(
179
+ email_addresses, lists)
180
+ activity.should be_kind_of(ConstantContact::Components::Activity)
181
+ activity.type.should eq('REMOVE_CONTACTS_FROM_LISTS')
182
+ end
183
+ end
184
+
185
+ describe "#add_remove_contacts_from_lists_activity_from_file" do
186
+ it "creates a Remove Contacts Activity from a file" do
187
+ content = load_file('remove_contacts_request.txt')
188
+ json = load_file('remove_contacts_response.json')
189
+ lists = 'list1, list2'
190
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
191
+
192
+ response = RestClient::Response.create(json, net_http_resp, {}, @request)
193
+ RestClient.stub(:post).and_return(response)
194
+
195
+ activity = ConstantContact::Services::ActivityService.add_remove_contacts_from_lists_activity_from_file(
196
+ 'contacts.txt', content, lists)
197
+ activity.should be_kind_of(ConstantContact::Components::Activity)
198
+ activity.type.should eq('REMOVE_CONTACTS_FROM_LISTS')
199
+ end
200
+ end
201
+
202
+ describe "#add_export_contacts_activity" do
203
+ it "creates an Export Contacts Activity" do
204
+ json_request = load_file('export_contacts_request.json')
205
+ json_response = load_file('export_contacts_response.json')
206
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
207
+
208
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
209
+ RestClient.stub(:post).and_return(response)
210
+
211
+ export_contacts = ConstantContact::Components::ExportContacts.new(JSON.parse(json_request))
212
+
213
+ activity = ConstantContact::Services::ActivityService.add_export_contacts_activity(export_contacts)
214
+ activity.should be_kind_of(ConstantContact::Components::Activity)
215
+ activity.type.should eq('EXPORT_CONTACTS')
216
+ end
217
+ end
218
+
219
+ describe "#add_remove_contacts_from_lists_activity" do
220
+ it "creates a Remove Contacts From Lists Activity" do
221
+ json_request = load_file('remove_contacts_from_lists_request.json')
222
+ json_response = load_file('remove_contacts_from_lists_response.json')
223
+ net_http_resp = Net::HTTPResponse.new(1.0, 200, 'OK')
224
+
225
+ response = RestClient::Response.create(json_response, net_http_resp, {}, @request)
226
+ RestClient.stub(:post).and_return(response)
227
+
228
+ request_object = JSON.parse(json_request)
229
+
230
+ lists = [], email_addresses = []
231
+ request_object['lists'].each do |list|
232
+ lists << ConstantContact::Components::ContactList.create(:id => list)
233
+ end
234
+ request_object['import_data'].each do |data|
235
+ data['email_addresses'].each do |email_address|
236
+ email_addresses << email_address
237
+ end
238
+ end
239
+
240
+ activity = ConstantContact::Services::ActivityService.add_remove_contacts_from_lists_activity(email_addresses, lists)
241
+ activity.type.should eq('REMOVE_CONTACTS_FROM_LISTS')
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,50 @@
1
+ #
2
+ # base_service_spec.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ require 'spec_helper'
8
+
9
+ describe ConstantContact::Services::BaseService do
10
+ describe "#get_headers" do
11
+ it "gets a hash of headers" do
12
+ token = 'foo'
13
+ ConstantContact::Services::BaseService.access_token = token
14
+ headers = ConstantContact::Services::BaseService.send(:get_headers)
15
+
16
+ expect(headers).to be_a Hash
17
+ expect(headers[:content_type]).to be_a String
18
+ expect(headers[:content_type]).to eq('application/json')
19
+ expect(headers[:accept]).to be_a String
20
+ expect(headers[:accept]).to eq('application/json')
21
+ expect(headers[:authorization]).to be_a String
22
+ expect(headers[:authorization]).to eq("Bearer #{token}")
23
+ expect(headers[:user_agent]).to be_a String
24
+ expect(headers[:user_agent].include?("Ruby SDK v#{ConstantContact::SDK::VERSION}")).to be_true
25
+ expect(headers[:user_agent].include?(RUBY_DESCRIPTION)).to be_true
26
+ expect(headers[:x_ctct_request_source]).to be_a String
27
+ expect(headers[:x_ctct_request_source].include?(ConstantContact::SDK::VERSION)).to be_true
28
+ end
29
+ end
30
+
31
+ describe "#build_url" do
32
+ it "combines all the given parameters into the url" do
33
+ components = ConstantContact::Services::BaseService.send(:build_url, "http://testing.com", :arg1 => 'abc', :arg2 => 123).split('&')
34
+ expect(components[0]).to eq('http://testing.com?api_key=api+key')
35
+ expect(components.length).to eq(3)
36
+ expect(components.include?('arg1=abc')).to be_true
37
+ expect(components.include?('arg2=123')).to be_true
38
+ end
39
+
40
+ it "does not parse the next param when not in next_link format" do
41
+ url = ConstantContact::Services::BaseService.send(:build_url, "http://testing.com", :next => "abcdef")
42
+ expect(url).to eq('http://testing.com?api_key=api+key&next=abcdef')
43
+ end
44
+
45
+ it "parses next id from next param given in next_link format" do
46
+ url = ConstantContact::Services::BaseService.send(:build_url, "http://testing.com", :next => "/some/path?next=abcdefg")
47
+ expect(url).to eq('http://testing.com?api_key=api+key&next=abcdefg')
48
+ end
49
+ end
50
+ end