2 require 'facebooker/service'
5 # A mock service that reads the Facebook response from fixtures
6 # Adapted from http://gist.github.com/44344
8 # Facebooker::MockService.fixture_path = 'path/to/dir'
9 # Facebooker::Session.current = Facebooker::MockSession.create
11 class MockService < Service
13 attr_accessor :fixture_path
16 def read_fixture(method, filename, original = nil)
17 path = fixture_path(method, filename)
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')
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"
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)))
38 def fixture_path(method, filename)
39 File.join(self.class.fixture_path, method, "#{filename}.xml")
42 def hash_fixture_name(filename)
43 Digest::MD5.hexdigest(filename)
46 def fixture_name(params)
47 params.map {|*args| args.join('=') }.sort.join('&')