social_auth 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +39 -0
- data/app/models/social_auth/facebook_service.rb +60 -0
- data/app/models/social_auth/google_plus_service.rb +106 -0
- data/app/models/social_auth/service.rb +152 -0
- data/app/models/social_auth/twitter_service.rb +67 -0
- data/config/routes.rb +2 -0
- data/lib/generators/social_auth/install/install_generator.rb +37 -0
- data/lib/generators/social_auth/install/templates/create_social_auth_services.rb +12 -0
- data/lib/generators/social_auth/install/templates/initializer.rb +15 -0
- data/lib/social_auth.rb +73 -0
- data/lib/social_auth/acts_as_social_user.rb +23 -0
- data/lib/social_auth/engine.rb +12 -0
- data/lib/social_auth/railtie.rb +7 -0
- data/lib/social_auth/version.rb +3 -0
- data/lib/tasks/social_auth_tasks.rake +4 -0
- data/spec/dummy/rails-4.2.0/Gemfile +42 -0
- data/spec/dummy/rails-4.2.0/README.rdoc +28 -0
- data/spec/dummy/rails-4.2.0/Rakefile +6 -0
- data/spec/dummy/rails-4.2.0/app/assets/javascripts/application.js +16 -0
- data/spec/dummy/rails-4.2.0/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/rails-4.2.0/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/rails-4.2.0/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/rails-4.2.0/app/models/user.rb +2 -0
- data/spec/dummy/rails-4.2.0/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/rails-4.2.0/bin/bundle +3 -0
- data/spec/dummy/rails-4.2.0/bin/rails +4 -0
- data/spec/dummy/rails-4.2.0/bin/rake +4 -0
- data/spec/dummy/rails-4.2.0/bin/setup +29 -0
- data/spec/dummy/rails-4.2.0/config.ru +4 -0
- data/spec/dummy/rails-4.2.0/config/application.rb +26 -0
- data/spec/dummy/rails-4.2.0/config/boot.rb +3 -0
- data/spec/dummy/rails-4.2.0/config/database.yml +15 -0
- data/spec/dummy/rails-4.2.0/config/environment.rb +5 -0
- data/spec/dummy/rails-4.2.0/config/environments/development.rb +41 -0
- data/spec/dummy/rails-4.2.0/config/environments/production.rb +79 -0
- data/spec/dummy/rails-4.2.0/config/environments/test.rb +42 -0
- data/spec/dummy/rails-4.2.0/config/initializers/assets.rb +11 -0
- data/spec/dummy/rails-4.2.0/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/rails-4.2.0/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/rails-4.2.0/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/rails-4.2.0/config/initializers/inflections.rb +16 -0
- data/spec/dummy/rails-4.2.0/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/rails-4.2.0/config/initializers/session_store.rb +3 -0
- data/spec/dummy/rails-4.2.0/config/initializers/social_auth.rb +15 -0
- data/spec/dummy/rails-4.2.0/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/rails-4.2.0/config/locales/en.yml +23 -0
- data/spec/dummy/rails-4.2.0/config/routes.rb +56 -0
- data/spec/dummy/rails-4.2.0/config/secrets.yml +22 -0
- data/spec/dummy/rails-4.2.0/db/migrate/20150504044515878_create_social_auth_services.rb +12 -0
- data/spec/dummy/rails-4.2.0/db/migrate/20150504044519_create_users.rb +9 -0
- data/spec/dummy/rails-4.2.0/db/schema.rb +35 -0
- data/spec/dummy/rails-4.2.0/db/seeds.rb +7 -0
- data/spec/dummy/rails-4.2.0/log/test.log +2570 -0
- data/spec/dummy/rails-4.2.0/public/404.html +67 -0
- data/spec/dummy/rails-4.2.0/public/422.html +67 -0
- data/spec/dummy/rails-4.2.0/public/500.html +66 -0
- data/spec/dummy/rails-4.2.0/public/favicon.ico +0 -0
- data/spec/dummy/rails-4.2.0/public/robots.txt +5 -0
- data/spec/dummy/rails-4.2.0/test/fixtures/users.yml +7 -0
- data/spec/dummy/rails-4.2.0/test/models/user_test.rb +7 -0
- data/spec/dummy/rails-4.2.0/test/test_helper.rb +10 -0
- data/spec/fixtures/vcr_cassettes/facebook_service/invalid_friends_request.yml +54 -0
- data/spec/fixtures/vcr_cassettes/facebook_service/invalid_request.yml +50 -0
- data/spec/fixtures/vcr_cassettes/facebook_service/invalid_token.yml +50 -0
- data/spec/fixtures/vcr_cassettes/facebook_service/valid_friends_request.yml +110 -0
- data/spec/fixtures/vcr_cassettes/facebook_service/valid_request.yml +55 -0
- data/spec/fixtures/vcr_cassettes/google_plus_service/invalid_authorization.yml +51 -0
- data/spec/fixtures/vcr_cassettes/google_plus_service/invalid_friends_request.yml +53 -0
- data/spec/fixtures/vcr_cassettes/google_plus_service/invalid_token.yml +51 -0
- data/spec/fixtures/vcr_cassettes/google_plus_service/valid_authorization.yml +56 -0
- data/spec/fixtures/vcr_cassettes/google_plus_service/valid_friends_request.yml +132 -0
- data/spec/fixtures/vcr_cassettes/google_plus_service/valid_request.yml +110 -0
- data/spec/fixtures/vcr_cassettes/twitter_service/invalid_friends_request.yml +47 -0
- data/spec/fixtures/vcr_cassettes/twitter_service/valid_friends_request.yml +159 -0
- data/spec/fixtures/vcr_cassettes/twitter_service/valid_request.yml +337 -0
- data/spec/models/facebook_service_spec.rb +127 -0
- data/spec/models/google_plus_service_spec.rb +133 -0
- data/spec/models/service_spec.rb +236 -0
- data/spec/models/twitter_service_spec.rb +100 -0
- data/spec/spec_helper.rb +74 -0
- data/spec/support/database.yml +15 -0
- data/spec/support/rails_template.rb +15 -0
- metadata +376 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module SocialAuth
|
|
4
|
+
|
|
5
|
+
describe FacebookService do
|
|
6
|
+
before :each do
|
|
7
|
+
@user = User.create(email: "email@address.com")
|
|
8
|
+
allow_any_instance_of(FacebookService).to receive(:redis_instance).and_return(Redis.new)
|
|
9
|
+
allow_any_instance_of(FacebookService).to receive(:append_to_associated_services).and_return(true)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe "social login methods" do
|
|
13
|
+
it "receives init_with on authenticate" do
|
|
14
|
+
expect(FacebookService).to receive(:init_with)
|
|
15
|
+
SocialAuth.authenticate("facebook", {access_token: "access_token"})
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "receives connect_with on connect" do
|
|
19
|
+
expect(FacebookService).to receive(:connect_with)
|
|
20
|
+
SocialAuth.connect(@user, "facebook", {access_token: "access_token"})
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "exception raising" do
|
|
25
|
+
it "invalid token raises InvalidToken error" do
|
|
26
|
+
VCR.use_cassette('facebook_service/invalid_request') do
|
|
27
|
+
expect{
|
|
28
|
+
FacebookService.init_with({access_token: "343421"})
|
|
29
|
+
}.to raise_error InvalidToken
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe "self.init_with" do
|
|
35
|
+
before :each do
|
|
36
|
+
#create an override method on user which gets called whenever
|
|
37
|
+
#we want a user created you do the rest!
|
|
38
|
+
User.class_eval do
|
|
39
|
+
has_many :services, inverse_of: :user, class_name: SocialAuth::Service
|
|
40
|
+
def self.create_with_facebook_request(request)
|
|
41
|
+
new
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "creates service if doesn't exist" do
|
|
47
|
+
VCR.use_cassette('facebook_service/valid_request') do
|
|
48
|
+
expect{
|
|
49
|
+
FacebookService.init_with(fb_access_token)
|
|
50
|
+
}.to change(FacebookService, :count).by(1)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "User receives override method" do
|
|
55
|
+
expect(User).to receive(:create_with_facebook_request).once
|
|
56
|
+
VCR.use_cassette('facebook_service/valid_request') do
|
|
57
|
+
FacebookService.init_with(fb_access_token)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe "create_connection" do
|
|
63
|
+
it "returns valid connection" do
|
|
64
|
+
VCR.use_cassette('facebook_service/valid_request') do
|
|
65
|
+
expect{
|
|
66
|
+
FacebookService.create_connection(fb_access_token)
|
|
67
|
+
}.to_not raise_error
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "raises invalid token" do
|
|
72
|
+
VCR.use_cassette('facebook_service/invalid_token') do
|
|
73
|
+
expect{
|
|
74
|
+
FacebookService.create_connection({access_token: "invalid_token"})
|
|
75
|
+
}.to raise_error InvalidToken
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "self.connect_with" do
|
|
82
|
+
it "creates service if doesn't exist" do
|
|
83
|
+
VCR.use_cassette('facebook_service/valid_request') do
|
|
84
|
+
expect{
|
|
85
|
+
FacebookService.connect_with(@user, fb_access_token)
|
|
86
|
+
}.to change(FacebookService, :count).by(1)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "friend_ids" do
|
|
92
|
+
before :each do
|
|
93
|
+
@service = FacebookService.create(access_token: fb_access_token, remote_id: "10204796229055532", user: @user, method: "Authenticated")
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "returns friend_ids" do
|
|
97
|
+
VCR.use_cassette("facebook_service/valid_friends_request") do
|
|
98
|
+
expect{
|
|
99
|
+
expect(@service.friend_ids).to_not be_empty
|
|
100
|
+
}.to_not raise_error
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "if user has no friends returns empty array" do
|
|
105
|
+
allow_any_instance_of(FbGraph2::Edge::Friends).to receive(:friends).and_return([])
|
|
106
|
+
VCR.use_cassette("facebook_service/valid_friends_request") do
|
|
107
|
+
expect{
|
|
108
|
+
expect(@service.friend_ids).to be_empty
|
|
109
|
+
}.to_not raise_error
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "invalid_token returns empty array and hits disconnect callback" do
|
|
114
|
+
service = FacebookService.create(access_token: {access_token: "test"}, remote_id: "10204796229055532", user: @user, method: "Authenticated")
|
|
115
|
+
|
|
116
|
+
expect_any_instance_of(FacebookService).to receive(:disconnect).once
|
|
117
|
+
VCR.use_cassette("facebook_service/invalid_friends_request") do
|
|
118
|
+
expect{
|
|
119
|
+
expect(@service.friend_ids).to be_empty
|
|
120
|
+
}.to_not raise_error
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
end
|
|
127
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module SocialAuth
|
|
4
|
+
|
|
5
|
+
describe GooglePlusService do
|
|
6
|
+
before :each do
|
|
7
|
+
@user = User.create(email: "email@address.com")
|
|
8
|
+
allow_any_instance_of(GooglePlusService).to receive(:redis_instance).and_return(Redis.new)
|
|
9
|
+
allow_any_instance_of(GooglePlusService).to receive(:append_to_associated_services).and_return(true)
|
|
10
|
+
SocialAuth.google_client_id = "1053743633063-aaearku9rl008rc8vq7muvreifc4jbo8.apps.googleusercontent.com"
|
|
11
|
+
SocialAuth.google_client_secret = "rK6Fkmo6qpiiy0_SnWJDOlgv"
|
|
12
|
+
SocialAuth.google_redirect_uri = "https://developers.google.com/oauthplayground"
|
|
13
|
+
SocialAuth.google_api_key = "AIzaSyAKMHRoLKyRo5rivF8hq_Ic3SmvphBYIBk"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe "social login methods" do
|
|
17
|
+
it "receives init_with on authenticate" do
|
|
18
|
+
expect(GooglePlusService).to receive(:init_with)
|
|
19
|
+
SocialAuth.authenticate("google_plus", {access_token: "access_token"})
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "receives connect_with on connect" do
|
|
23
|
+
expect(GooglePlusService).to receive(:connect_with)
|
|
24
|
+
SocialAuth.connect(@user, "google_plus", {access_token: "access_token"})
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "self.init_with" do
|
|
29
|
+
before :each do
|
|
30
|
+
#create an override method on user which gets called whenever
|
|
31
|
+
#we want a user created you do the rest!
|
|
32
|
+
User.class_eval do
|
|
33
|
+
has_many :services, inverse_of: :user, class_name: SocialAuth::Service
|
|
34
|
+
def self.create_with_google_plus_request(request)
|
|
35
|
+
new
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "creates service if doesn't exist" do
|
|
41
|
+
VCR.use_cassette('google_plus_service/valid_request') do
|
|
42
|
+
expect{
|
|
43
|
+
GooglePlusService.init_with(google_plus_access_token)
|
|
44
|
+
}.to change(GooglePlusService, :count).by(1)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "User receives override method" do
|
|
49
|
+
expect(User).to receive(:create_with_google_plus_request).once
|
|
50
|
+
VCR.use_cassette('google_plus_service/valid_request') do
|
|
51
|
+
GooglePlusService.init_with(google_plus_access_token)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "self.connect_with" do
|
|
57
|
+
it "creates service if doesn't exist" do
|
|
58
|
+
VCR.use_cassette('google_plus_service/valid_request') do
|
|
59
|
+
expect{
|
|
60
|
+
GooglePlusService.connect_with(@user, google_plus_access_token)
|
|
61
|
+
}.to change(GooglePlusService, :count).by(1)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "invalid_token raises InvalidToken exception" do
|
|
66
|
+
VCR.use_cassette('google_plus_service/invalid_token') do
|
|
67
|
+
expect{
|
|
68
|
+
GooglePlusService.connect_with(@user, {auth_token: "wrong"})
|
|
69
|
+
}.to raise_error InvalidToken
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe "create_connection" do
|
|
75
|
+
it "fetches token correctly" do
|
|
76
|
+
VCR.use_cassette("google_plus_service/valid_authorization") do
|
|
77
|
+
response = GooglePlusService.fetch_access_token({auth_token: google_plus_auth_token})
|
|
78
|
+
expect(response[:refresh_token]).to be_present
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "fetches token correctly" do
|
|
83
|
+
VCR.use_cassette("google_plus_service/invalid_authorization") do
|
|
84
|
+
expect{
|
|
85
|
+
GooglePlusService.fetch_access_token({auth_token: "bad-token"})
|
|
86
|
+
}.to raise_error InvalidToken
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "returns valid connection" do
|
|
91
|
+
VCR.use_cassette('google_plus_service/valid_request') do
|
|
92
|
+
expect{
|
|
93
|
+
GooglePlusService.create_connection(google_plus_access_token)
|
|
94
|
+
}.to_not raise_error
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe "friend_ids" do
|
|
100
|
+
before :each do
|
|
101
|
+
@service = GooglePlusService.create(access_token: {refresh_token: google_plus_access_token[:refresh_token]}, remote_id: "410739240", user: @user, method: "Authenticated")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "returns friend_ids" do
|
|
105
|
+
VCR.use_cassette("google_plus_service/valid_friends_request") do
|
|
106
|
+
expect{
|
|
107
|
+
expect(@service.friend_ids).to_not be_empty
|
|
108
|
+
}.to_not raise_error
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "doesn't raise error if user has no friends" do
|
|
113
|
+
expect_any_instance_of(GooglePlusService).to receive(:google_items).and_return(nil)
|
|
114
|
+
VCR.use_cassette("google_plus_service/valid_friends_request") do
|
|
115
|
+
expect{
|
|
116
|
+
expect(@service.friend_ids).to be_empty
|
|
117
|
+
}.to_not raise_error
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "invalid_token returns empty array and hits disconnect callback" do
|
|
122
|
+
service = GooglePlusService.create(access_token: {refresh_token: "fake"}, remote_id: "410739240", user: @user, method: "Authenticated")
|
|
123
|
+
expect_any_instance_of(GooglePlusService).to receive(:disconnect).once
|
|
124
|
+
VCR.use_cassette("google_plus_service/invalid_friends_request") do
|
|
125
|
+
expect{
|
|
126
|
+
expect(service.friend_ids).to be_empty
|
|
127
|
+
}.to_not raise_error
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
end
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module SocialAuth
|
|
4
|
+
|
|
5
|
+
describe Service do
|
|
6
|
+
before :each do
|
|
7
|
+
@user = User.create(email: "email@address.com")
|
|
8
|
+
@redis_server = Redis.new
|
|
9
|
+
allow_any_instance_of(Service).to receive(:redis_instance).and_return(@redis_server)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
#service factories
|
|
13
|
+
def valid_service(user)
|
|
14
|
+
service = Service.create(access_token: {access_token: "34223"}, remote_id: "34343", user_id: user.id, method: "Authenticated")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "has valid factory" do
|
|
18
|
+
service = valid_service(User.create())
|
|
19
|
+
expect(service).to be_valid
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "associated_services" do
|
|
23
|
+
it "includes service with whom your friends with" do
|
|
24
|
+
service = Service.create(access_token: {fake: "fake"}, remote_id: "2", user: User.create, method: "Authenticated")
|
|
25
|
+
expect(service).to receive(:friend_ids).and_return(["1234"])
|
|
26
|
+
|
|
27
|
+
another_service = Service.create(access_token: {fake: "fake"}, remote_id: "1234", user: User.create, method: "Authenticated")
|
|
28
|
+
expect(service.services).to include another_service
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "doesn't return service your not friends with" do
|
|
32
|
+
service = Service.create(access_token: {fake: "fake"}, remote_id: "2", user: User.create, method: "Authenticated")
|
|
33
|
+
expect(service).to receive(:friend_ids).and_return(["324"])
|
|
34
|
+
|
|
35
|
+
another_service = Service.create(access_token: {fake: "fake"}, remote_id: "1234", user: User.create, method: "Authenticated")
|
|
36
|
+
expect(service.services).to_not include another_service
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "append to friends list" do
|
|
41
|
+
before :each do
|
|
42
|
+
User.class_eval do
|
|
43
|
+
def friend_joined_the_app_callback(user)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "append to associate_services gets called on create" do
|
|
49
|
+
expect_any_instance_of(Service).to receive(:append_to_associated_services).once
|
|
50
|
+
service = Service.create(access_token: {fake: "fake"}, remote_id: "2", user: User.create, method: "Authenticated")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "on create append remote_id to related services" do
|
|
54
|
+
service = Service.create(access_token: {fake: "fake"}, remote_id: "2", user: User.create, method: "Authenticated")
|
|
55
|
+
@redis_server.sadd(service.redis_key(:friends), ["10", "11"])
|
|
56
|
+
|
|
57
|
+
expect(service.friend_ids.count).to eq 2
|
|
58
|
+
|
|
59
|
+
another_service = Service.create(access_token: {fake: "fake"}, remote_id: "15", user: User.create, method: "Authenticated")
|
|
60
|
+
@redis_server.sadd(another_service.redis_key(:friends), ["2"])
|
|
61
|
+
|
|
62
|
+
Service.append_to_associated_services(another_service.id)
|
|
63
|
+
|
|
64
|
+
expect(service.friend_ids.count).to eq 3
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "receives friend_join_the_app callback" do
|
|
68
|
+
expect_any_instance_of(User).to receive(:friend_joined_the_app_callback)
|
|
69
|
+
|
|
70
|
+
service = Service.create(access_token: {fake: "fake"}, remote_id: "2", user: User.create, method: "Authenticated")
|
|
71
|
+
@redis_server.sadd(service.redis_key(:friends), ["10", "11"])
|
|
72
|
+
|
|
73
|
+
expect(service.friend_ids.count).to eq 2
|
|
74
|
+
|
|
75
|
+
another_service = Service.create(access_token: {fake: "fake"}, remote_id: "15", user: User.create, method: "Authenticated")
|
|
76
|
+
@redis_server.sadd(another_service.redis_key(:friends), ["2"])
|
|
77
|
+
|
|
78
|
+
Service.append_to_associated_services(another_service.id)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe "disconnect" do
|
|
83
|
+
before :each do
|
|
84
|
+
@service = Service.create(access_token: {access_token: "test"}, remote_id: "10204796229055532", user: @user, method: "Authenticated")
|
|
85
|
+
User.class_eval do
|
|
86
|
+
has_many :services, inverse_of: :user, class_name: SocialAuth::Service
|
|
87
|
+
def service_disconnected_callback(service)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "destroys service if 'Connected' service" do
|
|
93
|
+
@service.update(method: 'Connected')
|
|
94
|
+
expect{
|
|
95
|
+
@service.disconnect
|
|
96
|
+
}.to change(Service, :count).by(-1)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "doesn't destroy service if 'Authenticated' service" do
|
|
100
|
+
@service.update(method: 'Authenticated')
|
|
101
|
+
expect{
|
|
102
|
+
@service.disconnect
|
|
103
|
+
}.to raise_error InvalidToken
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "hits service disconnected callback if callback is true" do
|
|
107
|
+
@service.update(method: 'Connected')
|
|
108
|
+
expect_any_instance_of(User).to receive(:service_disconnected_callback).once
|
|
109
|
+
@service.disconnect
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "doesn't hit service disconnected callback if callback is false" do
|
|
113
|
+
@service.update(method: 'Connected')
|
|
114
|
+
expect_any_instance_of(User).to_not receive(:service_disconnected_callback).once
|
|
115
|
+
@service.disconnect(nil, false)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe "disconnect_user" do
|
|
120
|
+
before :each do
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "disconnects service belong to user" do
|
|
124
|
+
service = Service.create(access_token: {access_token: "34223"}, remote_id: "34343", user: @user, method: "Connected")
|
|
125
|
+
|
|
126
|
+
expect_any_instance_of(Service).to receive(:disconnect).once
|
|
127
|
+
Service.disconnect_user(@user)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it "raises exception if you try to disconnect an authenticated service" do
|
|
131
|
+
service = Service.create(access_token: {access_token: "34223"}, remote_id: "34343", user: @user, method: "Authenticated")
|
|
132
|
+
|
|
133
|
+
expect{
|
|
134
|
+
Service.disconnect_user(@user)
|
|
135
|
+
}.to raise_error Error
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "raises exception if no service exists" do
|
|
139
|
+
expect{
|
|
140
|
+
Service.disconnect_user(@user)
|
|
141
|
+
}.to raise_error ServiceDoesNotExist
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
describe "validations" do
|
|
146
|
+
before :each do
|
|
147
|
+
@user = User.create
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "valid if 1 'Connected' of the same type exists for the same user" do
|
|
151
|
+
service = Service.new(access_token: {access_token: "34223"}, remote_id: "34343", user: @user, method: "Connected")
|
|
152
|
+
expect(service).to be_valid
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "invalid if more than 1 'Connected' of the same type exists for the same user" do
|
|
156
|
+
service = Service.create(access_token: {access_token: "34223"}, remote_id: "34343", user: @user, method: "Connected")
|
|
157
|
+
other_service = Service.create(access_token: {access_token: "34223"}, remote_id: "34343", user: @user, method: "Connected")
|
|
158
|
+
expect(other_service).to_not be_valid
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
xit "can't connect a service you have already authenticated with" do
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "'Connected' service is valid if another 'Authenticated' service exists with the same remote_id but for another user" do
|
|
165
|
+
service = Service.create(access_token: {access_token: "access_token"}, remote_id: "1", user: User.create, method: "Authenticated")
|
|
166
|
+
other_service = Service.new(access_token: {access_token: "access_token"}, remote_id: "1", user: @user, method: "Connected")
|
|
167
|
+
expect(other_service).to be_valid
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "can have 1 authenticated service scoped remote_id" do
|
|
171
|
+
service = Service.new(access_token: {access_token: "34223"}, remote_id: "34343", user: @user, method: "Authenticated")
|
|
172
|
+
expect(service).to be_valid
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it "cannot have multiple authenticate services with same remote_id" do
|
|
176
|
+
service = Service.create(access_token: {access_token: "fdf"}, remote_id: "34343", user: @user, method: "Authenticated")
|
|
177
|
+
another_service = Service.new(access_token: {access_token: "fdf"}, remote_id: "34343", user: @user, method: "Authenticated")
|
|
178
|
+
expect(another_service).to_not be_valid
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "can have multiple connected services with same remote_id" do
|
|
182
|
+
service = Service.create(access_token: {access_token: "fdf"}, remote_id: "34343", user: @user, method: "Connected")
|
|
183
|
+
another_service = Service.create(access_token: {access_token: "fdf"}, remote_id: "34343", user: User.create, method: "Connected")
|
|
184
|
+
expect(another_service).to be_valid
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
describe "self.create_with_request" do
|
|
189
|
+
def valid_service_from_request
|
|
190
|
+
Service.create_with_request("1", @user, "Authenticated",{access_token: "access_token"})
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "creates an Authenticated method service if remote id doesn't exist" do
|
|
194
|
+
expect{
|
|
195
|
+
valid_service_from_request
|
|
196
|
+
}.to change(Service, :count).by(1)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "Can create a connected service even if an authenticated service belonging to another user already exists" do
|
|
200
|
+
service = Service.create(access_token: {access_token: "access_token"}, remote_id: "1", user: User.create, method: "Authenticated")
|
|
201
|
+
expect{
|
|
202
|
+
Service.create_with_request("1", @user, "Connected", {access_token: "access_token"})
|
|
203
|
+
}.to change(Service, :count).by(1)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "creates service with type set to authenticated" do
|
|
207
|
+
expect(valid_service_from_request.method).to eq "Authenticated"
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
it "creates service if connected service already exists but belonging to another user" do
|
|
211
|
+
service = Service.create(access_token: {access_token: "access_token"}, remote_id: "1", user: @user, method: "Connected")
|
|
212
|
+
expect{
|
|
213
|
+
Service.create_with_request("1", User.create, "Connected", {access_token: "access_token"})
|
|
214
|
+
}.to change(Service, :count).by(1)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "returns service if remote_id and method is authenticated already exist" do
|
|
218
|
+
service = Service.create(access_token: {access_token: "access_token"}, remote_id: "1", user: @user, method: "Authenticated")
|
|
219
|
+
expect{
|
|
220
|
+
expect(Service.create_with_request("1", @user, "Authenticated", {access_token: "access_token"})).to eq service
|
|
221
|
+
}.to change(Service, :count).by(0)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "returns service if no authenticate method exists however a single connected service does exist" do
|
|
225
|
+
service = Service.create(access_token: {access_token: "access_token"}, remote_id: "1", user: @user, method: "Connected")
|
|
226
|
+
expect{
|
|
227
|
+
expect(Service.create_with_request("1", @user, "Authenticated", {access_token: "access_token"})).to eq service
|
|
228
|
+
}.to change(Service, :count).by(0)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
xit "raises exception if not authentication method exists however multiple connected services exist with the same remote_id" do
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
end
|
|
236
|
+
end
|