soapy_bing 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.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.env +6 -0
  3. data/.gitignore +6 -0
  4. data/.rspec +2 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +6 -0
  7. data/README.md +63 -0
  8. data/Rakefile +7 -0
  9. data/circle.yml +6 -0
  10. data/lib/soapy_bing/account.rb +12 -0
  11. data/lib/soapy_bing/ads/reports/base.rb +83 -0
  12. data/lib/soapy_bing/ads/reports/campaign_performance_report.rb +23 -0
  13. data/lib/soapy_bing/ads/reports/parsers/csv_parser.rb +45 -0
  14. data/lib/soapy_bing/ads/reports/parsers.rb +1 -0
  15. data/lib/soapy_bing/ads/reports.rb +3 -0
  16. data/lib/soapy_bing/ads.rb +22 -0
  17. data/lib/soapy_bing/helpers/class_name.rb +9 -0
  18. data/lib/soapy_bing/helpers.rb +1 -0
  19. data/lib/soapy_bing/oauth_credentials.rb +43 -0
  20. data/lib/soapy_bing/param_guard.rb +26 -0
  21. data/lib/soapy_bing/soap/request/base.rb +37 -0
  22. data/lib/soapy_bing/soap/request/poll_generate_report_request.rb +33 -0
  23. data/lib/soapy_bing/soap/request/submit_generate_report_request.rb +16 -0
  24. data/lib/soapy_bing/soap/request.rb +3 -0
  25. data/lib/soapy_bing/soap/response/base.rb +16 -0
  26. data/lib/soapy_bing/soap/response/payload.rb +15 -0
  27. data/lib/soapy_bing/soap/response/poll_generate_report_response.rb +13 -0
  28. data/lib/soapy_bing/soap/response/report_status.rb +33 -0
  29. data/lib/soapy_bing/soap/response/submit_generate_report_response.rb +11 -0
  30. data/lib/soapy_bing/soap/response.rb +5 -0
  31. data/lib/soapy_bing/soap/template_renderer.rb +21 -0
  32. data/lib/soapy_bing/soap/templates/poll_generate_report.erb.xml +18 -0
  33. data/lib/soapy_bing/soap/templates/submit_generate_report.erb.xml +46 -0
  34. data/lib/soapy_bing/soap.rb +3 -0
  35. data/lib/soapy_bing/version.rb +3 -0
  36. data/lib/soapy_bing.rb +11 -0
  37. data/lib/tasks/console.rake +5 -0
  38. data/lib/tasks/coverage.rake +6 -0
  39. data/lib/tasks/spec.rake +4 -0
  40. data/soapy_bing.gemspec +34 -0
  41. data/spec/fixtures/reports/campaign_performance_report.csv +37 -0
  42. data/spec/fixtures/reports/campaign_performance_report.json +146 -0
  43. data/spec/fixtures/soap_templates/simple.erb.xml +2 -0
  44. data/spec/fixtures/vcr_cassettes/campaign_performance_report/with_pending_status.yml +168 -0
  45. data/spec/fixtures/vcr_cassettes/campaign_performance_report/with_successful_status.yml +284 -0
  46. data/spec/fixtures/vcr_cassettes/oauth_credentials/access_token/with_successful_status.yml +42 -0
  47. data/spec/integration/soapy_bing/ads/reports/campaign_performance_report_spec.rb +39 -0
  48. data/spec/integration/soapy_bing/oauth_credentials_spec.rb +10 -0
  49. data/spec/simplecov_setup.rb +9 -0
  50. data/spec/soapy_bing/account_spec.rb +80 -0
  51. data/spec/soapy_bing/ads/reports/campaign_performance_report_spec.rb +41 -0
  52. data/spec/soapy_bing/ads/reports/parsers/csv_parser_spec.rb +31 -0
  53. data/spec/soapy_bing/ads_spec.rb +32 -0
  54. data/spec/soapy_bing/helpers/class_name_spec.rb +14 -0
  55. data/spec/soapy_bing/oauth_credentials_spec.rb +108 -0
  56. data/spec/soapy_bing/param_guard_spec.rb +43 -0
  57. data/spec/soapy_bing/soap/request/base_spec.rb +54 -0
  58. data/spec/soapy_bing/soap/request/poll_generate_report_request_spec.rb +59 -0
  59. data/spec/soapy_bing/soap/response/base_spec.rb +12 -0
  60. data/spec/soapy_bing/soap/response/payload_spec.rb +25 -0
  61. data/spec/soapy_bing/soap/response/poll_generate_report_response_spec.rb +25 -0
  62. data/spec/soapy_bing/soap/response/report_status_spec.rb +91 -0
  63. data/spec/soapy_bing/soap/response/submit_generate_report_response_spec.rb +19 -0
  64. data/spec/soapy_bing/soap/template_renderer_spec.rb +24 -0
  65. data/spec/spec_helper.rb +32 -0
  66. data/spec/support/dotenv.rb +3 -0
  67. data/spec/support/vcr.rb +101 -0
  68. metadata +305 -0
@@ -0,0 +1,284 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://login.live.com/oauth20_token.srf
6
+ body:
7
+ encoding: UTF-8
8
+ string: client_id=bing-ads-oauth-client-id&client_secret=bing-ads-oauth-client-secret&grant_type=refresh_token&refresh_token=bing-ads-oauth-refresh-token
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Cache-Control:
22
+ - no-store
23
+ Pragma:
24
+ - no-cache
25
+ Content-Length:
26
+ - '1317'
27
+ Content-Type:
28
+ - application/json
29
+ Server:
30
+ - Microsoft-IIS/8.5
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ Date:
34
+ - Fri, 13 Nov 2015 14:23:33 GMT
35
+ Connection:
36
+ - close
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"token_type":"bearer","expires_in":3600,"scope":"bingads.manage","access_token":"bing-ads-oauth-authentication-token","refresh_token":"bing-ads-oauth-refresh-token","user_id":"bing-ads-oauth-user-id"}'
40
+ http_version:
41
+ recorded_at: Fri, 13 Nov 2015 14:23:34 GMT
42
+ - request:
43
+ method: post
44
+ uri: https://reporting.api.bingads.microsoft.com/Api/Advertiser/Reporting/V9/ReportingService.svc
45
+ body:
46
+ encoding: UTF-8
47
+ string: |
48
+ <?xml version="1.0" encoding="UTF-8"?>
49
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
50
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
51
+ xmlns:tns="https://bingads.microsoft.com/Reporting/v9"
52
+ xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
53
+ xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
54
+ <env:Header>
55
+ <tns:CustomerAccountId>bing-ads-account-id</tns:CustomerAccountId>
56
+ <tns:CustomerId>bing-ads-customer-id</tns:CustomerId>
57
+ <tns:DeveloperToken>bing-ads-developer-token</tns:DeveloperToken>
58
+ <tns:AuthenticationToken>bing-ads-oauth-authentication-token</tns:AuthenticationToken>
59
+ </env:Header>
60
+ <env:Body>
61
+ <tns:SubmitGenerateReportRequest>
62
+ <tns:ReportRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:type="tns:CampaignPerformanceReportRequest">
63
+ <tns:Format>Csv</tns:Format>
64
+ <tns:Language>English</tns:Language>
65
+ <tns:ReportName>MyReport</tns:ReportName>
66
+ <tns:ReturnOnlyCompleteData>false</tns:ReturnOnlyCompleteData>
67
+ <tns:Aggregation>HourOfDay</tns:Aggregation>
68
+ <tns:Columns>
69
+ <tns:CampaignPerformanceReportColumn>TimePeriod</tns:CampaignPerformanceReportColumn>
70
+ <tns:CampaignPerformanceReportColumn>Impressions</tns:CampaignPerformanceReportColumn>
71
+ <tns:CampaignPerformanceReportColumn>Clicks</tns:CampaignPerformanceReportColumn>
72
+ <tns:CampaignPerformanceReportColumn>Spend</tns:CampaignPerformanceReportColumn>
73
+ </tns:Columns>
74
+ <tns:Scope>
75
+ <tns:AccountIds>
76
+ <arr:long>bing-ads-account-id</arr:long>
77
+ </tns:AccountIds>
78
+ </tns:Scope>
79
+ <tns:Time>
80
+ <tns:CustomDateRangeEnd>
81
+ <tns:Day>14</tns:Day>
82
+ <tns:Month>10</tns:Month>
83
+ <tns:Year>2015</tns:Year>
84
+ </tns:CustomDateRangeEnd>
85
+ <tns:CustomDateRangeStart>
86
+ <tns:Day>14</tns:Day>
87
+ <tns:Month>10</tns:Month>
88
+ <tns:Year>2015</tns:Year>
89
+ </tns:CustomDateRangeStart>
90
+ </tns:Time>
91
+ </tns:ReportRequest>
92
+ </tns:SubmitGenerateReportRequest>
93
+ </env:Body>
94
+ </env:Envelope>
95
+ headers:
96
+ Content-Type:
97
+ - text/xml;charset=UTF-8
98
+ Soapaction:
99
+ - SubmitGenerateReport
100
+ response:
101
+ status:
102
+ code: 200
103
+ message: OK
104
+ headers:
105
+ Content-Length:
106
+ - '396'
107
+ Content-Type:
108
+ - text/xml; charset=utf-8
109
+ Server:
110
+ - Microsoft-IIS/8.0
111
+ X-Powered-By:
112
+ - ASP.NET
113
+ Date:
114
+ - Fri, 13 Nov 2015 14:23:35 GMT
115
+ body:
116
+ encoding: UTF-8
117
+ string: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:TrackingId
118
+ xmlns:h="https://bingads.microsoft.com/Reporting/v9">bing-ads-report-tracking-id</h:TrackingId></s:Header><s:Body><SubmitGenerateReportResponse
119
+ xmlns="https://bingads.microsoft.com/Reporting/v9"><ReportRequestId>bing-ads-report-request-id</ReportRequestId></SubmitGenerateReportResponse></s:Body></s:Envelope>
120
+ http_version:
121
+ recorded_at: Fri, 13 Nov 2015 14:23:35 GMT
122
+ - request:
123
+ method: post
124
+ uri: https://reporting.api.bingads.microsoft.com/Api/Advertiser/Reporting/V9/ReportingService.svc
125
+ body:
126
+ encoding: UTF-8
127
+ string: |
128
+ <?xml version="1.0" encoding="UTF-8"?>
129
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
130
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
131
+ xmlns:tns="https://bingads.microsoft.com/Reporting/v9"
132
+ xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
133
+ xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
134
+ <env:Header>
135
+ <tns:CustomerAccountId>bing-ads-account-id</tns:CustomerAccountId>
136
+ <tns:CustomerId>bing-ads-customer-id</tns:CustomerId>
137
+ <tns:DeveloperToken>bing-ads-developer-token</tns:DeveloperToken>
138
+ <tns:AuthenticationToken>bing-ads-oauth-authentication-token</tns:AuthenticationToken>
139
+ </env:Header>
140
+ <env:Body>
141
+ <tns:PollGenerateReportRequest>
142
+ <tns:ReportRequestId xsi:nil="false">bing-ads-report-request-id</tns:ReportRequestId>
143
+ </tns:PollGenerateReportRequest>
144
+ </env:Body>
145
+ </env:Envelope>
146
+ headers:
147
+ Content-Type:
148
+ - text/xml;charset=UTF-8
149
+ Soapaction:
150
+ - PollGenerateReport
151
+ response:
152
+ status:
153
+ code: 200
154
+ message: OK
155
+ headers:
156
+ Content-Length:
157
+ - '493'
158
+ Content-Type:
159
+ - text/xml; charset=utf-8
160
+ Server:
161
+ - Microsoft-IIS/8.0
162
+ X-Powered-By:
163
+ - ASP.NET
164
+ Date:
165
+ - Fri, 13 Nov 2015 14:23:36 GMT
166
+ body:
167
+ encoding: UTF-8
168
+ string: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:TrackingId
169
+ xmlns:h="https://bingads.microsoft.com/Reporting/v9">bing-ads-report-tracking-id</h:TrackingId></s:Header><s:Body><PollGenerateReportResponse
170
+ xmlns="https://bingads.microsoft.com/Reporting/v9"><ReportRequestStatus xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ReportDownloadUrl
171
+ i:nil="true"/><Status>Pending</Status></ReportRequestStatus></PollGenerateReportResponse></s:Body></s:Envelope>
172
+ http_version:
173
+ recorded_at: Fri, 13 Nov 2015 14:23:36 GMT
174
+ - request:
175
+ method: post
176
+ uri: https://reporting.api.bingads.microsoft.com/Api/Advertiser/Reporting/V9/ReportingService.svc
177
+ body:
178
+ encoding: UTF-8
179
+ string: |
180
+ <?xml version="1.0" encoding="UTF-8"?>
181
+ <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
182
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
183
+ xmlns:tns="https://bingads.microsoft.com/Reporting/v9"
184
+ xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
185
+ xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
186
+ <env:Header>
187
+ <tns:CustomerAccountId>bing-ads-account-id</tns:CustomerAccountId>
188
+ <tns:CustomerId>bing-ads-customer-id</tns:CustomerId>
189
+ <tns:DeveloperToken>bing-ads-developer-token</tns:DeveloperToken>
190
+ <tns:AuthenticationToken>bing-ads-oauth-authentication-token</tns:AuthenticationToken>
191
+ </env:Header>
192
+ <env:Body>
193
+ <tns:PollGenerateReportRequest>
194
+ <tns:ReportRequestId xsi:nil="false">bing-ads-report-request-id</tns:ReportRequestId>
195
+ </tns:PollGenerateReportRequest>
196
+ </env:Body>
197
+ </env:Envelope>
198
+ headers:
199
+ Content-Type:
200
+ - text/xml;charset=UTF-8
201
+ Soapaction:
202
+ - PollGenerateReport
203
+ response:
204
+ status:
205
+ code: 200
206
+ message: OK
207
+ headers:
208
+ Content-Length:
209
+ - '937'
210
+ Content-Type:
211
+ - text/xml; charset=utf-8
212
+ Server:
213
+ - Microsoft-IIS/8.0
214
+ X-Powered-By:
215
+ - ASP.NET
216
+ Date:
217
+ - Fri, 13 Nov 2015 14:23:42 GMT
218
+ body:
219
+ encoding: UTF-8
220
+ string: <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:TrackingId
221
+ xmlns:h="https://bingads.microsoft.com/Reporting/v9">bing-ads-report-tracking-id</h:TrackingId></s:Header><s:Body><PollGenerateReportResponse
222
+ xmlns="https://bingads.microsoft.com/Reporting/v9"><ReportRequestStatus xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ReportDownloadUrl>https://download.api.bingads.microsoft.com/ReportDownload/Download.aspx?q=bing-ads-report-download-id</ReportDownloadUrl><Status>Success</Status></ReportRequestStatus></PollGenerateReportResponse></s:Body></s:Envelope>
223
+ http_version:
224
+ recorded_at: Fri, 13 Nov 2015 14:23:42 GMT
225
+ - request:
226
+ method: get
227
+ uri: https://download.api.bingads.microsoft.com/ReportDownload/Download.aspx?q=bing-ads-report-download-id
228
+ body:
229
+ encoding: US-ASCII
230
+ string: ''
231
+ headers:
232
+ Accept-Encoding:
233
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
234
+ Accept:
235
+ - "*/*"
236
+ User-Agent:
237
+ - Ruby
238
+ response:
239
+ status:
240
+ code: 200
241
+ message: OK
242
+ headers:
243
+ Cache-Control:
244
+ - private
245
+ Content-Length:
246
+ - '875'
247
+ Content-Type:
248
+ - application/x-zip-compressed
249
+ Server:
250
+ - Microsoft-IIS/8.0
251
+ Content-Disposition:
252
+ - attachment; filename="MyReport.zip"
253
+ X-Aspnet-Version:
254
+ - 4.0.30319
255
+ X-Powered-By:
256
+ - ASP.NET
257
+ Date:
258
+ - Fri, 13 Nov 2015 14:23:43 GMT
259
+ body:
260
+ encoding: ASCII-8BIT
261
+ string: !binary |-
262
+ UEsDBBQAAAAIAPCYb0c2Z8CWHQIAAPkDAAAUAE8AMzAwMDAwMDYyNjA5ODY2
263
+ Ny5jc3ZOVS4ATlVDWBQAMwAwADAAMAAwADAAMAA2ADIANgAwADkAOAA2ADYA
264
+ NwAuAGMAcwB2AHVwGQABF2t/LTMwMDAwMDA2MjYwOTg2NjcuY3N2hFNLjtQw
265
+ EN0jcQcrK5CQ21X+JrvWIGAkGhCMWLAL3e4mIt1uJelBvUNwC24wZ2CBxNyE
266
+ C3AFXOWMxAoWieP3/F69sp3f339Ur+MxDZN40e5jI1bnMq3u37sjrjoiQC3A
267
+ LFCBJYow8S4dMvG2Hbp0Ggl93o6TuEj7Yx+nuBHL67br2/d9FI/bc3aABTh2
268
+ ENgY1Sgllivx4Onq6uE/xc/Safives663O2GuGunLh0aFoq0FZv2/NeSJ10/
269
+ xWxI0Ks0xcPUtb24PKzn0jns1DZiGk6RVenT2Ag0+TvPyPLlNrdTPaou98ch
270
+ jmMuNebZRd+tP9LHm2M8bEip8kT7WucBbF3nwaN0vH1AlHW0AgwS5azUgSgk
271
+ CrwnCr3Ng/WyRqLICaE2eQiGRDpIxyKCQHMpq8kcjQSKXJGBd5Yh9gSpPBGO
272
+ 9CWcIYWTWZhxXmQphWWVNI7gQEVJg4SCBE5EIYBQepREdgY1A5pB0AzCDCKD
273
+ qmaQmyUUAsNBMcypgHsPnMFyl0BtektvrZGTy1CMaG2tiTH8hlq6Upfdy35a
274
+ zo76jir7gYUKhZoTBKYUU4q6RJShhOCeMXA/XBe99Nw48nl6FvvAB2Sl5e3D
275
+ ciieU2PxNRI5B5ZdKLfB8UqvpSq3QfMxG96R0rqvpZ1v4+3XX5+/3X75ecO/
276
+ xapbD2lMW/qLhnzV+S+QYtn3Yuh2H6ZR5Osah+u4kaL6AwAA//8DAFBLAQIt
277
+ ABQAAAAIAPCYb0c2Z8CWHQIAAPkDAAAUAHUAAAAAAAAAAAAAAAAAAAAzMDAw
278
+ MDAwNjI2MDk4NjY3LmNzdk5VMABOVUNYFAAAADMAMAAwADAAMAAwADAANgAy
279
+ ADYAMAA5ADgANgA2ADcALgBjAHMAdgAKACAAAAAAAAEAGAD8qUTvGyDRAfyp
280
+ RO8bINEBN3BD7xsg0QF1cBkAARdrfy0zMDAwMDAwNjI2MDk4NjY3LmNzdlBL
281
+ BQYAAAAAAQABALcAAACeAgAAAAA=
282
+ http_version:
283
+ recorded_at: Fri, 13 Nov 2015 14:23:43 GMT
284
+ recorded_with: VCR 3.0.0
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://login.live.com/oauth20_token.srf
6
+ body:
7
+ encoding: UTF-8
8
+ string: client_id=bing-ads-oauth-client-id&client_secret=bing-ads-oauth-client-secret&grant_type=refresh_token&refresh_token=bing-ads-oauth-refresh-token
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Cache-Control:
22
+ - no-store
23
+ Pragma:
24
+ - no-cache
25
+ Content-Length:
26
+ - '1317'
27
+ Content-Type:
28
+ - application/json
29
+ Server:
30
+ - Microsoft-IIS/8.5
31
+ X-Content-Type-Options:
32
+ - nosniff
33
+ Date:
34
+ - Fri, 13 Nov 2015 14:23:33 GMT
35
+ Connection:
36
+ - close
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"token_type":"bearer","expires_in":3600,"scope":"bingads.manage","access_token":"bing-ads-oauth-authentication-token","refresh_token":"bing-ads-oauth-refresh-token","user_id":"bing-ads-oauth-user-id"}'
40
+ http_version:
41
+ recorded_at: Fri, 13 Nov 2015 14:23:33 GMT
42
+ recorded_with: VCR 3.0.0
@@ -0,0 +1,39 @@
1
+ require 'json'
2
+
3
+ RSpec.describe SoapyBing::Ads::Reports::CampaignPerformanceReport do
4
+ let(:service) { SoapyBing::Ads.new }
5
+ let(:report) do
6
+ service.campaign_performance_report(
7
+ date_start: '2015-10-14',
8
+ date_end: '2015-10-14',
9
+ # CampaignName is considered to be a sensitive data, lets not record it
10
+ settings: { columns: %w(TimePeriod Impressions Clicks Spend) }
11
+ )
12
+ end
13
+ let(:payload_fixture_path) do
14
+ File.join('spec', 'fixtures', 'reports', 'campaign_performance_report.json')
15
+ end
16
+ let(:fixtured_payload) { JSON.load(File.read(payload_fixture_path)) }
17
+
18
+ describe '#rows' do
19
+ subject { report.rows }
20
+
21
+ context 'when there is a successfull response during polling', :integration do
22
+ it 'responds with report rows',
23
+ vcr: { cassette_name: 'campaign_performance_report/with_successful_status' } do
24
+ expect(subject).to eq fixtured_payload
25
+ end
26
+ end
27
+
28
+ context 'when there is only pending responses during polling', :integration do
29
+ before { stub_const('SoapyBing::Soap::Request::PollGenerateReportRequest::POLLING_TRIES', 1) }
30
+
31
+ it 'throws exception PollingTimeoutError',
32
+ vcr: { cassette_name: 'campaign_performance_report/with_pending_status' } do
33
+ expect { subject }.to raise_error(
34
+ SoapyBing::Soap::Request::PollGenerateReportRequest::PollingTimeoutError
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,10 @@
1
+ RSpec.describe SoapyBing::OauthCredentials do
2
+ describe '#access_token' do
3
+ context 'on successful respose', :integration do
4
+ it 'responds with oauth access token',
5
+ vcr: { cassette_name: 'oauth_credentials/access_token/with_successful_status' } do
6
+ expect(subject.access_token).to eq 'bing-ads-oauth-authentication-token'
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ if ENV['CI'] || ENV['COVERAGE']
2
+ require 'simplecov'
3
+
4
+ SimpleCov.root(File.expand_path('../..', __FILE__))
5
+ SimpleCov.start do
6
+ minimum_coverage 100
7
+ add_filter '/spec/'
8
+ end
9
+ end
@@ -0,0 +1,80 @@
1
+ RSpec.describe SoapyBing::Account do
2
+ describe '#initialize' do
3
+ subject { described_class.new(account) }
4
+
5
+ context 'when account credentials passed explicitly' do
6
+ let(:account) do
7
+ { developer_token: 'foo', account_id: 'baz', customer_id: 'qux' }
8
+ end
9
+ before do
10
+ allow(ENV).to receive(:[]).with('BING_ADS_DEVELOPER_TOKEN').and_return('foo_env')
11
+ allow(ENV).to receive(:[]).with('BING_ADS_ACCOUNT_ID').and_return('baz_env')
12
+ allow(ENV).to receive(:[]).with('BING_ADS_CUSTOMER_ID').and_return('qux_env')
13
+ end
14
+
15
+ it '#developer_token is set' do
16
+ expect(subject.developer_token).to eq 'foo'
17
+ end
18
+
19
+ it '#account_id is set' do
20
+ expect(subject.account_id).to eq 'baz'
21
+ end
22
+
23
+ it '#customer_id is set' do
24
+ expect(subject.customer_id).to eq 'qux'
25
+ end
26
+ end
27
+
28
+ context 'when account credentials passed via Enviromenment variables' do
29
+ let(:account) { {} }
30
+ before do
31
+ allow(ENV).to receive(:[]).with('BING_ADS_DEVELOPER_TOKEN').and_return('foo_env')
32
+ allow(ENV).to receive(:[]).with('BING_ADS_ACCOUNT_ID').and_return('baz_env')
33
+ allow(ENV).to receive(:[]).with('BING_ADS_CUSTOMER_ID').and_return('qux_env')
34
+ end
35
+
36
+ it '#developer_token is set' do
37
+ expect(subject.developer_token).to eq 'foo_env'
38
+ end
39
+
40
+ it '#account_id is set' do
41
+ expect(subject.account_id).to eq 'baz_env'
42
+ end
43
+
44
+ it '#customer_id is set' do
45
+ expect(subject.customer_id).to eq 'qux_env'
46
+ end
47
+ end
48
+
49
+ context 'when no credentials passed' do
50
+ let(:account) do
51
+ { developer_token: 'foo', account_id: 'baz', customer_id: 'qux' }
52
+ end
53
+ before do
54
+ %w( BING_ADS_DEVELOPER_TOKEN
55
+ BING_ADS_ACCOUNT_ID
56
+ BING_ADS_CUSTOMER_ID ).each do |var|
57
+ allow(ENV).to receive(:[]).with(var).and_return(nil)
58
+ end
59
+ end
60
+
61
+ it 'throws exception on missing :developer_token' do
62
+ account.delete(:developer_token)
63
+ expect { subject }.to raise_error SoapyBing::ParamGuard::ParamRequiredError,
64
+ "developer_token have to be passed explicitly or via ENV['BING_ADS_DEVELOPER_TOKEN']"
65
+ end
66
+
67
+ it 'throws exception on missing :account_id' do
68
+ account.delete(:account_id)
69
+ expect { subject }.to raise_error SoapyBing::ParamGuard::ParamRequiredError,
70
+ "account_id have to be passed explicitly or via ENV['BING_ADS_ACCOUNT_ID']"
71
+ end
72
+
73
+ it 'throws exception on missing :customer_id' do
74
+ account.delete(:customer_id)
75
+ expect { subject }.to raise_error SoapyBing::ParamGuard::ParamRequiredError,
76
+ "customer_id have to be passed explicitly or via ENV['BING_ADS_CUSTOMER_ID']"
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,41 @@
1
+ require 'date'
2
+
3
+ RSpec.describe SoapyBing::Ads::Reports::CampaignPerformanceReport do
4
+ let(:report_options) { { oauth_credentials: nil, account: nil } }
5
+ subject { described_class.new report_options }
6
+
7
+ describe '#initialize' do
8
+ let(:wrong_date) { 'wrong_date' }
9
+
10
+ context 'when there is a wrong date format' do
11
+ before { report_options.merge!(date_start: wrong_date) }
12
+
13
+ let(:start_date) { 'wrong_date' }
14
+ it 'throws exception' do
15
+ expect { subject }.to raise_error(ArgumentError, 'invalid date')
16
+ end
17
+ end
18
+ end
19
+
20
+ describe '#date_range' do
21
+ let(:date_start) { '2011-01-01' }
22
+ let(:date_end) { '2015-12-31' }
23
+ before { report_options.merge!(date_start: date_start, date_end: date_end) }
24
+
25
+ it 'is instance of Range' do
26
+ expect(subject.date_range).to be_an_instance_of Range
27
+ end
28
+
29
+ context 'begin' do
30
+ it 'keeps initialized value' do
31
+ expect(subject.date_range.begin).to eq Date.parse(date_start)
32
+ end
33
+ end
34
+
35
+ context 'end' do
36
+ it 'keeps initialized value' do
37
+ expect(subject.date_range.end).to eq Date.parse(date_end)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,31 @@
1
+ require 'json'
2
+ require 'csv'
3
+
4
+ RSpec.describe SoapyBing::Ads::Reports::Parsers::CSVParser do
5
+ describe '#rows' do
6
+ subject { described_class.new(csv_data).rows }
7
+ context 'on valid CSV data' do
8
+ let(:csv_fixture_path) do
9
+ File.join('spec', 'fixtures', 'reports', 'campaign_performance_report.csv')
10
+ end
11
+ let(:csv_data) { File.read(csv_fixture_path) }
12
+
13
+ let(:json_fixture_path) do
14
+ File.join('spec', 'fixtures', 'reports', 'campaign_performance_report.json')
15
+ end
16
+ let(:json_data) { JSON.load(File.read(json_fixture_path)) }
17
+
18
+ it 'responds with array of Hashes' do
19
+ expect(subject).to eq json_data
20
+ end
21
+ end
22
+
23
+ context 'on malformed CSV data 'do
24
+ let(:csv_data) { '"co", "' }
25
+
26
+ it 'throws exception CSV::MalformedCSVError' do
27
+ expect { subject }.to raise_error CSV::MalformedCSVError
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ RSpec.describe SoapyBing::Ads do
2
+ let(:oauth) do
3
+ { client_id: 'foo', client_secret: 'bar', refresh_token: 'baz' }
4
+ end
5
+ let(:account) do
6
+ { developer_token: 'foo', account_id: 'baz', customer_id: 'qux' }
7
+ end
8
+ subject { described_class.new(oauth: oauth, account: account) }
9
+
10
+ describe '#oauth_credentials' do
11
+ it 'is instance of SoapyBing::OauthCredentials' do
12
+ expect(subject.oauth_credentials).to be_an_instance_of SoapyBing::OauthCredentials
13
+ end
14
+ end
15
+
16
+ describe '#account' do
17
+ it 'is instance of SoapyBing::Account' do
18
+ expect(subject.account).to be_an_instance_of SoapyBing::Account
19
+ end
20
+ end
21
+
22
+ describe '#campaign_performance_report' do
23
+ subject do
24
+ described_class
25
+ .new(oauth: oauth, account: account)
26
+ .campaign_performance_report(date_start: '2015-01-01', date_end: '2015-01-01')
27
+ end
28
+ it 'is instance of SoapyBing::Ads::Reports::CampaignPerformanceReport' do
29
+ expect(subject).to be_an_instance_of SoapyBing::Ads::Reports::CampaignPerformanceReport
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ RSpec.describe SoapyBing::Helpers::ClassName do
2
+ describe '#class_name' do
3
+ subject do
4
+ stub_const(
5
+ 'OUTERNS::INNERNS::MyClass',
6
+ Class.new.include(described_class)
7
+ ).new.class_name
8
+ end
9
+
10
+ it 'resolves class name' do
11
+ expect(subject).to eq 'MyClass'
12
+ end
13
+ end
14
+ end