some
[appoyo.git] / vendor / plugins / facebooker / lib / facebooker / mock / service.rb
blob4be1d88d9adee47b40428e9e6f2806055f29c8aa
1 require 'digest/md5'
2 require 'facebooker/service'
4 module Facebooker
5   # A mock service that reads the Facebook response from fixtures
6   # Adapted from http://gist.github.com/44344
7   #
8   #   Facebooker::MockService.fixture_path = 'path/to/dir'
9   #   Facebooker::Session.current = Facebooker::MockSession.create
10   #
11   class MockService < Service
12     class << self
13       attr_accessor :fixture_path
14     end
16     def read_fixture(method, filename, original = nil)
17       path = fixture_path(method, filename)
18       File.read path
19     rescue Errno::ENAMETOOLONG
20       read_fixture(method, hash_fixture_name(filename), filename)
21     rescue Errno::ENOENT => e
22       if File.exists?(fixture_path(method, 'default'))
23         File.read fixture_path(method, 'default')
24       else
25         e.message << "\n(Non-hashed path is #{original})" if original
26         e.message << "\nFacebook API Reference: http://wiki.developers.facebook.com/index.php/#{method.sub(/^facebook\./, '')}#Example_Return_XML"
27         raise e
28       end
29     end
31     def post(params)
32       method = params.delete(:method)
33       params.delete_if {|k,_| [:v, :api_key, :call_id, :sig].include?(k) }
34       Parser.parse(method, read_fixture(method, fixture_name(params)))
35     end
37   private
38     def fixture_path(method, filename)
39       File.join(self.class.fixture_path, method, "#{filename}.xml")
40     end
42     def hash_fixture_name(filename)
43       Digest::MD5.hexdigest(filename)
44     end
46     def fixture_name(params)
47       params.map {|*args| args.join('=') }.sort.join('&')
48     end
49   end
50 end