facebook-js-stub 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "jasmine"
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2011 by Involver
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,88 @@
1
+ # Facebook JS Stub
2
+
3
+ ## Description
4
+
5
+ This library facilitates the testing of code that interacts with Facebook via the official JavaScript SDK. It does this
6
+ by providing a fake `FB` JavaScript module that mimics the official module. It also provides helper methods for
7
+ simulating different Facebook states.
8
+
9
+ ## Install
10
+
11
+ ### Jasmine on Rails 3.1
12
+
13
+ If using the edge version of [Jasmine](http://pivotal.github.com/jasmine/) with the Rails 3.1 asset pipeline:
14
+
15
+ 1. Add the gem to your Gemfile:
16
+
17
+ gem "facebook-js-stub", :git => "git://github.com/involver/facebook-js-stub.git"
18
+
19
+ 2. Add the `facebook-js-stub.js` asset to your `src_files` in `spec/javascripts/support/jasmine.yml`:
20
+
21
+ src_files:
22
+ - ...
23
+ - assets/facebook-js-stub.js
24
+
25
+ ### Jasmine on another project
26
+
27
+ 1. Copy `vendor/assets/javascripts/facebook-js-stub.js` to `spec/javascripts/helpers/`.
28
+ 2. If you're explicitly setting helpers in your Jasmine configuration, add the new file:
29
+
30
+ helper_files:
31
+ - ...
32
+ - helpers/facebook-js-stub.js
33
+
34
+ ## Usage
35
+
36
+ `FB` is a module that simulates the official Facebook JavaScript library.
37
+
38
+ `FBStub` is a module that provides methods for simulating a user's Facebook state and for simulating calls from
39
+ Facebook to your callbacks.
40
+
41
+ ### FB.init(options)
42
+
43
+ As with the official Facebook library, you need to initialize it with your Application ID before anything else. Add the
44
+ following in a `beforeEach`:
45
+
46
+ FB.init({appId: 123});
47
+
48
+ ### FB.getLoginStatus(callback)
49
+
50
+ The given callback is called immediately and synchronously using the user's Facebook state as set via `FBStub`.
51
+
52
+ See `FBStub.loggedIn()`, `FBStub.notLoggedIn()`, `FBStub.connected()`, and `FBStub.notConnected()`.
53
+
54
+ ### FB.api(path, callback)
55
+
56
+ The given request is recorded. The `callback` is not immediately called but stored for later use.
57
+
58
+ To trigger a simulated response from Facebook, see `FBStub.respondToApiRequest()`.
59
+
60
+ ### FBStub.loggedIn(userId)
61
+
62
+ This simulates a logged in user.
63
+
64
+ ### FBStub.notLoggedIn()
65
+
66
+ This simulates a logged out user.
67
+
68
+ ### FBStub.connected()
69
+
70
+ This simulates a user having authorized the current application.
71
+
72
+ ### FBStub.notConnected()
73
+
74
+ This simulates a user having not authorized the current application.
75
+
76
+ ### FBStub.respondToApiRequest(path, response)
77
+
78
+ This responds to a previously recorded `FB.api()` request matching the given `path`. It will synchronously call the
79
+ stored callback with the given `response`.
80
+
81
+ ## Notes
82
+
83
+ * When using `facebook-js-stub.js`, do not include Facebook's official JavaScript library. They both use the `FB`
84
+ namespace, so one will override the other.
85
+
86
+ ## License
87
+
88
+ Please see the included license file.
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ begin
4
+ require 'jasmine'
5
+ load 'jasmine/tasks/jasmine.rake'
6
+ rescue LoadError
7
+ task :jasmine do
8
+ abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module FacebookJsStub
2
+ MAJOR = 0
3
+ MINOR = 1
4
+ PATCH = 4
5
+
6
+ VERSION = [MAJOR, MINOR, PATCH].join('.')
7
+ end
@@ -0,0 +1,97 @@
1
+ describe("FB.api", function () {
2
+ var callbacks;
3
+
4
+ beforeEach(function () {
5
+ callbacks = {
6
+ api:function () {
7
+ }
8
+ };
9
+ spyOn(callbacks, 'api');
10
+ });
11
+
12
+ describe("when FB has not been initialized", function () {
13
+ beforeEach(function () {
14
+ FB.api(callbacks.api);
15
+ });
16
+
17
+ it("should not call the callback function", function () {
18
+ expect(callbacks.api).not.toHaveBeenCalled();
19
+ });
20
+ });
21
+
22
+ describe("when FB has been initialized", function () {
23
+ var response;
24
+
25
+ function shared_callback_examples() {
26
+ it("should match open requests", function() {
27
+ expect(FBStub.findApiRequest("/some/path")).toBeDefined();
28
+ });
29
+
30
+ it("should not yet call the callback function", function() {
31
+ expect(callbacks.api).not.toHaveBeenCalled();
32
+ });
33
+
34
+ describe("when the API response is triggered for the same path", function() {
35
+ beforeEach(function() {
36
+ FBStub.respondToApiRequest("/some/path", response);
37
+ });
38
+
39
+ it("should yield the response to the callback function", function() {
40
+ expect(callbacks.api).toHaveBeenCalledWith(response);
41
+ });
42
+ });
43
+
44
+ describe("when the API response is triggered for a different path", function() {
45
+ beforeEach(function() {
46
+ FBStub.respondToApiRequest("/another/path", response);
47
+ });
48
+
49
+ it("should not yet call the callback function", function() {
50
+ expect(callbacks.api).not.toHaveBeenCalled();
51
+ });
52
+ });
53
+ }
54
+
55
+ describe("when given path and callback params", function() {
56
+ beforeEach(function () {
57
+ FB.init({appId:123});
58
+ FB.api("/some/path", callbacks.api);
59
+
60
+ response = {
61
+ data: [
62
+ {
63
+ name: "Example",
64
+ access_token: "",
65
+ category: "Community",
66
+ id: "1234567890"
67
+ }
68
+ ]
69
+ };
70
+ });
71
+
72
+ shared_callback_examples();
73
+ });
74
+
75
+ describe("when given path, method ,object, and callback params", function() {
76
+ var myObj = { };
77
+
78
+ beforeEach(function () {
79
+ FB.init({appId:123});
80
+ FB.api("/some/path", "post", myObj, callbacks.api);
81
+
82
+ response = {
83
+ data: [
84
+ {
85
+ name: "Example",
86
+ access_token: "",
87
+ category: "Community",
88
+ id: "1234567890"
89
+ }
90
+ ]
91
+ };
92
+ });
93
+
94
+ shared_callback_examples();
95
+ });
96
+ });
97
+ });
@@ -0,0 +1,81 @@
1
+ describe("FB.getLoginStatus", function() {
2
+ var callbacks;
3
+
4
+ beforeEach(function() {
5
+ callbacks = {
6
+ getLoginStatus: function() {}
7
+ };
8
+ spyOn(callbacks, 'getLoginStatus');
9
+ });
10
+
11
+ describe("when FB has not been initialized", function() {
12
+ it("should not call the callback function", function() {
13
+ FB.getLoginStatus(callbacks.getLoginStatus);
14
+ expect(callbacks.getLoginStatus).not.toHaveBeenCalled();
15
+ });
16
+ });
17
+
18
+ describe("when FB has been initialized", function() {
19
+ beforeEach(function() {
20
+ FB.init({appId: 123});
21
+ });
22
+
23
+ it("should call the callback function", function() {
24
+ FB.getLoginStatus(callbacks.getLoginStatus);
25
+ expect(callbacks.getLoginStatus).toHaveBeenCalled();
26
+ });
27
+
28
+ describe("when the user is logged in", function() {
29
+ beforeEach(function() {
30
+ FBStub.loggedIn({userID: 123});
31
+ });
32
+
33
+ describe("when the user has authorized the application", function() {
34
+ beforeEach(function() {
35
+ FBStub.connected();
36
+ });
37
+
38
+ it("should yield a hash with a connected response", function() {
39
+ FB.getLoginStatus(callbacks.getLoginStatus);
40
+ expect(callbacks.getLoginStatus).toHaveBeenCalledWith({
41
+ status : 'connected',
42
+ authResponse: {
43
+ accessToken: '',
44
+ expiresIn: 4095,
45
+ signedRequest: '',
46
+ userID: 123
47
+ }
48
+ });
49
+ });
50
+ });
51
+
52
+ describe("when the user has not authorized the application", function() {
53
+ beforeEach(function() {
54
+ FBStub.notConnected();
55
+ });
56
+
57
+ it("should yield a hash with an unauthorized status", function() {
58
+ FB.getLoginStatus(callbacks.getLoginStatus);
59
+ expect(callbacks.getLoginStatus).toHaveBeenCalledWith({
60
+ status: 'not_authorized',
61
+ authResponse: null
62
+ });
63
+ })
64
+ });
65
+ });
66
+
67
+ describe("when the user is not logged in", function() {
68
+ beforeEach(function() {
69
+ FBStub.notLoggedIn();
70
+ });
71
+
72
+ it("should yield a hash an unknown status", function() {
73
+ FB.getLoginStatus(callbacks.getLoginStatus);
74
+ expect(callbacks.getLoginStatus).toHaveBeenCalledWith({
75
+ status: 'unknown',
76
+ authResponse: null
77
+ });
78
+ })
79
+ });
80
+ });
81
+ });
@@ -0,0 +1,3 @@
1
+ beforeEach(function() {
2
+ FBStub.reset();
3
+ });
@@ -0,0 +1,101 @@
1
+ describe("FB.login", function() {
2
+ var callbacks;
3
+
4
+ beforeEach(function() {
5
+ callbacks = {
6
+ login: function() {}
7
+ };
8
+ spyOn(callbacks, 'login');
9
+ });
10
+
11
+ describe("when FB has not been initialized", function() {
12
+ beforeEach(function() {
13
+ FB.login(callbacks.login);
14
+ });
15
+
16
+ describe("when the user logs in and authorizes the application", function() {
17
+ beforeEach(function() {
18
+ FBStub.logInAndAuthorize();
19
+ });
20
+
21
+ it("should not call the callback function", function() {
22
+ expect(callbacks.login).not.toHaveBeenCalled();
23
+ });
24
+ });
25
+
26
+ describe("when the user does not log in or authorize the application", function() {
27
+ beforeEach(function() {
28
+ FBStub.logInAndDeny();
29
+ });
30
+
31
+ it("should not call the callback function", function() {
32
+ expect(callbacks.login).not.toHaveBeenCalled();
33
+ });
34
+ });
35
+
36
+ describe("when the user does not log in", function() {
37
+ beforeEach(function() {
38
+ FBStub.abortLogIn();
39
+ });
40
+
41
+ it("should not call the callback function", function() {
42
+ expect(callbacks.login).not.toHaveBeenCalled();
43
+ });
44
+ });
45
+ });
46
+
47
+ describe("when FB has been initialized", function() {
48
+ beforeEach(function() {
49
+ FB.init({appId: 123});
50
+ FB.login(callbacks.login);
51
+ });
52
+
53
+ it("should not yet call the callback function", function() {
54
+ expect(callbacks.login).not.toHaveBeenCalled();
55
+ });
56
+
57
+ describe("when the user logs in and authorizes the application", function() {
58
+ beforeEach(function() {
59
+ FBStub.logInAndAuthorize();
60
+ });
61
+
62
+ it("should yield an object with an authorized response", function() {
63
+ expect(callbacks.login).toHaveBeenCalledWith({
64
+ status: "connected",
65
+ authResponse: {
66
+ accessToken: "",
67
+ userID: "",
68
+ expiresIn: 4374,
69
+ signedRequest: ""
70
+ }
71
+ });
72
+ });
73
+ });
74
+
75
+ describe("when the user logs in and does not authorize the application", function() {
76
+ beforeEach(function() {
77
+ FBStub.logInAndDeny();
78
+ });
79
+
80
+ it("should yield an object with an authorized status", function() {
81
+ expect(callbacks.login).toHaveBeenCalledWith({
82
+ status: "not_authorized",
83
+ authResponse: null
84
+ });
85
+ });
86
+ });
87
+
88
+ describe("when the user does not log in", function() {
89
+ beforeEach(function() {
90
+ FBStub.abortLogIn();
91
+ });
92
+
93
+ it("should yield an object with an unknown status", function() {
94
+ expect(callbacks.login).toHaveBeenCalledWith({
95
+ status: "unknown",
96
+ authResponse: null
97
+ });
98
+ });
99
+ });
100
+ });
101
+ });
@@ -0,0 +1,2 @@
1
+ src_files:
2
+ - src/**/*.js
@@ -0,0 +1,23 @@
1
+ module Jasmine
2
+ class Config
3
+
4
+ # Add your overrides or custom config code here
5
+
6
+ end
7
+ end
8
+
9
+
10
+ # Note - this is necessary for rspec2, which has removed the backtrace
11
+ module Jasmine
12
+ class SpecBuilder
13
+ def declare_spec(parent, spec)
14
+ me = self
15
+ example_name = spec["name"]
16
+ @spec_ids << spec["id"]
17
+ backtrace = @example_locations[parent.description + " " + example_name]
18
+ parent.it example_name, {} do
19
+ me.report_spec(spec["id"])
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ $:.unshift(ENV['JASMINE_GEM_PATH']) if ENV['JASMINE_GEM_PATH'] # for gem testing purposes
2
+
3
+ require 'rubygems'
4
+ require 'jasmine'
5
+ jasmine_config_overrides = File.expand_path(File.join(File.dirname(__FILE__), 'jasmine_config.rb'))
6
+ require jasmine_config_overrides if File.exist?(jasmine_config_overrides)
7
+ if Jasmine::Dependencies.rspec2?
8
+ require 'rspec'
9
+ else
10
+ require 'spec'
11
+ end
12
+
13
+ jasmine_config = Jasmine::Config.new
14
+ spec_builder = Jasmine::SpecBuilder.new(jasmine_config)
15
+
16
+ should_stop = false
17
+
18
+ if Jasmine::Dependencies.rspec2?
19
+ RSpec.configuration.after(:suite) do
20
+ spec_builder.stop if should_stop
21
+ end
22
+ else
23
+ Spec::Runner.configure do |config|
24
+ config.after(:suite) do
25
+ spec_builder.stop if should_stop
26
+ end
27
+ end
28
+ end
29
+
30
+ spec_builder.start
31
+ should_stop = true
32
+ spec_builder.declare_suites
@@ -0,0 +1,58 @@
1
+ var FB = (function(){
2
+ var self = { };
3
+
4
+ self.init = function(options) {
5
+ FBStub.appId(options.appId);
6
+ };
7
+
8
+ self.login = function(callback) {
9
+ if (!FBStub.initialized()) return;
10
+ FBStub.loginCallback = callback;
11
+ };
12
+
13
+ self.getLoginStatus = function(callback) {
14
+ if (!FBStub.initialized()) return;
15
+ var status;
16
+ var authResponse = null;
17
+
18
+ if (FBStub.isLoggedIn()) {
19
+ if (FBStub.isConnected()) {
20
+ status = "connected";
21
+ authResponse = {
22
+ accessToken: "",
23
+ expiresIn: 4095,
24
+ signedRequest: "",
25
+ userID: FBStub.userID()
26
+ };
27
+ }
28
+ else {
29
+ status = "not_authorized";
30
+ }
31
+ }
32
+ else {
33
+ status = "unknown";
34
+ }
35
+
36
+ callback({
37
+ status: status,
38
+ authResponse: authResponse
39
+ });
40
+ };
41
+
42
+ self.api = function(path, method, params, callback) {
43
+ var callbackMethod;
44
+
45
+ if (typeof method === 'function') {
46
+ callbackMethod = method;
47
+ } else {
48
+ if (typeof params == 'function') {
49
+ callbackMethod = params;
50
+ } else {
51
+ callbackMethod = callback;
52
+ }
53
+ }
54
+ FBStub.addApiRequest(path, callbackMethod);
55
+ };
56
+
57
+ return self;
58
+ }( ));
@@ -0,0 +1,107 @@
1
+ var FBStub = (function() {
2
+ var self = { };
3
+
4
+ var state, apiRequests;
5
+
6
+ var initialize = function() {
7
+ state = {
8
+ 'loggedIn': false,
9
+ 'connected': false,
10
+ 'appId': null,
11
+ 'user': {}
12
+ };
13
+ apiRequests = { };
14
+ };
15
+
16
+ initialize();
17
+
18
+ self.addApiRequest = function(path, callback) {
19
+ apiRequests[path] = callback;
20
+ };
21
+
22
+ self.findApiRequest = function(path) {
23
+ return apiRequests[path];
24
+ };
25
+
26
+ self.loggedIn = function(user) {
27
+ state.loggedIn = true;
28
+ state.user = user || {};
29
+ };
30
+
31
+ self.notLoggedIn = function() {
32
+ state.loggedIn = false;
33
+ state.user = {};
34
+ };
35
+
36
+ self.connected = function() {
37
+ state.connected = true;
38
+ };
39
+
40
+ self.notConnected = function() {
41
+ state.connected = false;
42
+ };
43
+
44
+ self.isLoggedIn = function() {
45
+ return state.loggedIn;
46
+ };
47
+
48
+ self.isConnected = function() {
49
+ return state.connected;
50
+ };
51
+
52
+ self.userID = function() {
53
+ return state.user.userID;
54
+ };
55
+
56
+ self.appId = function(id) {
57
+ if (id) {
58
+ state.appId = id;
59
+ }
60
+ return state.appId;
61
+ };
62
+
63
+ self.reset = function() {
64
+ initialize();
65
+ };
66
+
67
+ self.logInAndAuthorize = function() {
68
+ if (!self.initialized()) return;
69
+ self.loginCallback({
70
+ status: "connected",
71
+ authResponse: {
72
+ accessToken: "",
73
+ userID: "",
74
+ expiresIn: 4374,
75
+ signedRequest: ""
76
+ }
77
+ });
78
+ };
79
+
80
+ self.logInAndDeny = function() {
81
+ if (!self.initialized()) return;
82
+ self.loginCallback({
83
+ status: "not_authorized",
84
+ authResponse: null
85
+ });
86
+ };
87
+
88
+ self.abortLogIn = function() {
89
+ if (!self.initialized()) return;
90
+ self.loginCallback({
91
+ status: "unknown",
92
+ authResponse: null
93
+ });
94
+ };
95
+
96
+ self.respondToApiRequest = function(path, response) {
97
+ if (typeof(apiRequests[path]) === 'undefined') return;
98
+ apiRequests[path](response);
99
+ };
100
+
101
+ self.initialized = function() {
102
+ var appId = state.appId;
103
+ return (typeof(appId) == 'number' || typeof(appId) == "string");
104
+ };
105
+
106
+ return self;
107
+ }( ));
metadata CHANGED
@@ -1,11 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: facebook-js-stub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Involver
9
+ - Brian Norton
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
@@ -17,9 +18,23 @@ executables: []
17
18
  extensions: []
18
19
  extra_rdoc_files: []
19
20
  files:
20
- - /Users/nort/git/facebook-js-stub/lib/facebook-js-stub/engine.rb
21
- - /Users/nort/git/facebook-js-stub/lib/facebook-js-stub.rb
22
- - /Users/nort/git/facebook-js-stub/vendor/assets/javascripts/facebook-js-stub.js
21
+ - lib/facebook-js-stub/engine.rb
22
+ - lib/facebook-js-stub/version.rb
23
+ - lib/facebook-js-stub.rb
24
+ - spec/javascripts/api_spec.js
25
+ - spec/javascripts/get_login_status_spec.js
26
+ - spec/javascripts/helpers/spec_helper.js
27
+ - spec/javascripts/login_spec.js
28
+ - spec/javascripts/support/jasmine.yml
29
+ - spec/javascripts/support/jasmine_config.rb
30
+ - spec/javascripts/support/jasmine_runner.rb
31
+ - src/fb.js
32
+ - src/fb_stub.js
33
+ - vendor/assets/javascripts/facebook-js-stub.js
34
+ - Gemfile
35
+ - MIT-LICENSE
36
+ - Rakefile
37
+ - README.md
23
38
  homepage:
24
39
  licenses: []
25
40
  post_install_message:
@@ -43,6 +58,6 @@ rubyforge_project:
43
58
  rubygems_version: 1.8.25
44
59
  signing_key:
45
60
  specification_version: 3
46
- summary: ''
61
+ summary: A mocking framework for the FB javascript library.
47
62
  test_files: []
48
63
  has_rdoc: