ad_leads 0.1.6.1 → 0.1.7
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.
- checksums.yaml +4 -4
- data/lib/ad_leads/ad.rb +7 -17
- data/lib/ad_leads/campaign.rb +55 -40
- data/lib/ad_leads/client.rb +14 -7
- data/lib/ad_leads/creative_group.rb +7 -11
- data/lib/ad_leads/image.rb +30 -40
- data/lib/ad_leads/promotion.rb +1 -1
- data/lib/ad_leads/token.rb +1 -2
- data/lib/ad_leads/version.rb +1 -1
- data/lib/ad_leads.rb +7 -5
- data/spec/ad_leads/ad_spec.rb +8 -19
- data/spec/ad_leads/campaign_spec.rb +54 -45
- data/spec/ad_leads/client_spec.rb +28 -0
- data/spec/ad_leads/creative_group_spec.rb +8 -19
- data/spec/ad_leads/image_spec.rb +26 -57
- data/spec/ad_leads/network_requests_redux_spec.rb +53 -20
- data/spec/spec_helper.rb +5 -1
- metadata +2 -6
- data/lib/ad_leads/base.rb +0 -19
- data/lib/ad_leads/etag.rb +0 -30
- data/spec/ad_leads/base_spec.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d7000e942209e9c92354564fa68b260925f8c71
|
4
|
+
data.tar.gz: de28f9996e6ca7383f136852e9a8a5e36f706321
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77692bf8a3ded98d7d13ee154359d6dfaf7157738e988cc669de2f8912e99fa64eaa132c6f435219280c8afb235b8931f45f14cdf7523cdd18590095f1d4a7f8
|
7
|
+
data.tar.gz: 84af060967a19a460f53bfb5d2df70cfeb078cb28ee9132c1dc97a21073fa8e51a01a6bdaa36abe2fd51f4875e45d781207137ff782dfcd9d6ff5907ab7919d7
|
data/lib/ad_leads/ad.rb
CHANGED
@@ -1,19 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
attr_accessor :creative_group_id
|
10
|
-
|
11
|
-
def initialize(creative_group_id)
|
12
|
-
@creative_group_id = creative_group_id
|
1
|
+
module AdLeads
|
2
|
+
class Client
|
3
|
+
module Ad
|
4
|
+
def create_ad(creative_group_id, options)
|
5
|
+
post "/creativegroups/#{creative_group_id}/creatives", options
|
6
|
+
end
|
7
|
+
end
|
13
8
|
end
|
14
|
-
|
15
|
-
def root_path
|
16
|
-
"/creativegroups/#{creative_group_id}/creatives"
|
17
|
-
end
|
18
|
-
|
19
9
|
end
|
data/lib/ad_leads/campaign.rb
CHANGED
@@ -1,43 +1,58 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
1
|
+
module AdLeads
|
2
|
+
class Client
|
3
|
+
module Campaign
|
4
|
+
def create_campaign(creative_id, options)
|
5
|
+
post '/campaigns', options.merge(creativeGroups: creative_id)
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_complete_campaign(options)
|
9
|
+
create_creative_group(options[:creative_group])
|
10
|
+
creative_id = self.last_response_id
|
11
|
+
|
12
|
+
create_ad(creative_id, options[:ad])
|
13
|
+
ad_id = self.last_response_id
|
14
|
+
|
15
|
+
create_image(creative_id, ad_id, options[:image])
|
16
|
+
image_id = self.last_response_id
|
17
|
+
upload_image(creative_id, ad_id, image_id, options[:file])
|
18
|
+
|
19
|
+
create_campaign(creative_id, options[:campaign])
|
20
|
+
end
|
21
|
+
|
22
|
+
def update_campaign(id, options)
|
23
|
+
post campaign_path(id), options
|
24
|
+
end
|
25
|
+
|
26
|
+
def verify_campaign(id)
|
27
|
+
get verify_campaign_path(id)
|
28
|
+
end
|
29
|
+
|
30
|
+
def launch_campaign(id)
|
31
|
+
remaining_tries ||= 3
|
32
|
+
post launch_campaign_path(id), etag: campaign_etag(id).headers['Etag']
|
33
|
+
rescue AdLeads::EtagMismatchError
|
34
|
+
remaining_tries -= 1
|
35
|
+
retry unless remaining_tries.zero?
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def campaign_path(id)
|
41
|
+
"/campaigns/#{id}"
|
42
|
+
end
|
43
|
+
alias :campaign_etag_path :campaign_path
|
44
|
+
|
45
|
+
def launch_campaign_path(id)
|
46
|
+
campaign_path(id) + '/launch'
|
47
|
+
end
|
48
|
+
|
49
|
+
def verify_campaign_path(id)
|
50
|
+
campaign_path(id) + '/plan'
|
51
|
+
end
|
52
|
+
|
53
|
+
def campaign_etag(id)
|
54
|
+
get campaign_etag_path(id)
|
55
|
+
end
|
24
56
|
end
|
25
57
|
end
|
26
|
-
|
27
|
-
def campaign_path
|
28
|
-
root_path + "/#{id}"
|
29
|
-
end
|
30
|
-
alias :etag_path :campaign_path
|
31
|
-
|
32
|
-
def launch_campaign_path
|
33
|
-
campaign_path + '/launch'
|
34
|
-
end
|
35
|
-
|
36
|
-
def root_path
|
37
|
-
'/campaigns'
|
38
|
-
end
|
39
|
-
|
40
|
-
def verify_campaign_path
|
41
|
-
campaign_path + '/plan'
|
42
|
-
end
|
43
58
|
end
|
data/lib/ad_leads/client.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
require 'json'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
module AdLeads
|
1
|
+
module AdLeads
|
6
2
|
class Client
|
3
|
+
include AdLeads::Client::CreativeGroup
|
4
|
+
include AdLeads::Client::Ad
|
5
|
+
include AdLeads::Client::Image
|
6
|
+
include AdLeads::Client::Campaign
|
7
|
+
|
7
8
|
attr_accessor *Configuration::VALID_CONFIG_KEYS
|
9
|
+
attr_reader :last_response
|
8
10
|
|
9
11
|
def initialize(options={})
|
10
12
|
merged_options = AdLeads.options.merge(options)
|
@@ -40,6 +42,10 @@ module AdLeads
|
|
40
42
|
request(:post, path, params)
|
41
43
|
end
|
42
44
|
|
45
|
+
def last_response_id
|
46
|
+
JSON.parse(last_response.body)['data'].first
|
47
|
+
end
|
48
|
+
|
43
49
|
private
|
44
50
|
|
45
51
|
def etag_opts(etag)
|
@@ -87,14 +93,14 @@ module AdLeads
|
|
87
93
|
case response.status
|
88
94
|
when 400 then raise ArgError.new response.body
|
89
95
|
when 401 then raise AuthError.new "token: #{token}" + response.body.to_s
|
96
|
+
when 412 then raise EtagMismatchError.new response.body
|
90
97
|
when 500 then raise ApiServerError.new response.body
|
91
98
|
else
|
92
|
-
response
|
99
|
+
@last_response = response
|
93
100
|
end
|
94
101
|
# rescue Faraday::Error::TimeoutError, Timeout::Error => error
|
95
102
|
# rescue Faraday::Error::ClientError, JSON::ParserError => error
|
96
103
|
end
|
97
|
-
|
98
104
|
end
|
99
105
|
|
100
106
|
class ApiError < StandardError
|
@@ -106,4 +112,5 @@ module AdLeads
|
|
106
112
|
class AuthError < ApiError; end
|
107
113
|
class ApiServerError < ApiError; end
|
108
114
|
class ArgError < ApiError; end
|
115
|
+
class EtagMismatchError < ApiError; end
|
109
116
|
end
|
@@ -1,13 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def root_path
|
10
|
-
'/creativegroups'
|
1
|
+
module AdLeads
|
2
|
+
class Client
|
3
|
+
module CreativeGroup
|
4
|
+
def create_creative_group(options)
|
5
|
+
post '/creativegroups', options
|
6
|
+
end
|
7
|
+
end
|
11
8
|
end
|
12
|
-
|
13
9
|
end
|
data/lib/ad_leads/image.rb
CHANGED
@@ -1,48 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module AdLeads
|
2
|
+
class Client
|
3
|
+
module Image
|
4
|
+
def create_image(creative_group_id, ad_id, options)
|
5
|
+
post image_root_path(creative_group_id, ad_id), options
|
6
|
+
end
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
def upload_image(creative_group_id, ad_id, image_id, file)
|
9
|
+
remaining_tries ||= 3
|
10
|
+
post image_upload_path(creative_group_id, ad_id, image_id), image_upload_opts(creative_group_id, ad_id, image_id, file)
|
11
|
+
rescue AdLeads::EtagMismatchError
|
12
|
+
remaining_tries -= 1
|
13
|
+
retry unless remaining_tries.zero?
|
14
|
+
end
|
9
15
|
|
10
|
-
|
11
|
-
{ group: creative_group_id, creative: ad_id }
|
12
|
-
end
|
16
|
+
private
|
13
17
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
18
|
+
def image_root_path(creative_group_id, ad_id)
|
19
|
+
"/creativegroups/#{creative_group_id}/creatives/#{ad_id}/images"
|
20
|
+
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
etag: etag
|
24
|
-
}
|
25
|
-
end
|
22
|
+
def image_upload_path(creative_group_id, ad_id, image_id)
|
23
|
+
"/creativegroups/#{creative_group_id}/creatives/#{ad_id}/images/#{image_id}/file"
|
24
|
+
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def etag_path
|
36
|
-
root_path + "/#{id}"
|
37
|
-
end
|
26
|
+
def image_upload_opts(creative_group_id, ad_id, image_id, file)
|
27
|
+
{
|
28
|
+
file: Faraday::UploadIO.new(file, 'image/jpeg'),
|
29
|
+
etag: image_etag(creative_group_id, ad_id, image_id).headers['Etag']
|
30
|
+
}
|
31
|
+
end
|
38
32
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
'creatives',
|
44
|
-
ad_id,
|
45
|
-
'images'
|
46
|
-
].join('/')
|
33
|
+
def image_etag(creative_group_id, ad_id, image_id)
|
34
|
+
get "/creativegroups/#{creative_group_id}/creatives/#{ad_id}/images/#{image_id}"
|
35
|
+
end
|
36
|
+
end
|
47
37
|
end
|
48
38
|
end
|
data/lib/ad_leads/promotion.rb
CHANGED
data/lib/ad_leads/token.rb
CHANGED
data/lib/ad_leads/version.rb
CHANGED
data/lib/ad_leads.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'jwt'
|
2
|
+
require 'faraday'
|
3
|
+
require 'json'
|
4
|
+
require 'logger'
|
5
|
+
|
2
6
|
require 'ad_leads/version'
|
3
7
|
require 'ad_leads/configuration'
|
4
|
-
require 'ad_leads/client'
|
5
8
|
require 'ad_leads/token'
|
6
|
-
require 'ad_leads/
|
7
|
-
require 'ad_leads/
|
9
|
+
require 'ad_leads/creative_group'
|
10
|
+
require 'ad_leads/ad'
|
8
11
|
require 'ad_leads/image'
|
9
12
|
require 'ad_leads/campaign'
|
10
|
-
require 'ad_leads/
|
11
|
-
require 'ad_leads/creative_group'
|
13
|
+
require 'ad_leads/client'
|
12
14
|
|
13
15
|
module AdLeads
|
14
16
|
extend Configuration
|
data/spec/ad_leads/ad_spec.rb
CHANGED
@@ -1,24 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe AdLeads::Ad do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
describe '#create!' do
|
13
|
-
it 'posts to Ad Leads ad endpoint for creatives' do
|
14
|
-
expect(client).to receive(:post).with('/creativegroups/1/creatives', params)
|
15
|
-
ad.create!(params)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'assigns #response' do
|
19
|
-
client.stub(:post) { 'Foobar' }
|
20
|
-
ad.create!(params)
|
21
|
-
expect(ad.response).to eq 'Foobar'
|
3
|
+
describe AdLeads::Client::Ad do
|
4
|
+
let(:client) { AdLeads::Client.new }
|
5
|
+
let(:options) { {} }
|
6
|
+
|
7
|
+
describe '#create_ad' do
|
8
|
+
it 'creates an ad' do
|
9
|
+
expect(client).to receive(:post).with('/creativegroups/1/creatives', options)
|
10
|
+
client.create_ad(1, options)
|
22
11
|
end
|
23
12
|
end
|
24
13
|
|
@@ -1,69 +1,78 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe AdLeads::Campaign do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
let(:params) { {} }
|
3
|
+
describe AdLeads::Client::Campaign do
|
4
|
+
let(:client) { AdLeads::Client.new }
|
5
|
+
let(:options) { {} }
|
7
6
|
let(:http_success) { double(:http_success, status: 200) }
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
describe '#create_complete_campaign' do
|
9
|
+
let(:creative_opts) { {} }
|
10
|
+
let(:ad_opts) { {} }
|
11
|
+
let(:image_opts) { {} }
|
12
|
+
let(:file) { './spec/fixtures/test.jpg' }
|
13
|
+
let(:campaign_opts) { {} }
|
14
|
+
let(:complete_campaign_opts) {{
|
15
|
+
creative_group: creative_opts,
|
16
|
+
ad: ad_opts,
|
17
|
+
image: image_opts,
|
18
|
+
file: file,
|
19
|
+
campaign: campaign_opts
|
20
|
+
}}
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
expect(client).to receive(:post).with('/campaigns', params)
|
16
|
-
campaign.create!(params)
|
17
|
-
end
|
22
|
+
it 'creates a creative group, ad, image, and campaign' do
|
23
|
+
client.stub(:last_response_id) { 1 }
|
18
24
|
|
19
|
-
|
20
|
-
client.
|
21
|
-
|
22
|
-
expect(
|
25
|
+
expect(client).to receive(:create_creative_group).with(creative_opts)
|
26
|
+
expect(client).to receive(:create_ad).with(1, ad_opts)
|
27
|
+
expect(client).to receive(:create_image).with(1, 1, image_opts)
|
28
|
+
expect(client).to receive(:upload_image).with(1, 1, 1, file)
|
29
|
+
expect(client).to receive(:create_campaign).with(1, campaign_opts)
|
30
|
+
client.create_complete_campaign(complete_campaign_opts)
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
26
|
-
describe '#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
expect(client).to receive(:post).with('/campaigns/1', params)
|
31
|
-
campaign.update!(params)
|
34
|
+
describe '#create_campaign' do
|
35
|
+
it 'creates a campaign' do
|
36
|
+
expect(client).to receive(:post).with('/campaigns', {creativeGroups: 1})
|
37
|
+
client.create_campaign(1, options)
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
35
|
-
describe '#
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
expect(client).to receive(:get).with('/campaigns/1/plan')
|
40
|
-
campaign.verify!
|
41
|
+
describe '#update_campaign' do
|
42
|
+
it 'updates the respective campaign' do
|
43
|
+
expect(client).to receive(:post).with('/campaigns/1', options)
|
44
|
+
client.update_campaign(1, options)
|
41
45
|
end
|
42
46
|
end
|
43
47
|
|
44
|
-
describe '#
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
+
describe '#verify_campaign' do
|
49
|
+
it 'verifies the respective campaign' do
|
50
|
+
expect(client).to receive(:get).with('/campaigns/1/plan')
|
51
|
+
client.verify_campaign(1)
|
48
52
|
end
|
53
|
+
end
|
49
54
|
|
50
|
-
|
51
|
-
|
52
|
-
|
55
|
+
describe '#launch_campaign' do
|
56
|
+
it 'launches a campaign' do
|
57
|
+
etag_response = double :response, headers: { 'Etag' => 1 }
|
58
|
+
client.stub(:campaign_etag) { etag_response }
|
59
|
+
expect(client).to receive(:post).with('/campaigns/1/launch', {etag: 1} )
|
60
|
+
client.launch_campaign(1)
|
53
61
|
end
|
54
62
|
|
55
|
-
it '
|
56
|
-
client.
|
57
|
-
|
58
|
-
campaign.launch!
|
63
|
+
it 'gets etag' do
|
64
|
+
expect(client).to receive(:get).with('/campaigns/1')
|
65
|
+
client.send(:campaign_etag, 1)
|
59
66
|
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe '#etag_path' do
|
63
|
-
before { campaign.instance_variable_set(:@id, 1) }
|
64
67
|
|
65
|
-
|
66
|
-
|
68
|
+
context 'with EtagMismatchError' do
|
69
|
+
it 'retries launch a maximum of three times' do
|
70
|
+
etag_response = double :response, headers: { 'Etag' => 1 }
|
71
|
+
client.stub(:campaign_etag) { etag_response }
|
72
|
+
client.stub(:post) { raise AdLeads::EtagMismatchError.new 'Error' }
|
73
|
+
expect(client).to receive(:post).exactly(3).times
|
74
|
+
client.launch_campaign(1)
|
75
|
+
end
|
67
76
|
end
|
68
77
|
end
|
69
78
|
end
|
@@ -10,6 +10,8 @@ describe AdLeads::Client do
|
|
10
10
|
|
11
11
|
before { client.stub(:token) { token } }
|
12
12
|
|
13
|
+
it { should respond_to(:last_response) }
|
14
|
+
|
13
15
|
describe '#connection' do
|
14
16
|
let(:config_keys) { AdLeads::Configuration::VALID_CONFIG_KEYS }
|
15
17
|
|
@@ -29,6 +31,23 @@ describe AdLeads::Client do
|
|
29
31
|
connection.stub(:post) { response }
|
30
32
|
end
|
31
33
|
|
34
|
+
context 'status: 200' do
|
35
|
+
let(:status) { 200 }
|
36
|
+
it 'sets @last_response' do
|
37
|
+
client.post('foo')
|
38
|
+
expect(client.instance_variable_get(:@last_response)).to eq response
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'status: 412' do
|
43
|
+
let(:status) { 412 }
|
44
|
+
it 'raises AdLeads::EtagMismatchError' do
|
45
|
+
expect {
|
46
|
+
client.post('foo')
|
47
|
+
}.to raise_error AdLeads::EtagMismatchError
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
32
51
|
context 'status: 500' do
|
33
52
|
let(:status) { 500 }
|
34
53
|
it 'raises AdLeads::ApiError' do
|
@@ -46,4 +65,13 @@ describe AdLeads::Client do
|
|
46
65
|
end
|
47
66
|
end
|
48
67
|
end
|
68
|
+
|
69
|
+
describe '#last_response_id' do
|
70
|
+
let(:last_response) { double :response, body: {'data' => [88]}.to_json }
|
71
|
+
|
72
|
+
it 'retrieves id from @last_response' do
|
73
|
+
client.stub(:last_response) { last_response }
|
74
|
+
expect(client.last_response_id).to eq 88
|
75
|
+
end
|
76
|
+
end
|
49
77
|
end
|
@@ -1,24 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe AdLeads::CreativeGroup do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
describe '#create!' do
|
13
|
-
it 'posts to /creativegroups path' do
|
14
|
-
expect(client).to receive(:post).with('/creativegroups', params)
|
15
|
-
creative_group.create!(params)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'assigns #response' do
|
19
|
-
client.stub(:post) { 'Foobar' }
|
20
|
-
creative_group.create!(params)
|
21
|
-
expect(creative_group.response).to eq 'Foobar'
|
3
|
+
describe AdLeads::Client::CreativeGroup do
|
4
|
+
let(:client) { AdLeads::Client.new }
|
5
|
+
let(:options) {{}}
|
6
|
+
|
7
|
+
describe '#create_creative_group' do
|
8
|
+
it 'creates a creative group' do
|
9
|
+
expect(client).to receive(:post).with('/creativegroups', options)
|
10
|
+
client.create_creative_group(options)
|
22
11
|
end
|
23
12
|
end
|
24
13
|
|
data/spec/ad_leads/image_spec.rb
CHANGED
@@ -1,70 +1,39 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe AdLeads::Client::Image do
|
4
|
+
let(:client) { AdLeads::Client.new }
|
5
|
+
let(:options) { {} }
|
6
|
+
let(:file) { './spec/fixtures/test.jpg' }
|
4
7
|
|
5
|
-
describe
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
let(:etag_mismatch) { double(:http_response, status: 412) }
|
11
|
-
let(:new_etag) { double(:http_response, status: 200, headers: { 'Etag' => '123'} ) }
|
12
|
-
|
13
|
-
it 'inherits from AdLeads::Base' do
|
14
|
-
expect(image.class.ancestors).to include AdLeads::Base
|
15
|
-
end
|
16
|
-
|
17
|
-
describe '#create!' do
|
18
|
-
it 'posts to AdLeads::Image endpoint' do
|
19
|
-
expect(client).to receive(:post).with('/creativegroups/1/creatives/1/images', params)
|
20
|
-
image.create!(params)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'assigns #response' do
|
24
|
-
client.stub(:post) { 'Foobar' }
|
25
|
-
image.create!(params)
|
26
|
-
expect(image.response).to eq 'Foobar'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '#refresh_etag' do
|
31
|
-
before { image.stub(:etag_path) { '/foo' } }
|
32
|
-
it 'sets @etag from response headers' do
|
33
|
-
expect(client).to receive(:get).with('/foo').and_return(new_etag)
|
34
|
-
image.refresh_etag!
|
35
|
-
expect(image.etag).to eq '123'
|
8
|
+
describe '#create_image' do
|
9
|
+
it 'creates an image' do
|
10
|
+
expect(client).to receive(:post).
|
11
|
+
with('/creativegroups/1/creatives/1/images', options)
|
12
|
+
client.create_image(1, 1, options)
|
36
13
|
end
|
37
14
|
end
|
38
15
|
|
39
|
-
describe '#
|
40
|
-
|
41
|
-
|
42
|
-
image.stub(:etag) { 'Fake etag' }
|
43
|
-
image.stub(:id) { 1 }
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'posts to AdLeads::Image#image_upload_path' do
|
47
|
-
image.stub(:image_upload_params) {{}}
|
16
|
+
describe '#upload_image' do
|
17
|
+
it 'uploads an image' do
|
18
|
+
client.stub(:image_upload_opts) { {} }
|
48
19
|
expect(client).to receive(:post).
|
49
|
-
with('/creativegroups/1/creatives/1/images/1/file',
|
50
|
-
|
51
|
-
image.upload!(file)
|
20
|
+
with('/creativegroups/1/creatives/1/images/1/file', options)
|
21
|
+
client.upload_image(1, 1, 1, file)
|
52
22
|
end
|
53
23
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
24
|
+
it 'gets etag' do
|
25
|
+
etag_response = double :response, headers: { 'Etag' => 1 }
|
26
|
+
expect(client).to receive(:get).with('/creativegroups/1/creatives/1/images/1').
|
27
|
+
and_return(etag_response)
|
28
|
+
client.send(:image_upload_opts, 1, 1, 1, file)
|
29
|
+
end
|
61
30
|
|
62
|
-
|
63
|
-
|
64
|
-
client.stub(:
|
65
|
-
|
66
|
-
|
67
|
-
|
31
|
+
context 'with EtagMismatchError' do
|
32
|
+
it 'retries upload a maximum of three times' do
|
33
|
+
client.stub(:image_upload_opts) { {} }
|
34
|
+
client.stub(:post) { raise AdLeads::EtagMismatchError.new 'Error' }
|
35
|
+
expect(client).to receive(:post).exactly(3).times
|
36
|
+
client.upload_image(1, 1, 1, file)
|
68
37
|
end
|
69
38
|
end
|
70
39
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'pry'
|
2
3
|
|
3
4
|
describe AdLeads::Client do
|
4
5
|
let!(:client) { AdLeads::Client.new }
|
5
6
|
let(:connection) { client.connection }
|
6
|
-
let(:
|
7
|
-
let(:token) { '99d3492c-f82e-40c1-ac12-95a3c3326edc' }
|
7
|
+
let(:token) { '55bd8390-9cd9-4b69-9966-1a10a9bc5591' }
|
8
8
|
let(:file) { './spec/fixtures/test.jpg' }
|
9
9
|
|
10
10
|
before do
|
@@ -16,47 +16,80 @@ describe AdLeads::Client do
|
|
16
16
|
describe 'Ad Campaign' do
|
17
17
|
xit 'uploads logo image, creates campaign using logo image, verifies and launches ad campaign' do
|
18
18
|
|
19
|
-
|
19
|
+
options = {
|
20
20
|
'name' => 'Creative Group Name',
|
21
21
|
'productName' => 'amazing product',
|
22
22
|
'privacyPolicyUrl' => 'http://privacy_url'
|
23
23
|
}
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
client.create_creative_group(options)
|
26
|
+
creative_id = client.last_response_id
|
27
27
|
|
28
|
-
|
28
|
+
options = {
|
29
29
|
'type' => 'Mobile',
|
30
30
|
'name' => 'Ad name',
|
31
31
|
'headerText' => 'get your ad on this phone today',
|
32
32
|
'bodyText' => 'this is mobile ad body copy'
|
33
33
|
}
|
34
34
|
|
35
|
-
|
36
|
-
|
35
|
+
client.create_ad(creative_id, options)
|
36
|
+
ad_id = client.last_response_id
|
37
37
|
|
38
|
-
|
38
|
+
options = { 'type' => 'LogoImage' }
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
client.create_image(creative_id, ad_id, options)
|
41
|
+
image_id = client.last_response_id
|
42
|
+
client.upload_image(creative_id, ad_id, image_id, file)
|
43
43
|
|
44
|
-
|
44
|
+
options = {
|
45
45
|
'name' => 'Campaign name',
|
46
46
|
'verticals' => 82,
|
47
47
|
'offerIncentiveCategory' => 5,
|
48
48
|
'collectedFields' => 'firstname,lastname,email,companyname',
|
49
49
|
'budget' => 50,
|
50
|
-
'creativeGroups' =>
|
50
|
+
'creativeGroups' => creative_id
|
51
51
|
}
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
campaign.verify!
|
56
|
-
campaign.launch!
|
53
|
+
client.create_campaign(options)
|
54
|
+
campaign_id = client.last_response_id
|
57
55
|
|
58
|
-
|
59
|
-
|
56
|
+
client.verify_campaign(campaign_id)
|
57
|
+
response = client.launch_campaign(campaign_id)
|
58
|
+
|
59
|
+
expect(response.status).to eq(200)
|
60
|
+
expect(JSON.parse(response.body)['result']).to eq true
|
61
|
+
end
|
62
|
+
|
63
|
+
xit 'creates complete campaign in one step, verifies and launches ad campaign' do
|
64
|
+
options = {
|
65
|
+
creative_group: {
|
66
|
+
'name' => 'Creative Group Name',
|
67
|
+
'productName' => 'amazing product',
|
68
|
+
'privacyPolicyUrl' => 'http://privacy_url'
|
69
|
+
},
|
70
|
+
ad: {
|
71
|
+
'type' => 'Mobile',
|
72
|
+
'name' => 'Ad name',
|
73
|
+
'headerText' => 'get your ad on this phone today',
|
74
|
+
'bodyText' => 'this is mobile ad body copy'
|
75
|
+
},
|
76
|
+
image: { 'type' => 'LogoImage' },
|
77
|
+
file: file,
|
78
|
+
campaign: {
|
79
|
+
'name' => 'Campaign name',
|
80
|
+
'verticals' => 82,
|
81
|
+
'offerIncentiveCategory' => 5,
|
82
|
+
'collectedFields' => 'firstname,lastname,email,companyname',
|
83
|
+
'budget' => 50
|
84
|
+
}}
|
85
|
+
|
86
|
+
client.create_complete_campaign(options)
|
87
|
+
campaign_id = client.last_response_id
|
88
|
+
client.verify_campaign(campaign_id)
|
89
|
+
client.launch_campaign(campaign_id)
|
90
|
+
|
91
|
+
expect(client.last_response.status).to eq(200)
|
92
|
+
expect(JSON.parse(client.last_response.body)['result']).to eq true
|
60
93
|
end
|
61
94
|
end
|
62
95
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ad_leads
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dinshaw
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -123,19 +123,16 @@ files:
|
|
123
123
|
- ad_leads.gemspec
|
124
124
|
- lib/ad_leads.rb
|
125
125
|
- lib/ad_leads/ad.rb
|
126
|
-
- lib/ad_leads/base.rb
|
127
126
|
- lib/ad_leads/campaign.rb
|
128
127
|
- lib/ad_leads/campaign_helpers.rb
|
129
128
|
- lib/ad_leads/client.rb
|
130
129
|
- lib/ad_leads/configuration.rb
|
131
130
|
- lib/ad_leads/creative_group.rb
|
132
|
-
- lib/ad_leads/etag.rb
|
133
131
|
- lib/ad_leads/image.rb
|
134
132
|
- lib/ad_leads/promotion.rb
|
135
133
|
- lib/ad_leads/token.rb
|
136
134
|
- lib/ad_leads/version.rb
|
137
135
|
- spec/ad_leads/ad_spec.rb
|
138
|
-
- spec/ad_leads/base_spec.rb
|
139
136
|
- spec/ad_leads/campaign_spec.rb
|
140
137
|
- spec/ad_leads/client_spec.rb
|
141
138
|
- spec/ad_leads/configuration_spec.rb
|
@@ -173,7 +170,6 @@ specification_version: 4
|
|
173
170
|
summary: Ruby Wrapper for AdLeads API
|
174
171
|
test_files:
|
175
172
|
- spec/ad_leads/ad_spec.rb
|
176
|
-
- spec/ad_leads/base_spec.rb
|
177
173
|
- spec/ad_leads/campaign_spec.rb
|
178
174
|
- spec/ad_leads/client_spec.rb
|
179
175
|
- spec/ad_leads/configuration_spec.rb
|
data/lib/ad_leads/base.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
class AdLeads::Base
|
2
|
-
attr_accessor :response
|
3
|
-
|
4
|
-
def create!(params)
|
5
|
-
self.response = client.post(root_path, params)
|
6
|
-
end
|
7
|
-
|
8
|
-
def client
|
9
|
-
@client ||= AdLeads::Client.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def id
|
13
|
-
@id ||= JSON.parse(response.body)['data'].first
|
14
|
-
end
|
15
|
-
|
16
|
-
def status
|
17
|
-
response.status
|
18
|
-
end
|
19
|
-
end
|
data/lib/ad_leads/etag.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module AdLeads::Etag
|
2
|
-
def etag_path
|
3
|
-
# must be implemented in including class
|
4
|
-
end
|
5
|
-
|
6
|
-
def refresh_etag!
|
7
|
-
@etag = client.get(etag_path).headers['Etag']
|
8
|
-
end
|
9
|
-
|
10
|
-
def etag
|
11
|
-
@etag ||= refresh_etag!
|
12
|
-
end
|
13
|
-
|
14
|
-
def with_etag(count = 1, &block)
|
15
|
-
raise MismatchError if count > 3
|
16
|
-
|
17
|
-
response = yield
|
18
|
-
count += 1
|
19
|
-
|
20
|
-
if response.status == 412
|
21
|
-
self.refresh_etag!
|
22
|
-
with_etag(count) do
|
23
|
-
yield
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
class MismatchError < StandardError; end
|
30
|
-
end
|
data/spec/ad_leads/base_spec.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe AdLeads::Base do
|
4
|
-
let(:base) { AdLeads::Base.new() }
|
5
|
-
|
6
|
-
describe '#id' do
|
7
|
-
let(:response) { double(:response, body: '{ "data": [1] }') }
|
8
|
-
before { base.response = response }
|
9
|
-
|
10
|
-
it 'parses ID from JSON response body' do
|
11
|
-
expect(base.id).to eq 1
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe 'client' do
|
16
|
-
it 'returns an instance of AdLeads::Client' do
|
17
|
-
expect(base.client).to be_a AdLeads::Client
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|