fake_fb_marketing_api 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99afb79bf47f9427e52842be802807c88d9dc32a
4
- data.tar.gz: 29bb8e9c56bfbfba455180e48e153549b8507929
3
+ metadata.gz: 902b82f2118934fcc72d5f5f13eff04ecf047e2b
4
+ data.tar.gz: 9810c731ff7749c5c5217ad5e770ab0cd9667567
5
5
  SHA512:
6
- metadata.gz: a3dd5717991fc14d3f5157add3ece91a4e433f3573e843053c6c511fa816f0e1b49da4e2a2a046c2d6b9e4dec1de5e051d345a87c9b8dcf20cab92b4e565ef62
7
- data.tar.gz: e1a66ed121049394e971660e376893924cd4c201cb42e9b7e5818835ce8b2e6deb8769faa805c83e077ba7d24ea577d87084e523ac149778a5704c693ec9f21d
6
+ metadata.gz: 796be2231683d601691c4660233945e8e295092ba61c07003a4c6312937b396b4b320d9687f63fd3c85f15eee50a8172120ffab8e0d3e6b13850f8bf7b89704f
7
+ data.tar.gz: 97cffc4336e934983a1620a7b1431a1a061185a25e366a4a9404f7eb91d7fd28b0bdb240d0d53a5818fe72ee002f16b2e87cecc844101eb0dc8cf69ac2b74a10
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fake_fb_marketing_api (0.0.4)
4
+ fake_fb_marketing_api (0.0.6)
5
5
  sinatra (~> 2.0)
6
6
  we-call (~> 0.9)
7
7
 
@@ -39,7 +39,7 @@ GEM
39
39
  faraday (>= 0.9.0, < 1)
40
40
  faraday_middleware (0.13.1)
41
41
  faraday (>= 0.7.4, < 1.0)
42
- ffi (1.10.0)
42
+ ffi (1.11.1)
43
43
  hashdiff (0.3.8)
44
44
  i18n (1.5.3)
45
45
  concurrent-ruby (~> 1.0)
@@ -110,7 +110,7 @@ PLATFORMS
110
110
  ruby
111
111
 
112
112
  DEPENDENCIES
113
- bundler (~> 1.15)
113
+ bundler
114
114
  capybara_discoball
115
115
  fake_fb_marketing_api!
116
116
  faker (~> 1.9)
@@ -125,4 +125,4 @@ DEPENDENCIES
125
125
  webmock
126
126
 
127
127
  BUNDLED WITH
128
- 1.15.2
128
+ 2.0.2
@@ -35,7 +35,7 @@ Gem::Specification.new do |gem|
35
35
  end
36
36
  gem.required_ruby_version = '>= 2.4.3'
37
37
 
38
- gem.add_development_dependency 'bundler', '~> 1.15'
38
+ gem.add_development_dependency 'bundler'
39
39
  gem.add_development_dependency 'capybara_discoball'
40
40
  gem.add_development_dependency 'faker', '~> 1.9'
41
41
  gem.add_development_dependency 'faraday'
@@ -2,12 +2,14 @@
2
2
 
3
3
  require 'rack/builder'
4
4
 
5
+ require_relative './versions/v3_3'
5
6
  require_relative './versions/v3_2'
6
7
  require_relative './versions/v3_0'
7
8
 
8
9
  module FakeFbMarketingApi
9
10
  class Application
10
11
  VERSIONS = [
12
+ FakeFbMarketingApi::Versions::V33,
11
13
  FakeFbMarketingApi::Versions::V32,
12
14
  FakeFbMarketingApi::Versions::V30
13
15
  ].freeze
@@ -21,3 +21,4 @@ module FakeFbMarketingApi
21
21
  end
22
22
  end
23
23
  end
24
+
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FakeFbMarketingApi
4
- VERSION = '0.0.5'
4
+ VERSION = '0.0.6'
5
5
  end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base'
4
+ require_relative '../fake_facebook'
5
+
6
+ module FakeFbMarketingApi
7
+ module Versions
8
+ class V33 < Base
9
+ set_namespace 'v3.3'
10
+
11
+ get '/:business_id/owned_ad_accounts' do
12
+ content_type :json
13
+ FakeFacebook.owned_ad_accounts.to_json
14
+ end
15
+
16
+ post '/:business_id/adaccount' do
17
+ content_type :json
18
+ FakeFacebook.add_owned_ad_account(
19
+ {
20
+ 'name' => params[:name],
21
+ 'id' => ENV.fetch('FACEBOOK_AD_ACCOUNT_ID')
22
+ }
23
+ )
24
+ {
25
+ end_advertiser_id: params[:end_advertiser_id],
26
+ media_agency_id: params[:media_agency_id],
27
+ business_id: params[:business_id],
28
+ account_id: ENV['FACEBOOK_AD_ACCOUNT_ID'].sub(/^act_/, ''),
29
+ id: ENV['FACEBOOK_AD_ACCOUNT_ID'],
30
+ partner_id: 'NONE'
31
+ }.to_json
32
+ end
33
+
34
+ post '/:project_id/adaccounts' do
35
+ content_type :json
36
+ proxy_post_to_fb(request, response)
37
+ end
38
+
39
+ post '/:ad_account_id/assigned_users' do
40
+ proxy_post_to_fb(request, response)
41
+ end
42
+
43
+ post '/:business_id/businessprojects' do
44
+ proxy_post_to_fb(request, response)
45
+ end
46
+
47
+ post '/:ad_account_id/campaigns' do
48
+ content_type :json
49
+ case params[:objective]
50
+ when 'BRAND_AWARENESS'
51
+ {
52
+ id: ENV['BRAND_AWARENESS_CAMPAIGN_ID']
53
+ }.to_json
54
+ when 'LINK_CLICKS'
55
+ {
56
+ id: ENV['LINK_CLICKS_CAMPAIGN_ID']
57
+ }.to_json
58
+ when 'VIDEO_VIEWS'
59
+ {
60
+ id: ENV['VIDEO_VIEWS_CAMPAIGN_ID']
61
+ }.to_json
62
+ when 'REACH'
63
+ {
64
+ id: ENV['REACH_CAMPAIGN_ID']
65
+ }.to_json
66
+ when 'POST_ENGAGEMENT'
67
+ {
68
+ id: ENV['POST_ENGAGEMENT_CAMPAIGN_ID']
69
+ }.to_json
70
+ when 'PAGE_LIKES'
71
+ {
72
+ id: ENV['PAGE_LIKES_CAMPAIGN_ID']
73
+ }.to_json
74
+ when 'CONVERSIONS_COUNT'
75
+ {
76
+ id: ENV['CONVERSIONS_COUNT_CAMPAIGN_ID']
77
+ }.to_json
78
+ when 'CONVERSIONS_FUNDRAISE'
79
+ {
80
+ id: ENV['CONVERSIONS_FUNDRAISE_CAMPAIGN_ID']
81
+ }.to_json
82
+ when 'CONVERSIONS'
83
+ {
84
+ id: ENV['CONVERSIONS_CAMPAIGN_ID']
85
+ }.to_json
86
+ end
87
+ end
88
+
89
+ get '/:graph_id/*' do
90
+ content_type :json
91
+ proxy_get_to_fb(request, response)
92
+ end
93
+
94
+ post '/*' do
95
+ content_type :json
96
+ return proxy_post_to_fb(request, response)
97
+ end
98
+
99
+ get '/*' do
100
+ proxy_get_to_fb(request, response)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -16,6 +16,7 @@ RSpec.describe FakeFbMarketingApi::Application do
16
16
  before { ENV['POST_ENGAGEMENT_CAMPAIGN_ID'] = Faker::Number.number(10) }
17
17
  before { ENV['PAGE_LIKES_CAMPAIGN_ID'] = Faker::Number.number(10) }
18
18
  before do
19
+ FakeFbMarketingApi::FakeFacebook.setup
19
20
  WebMock.disable_net_connect!(allow: /127.0.0.1/)
20
21
  Capybara::Discoball.spin(FakeFbMarketingApi::Application) do |server|
21
22
  Koala.http_service.http_options = {
@@ -0,0 +1,351 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'koala'
4
+ require 'capybara_discoball'
5
+
6
+ RSpec.describe FakeFbMarketingApi::Application do
7
+ before { ENV['PROJECT_ID'] = Faker::Number.number(10) }
8
+ before { ENV['BUSINESS_ID'] = Faker::Number.number(10) }
9
+ before { ENV['FACEBOOK_AD_ACCOUNT_ID'] = Faker::Number.number(10) }
10
+ before { ENV['FACEBOOK_AD_ACCOUNT_NAME'] = Faker::Seinfeld.character }
11
+ before { ENV['BRAND_AWARENESS_CAMPAIGN_ID'] = Faker::Number.number(10) }
12
+ before { ENV['LINK_CLICKS_CAMPAIGN_ID'] = Faker::Number.number(10) }
13
+ before { ENV['VIDEO_VIEWS_CAMPAIGN_ID'] = Faker::Number.number(10) }
14
+ before { ENV['CONVERSIONS_CAMPAIGN_ID'] = Faker::Number.number(10) }
15
+ before { ENV['REACH_CAMPAIGN_ID'] = Faker::Number.number(10) }
16
+ before { ENV['POST_ENGAGEMENT_CAMPAIGN_ID'] = Faker::Number.number(10) }
17
+ before { ENV['PAGE_LIKES_CAMPAIGN_ID'] = Faker::Number.number(10) }
18
+ before do
19
+ FakeFbMarketingApi::FakeFacebook.setup
20
+ WebMock.disable_net_connect!(allow: /127.0.0.1/)
21
+ Capybara::Discoball.spin(FakeFbMarketingApi::Application) do |server|
22
+ Koala.http_service.http_options = {
23
+ use_ssl: false
24
+ }
25
+ Koala.configure do |config|
26
+ config.api_version = 'v3.3'
27
+ config.graph_server = server.url.gsub 'http://', ''
28
+ end
29
+ end
30
+ end
31
+
32
+ let(:access_token) { Faker::Number.number(20) }
33
+ let(:graph) { Koala::Facebook::API.new(access_token) }
34
+
35
+ it 'has a version number' do
36
+ expect(FakeFbMarketingApi::VERSION).not_to be nil
37
+ end
38
+
39
+ describe 'GET /:business_id/owned_ad_acocunts' do
40
+ it 'does not show any ad accounts until one is created' do
41
+ response = graph.get_object("#{ENV['BUSINESS_ID']}/owned_ad_accounts", fields: 'id,name')
42
+
43
+ expect(response).to eq([])
44
+ end
45
+
46
+ it 'returns a single ad account after one has been created' do
47
+ end_advertiser_id = Faker::Number.number(10)
48
+ media_agency_id = Faker::Number.number(10)
49
+ name = Faker::Seinfeld.character
50
+ response = graph.put_connections "#{ENV['BUSINESS_ID']}", 'adaccount',
51
+ name: name,
52
+ currency: 'USD', timezone_id: 6, end_advertiser_id: end_advertiser_id,
53
+ media_agency_id: media_agency_id, partner: 'NONE'
54
+ response = graph.get_object("#{ENV['BUSINESS_ID']}/owned_ad_accounts", fields: 'id,name')
55
+
56
+ expect(response).to eq(
57
+ [
58
+ {
59
+ 'id' => ENV.fetch('FACEBOOK_AD_ACCOUNT_ID'),
60
+ 'name' => name
61
+ }
62
+ ]
63
+ )
64
+ end
65
+ end
66
+
67
+ describe 'POST /:business_id/adaccount' do
68
+ context 'when creating an ad account' do
69
+ it 'works' do
70
+ end_advertiser_id = Faker::Number.number(10)
71
+ media_agency_id = Faker::Number.number(10)
72
+ response = graph.put_connections (ENV['BUSINESS_ID']).to_s, 'adaccount',
73
+ name: 'Test Ad Account',
74
+ currency: 'USD', timezone_id: 6, end_advertiser_id: end_advertiser_id,
75
+ media_agency_id: media_agency_id, partner: 'NONE'
76
+
77
+ expect(response).to include
78
+ {
79
+ 'business_id' => ENV['BUSINESS_ID'],
80
+ 'account_id' => ENV['FACEBOOK_AD_ACCOUNT_ID'],
81
+ 'id' => "act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}",
82
+ 'end_advertiser_id' => end_advertiser_id,
83
+ 'media_agency_id' => media_agency_id,
84
+ 'partner_id' => 'NONE'
85
+ }
86
+ end
87
+ end
88
+ end
89
+
90
+ describe 'POST /:project_id/adaccounts' do
91
+ context 'when adding a user to an ad account' do
92
+ it 'calls out to facebook' do
93
+ project_id = Faker::Number.number(15).to_s
94
+ fb_ad_account = ENV['FACEBOOK_AD_ACCOUNT_ID']
95
+ stub_request(:post, "https://graph.facebook.com/v3.3/#{project_id}/adaccounts?access_token=#{access_token}&adaccount_id=#{fb_ad_account}")
96
+ .with(
97
+ headers: {
98
+ 'Expect' => '',
99
+ 'User-Agent' => 'fb-graph-proxy',
100
+ 'X-App-Env' => 'staging',
101
+ 'X-App-Name' => 'fb-graph-proxy'
102
+ }
103
+ ).to_return(status: 200, body: { 'success' => true }.to_json, headers: {})
104
+
105
+ response = graph.put_connections(project_id, 'adaccounts', adaccount_id: fb_ad_account)
106
+
107
+ expect(response).to eq('success' => true)
108
+ end
109
+ end
110
+ end
111
+
112
+ describe 'POST /:ad_account_id/assigned_users' do
113
+ it 'passes makes a post to fb' do
114
+ user_id = Faker::Number.number(14).to_s
115
+ ad_account_id = Faker::Number.number(15).to_s
116
+ stub_request(:post, "https://graph.facebook.com/v3.3/#{ad_account_id}/assigned_users?access_token=#{access_token}&tasks=ANALYZE,MANAGE,ADVERTISE&user=#{user_id}")
117
+ .with(
118
+ headers: {
119
+ 'Content-Length' => '0',
120
+ 'Expect' => '',
121
+ 'User-Agent' => 'fb-graph-proxy',
122
+ 'X-App-Env' => 'staging',
123
+ 'X-App-Name' => 'fb-graph-proxy'
124
+ }
125
+ )
126
+ .to_return(status: 200, body: { 'success' => true }.to_json, headers: {})
127
+
128
+ response = graph.put_connections(ad_account_id, 'assigned_users', user: user_id, tasks: %w[ANALYZE MANAGE ADVERTISE])
129
+
130
+ expect(response).to eq 'success' => true
131
+ end
132
+ end
133
+
134
+ describe 'POST /:business_id/businessprojects' do
135
+ it 'passes a static project_id' do
136
+ stub_request(:post, "https://graph.facebook.com/v3.3/#{ENV['BUSINESS_ID']}/businessprojects?access_token=#{access_token}&name=test_project")
137
+ .to_return(status: 200, body: { 'id' => ENV['PROJECT_ID'] }.to_json, headers: {})
138
+
139
+ result = graph.put_connections(ENV['BUSINESS_ID'], 'businessprojects', name: 'test_project')
140
+
141
+ expect(result).to include 'id' => ENV['PROJECT_ID']
142
+ end
143
+ end
144
+
145
+ describe 'POST /:ad_account_id/campaigns' do
146
+ it 'works for brand awareness' do
147
+ objective = 'BRAND_AWARENESS'
148
+
149
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
150
+
151
+ expect(campaign).to eq 'id' => ENV['BRAND_AWARENESS_CAMPAIGN_ID']
152
+ end
153
+
154
+ it 'works for link clicks' do
155
+ objective = 'LINK_CLICKS'
156
+
157
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
158
+
159
+ expect(campaign).to eq 'id' => ENV['LINK_CLICKS_CAMPAIGN_ID']
160
+ end
161
+
162
+ it 'works for video views' do
163
+ objective = 'VIDEO_VIEWS'
164
+
165
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
166
+
167
+ expect(campaign).to eq 'id' => ENV['VIDEO_VIEWS_CAMPAIGN_ID']
168
+ end
169
+
170
+ it 'works for reach' do
171
+ objective = 'REACH'
172
+
173
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
174
+
175
+ expect(campaign).to eq 'id' => ENV['REACH_CAMPAIGN_ID']
176
+ end
177
+
178
+ it 'works for post engagement' do
179
+ objective = 'POST_ENGAGEMENT'
180
+
181
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
182
+
183
+ expect(campaign).to eq 'id' => ENV['POST_ENGAGEMENT_CAMPAIGN_ID']
184
+ end
185
+
186
+ it 'works for page likes' do
187
+ objective = 'PAGE_LIKES'
188
+
189
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
190
+
191
+ expect(campaign).to eq 'id' => ENV['PAGE_LIKES_CAMPAIGN_ID']
192
+ end
193
+
194
+ it 'works for conversions' do
195
+ objective = 'CONVERSIONS'
196
+
197
+ campaign = graph.put_connections("act_#{ENV['FACEBOOK_AD_ACCOUNT_ID']}", 'campaigns', budget_rebalance_flag: false, name: "#{objective} Test Campaign", objective: objective, status: 'ACTIVE')
198
+
199
+ expect(campaign).to eq 'id' => ENV['CONVERSIONS_CAMPAIGN_ID']
200
+ end
201
+ end
202
+
203
+ describe 'GET /:ad_account_id/campaigns' do
204
+ context 'when no campaigns have been created' do
205
+ it 'returns nothing' do
206
+ end
207
+ end
208
+ end
209
+
210
+ describe 'GET /:graph_id/insights' do
211
+ it 'passes through insight requests' do
212
+ graph_id = Faker::Number.number(10)
213
+ stub_request(:get, "https://graph.facebook.com/v3.3/#{graph_id}/insights?access_token=#{access_token}&date_preset=lifetime&fields=ad_id")
214
+ .to_return(status: 200, body: "{\"data\":[{\"ad_id\":\"#{graph_id}\",\"date_start\":\"2018-05-30\",\"date_stop\":\"2019-01-05\"}],\"paging\":{\"cursors\":{\"before\":\"MAZDZD\",\"after\":\"MAZDZD\"}}}", headers: {})
215
+
216
+ ad_insights = graph.get_object("#{graph_id}/insights", fields: 'ad_id', date_preset: 'lifetime')
217
+
218
+ expect(ad_insights.count).to eq 1
219
+ expect(ad_insights.first['ad_id']).to eq graph_id
220
+ end
221
+
222
+ it 'returns headers of the api call' do
223
+ graph_id = Faker::Number.number(10)
224
+ headers = { 'etag' => '423144fb7fd642308ea9666e20cceb65ee4f6650' }
225
+ stub_request(:get, "https://graph.facebook.com/v3.3/#{graph_id}/insights?access_token=#{access_token}&date_preset=lifetime&fields=ad_id")
226
+ .to_return(status: 200, body: "{\"data\":[{\"ad_id\":\"#{graph_id}\",\"date_start\":\"2018-05-30\",\"date_stop\":\"2019-01-05\"}],\"paging\":{\"cursors\":{\"before\":\"MAZDZD\",\"after\":\"MAZDZD\"}}}", headers: headers)
227
+
228
+ ad_insights = graph.get_object("#{graph_id}/insights", fields: 'ad_id', date_preset: 'lifetime')
229
+
230
+ expect(ad_insights.headers).to include 'etag'
231
+ end
232
+
233
+ it 'returns the status of the api call' do
234
+ graph_id = Faker::Number.number(10)
235
+ headers = { 'etag' => '423144fb7fd642308ea9666e20cceb65ee4f6650' }
236
+ stub_request(:get, "https://graph.facebook.com/v3.3/#{graph_id}/insights?access_token=#{access_token}&date_preset=lifetime&fields=ad_id")
237
+ .to_return(status: 400, body: "{\"error\":{\"message\":\"(#100) date_preset must be \",\"type\":\"OAuthException\",\"code\":100,\"fbtrace_id\":\"GB8SawFk\/47\"}}", headers: headers)
238
+
239
+ expect do
240
+ graph.get_object("#{graph_id}/insights", fields: 'ad_id', date_preset: 'lifetime')
241
+ end.to raise_error Koala::KoalaError
242
+ end
243
+ end
244
+
245
+ describe 'POST / batch requests' do
246
+ it 'passes through insight requests' do
247
+ graph_id = Faker::Number.number(10)
248
+ json = File.open("#{Dir.pwd}/spec/fb_batch_response.json").read
249
+ json.gsub!('replace_ad_id', graph_id)
250
+ stub_request(:post, "https://graph.facebook.com/v3.3/?access_token=#{access_token}&batch=%5B%7B%22method%22:%22get%22,%22relative_url%22:%22#{graph_id}/insights?date_preset=lifetime%26fields=ad_id%22%7D,%7B%22method%22:%22get%22,%22relative_url%22:%22#{graph_id}/insights?date_preset=lifetime%26fields=ad_id%22%7D%5D")
251
+ .to_return(status: 200, body: json, headers: {})
252
+
253
+ result = graph.batch do |batch|
254
+ batch.get_object("#{graph_id}/insights", fields: 'ad_id', date_preset: 'lifetime')
255
+ batch.get_object("#{graph_id}/insights", fields: 'ad_id', date_preset: 'lifetime')
256
+ end
257
+
258
+ expect(result.first.first).to include 'ad_id' => graph_id
259
+ end
260
+
261
+ it 'returns errror when they happen' do
262
+ graph_id = Faker::Number.number(10)
263
+ json = File.open("#{Dir.pwd}/spec/fb_batch_error_response.json").read
264
+ json.gsub!('replace_ad_id', graph_id)
265
+ stub_request(:post, "https://graph.facebook.com/v3.3/?access_token=#{access_token}&batch=%5B%7B%22method%22:%22get%22,%22relative_url%22:%22doesnotexist/insights?date_preset=lifetime%26fields=ad_id%22%7D,%7B%22method%22:%22get%22,%22relative_url%22:%22doesnotexist/insights?date_preset=lifetime%26fields=ad_id%22%7D%5D").
266
+ # stub_request(:get, "https://graph.facebook.com/v3.0/?access_token=#{access_token}&batch=%5B%7B%22method%22:%22get%22,%22relative_url%22:%22#{graph_id}/insights?date_preset=lifetime%26fields=ad_id%22%7D%5D").
267
+ to_return(status: 200, body: json)
268
+
269
+ result = graph.batch do |batch|
270
+ batch.get_object('doesnotexist/insights', fields: 'ad_id', date_preset: 'lifetime')
271
+ batch.get_object('doesnotexist/insights', fields: 'ad_id', date_preset: 'lifetime')
272
+ end
273
+
274
+ expect(result[0].fb_error_code).to eq 803
275
+ expect(result[1].fb_error_code).to eq 803
276
+ end
277
+
278
+ it 'passes headers through' do
279
+ graph_id = Faker::Number.number(10)
280
+ json = File.open("#{Dir.pwd}/spec/fb_batch_error_response.json").read
281
+ json.gsub!('replace_ad_id', graph_id)
282
+ stub_request(:post, "https://graph.facebook.com/v3.3/?access_token=#{access_token}&batch=%5B%7B%22method%22:%22get%22,%22relative_url%22:%22doesnotexist/insights?date_preset=lifetime%26fields=ad_id%22%7D,%7B%22method%22:%22get%22,%22relative_url%22:%22doesnotexist/insights?date_preset=lifetime%26fields=ad_id%22%7D%5D")
283
+ .to_return(status: 200,
284
+ body: json,
285
+ headers: { 'Content-Type' => 'text/javascript; charset=UTF-8',
286
+ 'Facebook-API-Version' => 'v3.3',
287
+ 'X-App-Usage' => '{"call_count":0,"total_cputime":0,"total_time":0}',
288
+ 'ETag' => '9d4067db4e21a79fc53d45e0f487e67c5c0b50a1',
289
+ 'Access-Control-Allow-Origin' => '*',
290
+ 'Cache-Control' => 'private, no-cache, no-store, must-revalidate',
291
+ 'Vary' => 'Accept-Encoding',
292
+ 'Expires' => 'Sat, 01 Jan 2000 00:00:00 GMT',
293
+ 'X-Ad-Account-Usage' => '{"acc_id_util_pct":0}',
294
+ 'Strict-Transport-Security' => 'max-age=15552000; preload',
295
+ 'Transfer-Encoding' => 'chunked',
296
+ 'Connection' => 'keep-alive',
297
+ 'Pragma' => 'no-cache' })
298
+
299
+ result = graph.batch do |batch|
300
+ batch.get_object('doesnotexist/insights', fields: 'ad_id', date_preset: 'lifetime')
301
+ batch.get_object('doesnotexist/insights', fields: 'ad_id', date_preset: 'lifetime')
302
+ end
303
+
304
+ expect(result).not_to be_nil
305
+ end
306
+ end
307
+
308
+ describe 'POST /:ad_set_id' do
309
+ it 'passes through requests to pause an ad' do
310
+ graph_id = Faker::Number.number(10)
311
+ stub_request(:post, "https://graph.facebook.com/v3.3/#{graph_id}/?access_token=#{access_token}&status=PAUSED")
312
+ .to_return(status: 200, body: { success: true }.to_json, headers: {})
313
+
314
+ result = graph.put_connections(graph_id, '', status: 'PAUSED')
315
+
316
+ expect(result).to include 'success' => true
317
+ end
318
+ end
319
+
320
+ describe 'GET /' do
321
+ it 'gets graph objects' do
322
+ graph_id = Faker::Number.number(10)
323
+ json = File.open("#{Dir.pwd}/spec/fb_graph_object_response.json").read
324
+ stub_request(:get, "https://graph.facebook.com/v3.3/?access_token=#{access_token}&fields=og_object%7Btitle,description,image%7D&id=https://fox2now.com/2018/04/02/5-myths-about-organ-donation/")
325
+ .to_return(
326
+ status: 200,
327
+ body: json,
328
+ headers: { 'Vary' => 'Accept-Encoding',
329
+ 'ETag' => '"90f0a9d85d04bf2760528d1f834dfa8444145dfb"',
330
+ 'x-app-usage' => '{"call_count":0,"total_cputime":0,"total_time":0}',
331
+ 'Content-Type' => 'application/json; charset=UTF-8',
332
+ 'facebook-api-version' => 'v3.0',
333
+ 'x-fb-rev' => '4669664',
334
+ 'Access-Control-Allow-Origin' => '*',
335
+ 'Cache-Control' => 'private, no-cache, no-store, must-revalidate',
336
+ 'x-fb-trace-id' => 'HwmUZwadEmw',
337
+ 'Expires' => 'Sat, 01 Jan 2000 00:00:00 GMT',
338
+ 'Strict-Transport-Security' => 'max-age=15552000; preload',
339
+ 'Pragma' => 'no-cache',
340
+ 'X-FB-Debug' => 'ykeEji7+g4+BKuq0fR8pJC2k3egR1GLILfEN7eL2VcGOBqKa7u2nLHGrLOE5DfB6A7YlPTalEVgbAx8oDyIDnQ==',
341
+ 'Date' => 'Tue, 08 Jan 2019 20:17:41 GMT',
342
+ 'Transfer-Encoding' => 'chunked',
343
+ 'Connection' => 'keep-alive' }
344
+ )
345
+
346
+ result = graph.get_object('', fields: 'og_object{title,description,image}', id: 'https://fox2now.com/2018/04/02/5-myths-about-organ-donation/')
347
+
348
+ expect(result.dig('og_object')['title']).to eq '5 myths about organ donation'
349
+ end
350
+ end
351
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fake_fb_marketing_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Menne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-09 00:00:00.000000000 Z
11
+ date: 2019-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.15'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: capybara_discoball
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -237,9 +237,11 @@ files:
237
237
  - lib/fake_fb_marketing_api/version.rb
238
238
  - lib/fake_fb_marketing_api/versions/v3_0.rb
239
239
  - lib/fake_fb_marketing_api/versions/v3_2.rb
240
+ - lib/fake_fb_marketing_api/versions/v3_3.rb
240
241
  - spec/.fake_fb_marketing_api_spec.rb.swo
241
242
  - spec/.fake_fb_marketing_api_spec.rb.swp
242
- - spec/fake_fb_marketing_api_spec.rb
243
+ - spec/fake_fb_marketing_api_V3_2_spec.rb
244
+ - spec/fake_fb_marketing_api_v3_3_spec.rb
243
245
  - spec/fb_batch_error_response.json
244
246
  - spec/fb_batch_response.json
245
247
  - spec/fb_graph_object_response.json