zuck 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.markdown +4 -0
- data/README.markdown +35 -0
- data/VERSION +1 -1
- data/lib/zuck/facebook/ad_account.rb +8 -5
- data/lib/zuck/facebook/ad_campaign.rb +0 -1
- data/lib/zuck/facebook/ad_creative.rb +11 -10
- data/lib/zuck/facebook/ad_group.rb +5 -7
- data/lib/zuck/fb_object/hash_delegator.rb +5 -1
- data/lib/zuck/fb_object/helpers.rb +1 -1
- data/lib/zuck/fb_object/read.rb +0 -35
- data/spec/fixtures/a_single_account.yml +32 -57
- data/spec/fixtures/a_single_campaign.yml +12 -12
- data/spec/fixtures/a_single_group.yml +48 -0
- data/spec/fixtures/ad_keyword_search_disney.yml +12 -12
- data/spec/fixtures/{ad_keyword_search_steve_carell.yml → ad_keyword_search_moviepilot.yml} +8 -9
- data/spec/fixtures/ad_keyword_search_nonexistant.yml +5 -5
- data/spec/fixtures/create_ad_campaign.yml +12 -15
- data/spec/fixtures/create_ad_group.yml +15 -14
- data/spec/fixtures/delete_ad_group.yml +11 -15
- data/spec/fixtures/find_a_single_group_and_update_it.yml +224 -0
- data/spec/fixtures/list_of_ad_accounts.yml +26 -23
- data/spec/fixtures/list_of_ad_campaigns.yml +23 -24
- data/spec/fixtures/list_of_ad_creatives.yml +13 -15
- data/spec/fixtures/list_of_ad_groups.yml +62 -31
- data/spec/fixtures/list_of_all_ad_creatives_of_account.yml +41 -34
- data/spec/fixtures/reach_for_invalid_keyword.yml +9 -56
- data/spec/fixtures/reach_for_valid_keywords.yml +11 -56
- data/spec/fixtures/reach_for_valid_keywords_male_young.yml +11 -56
- data/spec/lib/zuck/facebook/ad_keyword_spec.rb +3 -3
- data/spec/lib/zuck/facebook/targeting_spec_spec.rb +4 -4
- data/spec/lib/zuck/fb_object/helpers_spec.rb +3 -2
- data/spec/lib/zuck_spec.rb +17 -24
- data/spec/spec_helper.rb +3 -0
- data/zuck.gemspec +5 -4
- metadata +6 -5
- data/spec/fixtures/find_a_single_campaign_and_update_it.yml +0 -247
@@ -2,17 +2,17 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://graph.facebook.com/search?access_token=
|
5
|
+
uri: https://graph.facebook.com/search?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&keyword_list=Eminem,invalidsssssssssssssss&type=adkeywordvalid
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
9
9
|
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.7
|
10
12
|
Accept-Encoding:
|
11
13
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
14
|
Accept:
|
13
15
|
- ! '*/*'
|
14
|
-
User-Agent:
|
15
|
-
- Ruby
|
16
16
|
response:
|
17
17
|
status:
|
18
18
|
code: 200
|
@@ -23,7 +23,7 @@ http_interactions:
|
|
23
23
|
Cache-Control:
|
24
24
|
- private, no-cache, no-store, must-revalidate
|
25
25
|
Content-Type:
|
26
|
-
-
|
26
|
+
- application/json; charset=UTF-8
|
27
27
|
Etag:
|
28
28
|
- ! '"1b6af91a08d48aeee5ffa0cf3437f38b61281b68"'
|
29
29
|
Expires:
|
@@ -31,11 +31,11 @@ http_interactions:
|
|
31
31
|
Pragma:
|
32
32
|
- no-cache
|
33
33
|
X-Fb-Rev:
|
34
|
-
- '
|
34
|
+
- '934677'
|
35
35
|
X-Fb-Debug:
|
36
|
-
-
|
36
|
+
- J8DeY1E4Yqw7bJX0tlNMHLA1W2i+1busrhuPm8oG1vg=
|
37
37
|
Date:
|
38
|
-
-
|
38
|
+
- Thu, 12 Sep 2013 13:21:34 GMT
|
39
39
|
Connection:
|
40
40
|
- keep-alive
|
41
41
|
Content-Length:
|
@@ -44,52 +44,5 @@ http_interactions:
|
|
44
44
|
encoding: US-ASCII
|
45
45
|
string: ! '{"data":[{"name":"Eminem","valid":true,"id":6003170652434},{"name":"invalidsssssssssssssss","valid":false}]}'
|
46
46
|
http_version:
|
47
|
-
recorded_at:
|
48
|
-
|
49
|
-
method: get
|
50
|
-
uri: https://graph.facebook.com/act_10150585630710217/reachestimate?access_token=AAAEvJ5vzhl8BAPLr6fQgNy2wdUHDJ7ZAoX9PTZCFnebwuTBZBEqO7lNTVZA3XNsTHPTATpTmVFs6o6Jp1pZAL8ZA54BRBXWYtztVug8bm2BAZDZD&targeting_spec=%7B%22countries%22:%5B%22US%22%5D,%22keywords%22:%5B%22Eminem%22,%22invalidsssssssssssssss%22%5D,%22age_min%22:13,%22connections%22:%5B%5D%7D
|
51
|
-
body:
|
52
|
-
encoding: US-ASCII
|
53
|
-
string: ''
|
54
|
-
headers:
|
55
|
-
Accept-Encoding:
|
56
|
-
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
57
|
-
Accept:
|
58
|
-
- ! '*/*'
|
59
|
-
User-Agent:
|
60
|
-
- Ruby
|
61
|
-
response:
|
62
|
-
status:
|
63
|
-
code: 400
|
64
|
-
message: Bad Request
|
65
|
-
headers:
|
66
|
-
Access-Control-Allow-Origin:
|
67
|
-
- ! '*'
|
68
|
-
Cache-Control:
|
69
|
-
- no-store
|
70
|
-
Content-Type:
|
71
|
-
- text/javascript; charset=UTF-8
|
72
|
-
Expires:
|
73
|
-
- Sat, 01 Jan 2000 00:00:00 GMT
|
74
|
-
Pragma:
|
75
|
-
- no-cache
|
76
|
-
Www-Authenticate:
|
77
|
-
- ! 'OAuth "Facebook Platform" "invalid_token" "Error validating access token:
|
78
|
-
Session has expired at unix time 1355932800. The current unix time is 1355934833."'
|
79
|
-
X-Fb-Rev:
|
80
|
-
- '698469'
|
81
|
-
X-Fb-Debug:
|
82
|
-
- Kkjlojh5eu19FxaW5yu6N5A+5xmmbKyfKsCpa+y2eOc=
|
83
|
-
Date:
|
84
|
-
- Wed, 19 Dec 2012 16:33:53 GMT
|
85
|
-
Connection:
|
86
|
-
- keep-alive
|
87
|
-
Content-Length:
|
88
|
-
- '191'
|
89
|
-
body:
|
90
|
-
encoding: US-ASCII
|
91
|
-
string: ! '{"error":{"message":"Error validating access token: Session has expired
|
92
|
-
at unix time 1355932800. The current unix time is 1355934833.","type":"OAuthException","code":190,"error_subcode":463}}'
|
93
|
-
http_version:
|
94
|
-
recorded_at: Wed, 19 Dec 2012 16:33:53 GMT
|
95
|
-
recorded_with: VCR 2.2.4
|
47
|
+
recorded_at: Thu, 12 Sep 2013 13:21:34 GMT
|
48
|
+
recorded_with: VCR 2.3.0
|
@@ -2,62 +2,17 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://graph.facebook.com/
|
5
|
+
uri: https://graph.facebook.com/act_10150585630710217/reachestimate?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&targeting_spec=%7B%22countries%22:%5B%22US%22%5D,%22keywords%22:%5B%22Eminem%22,%22Sting%22%5D,%22age_min%22:13,%22connections%22:%5B%5D,%22broad_age%22:false%7D
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
9
9
|
headers:
|
10
|
-
Accept-Encoding:
|
11
|
-
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
-
Accept:
|
13
|
-
- ! '*/*'
|
14
10
|
User-Agent:
|
15
|
-
-
|
16
|
-
response:
|
17
|
-
status:
|
18
|
-
code: 200
|
19
|
-
message: OK
|
20
|
-
headers:
|
21
|
-
Access-Control-Allow-Origin:
|
22
|
-
- ! '*'
|
23
|
-
Cache-Control:
|
24
|
-
- private, no-cache, no-store, must-revalidate
|
25
|
-
Content-Type:
|
26
|
-
- text/javascript; charset=UTF-8
|
27
|
-
Etag:
|
28
|
-
- ! '"a684dbf074d5467a7775189984027b177954edef"'
|
29
|
-
Expires:
|
30
|
-
- Sat, 01 Jan 2000 00:00:00 GMT
|
31
|
-
Pragma:
|
32
|
-
- no-cache
|
33
|
-
X-Fb-Rev:
|
34
|
-
- '698469'
|
35
|
-
X-Fb-Debug:
|
36
|
-
- vtS1+m1EAAr/YCY4TKxUueU+DfmYhcASPsoK5LMzkW8=
|
37
|
-
Date:
|
38
|
-
- Wed, 19 Dec 2012 15:13:41 GMT
|
39
|
-
Connection:
|
40
|
-
- keep-alive
|
41
|
-
Content-Length:
|
42
|
-
- '109'
|
43
|
-
body:
|
44
|
-
encoding: US-ASCII
|
45
|
-
string: ! '{"data":[{"name":"Eminem","valid":true,"id":6003170652434},{"name":"Sting","valid":true,"id":6003164299249}]}'
|
46
|
-
http_version:
|
47
|
-
recorded_at: Wed, 19 Dec 2012 15:13:42 GMT
|
48
|
-
- request:
|
49
|
-
method: get
|
50
|
-
uri: https://graph.facebook.com/act_10150585630710217/reachestimate?access_token=AAAEvJ5vzhl8BAPLr6fQgNy2wdUHDJ7ZAoX9PTZCFnebwuTBZBEqO7lNTVZA3XNsTHPTATpTmVFs6o6Jp1pZAL8ZA54BRBXWYtztVug8bm2BAZDZD&targeting_spec=%7B%22countries%22:%5B%22US%22%5D,%22keywords%22:%5B%22Eminem%22,%22Sting%22%5D,%22age_min%22:13,%22connections%22:%5B%5D,%22broad_age%22:false%7D
|
51
|
-
body:
|
52
|
-
encoding: US-ASCII
|
53
|
-
string: ''
|
54
|
-
headers:
|
11
|
+
- Faraday v0.8.7
|
55
12
|
Accept-Encoding:
|
56
13
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
57
14
|
Accept:
|
58
15
|
- ! '*/*'
|
59
|
-
User-Agent:
|
60
|
-
- Ruby
|
61
16
|
response:
|
62
17
|
status:
|
63
18
|
code: 200
|
@@ -68,26 +23,26 @@ http_interactions:
|
|
68
23
|
Cache-Control:
|
69
24
|
- private, no-cache, no-store, must-revalidate
|
70
25
|
Content-Type:
|
71
|
-
-
|
26
|
+
- application/json; charset=UTF-8
|
72
27
|
Etag:
|
73
|
-
- ! '"
|
28
|
+
- ! '"9ac6d458b810272cafd8ce451a7f9f1f9530c83b"'
|
74
29
|
Expires:
|
75
30
|
- Sat, 01 Jan 2000 00:00:00 GMT
|
76
31
|
Pragma:
|
77
32
|
- no-cache
|
78
33
|
X-Fb-Rev:
|
79
|
-
- '
|
34
|
+
- '934677'
|
80
35
|
X-Fb-Debug:
|
81
|
-
-
|
36
|
+
- 61VwYP47RnemHT8gXLSpsdpq6MKIPD9tWkdAbhxdaK8=
|
82
37
|
Date:
|
83
|
-
-
|
38
|
+
- Thu, 12 Sep 2013 13:21:36 GMT
|
84
39
|
Connection:
|
85
40
|
- keep-alive
|
86
41
|
Content-Length:
|
87
|
-
- '
|
42
|
+
- '562'
|
88
43
|
body:
|
89
44
|
encoding: US-ASCII
|
90
|
-
string: ! '{"users":
|
45
|
+
string: ! '{"users":17800000,"bid_estimations":[{"unsupported":false,"location":3,"cpa_min":217,"cpa_median":391,"cpa_max":521,"cpc_min":40,"cpc_median":64,"cpc_max":85,"cpm_min":6,"cpm_median":22,"cpm_max":215}],"estimate_ready":true,"imp_estimates":[],"min_reach":null,"max_reach":null,"data":{"users":17800000,"bid_estimations":[{"unsupported":false,"location":3,"cpa_min":217,"cpa_median":391,"cpa_max":521,"cpc_min":40,"cpc_median":64,"cpc_max":85,"cpm_min":6,"cpm_median":22,"cpm_max":215}],"estimate_ready":true,"imp_estimates":[],"min_reach":null,"max_reach":null}}'
|
91
46
|
http_version:
|
92
|
-
recorded_at:
|
93
|
-
recorded_with: VCR 2.
|
47
|
+
recorded_at: Thu, 12 Sep 2013 13:21:36 GMT
|
48
|
+
recorded_with: VCR 2.3.0
|
@@ -2,62 +2,17 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: get
|
5
|
-
uri: https://graph.facebook.com/
|
5
|
+
uri: https://graph.facebook.com/act_10150585630710217/reachestimate?access_token=CAAEvJ5vzhl8BAH8aCPOx0Ft9uNB147TF8weJ8hK0g7YVDRWU4eEih7tEKdJgmfk0vABZClZACJbEzyhSMbiShL6RpsfkZASfX1C9nv1AlFvjJajflqkyYZAlpE2edT0FJHjdh4NFg0ZCt0sBgq0kZABtKsjuU18aMURLE7rjKHR4X8NkXBUafg1T4uZARRNqboZD&targeting_spec=%7B%22countries%22:%5B%22US%22%5D,%22keywords%22:%5B%22Sting%22%5D,%22age_min%22:13,%22age_max%22:24,%22genders%22:%5B2%5D,%22connections%22:%5B%5D,%22broad_age%22:false%7D
|
6
6
|
body:
|
7
7
|
encoding: US-ASCII
|
8
8
|
string: ''
|
9
9
|
headers:
|
10
|
-
Accept-Encoding:
|
11
|
-
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
-
Accept:
|
13
|
-
- ! '*/*'
|
14
10
|
User-Agent:
|
15
|
-
-
|
16
|
-
response:
|
17
|
-
status:
|
18
|
-
code: 200
|
19
|
-
message: OK
|
20
|
-
headers:
|
21
|
-
Access-Control-Allow-Origin:
|
22
|
-
- ! '*'
|
23
|
-
Cache-Control:
|
24
|
-
- private, no-cache, no-store, must-revalidate
|
25
|
-
Content-Type:
|
26
|
-
- text/javascript; charset=UTF-8
|
27
|
-
Etag:
|
28
|
-
- ! '"66bd8a85c55324c07c1c2afcb1eac4e2fd358bf5"'
|
29
|
-
Expires:
|
30
|
-
- Sat, 01 Jan 2000 00:00:00 GMT
|
31
|
-
Pragma:
|
32
|
-
- no-cache
|
33
|
-
X-Fb-Rev:
|
34
|
-
- '698469'
|
35
|
-
X-Fb-Debug:
|
36
|
-
- XuqZnN5WjRA/b3sTn4Nz0jyvTkw2S0OCP5x8OKrUO54=
|
37
|
-
Date:
|
38
|
-
- Wed, 19 Dec 2012 15:20:53 GMT
|
39
|
-
Connection:
|
40
|
-
- keep-alive
|
41
|
-
Content-Length:
|
42
|
-
- '59'
|
43
|
-
body:
|
44
|
-
encoding: US-ASCII
|
45
|
-
string: ! '{"data":[{"name":"Sting","valid":true,"id":6003164299249}]}'
|
46
|
-
http_version:
|
47
|
-
recorded_at: Wed, 19 Dec 2012 15:20:53 GMT
|
48
|
-
- request:
|
49
|
-
method: get
|
50
|
-
uri: https://graph.facebook.com/act_10150585630710217/reachestimate?access_token=AAAEvJ5vzhl8BAPLr6fQgNy2wdUHDJ7ZAoX9PTZCFnebwuTBZBEqO7lNTVZA3XNsTHPTATpTmVFs6o6Jp1pZAL8ZA54BRBXWYtztVug8bm2BAZDZD&targeting_spec=%7B%22countries%22:%5B%22US%22%5D,%22keywords%22:%5B%22Sting%22%5D,%22age_min%22:13,%22age_max%22:24,%22genders%22:%5B2%5D,%22connections%22:%5B%5D,%22broad_age%22:false%7D
|
51
|
-
body:
|
52
|
-
encoding: US-ASCII
|
53
|
-
string: ''
|
54
|
-
headers:
|
11
|
+
- Faraday v0.8.7
|
55
12
|
Accept-Encoding:
|
56
13
|
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
57
14
|
Accept:
|
58
15
|
- ! '*/*'
|
59
|
-
User-Agent:
|
60
|
-
- Ruby
|
61
16
|
response:
|
62
17
|
status:
|
63
18
|
code: 200
|
@@ -68,26 +23,26 @@ http_interactions:
|
|
68
23
|
Cache-Control:
|
69
24
|
- private, no-cache, no-store, must-revalidate
|
70
25
|
Content-Type:
|
71
|
-
-
|
26
|
+
- application/json; charset=UTF-8
|
72
27
|
Etag:
|
73
|
-
- ! '"
|
28
|
+
- ! '"ed45c65e395f6b7bcfd3dcbb4451e915b2ab464d"'
|
74
29
|
Expires:
|
75
30
|
- Sat, 01 Jan 2000 00:00:00 GMT
|
76
31
|
Pragma:
|
77
32
|
- no-cache
|
78
33
|
X-Fb-Rev:
|
79
|
-
- '
|
34
|
+
- '934677'
|
80
35
|
X-Fb-Debug:
|
81
|
-
-
|
36
|
+
- MFmGzAEJviAufFQtZWEOYbuCwzuNMsFYRc+LXv34UT8=
|
82
37
|
Date:
|
83
|
-
-
|
38
|
+
- Thu, 12 Sep 2013 13:21:38 GMT
|
84
39
|
Connection:
|
85
40
|
- keep-alive
|
86
41
|
Content-Length:
|
87
|
-
- '
|
42
|
+
- '552'
|
88
43
|
body:
|
89
44
|
encoding: US-ASCII
|
90
|
-
string: ! '{"users":
|
45
|
+
string: ! '{"users":38000,"bid_estimations":[{"unsupported":false,"location":3,"cpa_min":246,"cpa_median":424,"cpa_max":578,"cpc_min":37,"cpc_median":59,"cpc_max":76,"cpm_min":3,"cpm_median":8,"cpm_max":15}],"estimate_ready":true,"imp_estimates":[],"min_reach":null,"max_reach":null,"data":{"users":38000,"bid_estimations":[{"unsupported":false,"location":3,"cpa_min":246,"cpa_median":424,"cpa_max":578,"cpc_min":37,"cpc_median":59,"cpc_max":76,"cpm_min":3,"cpm_median":8,"cpm_max":15}],"estimate_ready":true,"imp_estimates":[],"min_reach":null,"max_reach":null}}'
|
91
46
|
http_version:
|
92
|
-
recorded_at:
|
93
|
-
recorded_with: VCR 2.
|
47
|
+
recorded_at: Thu, 12 Sep 2013 13:21:38 GMT
|
48
|
+
recorded_with: VCR 2.3.0
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Zuck::AdKeyword do
|
4
|
-
let(:graph){ Koala::Facebook::API.new(
|
4
|
+
let(:graph){ Koala::Facebook::API.new(test_access_token)}
|
5
5
|
|
6
6
|
it "finds the best keyword with a #" do
|
7
7
|
VCR.use_cassette('ad_keyword_search_disney') do
|
@@ -10,8 +10,8 @@ describe Zuck::AdKeyword do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "finds the best keyword when no keyword with # is available" do
|
13
|
-
VCR.use_cassette('
|
14
|
-
Zuck::AdKeyword.best_guess(graph, '
|
13
|
+
VCR.use_cassette('ad_keyword_search_moviepilot') do
|
14
|
+
Zuck::AdKeyword.best_guess(graph, 'moviepilot')[:keyword].should == 'Moviepilot'
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -87,7 +87,7 @@ describe Zuck::TargetingSpec do
|
|
87
87
|
end
|
88
88
|
|
89
89
|
describe "fetching reach" do
|
90
|
-
let(:graph){ Koala::Facebook::API.new(
|
90
|
+
let(:graph){ Koala::Facebook::API.new(test_access_token) }
|
91
91
|
let(:ad_account){ 'act_10150585630710217' }
|
92
92
|
|
93
93
|
it "bugs out when trying to use an invalid keyword" do
|
@@ -105,7 +105,7 @@ describe Zuck::TargetingSpec do
|
|
105
105
|
spec = {countries: ['us'], keywords: ['Eminem', 'Sting'] }
|
106
106
|
ts = Zuck::TargetingSpec.new(graph, ad_account, spec)
|
107
107
|
reach = ts.fetch_reach
|
108
|
-
reach[:users].should ==
|
108
|
+
reach[:users].should == 17800000
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -114,7 +114,7 @@ describe Zuck::TargetingSpec do
|
|
114
114
|
spec = {countries: ['us'], keywords: ['Sting'], gender: :female, age_class: :young }
|
115
115
|
ts = Zuck::TargetingSpec.new(graph, ad_account, spec)
|
116
116
|
reach = ts.fetch_reach
|
117
|
-
reach[:users].should ==
|
117
|
+
reach[:users].should == 38000
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
@@ -129,7 +129,7 @@ describe Zuck::TargetingSpec do
|
|
129
129
|
end
|
130
130
|
|
131
131
|
describe "Batch processing" do
|
132
|
-
let(:graph){ Koala::Facebook::API.new(
|
132
|
+
let(:graph){ Koala::Facebook::API.new(test_access_token) }
|
133
133
|
let(:ad_account){ 'act_10150585630710217' }
|
134
134
|
let(:spec_mock){ mock(fetch_reach: {some: :data}) }
|
135
135
|
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
class HTest
|
4
4
|
extend Zuck::FbObject::Helpers
|
5
5
|
include Zuck::FbObject::Helpers
|
6
|
+
def self.known_keys; []; end
|
6
7
|
end
|
7
8
|
|
8
9
|
describe Zuck::FbObject::Helpers do
|
@@ -11,12 +12,12 @@ describe Zuck::FbObject::Helpers do
|
|
11
12
|
|
12
13
|
context "get" do
|
13
14
|
it "forwards to koala" do
|
14
|
-
graph_mock.should_receive(:get_object).with('/foo').and_return(true)
|
15
|
+
graph_mock.should_receive(:get_object).with('/foo', fields: '').and_return(true)
|
15
16
|
HTest.send(:get, graph_mock, "/foo")
|
16
17
|
end
|
17
18
|
|
18
19
|
it "does not swallow exceptions" do
|
19
|
-
graph_mock.should_receive(:get_object).with('/foo').and_raise("broken")
|
20
|
+
graph_mock.should_receive(:get_object).with('/foo', fields: '').and_raise("broken")
|
20
21
|
expect{
|
21
22
|
HTest.send(:get, graph_mock, "/foo")
|
22
23
|
}.to raise_error("broken")
|
data/spec/lib/zuck_spec.rb
CHANGED
@@ -3,14 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe Zuck::FbObject do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
Zuck.graph = Koala::Facebook::API.new(
|
6
|
+
Zuck.graph = Koala::Facebook::API.new(test_access_token)
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:graph) { Zuck.graph }
|
10
10
|
let(:account) { Zuck::AdAccount.new(graph, {id: "act_10150585630710217"}) }
|
11
|
-
let(:campaign){ Zuck::AdCampaign.new(graph, {id: "
|
12
|
-
let(:group) { Zuck::AdGroup.new(graph, {id: "
|
13
|
-
let(:creative){ Zuck::AdCreative.new(graph, {id: "
|
11
|
+
let(:campaign){ Zuck::AdCampaign.new(graph, {id: "6010889111951"}, account) }
|
12
|
+
let(:group) { Zuck::AdGroup.new(graph, {id: "6010889169151"}, campaign)}
|
13
|
+
let(:creative){ Zuck::AdCreative.new(graph, {id: "6010888561951"}, group) }
|
14
14
|
|
15
15
|
|
16
16
|
describe "read only objects" do
|
@@ -44,13 +44,13 @@ describe Zuck::FbObject do
|
|
44
44
|
|
45
45
|
it "a list of ad campaigns" do
|
46
46
|
VCR.use_cassette('list_of_ad_campaigns') do
|
47
|
-
account.ad_campaigns.should have(
|
47
|
+
account.ad_campaigns.should have(8).items
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
it "a list of ad groups" do
|
52
52
|
VCR.use_cassette('list_of_ad_groups') do
|
53
|
-
campaign.ad_groups.should have(
|
53
|
+
campaign.ad_groups.should have(9).item
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -64,43 +64,35 @@ describe Zuck::FbObject do
|
|
64
64
|
g = graph
|
65
65
|
Zuck::AdAccount.should_receive(:all).and_return([account])
|
66
66
|
VCR.use_cassette('list_of_all_ad_creatives_of_account') do
|
67
|
-
Zuck::AdCreative.all(g).should have(
|
67
|
+
Zuck::AdCreative.all(g).should have(9).items
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
context "an id directly" do
|
72
72
|
|
73
|
-
it "with the correct type" do
|
73
|
+
it "campaign with the correct type" do
|
74
74
|
VCR.use_cassette('a_single_campaign') do
|
75
75
|
c = Zuck::AdCampaign.find(6005950787751, graph)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
it "with the correct type" do
|
79
|
+
it "account with the correct type" do
|
80
80
|
VCR.use_cassette('a_single_account') do
|
81
81
|
c = Zuck::AdAccount.find('act_10150585630710217', graph)
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
it "when expecting an ad group but the id belongs to a campaign" do
|
86
|
-
|
87
|
-
Invalid type.
|
88
|
-
|
89
|
-
Expected data['id']="6005950787751" to be equal to one of these:
|
90
|
-
* data['account_id']="10150585630710217"
|
91
|
-
* data['group_id']=nil
|
92
|
-
* data['adgroup_id']=nil
|
93
|
-
END_ERROR
|
94
|
-
VCR.use_cassette('a_single_campaign') do
|
86
|
+
VCR.use_cassette('a_single_group') do
|
95
87
|
expect{
|
96
|
-
c = Zuck::AdGroup.find(
|
97
|
-
}.to raise_error(
|
88
|
+
c = Zuck::AdGroup.find(6010889111951, graph)
|
89
|
+
}.to raise_error(Koala::Facebook::ClientError)
|
98
90
|
end
|
99
91
|
end
|
100
92
|
|
101
93
|
it "and saving it" do
|
102
|
-
VCR.use_cassette('
|
103
|
-
group = Zuck::AdGroup.find(
|
94
|
+
VCR.use_cassette('find_a_single_group_and_update_it') do
|
95
|
+
group = Zuck::AdGroup.find(6010889169151, graph)
|
104
96
|
group.name = "My old name"
|
105
97
|
group.save
|
106
98
|
group.name.should == "My old name"
|
@@ -135,7 +127,7 @@ END_ERROR
|
|
135
127
|
|
136
128
|
it "an ad group" do
|
137
129
|
VCR.use_cassette('create_ad_group') do
|
138
|
-
o = {bid_type:
|
130
|
+
o = {bid_type: 'CPC', max_bid: 1, name: "Rap like me", targeting: '{"countries":["US"]}',
|
139
131
|
creative: '{"type":25,"action_spec":{"action.type":"like", "post":10150420410887685}}'}
|
140
132
|
group = Zuck::AdGroup.create(graph, o, campaign)
|
141
133
|
group.name.should == "Rap like me"
|
@@ -144,10 +136,11 @@ END_ERROR
|
|
144
136
|
|
145
137
|
it "an ad group via an existing ad campaign" do
|
146
138
|
VCR.use_cassette('create_ad_group') do
|
147
|
-
o = {bid_type:
|
139
|
+
o = {bid_type: 'CPC', max_bid: 1, name: "Rap like me", targeting: '{"countries":["US"]}',
|
148
140
|
creative: '{"type":25,"action_spec":{"action.type":"like", "post":10150420410887685}}'}
|
149
141
|
group = campaign.create_ad_group(o)
|
150
142
|
group.name.should == "Rap like me"
|
143
|
+
# Until Oct 2013 Facebook will return the magic ints, and then the enums
|
151
144
|
group.bid_type.should == 1
|
152
145
|
end
|
153
146
|
end
|