rest-more 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/.gitignore +6 -0
  2. data/.gitmodules +3 -0
  3. data/.travis.yml +13 -0
  4. data/CHANGES.md +7 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +201 -0
  7. data/README.md +72 -0
  8. data/Rakefile +63 -0
  9. data/TODO.md +14 -0
  10. data/example/rails2/Gemfile +21 -0
  11. data/example/rails2/README +4 -0
  12. data/example/rails2/Rakefile +11 -0
  13. data/example/rails2/app/controllers/application_controller.rb +134 -0
  14. data/example/rails2/app/views/application/helper.html.erb +2 -0
  15. data/example/rails2/config/boot.rb +130 -0
  16. data/example/rails2/config/environment.rb +15 -0
  17. data/example/rails2/config/environments/development.rb +17 -0
  18. data/example/rails2/config/environments/production.rb +28 -0
  19. data/example/rails2/config/environments/test.rb +30 -0
  20. data/example/rails2/config/initializers/cookie_verification_secret.rb +7 -0
  21. data/example/rails2/config/initializers/new_rails_defaults.rb +21 -0
  22. data/example/rails2/config/initializers/session_store.rb +15 -0
  23. data/example/rails2/config/preinitializer.rb +23 -0
  24. data/example/rails2/config/rest-core.yaml +16 -0
  25. data/example/rails2/config/routes.rb +43 -0
  26. data/example/rails2/log +0 -0
  27. data/example/rails2/test/functional/application_controller_test.rb +219 -0
  28. data/example/rails2/test/test_helper.rb +18 -0
  29. data/example/rails2/test/unit/rails_util_test.rb +44 -0
  30. data/example/rails3/Gemfile +20 -0
  31. data/example/rails3/README +4 -0
  32. data/example/rails3/Rakefile +7 -0
  33. data/example/rails3/app/controllers/application_controller.rb +134 -0
  34. data/example/rails3/app/views/application/helper.html.erb +2 -0
  35. data/example/rails3/config.ru +4 -0
  36. data/example/rails3/config/application.rb +23 -0
  37. data/example/rails3/config/boot.rb +6 -0
  38. data/example/rails3/config/environment.rb +5 -0
  39. data/example/rails3/config/environments/development.rb +23 -0
  40. data/example/rails3/config/environments/production.rb +49 -0
  41. data/example/rails3/config/environments/test.rb +30 -0
  42. data/example/rails3/config/initializers/secret_token.rb +7 -0
  43. data/example/rails3/config/initializers/session_store.rb +8 -0
  44. data/example/rails3/config/rest-core.yaml +16 -0
  45. data/example/rails3/config/routes.rb +5 -0
  46. data/example/rails3/test/functional/application_controller_test.rb +219 -0
  47. data/example/rails3/test/test_helper.rb +18 -0
  48. data/example/rails3/test/unit/rails_util_test.rb +44 -0
  49. data/example/sinatra/config.ru +16 -0
  50. data/lib/rest-core/client/facebook.rb +265 -0
  51. data/lib/rest-core/client/facebook/rails_util.rb +334 -0
  52. data/lib/rest-core/client/flurry.rb +107 -0
  53. data/lib/rest-core/client/flurry/rails_util.rb +74 -0
  54. data/lib/rest-core/client/github.rb +18 -0
  55. data/lib/rest-core/client/linkedin.rb +59 -0
  56. data/lib/rest-core/client/mixi.rb +47 -0
  57. data/lib/rest-core/client/simple.rb +2 -0
  58. data/lib/rest-core/client/twitter.rb +101 -0
  59. data/lib/rest-core/client/universal.rb +18 -0
  60. data/lib/rest-more.rb +11 -0
  61. data/lib/rest-more/version.rb +4 -0
  62. data/rest-more.gemspec +127 -0
  63. data/task/.gitignore +1 -0
  64. data/task/gemgem.rb +265 -0
  65. data/test/client/facebook/config/rest-core.yaml +8 -0
  66. data/test/client/facebook/test_api.rb +97 -0
  67. data/test/client/facebook/test_cache.rb +58 -0
  68. data/test/client/facebook/test_default.rb +23 -0
  69. data/test/client/facebook/test_error.rb +65 -0
  70. data/test/client/facebook/test_handler.rb +84 -0
  71. data/test/client/facebook/test_load_config.rb +39 -0
  72. data/test/client/facebook/test_misc.rb +72 -0
  73. data/test/client/facebook/test_oauth.rb +38 -0
  74. data/test/client/facebook/test_old.rb +114 -0
  75. data/test/client/facebook/test_page.rb +106 -0
  76. data/test/client/facebook/test_parse.rb +166 -0
  77. data/test/client/facebook/test_serialize.rb +43 -0
  78. data/test/client/facebook/test_timeout.rb +22 -0
  79. data/test/client/flurry/test_metrics.rb +83 -0
  80. data/test/client/twitter/test_api.rb +37 -0
  81. metadata +155 -0
@@ -0,0 +1,58 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook do
5
+ after do
6
+ WebMock.reset!
7
+ RR.verify
8
+ end
9
+
10
+ describe 'cache' do
11
+ before do
12
+ @url, @body = "https://graph.facebook.com/cache", '{"message":"ok"}'
13
+ @cache_key = Digest::MD5.hexdigest(@url)
14
+ @cache = {}
15
+ @rg = RestCore::Facebook.new(:cache => @cache, :json_decode => false)
16
+ stub_request(:get, @url).to_return(:body => @body).times(1)
17
+ end
18
+
19
+ should 'enable cache if passing cache' do
20
+ 3.times{ @rg.get('cache').should.eq @body }
21
+ @cache.should.eq({@cache_key => @body})
22
+ end
23
+
24
+ should 'respect expires_in' do
25
+ mock(@cache).method(:store){ mock!.arity{ -3 } }
26
+ mock(@cache).store(@cache_key, @body, :expires_in => 3)
27
+ @rg.get('cache', {}, :expires_in => 3).should.eq @body
28
+ end
29
+
30
+ should 'update cache if there is cache option set to false' do
31
+ @rg.get('cache') .should.eq @body
32
+ stub_request(:get, @url).to_return(:body => @body.reverse).times(2)
33
+ @rg.get('cache') .should.eq @body
34
+ @rg.get('cache', {}, :cache => false).should.eq @body.reverse
35
+ @rg.get('cache') .should.eq @body.reverse
36
+ @rg.cache = nil
37
+ @rg.get('cache', {}, :cache => false).should.eq @body.reverse
38
+ end
39
+ end
40
+
41
+ should 'not cache post/put/delete' do
42
+ [:put, :post, :delete].each{ |meth|
43
+ url, body = "https://graph.facebook.com/cache", '{"message":"ok"}'
44
+ stub_request(meth, url).to_return(:body => body).times(3)
45
+
46
+ cache = {}
47
+ rg = RestCore::Facebook.new(:cache => cache)
48
+ 3.times{
49
+ if meth == :delete
50
+ rg.send(meth, 'cache').should.eq({'message' => 'ok'})
51
+ else
52
+ rg.send(meth, 'cache', 'payload').should.eq({'message' => 'ok'})
53
+ end
54
+ }
55
+ cache.should.eq({})
56
+ }
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook do
5
+ should 'honor default attributes' do
6
+ RestCore::Facebook.members.reject{ |name|
7
+ name.to_s =~ /method$|handler$|detector$/ }.each{ |name|
8
+ RestCore::Facebook.new.send(name).should ==
9
+ RestCore::Facebook.new.send("default_#{name}")
10
+ }
11
+ end
12
+
13
+ should 'use module to override default attributes' do
14
+ klass = RestCore::Facebook.dup
15
+ klass.send(:include, Module.new do
16
+ def default_app_id
17
+ '1829'
18
+ end
19
+ end)
20
+
21
+ klass.new.app_id.should.eq('1829')
22
+ end
23
+ end
@@ -0,0 +1,65 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook::Error do
5
+ after do
6
+ WebMock.reset!
7
+ RR.verify
8
+ end
9
+
10
+ should 'have the right ancestors' do
11
+ RestCore::Facebook::Error::AccessToken.should.lt RestCore::Facebook::Error
12
+
13
+ RestCore::Facebook::Error::InvalidAccessToken.should.lt \
14
+ RestCore::Facebook::Error::AccessToken
15
+
16
+ RestCore::Facebook::Error::MissingAccessToken.should.lt \
17
+ RestCore::Facebook::Error::AccessToken
18
+ end
19
+
20
+ def error2env hash
21
+ {RestCore::RESPONSE_BODY => hash,
22
+ RestCore::REQUEST_PATH => '/' ,
23
+ RestCore::REQUEST_QUERY => {}}
24
+ end
25
+
26
+ should 'parse right' do
27
+ %w[OAuthInvalidTokenException OAuthException].each{ |type|
28
+ RestCore::Facebook::Error.call(error2env('error' => {'type' => type})).
29
+ should.kind_of?(RestCore::Facebook::Error::InvalidAccessToken)
30
+ }
31
+
32
+ RestCore::Facebook::Error.call(
33
+ error2env('error'=>{'type' =>'QueryParseException',
34
+ 'message'=>'An active access token..'})).
35
+ should.kind_of?(RestCore::Facebook::Error::MissingAccessToken)
36
+
37
+ RestCore::Facebook::Error.call(
38
+ error2env('error'=>{'type' =>'QueryParseException',
39
+ 'message'=>'Oh active access token..'})).
40
+ should.not.kind_of?(RestCore::Facebook::Error::MissingAccessToken)
41
+
42
+ RestCore::Facebook::Error.call(error2env('error_code' => 190)).
43
+ should.kind_of?(RestCore::Facebook::Error::InvalidAccessToken)
44
+
45
+ RestCore::Facebook::Error.call(error2env('error_code' => 104)).
46
+ should.kind_of?(RestCore::Facebook::Error::MissingAccessToken)
47
+
48
+ RestCore::Facebook::Error.call(error2env('error_code' => 999)).
49
+ should.not.kind_of?(RestCore::Facebook::Error::AccessToken)
50
+
51
+ error = RestCore::Facebook::Error.call(error2env(['not a hash']))
52
+ error.should.not.kind_of?(RestCore::Facebook::Error::AccessToken)
53
+ error.should .kind_of?(RestCore::Facebook::Error)
54
+ end
55
+
56
+ should 'nuke cache upon errors' do
57
+ stub_request(:get, 'https://graph.facebook.com/me').
58
+ to_return(:body => '{"error":"wrong"}').times(2)
59
+
60
+ rg = RestCore::Facebook.new(:cache => {},
61
+ :error_handler => lambda{|env|env})
62
+ rg.get('me'); rg.get('me')
63
+ rg.cache.values.should.eq []
64
+ end
65
+ end
@@ -0,0 +1,84 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook do
5
+ after do
6
+ WebMock.reset!
7
+ RR.verify
8
+ end
9
+
10
+ describe 'log method' do
11
+ should 'log whenever doing network request' do
12
+ stub_request(:get, 'https://graph.facebook.com/me').
13
+ to_return(:body => '{}')
14
+
15
+ logger = []
16
+ rg = RestCore::Facebook.new(:log_method => lambda{ |s| logger << [s] })
17
+ rg.get('me')
18
+
19
+ logger.size.should.eq 1
20
+ end
21
+ end
22
+
23
+ describe 'with Graph API' do
24
+ before do
25
+ @id = lambda{ |env| env }
26
+ @error = '{"error":{"type":"Exception","message":"(#2500)"}}'
27
+ @error_hash = RestCore::JsonDecode.json_decode(@error)
28
+
29
+ stub_request(:get, 'https://graph.facebook.com/me').
30
+ to_return(:body => @error)
31
+ end
32
+
33
+ should 'call error_handler if error occurred' do
34
+ RestCore::Facebook.new(:error_handler => @id).get('me').
35
+ should.eq @error_hash
36
+ end
37
+
38
+ should 'raise ::RestCore::Facebook::Error in default error_handler' do
39
+ begin
40
+ RestCore::Facebook.new.get('me')
41
+ rescue ::RestCore::Facebook::Error => e
42
+ e.error .should.eq @error_hash
43
+ e.message.should.eq \
44
+ "#{@error_hash.inspect} from https://graph.facebook.com/me"
45
+ end
46
+ end
47
+ end
48
+
49
+ describe 'with FQL API' do
50
+ # Example of an actual response (without newline)
51
+ # {"error_code":603,"error_msg":"Unknown table: bad_table",
52
+ # "request_args":[{"key":"method","value":"fql.query"},
53
+ # {"key":"format","value":"json"},
54
+ # {"key":"query","value":
55
+ # "SELECT name FROM bad_table WHERE uid=12345"}]}
56
+ before do
57
+ @id = lambda{ |env| env }
58
+ @fql_error = '{"error_code":603,"error_msg":"Unknown table: bad"}'
59
+ @fql_error_hash = RestCore::JsonDecode.json_decode(@fql_error)
60
+
61
+ @bad_fql_query = 'SELECT name FROM bad_table WHERE uid="12345"'
62
+ bad_fql_request = "https://api.facebook.com/method/fql.query?" \
63
+ "format=json&query=#{CGI.escape(@bad_fql_query)}"
64
+
65
+ stub_request(:get, bad_fql_request).to_return(:body => @fql_error)
66
+ end
67
+
68
+ should 'call error_handler if error occurred' do
69
+ RestCore::Facebook.new(:error_handler => @id).fql(@bad_fql_query).
70
+ should.eq @fql_error_hash
71
+ end
72
+
73
+ should 'raise ::RestCore::Facebook::Error in default error_handler' do
74
+ begin
75
+ RestCore::Facebook.new.fql(@bad_fql_query)
76
+ rescue ::RestCore::Facebook::Error => e
77
+ e.error .should.eq @fql_error_hash
78
+ e.message.should.start_with?(
79
+ "#{@fql_error_hash.inspect} from " \
80
+ "https://api.facebook.com/method/fql.query?")
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,39 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ require 'rest-core/util/config'
5
+
6
+ describe RestCore::Config do
7
+
8
+ before do
9
+ @klass = RestCore::Facebook.dup
10
+ end
11
+
12
+ after do
13
+ RR.verify
14
+ end
15
+
16
+ def check
17
+ @klass.default_app_id .should.eq 41829
18
+ @klass.default_secret .should.eq 'r41829'.reverse
19
+ @klass.default_json_decode.should.eq false
20
+ @klass.default_lang .should.eq 'zh-tw'
21
+ end
22
+
23
+ should 'honor rails config' do
24
+ app = Object.new
25
+ mock(app).env { 'test' }
26
+ mock(app).root{ File.dirname(__FILE__) }
27
+ RestCore::Config.load_for_rails(@klass, 'facebook', app)
28
+ check
29
+ end
30
+
31
+ should 'honor config' do
32
+ RestCore::Config.load(
33
+ @klass,
34
+ "#{File.dirname(__FILE__)}/config/rest-core.yaml",
35
+ 'test',
36
+ 'facebook')
37
+ check
38
+ end
39
+ end
@@ -0,0 +1,72 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook do
5
+ after do
6
+ WebMock.reset!
7
+ RR.verify
8
+ end
9
+
10
+ should 'return true in authorized? if there is an access_token' do
11
+ RestCore::Facebook.new(:access_token => '1').authorized?.should.eq true
12
+ RestCore::Facebook.new(:access_token => nil).authorized?.should.eq false
13
+ end
14
+
15
+ should 'treat oauth_token as access_token as well' do
16
+ rg = RestCore::Facebook.new
17
+ hate_facebook = 'why the hell two different name?'
18
+ rg.data['oauth_token'] = hate_facebook
19
+ rg.authorized?.should.eq true
20
+ rg.access_token.should.eq hate_facebook
21
+ end
22
+
23
+ should 'build correct headers' do
24
+ rg = RestCore::Facebook.new(:accept => 'text/html',
25
+ :lang => 'zh-tw')
26
+
27
+ headers = rg.dry.call(rg.send(:build_env))[RestCore::REQUEST_HEADERS]
28
+ headers['Accept' ].should.eq 'text/html'
29
+ headers['Accept-Language'].should.eq 'zh-tw'
30
+ end
31
+
32
+ should 'build empty query string' do
33
+ rg = RestCore::Facebook.new
34
+ (rg.dry.call(rg.send(:build_env))[RestCore::REQUEST_QUERY] || {}).
35
+ should.eq({})
36
+ end
37
+
38
+ should 'create access_token in query string' do
39
+ rg = RestCore::Facebook.new(:access_token => 'token')
40
+ (rg.dry.call(rg.send(:build_env))[RestCore::REQUEST_QUERY] || {}).
41
+ should.eq({'access_token' => 'token'})
42
+ end
43
+
44
+ should 'build correct query string' do
45
+ rg = RestCore::Facebook.new(:access_token => 'token')
46
+ TestHelper.normalize_url(rg.url('', :message => 'hi!!')).
47
+ should.eq "#{rg.site}?access_token=token&message=hi%21%21"
48
+
49
+ rg.access_token = nil
50
+ TestHelper.normalize_url(rg.url('', :message => 'hi!!',
51
+ :subject => '(&oh&)')).
52
+ should.eq "#{rg.site}?message=hi%21%21&subject=%28%26oh%26%29"
53
+ end
54
+
55
+ should 'auto decode json' do
56
+ rg = RestCore::Facebook.new(:json_decode => true)
57
+ stub_request(:get, rg.site).to_return(:body => '[]')
58
+ rg.get('').should.eq []
59
+ end
60
+
61
+ should 'not auto decode json' do
62
+ rg = RestCore::Facebook.new(:json_decode => false)
63
+ stub_request(:get, rg.site).to_return(:body => '[]')
64
+ rg.get('').should.eq '[]'
65
+ end
66
+
67
+ should 'give attributes' do
68
+ RestCore::Facebook.new(:json_decode => false).attributes.
69
+ keys.map(&:to_s).sort.should.eq \
70
+ RestCore::Facebook.members.map(&:to_s).sort
71
+ end
72
+ end
@@ -0,0 +1,38 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook do
5
+ before do
6
+ @rg = RestCore::Facebook.new(:app_id => '29', :secret => '18')
7
+ @uri = 'http://zzz.tw'
8
+ end
9
+
10
+ after do
11
+ WebMock.reset!
12
+ end
13
+
14
+ should 'return correct oauth url' do
15
+ TestHelper.normalize_url(@rg.authorize_url(:redirect_uri => @uri)).
16
+ should.eq 'https://graph.facebook.com/oauth/authorize?' \
17
+ 'client_id=29&redirect_uri=http%3A%2F%2Fzzz.tw'
18
+ end
19
+
20
+ should 'do authorizing and parse result and save it in data' do
21
+ stub_request(:get, 'https://graph.facebook.com/oauth/access_token?' \
22
+ 'client_id=29&client_secret=18&code=zzz&' \
23
+ 'redirect_uri=http%3A%2F%2Fzzz.tw').
24
+ to_return(:body => 'access_token=baken&expires=2918')
25
+
26
+ result = {'access_token' => 'baken', 'expires' => '2918'}
27
+
28
+ @rg.authorize!(:redirect_uri => @uri, :code => 'zzz').
29
+ should.eq result
30
+ @rg.data.should.eq result
31
+ end
32
+
33
+ should 'not append access_token in authorize_url even presented' do
34
+ RestCore::Facebook.new(:access_token => 'do not use me').authorize_url.
35
+ should.eq 'https://graph.facebook.com/oauth/authorize'
36
+ end
37
+
38
+ end
@@ -0,0 +1,114 @@
1
+
2
+ require 'rest-core/test'
3
+
4
+ describe RestCore::Facebook do
5
+ after do
6
+ WebMock.reset!
7
+ RR.verify
8
+ end
9
+
10
+ should 'do fql query with/without access_token' do
11
+ fql = 'SELECT name FROM likes where id="123"'
12
+ query = "format=json&query=#{CGI.escape(fql)}"
13
+ stub_request(:get, "https://api.facebook.com/method/fql.query?#{query}").
14
+ to_return(:body => '[]')
15
+
16
+ RestCore::Facebook.new.fql(fql).should.eq []
17
+
18
+ token = 'token'.reverse
19
+ stub_request(:get, "https://api.facebook.com/method/fql.query?#{query}" \
20
+ "&access_token=#{token}").
21
+ to_return(:body => '[]')
22
+
23
+ RestCore::Facebook.new(:access_token => token).fql(fql).should.eq []
24
+ end
25
+
26
+ should 'do fql.mutilquery correctly' do
27
+ f0 = 'SELECT display_name FROM application WHERE app_id="233082465238"'
28
+ f1 = 'SELECT display_name FROM application WHERE app_id="110225210740"'
29
+ f0q, f1q = "\"#{f0.gsub('"', '\\"')}\"", "\"#{f1.gsub('"', '\\"')}\""
30
+ q = "format=json&queries=#{CGI.escape("{\"f0\":#{f0q},\"f1\":#{f1q}}")}"
31
+ p = "format=json&queries=#{CGI.escape("{\"f1\":#{f1q},\"f0\":#{f0q}}")}"
32
+
33
+ stub_multi = lambda{
34
+ stub_request(:get,
35
+ "https://api.facebook.com/method/fql.multiquery?#{q}").
36
+ to_return(:body => '[]')
37
+
38
+ stub_request(:get,
39
+ "https://api.facebook.com/method/fql.multiquery?#{p}").
40
+ to_return(:body => '[]')
41
+ }
42
+
43
+ stub_multi.call
44
+ RestCore::Facebook.new.fql_multi(:f0 => f0, :f1 => f1).should.eq []
45
+ end
46
+
47
+ should 'cache fake post in fql' do
48
+ query = 'select name from user where uid = 4'
49
+ body = '[{"name":"Mark Zuckerberg"}]'
50
+ stub_request(:post,
51
+ 'https://api.facebook.com/method/fql.query?format=json').
52
+ with(:body => {:query => query}).
53
+ to_return(:body => body)
54
+
55
+ RestCore::Facebook.new(:cache => (cache = {})).
56
+ fql(query, {}, :post => true).
57
+ first['name'] .should.eq 'Mark Zuckerberg'
58
+ cache.size .should.eq 1
59
+ cache.values.first.should.eq body
60
+
61
+ WebMock.reset! # should hit the cache
62
+
63
+ RestCore::Facebook.new(:cache => cache).fql(query, {}, :post => true).
64
+ first['name'] .should.eq 'Mark Zuckerberg'
65
+ cache.size .should.eq 1
66
+ cache.values.first.should.eq body
67
+
68
+ # query changed
69
+ should.raise(WebMock::NetConnectNotAllowedError) do
70
+ RestCore::Facebook.new(:cache => cache).
71
+ fql(query.upcase, {}, :post => true)
72
+ end
73
+
74
+ # cache should work for normal get
75
+ RestCore::Facebook.new(:cache => cache).fql(query).
76
+ first['name'] .should.eq 'Mark Zuckerberg'
77
+ cache.size .should.eq 1
78
+ cache.values.first.should.eq body
79
+ end
80
+
81
+ should 'do facebook old rest api' do
82
+ body = 'hate facebook inconsistent'
83
+ stub_request(:get,
84
+ 'https://api.facebook.com/method/notes.create?format=json').
85
+ to_return(:body => body)
86
+
87
+ RestCore::Facebook.new.
88
+ old_rest('notes.create', {}, :json_decode => false).should.eq body
89
+ end
90
+
91
+ should 'exchange sessions for access token' do
92
+ stub_request(:post,
93
+ 'https://graph.facebook.com/oauth/exchange_sessions?' \
94
+ 'type=client_cred&client_id=id&client_secret=di&' \
95
+ 'sessions=bad%20bed').
96
+ to_return(:body => '[{"access_token":"bogus"}]')
97
+
98
+ RestCore::Facebook.new(:app_id => 'id',
99
+ :secret => 'di').
100
+ exchange_sessions(:sessions => 'bad bed').
101
+ first['access_token'].should.eq 'bogus'
102
+ end
103
+
104
+ should 'use an secret access_token' do
105
+ stub_request(:get,
106
+ 'https://api.facebook.com/method/admin.getAppProperties?' \
107
+ 'access_token=123%7Cs&format=json&properties=app_id'
108
+ ).to_return(:body => '{"app_id":"123"}')
109
+
110
+ RestCore::Facebook.new(:app_id => '123', :secret => 's').
111
+ secret_old_rest('admin.getAppProperties', :properties => 'app_id').
112
+ should.eq({'app_id' => '123'})
113
+ end
114
+ end