adknowledge 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,378 @@
1
+ require "spec_helper"
2
+
3
+ describe Adknowledge::Integrated do
4
+ before do
5
+ Adknowledge.token = '3a9f34d1eee18880bbc74254ddf06448'
6
+ end
7
+
8
+ let :email_hashes do
9
+ [
10
+ { recipient: '004c58927df600d73d58c817bafc2155',
11
+ list: 9250,
12
+ domain: 'hotmail.com',
13
+ countrycode: 'US',
14
+ state: 'MO'
15
+ },
16
+ { recipient: 'a2a8c7a5ce7c4249663803c7d040401f',
17
+ list: 9250,
18
+ domain: 'mail.com',
19
+ countrycode: 'CA'
20
+ }
21
+ ]
22
+ end
23
+
24
+ let :request_xml do
25
+ %q[
26
+ <?xml version="1.0" encoding="UTF-8"?>
27
+ <request>
28
+ <email>
29
+ <recipient>004c58927df600d73d58c817bafc2155</recipient>
30
+ <list>9250</list>
31
+ <domain>hotmail.com</domain>
32
+ <countrycode>US</countrycode>
33
+ <state>MO</state>
34
+ </email>
35
+ <email>
36
+ <recipient>a2a8c7a5ce7c4249663803c7d040401f</recipient>
37
+ <list>9250</list>
38
+ <domain>rr.com</domain>
39
+ <countrycode>CA</countrycode>
40
+ </email>
41
+ </request>].gsub(/\n/, '')
42
+ end
43
+
44
+ let :domain1 do
45
+ "fga.example.com"
46
+ end
47
+
48
+ let :integrated do
49
+ described_class.new domain: domain1,
50
+ subid: 101,
51
+ test: true,
52
+ recipients: email_hashes
53
+ end
54
+
55
+ context "#recipients=" do
56
+ subject do
57
+ described_class.new
58
+ end
59
+
60
+ context "valid" do
61
+
62
+ let :email_hashes do
63
+ [
64
+ { recipient: '004c58927df600d73d58c817bafc2155',
65
+ list: 9250,
66
+ domain: 'hotmail.com',
67
+ countrycode: 'US',
68
+ state: 'MO'
69
+ },
70
+ { recipient: 'a2a8c7a5ce7c4249663803c7d040401f',
71
+ list: 9250,
72
+ domain: 'rr.com',
73
+ countrycode: 'CA'
74
+ }
75
+ ]
76
+ end
77
+
78
+ before do
79
+ subject.recipients = email_hashes
80
+ end
81
+
82
+ it "sets the request" do
83
+ expect(subject.request).to eql request_xml
84
+ end
85
+
86
+ it "keeps the recipients" do
87
+ expect(subject.recipients).to eql email_hashes
88
+ end
89
+ end # valid
90
+
91
+ context "missing mandatory field" do
92
+
93
+ let :email_hashes do
94
+ [
95
+ { recipient: '004c58927df600d73d58c817bafc2155',
96
+ list: 9250
97
+ },
98
+ { recipient: 'a2a8c7a5ce7c4249663803c7d040401f',
99
+ list: 9250,
100
+ domain: 'rr.com',
101
+ countrycode: 'CA'
102
+ }
103
+ ]
104
+ end
105
+
106
+ it "raises an exception" do
107
+ expect{
108
+ subject.recipients = email_hashes
109
+ }.to raise_error ArgumentError
110
+ end
111
+
112
+ end # missing mandatory field
113
+
114
+ end # #recipients=
115
+
116
+ context "#query_params" do
117
+
118
+ let :domain2 do
119
+ "fga.examplemail.com"
120
+ end
121
+
122
+ context "with domain option" do
123
+
124
+ let :query_params do
125
+ { token: "3a9f34d1eee18880bbc74254ddf06448",
126
+ idomain: domain1,
127
+ cdomain: domain1,
128
+ request: request_xml,
129
+ subid: 101,
130
+ test: 1
131
+ }
132
+ end
133
+
134
+ subject do
135
+ integrated.query_params
136
+ end
137
+
138
+ it "has the token" do
139
+ expect(subject[:token]).to eql "3a9f34d1eee18880bbc74254ddf06448"
140
+ end
141
+
142
+ it "has the idomain" do
143
+ expect(subject[:idomain]).to eql domain1
144
+ end
145
+
146
+ it "has the cdomain" do
147
+ expect(subject[:cdomain]).to eql domain1
148
+ end
149
+
150
+ it "has the test option" do
151
+ expect(subject[:test]).to eql 1
152
+ end
153
+
154
+ it "has the subid" do
155
+ expect(subject[:subid]).to eql 101
156
+ end
157
+
158
+ end # with domain option
159
+
160
+ context "with cdomain/idomian" do
161
+
162
+ let :query_params do
163
+ { token: "3a9f34d1eee18880bbc74254ddf06448",
164
+ idomain: domain1,
165
+ cdomain: domain2,
166
+ request: request_xml,
167
+ subid: 102,
168
+ test: false
169
+ }
170
+ end
171
+
172
+ let :integrated do
173
+ described_class.new idomain: domain1,
174
+ cdomain: domain2,
175
+ subid: 102,
176
+ test: false,
177
+ recipients: email_hashes
178
+ end
179
+
180
+ subject do
181
+ integrated.query_params
182
+ end
183
+
184
+ it "has the cdomain" do
185
+ expect(subject[:cdomain]).to eql domain2
186
+ end
187
+
188
+ it "has the idomain" do
189
+ expect(subject[:idomain]).to eql domain1
190
+ end
191
+
192
+ end
193
+
194
+ end # #query_params
195
+
196
+ context "before map" do
197
+
198
+ context "#mapped?" do
199
+
200
+ subject do
201
+ integrated.mapped?
202
+ end
203
+
204
+ it "should be false" do
205
+ expect(subject).to be_false
206
+ end
207
+
208
+ end # #mapped?
209
+
210
+ context "#mapped_recipients" do
211
+
212
+ subject do
213
+ integrated.mapped_recipients
214
+ end
215
+
216
+ it "has no mapped recipients" do
217
+ expect(subject).to be_empty
218
+ end
219
+
220
+ end # #mapped_recipients
221
+
222
+ context "#errored_recipients" do
223
+
224
+ subject do
225
+ integrated.errored_recipients
226
+ end
227
+
228
+ it "has no errored recipients" do
229
+ expect(subject).to be_empty
230
+ end
231
+
232
+ end # #errored_recipients
233
+
234
+ end # before map
235
+
236
+ context "after map" do
237
+
238
+ context "single results" do
239
+
240
+ before do
241
+ VCR.use_cassette :map_single_success, record: :once do
242
+ integrated.map!
243
+ end
244
+ end
245
+
246
+ context "#mapped?" do
247
+
248
+ subject do
249
+ integrated.mapped?
250
+ end
251
+
252
+ it "should be true" do
253
+ expect(subject).to be_true
254
+ end
255
+
256
+ end # #mapped?
257
+
258
+ context "#mapped_recipients" do
259
+
260
+ subject do
261
+ integrated.mapped_recipients
262
+ end
263
+
264
+ it "has a mapped recipient" do
265
+ expect(subject.size).to eql 1
266
+ end
267
+
268
+ it "has a creative" do
269
+ expect(subject.first['creative']).to be_a Hash
270
+ expect(subject.first['creative']['body']).to be_a String
271
+ expect(subject.first['creative']['subject']).to eql "Faxes delivered to your email."
272
+ end
273
+ end
274
+
275
+ context "#errored_recipients" do
276
+
277
+ subject do
278
+ integrated.errored_recipients
279
+ end
280
+
281
+ it "has an errored recipient" do
282
+ expect(subject.size).to eql 1
283
+ end
284
+
285
+ it "has an error error" do
286
+ expect(subject.first['error']).to be_a Hash
287
+ expect(subject.first['error']['num']).to eql "10"
288
+ expect(subject.first['error']['str']).to eql "Domain is suppressed\n"
289
+ end
290
+
291
+ end # #errored_recipients
292
+
293
+ end # single results
294
+
295
+ context "multiple results" do
296
+
297
+ let :email_hashes do
298
+ [
299
+ { recipient: '004c58927df600d73d58c817bafc2155',
300
+ list: 9250,
301
+ domain: 'hotmail.com',
302
+ countrycode: 'US',
303
+ state: 'MO'
304
+ },
305
+ { recipient: '004c58927df600d73d58c817bafc2156',
306
+ list: 9250,
307
+ domain: 'aol.com'
308
+ },
309
+ { recipient: 'a2a8c7a5ce7c4249663803c7d040401f',
310
+ list: 9250,
311
+ domain: 'mail.com',
312
+ countrycode: 'CA'
313
+ },
314
+ { recipient: 'a2a8c7a5ce7c4249663803c7d040401e',
315
+ list: 9250,
316
+ domain: 'mail.com'
317
+ }
318
+ ]
319
+ end
320
+
321
+ before do
322
+ VCR.use_cassette :map_multi_success, record: :once do
323
+ integrated.map!
324
+ end
325
+ end
326
+
327
+ context "#mapped?" do
328
+
329
+ subject do
330
+ integrated.mapped?
331
+ end
332
+
333
+ it "should be true" do
334
+ expect(subject).to be_true
335
+ end
336
+
337
+ end # #mapped?
338
+
339
+ context "#mapped_recipients" do
340
+
341
+ subject do
342
+ integrated.mapped_recipients
343
+ end
344
+
345
+ it "has a mapped recipient" do
346
+ expect(subject.size).to eql 2
347
+ end
348
+
349
+ it "has a creative" do
350
+ expect(subject.first['creative']).to be_a Hash
351
+ expect(subject.first['creative']['body']).to be_a String
352
+ expect(subject.first['creative']['subject']).to eql "Early-bird cruise specials"
353
+ end
354
+ end
355
+
356
+ context "#errored_recipients" do
357
+
358
+ subject do
359
+ integrated.errored_recipients
360
+ end
361
+
362
+ it "has an errored recipient" do
363
+ expect(subject.size).to eql 2
364
+ end
365
+
366
+ it "has an error error" do
367
+ expect(subject.first['error']).to be_a Hash
368
+ expect(subject.first['error']['num']).to eql "10"
369
+ expect(subject.first['error']['str']).to eql "Domain is suppressed\n"
370
+ end
371
+
372
+ end # #errored_recipients
373
+
374
+ end # multiple results
375
+
376
+ end # after map
377
+
378
+ end # Adknowledge::Integrated
@@ -0,0 +1,320 @@
1
+ require 'spec_helper'
2
+
3
+ describe Adknowledge::Performance do
4
+ before do
5
+ Adknowledge.token = 'b6d8610998e883b3a460fd2fcf71ead4'
6
+ end
7
+
8
+ context '#select' do
9
+ it 'changes metric selection' do
10
+ expect{
11
+ subject.select(:revenue)
12
+ }.to change(subject, :measures).
13
+ from({}).
14
+ to({revenue:1})
15
+ end
16
+
17
+ it 'supports multiple selections' do
18
+ expect{
19
+ subject.select(:revenue, :paid_clicks)
20
+ }.to change(subject, :measures).
21
+ from({}).
22
+ to({revenue:1, paid_clicks:1})
23
+ end
24
+
25
+ it 'supports chained selections' do
26
+ subject.select(:revenue)
27
+ expect{
28
+ subject.select(:paid_clicks)
29
+ }.to change(subject, :measures).
30
+ from({revenue:1}).
31
+ to({revenue:1, paid_clicks:1})
32
+ end
33
+
34
+ it 'errors on invalid measure' do
35
+ expect{ subject.select(:unvalid) }.to raise_error(ArgumentError)
36
+ end
37
+ end # #select
38
+
39
+ context '#group_by' do
40
+ it 'changes the dimension groupings' do
41
+ expect{
42
+ subject.group_by(:subid)
43
+ }.to change(subject, :dimensions).
44
+ from({}).
45
+ to({subid:1})
46
+ end
47
+
48
+ it 'supports multiple groupings' do
49
+ expect{
50
+ subject.group_by(:report_date, :revenue_type)
51
+ }.to change(subject, :dimensions).
52
+ from({}).
53
+ to({report_date:1, revenue_type:1})
54
+ end
55
+
56
+ it 'supports chained groupings' do
57
+ subject.group_by(:report_date)
58
+ expect{
59
+ subject.group_by(:revenue_type)
60
+ }.to change(subject, :dimensions).
61
+ from({report_date:1}).
62
+ to({report_date:1, revenue_type:1})
63
+ end
64
+
65
+ it 'errors on invalid dimension' do
66
+ expect{ subject.select(:inpossible) }.to raise_error(ArgumentError)
67
+ end
68
+ end # #group_by
69
+
70
+ context '#where' do
71
+ it 'changes the filter criteria' do
72
+ expect{
73
+ subject.where(start_date:0)
74
+ }.to change(subject, :filter).
75
+ from({product_guid: '*', product_id: '2'}).
76
+ to({product_guid: '*', product_id: '2', start_date:'0'})
77
+ end
78
+
79
+ it 'supports chained filtering' do
80
+ subject.where(start_date:0)
81
+ expect{
82
+ subject.where(domain_group:'AOL Group')
83
+ }.to change(subject, :filter).
84
+ from({product_guid: '*', product_id: '2', start_date:'0'}).
85
+ to({product_guid: '*', product_id: '2', start_date:'0', domain_group:'AOL Group'})
86
+ end
87
+
88
+ it 'errors on invalid filter' do
89
+ expect{ subject.where(revenue:0) }.to raise_error(ArgumentError)
90
+ end
91
+ end # #where
92
+
93
+ context '#limit' do
94
+ it 'sets the limit option' do
95
+ expect{
96
+ subject.limit(10)
97
+ }.to change(subject, :options).
98
+ from({}).
99
+ to({limit:"10"})
100
+ end
101
+
102
+ it 'supports chaining' do
103
+ expect(
104
+ subject.limit(10)
105
+ ).to be_a Adknowledge::Performance
106
+ end
107
+
108
+ it 'errors on invalid limit' do
109
+ expect{ subject.limit(:test) }.to raise_error(ArgumentError)
110
+ end
111
+ end # #limit
112
+
113
+ context '#sort' do
114
+ it 'sets the sort option' do
115
+ expect{
116
+ subject.sort(3)
117
+ }.to change(subject, :sort_option).
118
+ from(nil).
119
+ to("3")
120
+ end
121
+
122
+ it 'supports chaining' do
123
+ expect(
124
+ subject.sort(5)
125
+ ).to be_a Adknowledge::Performance
126
+ end
127
+
128
+ it 'errors on invalid sort' do
129
+ expect{ subject.limit('test') }.to raise_error(ArgumentError)
130
+ end
131
+ end # #sort
132
+
133
+ context '#full' do
134
+ it 'sets the full option' do
135
+ expect{
136
+ subject.full(true)
137
+ }.to change(subject, :options).
138
+ from({}).
139
+ to({full:"1"})
140
+ end
141
+
142
+ it 'supports chaining' do
143
+ expect(
144
+ subject.full(false)
145
+ ).to be_a Adknowledge::Performance
146
+ end
147
+
148
+ it 'errors on invalid full' do
149
+ expect{ subject.full('test') }.to raise_error(ArgumentError)
150
+ end
151
+ end # #full
152
+
153
+ context '#nocache' do
154
+ it 'sets the nocache option' do
155
+ expect{
156
+ subject.nocache(true)
157
+ }.to change(subject, :options).
158
+ from({}).
159
+ to({nocache:"1"})
160
+ end
161
+
162
+ it 'supports chaining' do
163
+ expect(
164
+ subject.nocache(false)
165
+ ).to be_a Adknowledge::Performance
166
+ end
167
+
168
+ it 'errors on invalid nocache' do
169
+ expect{ subject.nocache('test') }.to raise_error(ArgumentError)
170
+ end
171
+ end # #nocache
172
+
173
+ context '#display_all' do
174
+ it 'sets the display_all option' do
175
+ expect{
176
+ subject.display_all(true)
177
+ }.to change(subject, :options).
178
+ from({}).
179
+ to({all:"1"})
180
+ end
181
+
182
+ it 'supports chaining' do
183
+ expect(
184
+ subject.display_all(false)
185
+ ).to be_a Adknowledge::Performance
186
+ end
187
+
188
+ it 'errors on invalid display_all' do
189
+ expect{ subject.display_all('test') }.to raise_error(ArgumentError)
190
+ end
191
+ end # #display_all
192
+
193
+ context '#pivot' do
194
+ before do
195
+ subject.group_by :country_cd
196
+ end
197
+
198
+ it 'sets a basic pivot' do
199
+ expect{
200
+ subject.pivot :country_cd
201
+ }.to change(subject, :pivot_options).
202
+ from({}).
203
+ to({pivot: "country_cd"})
204
+ end
205
+
206
+ it 'only allows a single basic pivot' do
207
+ expect{ subject.pivot(:one, :two) }.to raise_error(ArgumentError)
208
+ end
209
+
210
+ it 'only allows grouped dimensions to be pivoted on' do
211
+ expect{ subject.pivot(:report_date) }.to raise_error(ArgumentError)
212
+ end
213
+
214
+ it 'sets a sum pivot' do
215
+ subject.group_by :country_cd
216
+ expect{
217
+ subject.pivot(sum: :revenue)
218
+ }.to change(subject, :pivot_options).
219
+ from({}).
220
+ to({sum: :revenue})
221
+ end
222
+
223
+ it 'only allows measurements to be summed' do
224
+ expect{ subject.pivot(sum: :ilresponsible) }.to raise_error(ArgumentError)
225
+ end
226
+
227
+ it 'replaces a previous pivot' do
228
+ subject.pivot :country_cd
229
+ expect{
230
+ subject.pivot(sum: :paid_clicks)
231
+ }.to change(subject, :pivot_options).
232
+ from({pivot: "country_cd"}).
233
+ to({sum: :paid_clicks})
234
+ end
235
+
236
+ it 'only allows "sum "or "count"' do
237
+ expect{ subject.pivot unlogical: :paid_clicks }.to raise_error(ArgumentError)
238
+ end
239
+ end # #pivot
240
+
241
+ context '#query_params' do
242
+
243
+ let :performance do
244
+ described_class.new.where(start_date:1).
245
+ select(:revenue,:paid_clicks).
246
+ where(domain_group: 'AOL Group').
247
+ group_by(:subid, :report_date).
248
+ pivot(:report_date).
249
+ nocache(true).
250
+ display_all(true).
251
+ full(true).
252
+ sort(2).
253
+ limit(20)
254
+ end
255
+
256
+ let :query_params do
257
+ { token:'b6d8610998e883b3a460fd2fcf71ead4',
258
+ start_date:'1',
259
+ measures:'revenue,paid_clicks',
260
+ domain_group: 'AOL Group',
261
+ dimensions:'subid,report_date',
262
+ product_guid: '*',
263
+ pivot: 'report_date',
264
+ product_id: '2',
265
+ nocache:'1',
266
+ full:'1',
267
+ sort:'2',
268
+ all:'1',
269
+ limit:'20'
270
+ }
271
+ end
272
+
273
+ subject do
274
+ performance.query_params
275
+ end
276
+
277
+ it 'creates query_params' do
278
+ expect(subject).to eql(query_params)
279
+ end
280
+ end # #query_params
281
+
282
+ context '#records' do
283
+
284
+ let :performance do
285
+ described_class.new.where(start_date:1).
286
+ select(:revenue,:paid_clicks).
287
+ group_by(:subid, :report_date).
288
+ limit(20)
289
+ end
290
+
291
+ before do
292
+ VCR.use_cassette :performance, record: :once do
293
+ performance.records
294
+ end
295
+ end
296
+
297
+ subject do
298
+ performance.records
299
+ end
300
+
301
+ it 'has results' do
302
+ expect(subject).to be_an Array
303
+ end
304
+
305
+ it 'has the correct dimensions' do
306
+ expect(subject.first).to have_key 'subid'
307
+ expect(subject.first).to have_key 'report_date'
308
+ end
309
+
310
+ it 'has the correct measures' do
311
+ expect(subject.first).to have_key 'paid_clicks'
312
+ expect(subject.first).to have_key 'revenue'
313
+ end
314
+
315
+ it 'has the correct count' do
316
+ expect(subject.size).to eql 20
317
+ end
318
+
319
+ end
320
+ end
File without changes