social_auth 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +39 -0
  4. data/app/models/social_auth/facebook_service.rb +60 -0
  5. data/app/models/social_auth/google_plus_service.rb +106 -0
  6. data/app/models/social_auth/service.rb +152 -0
  7. data/app/models/social_auth/twitter_service.rb +67 -0
  8. data/config/routes.rb +2 -0
  9. data/lib/generators/social_auth/install/install_generator.rb +37 -0
  10. data/lib/generators/social_auth/install/templates/create_social_auth_services.rb +12 -0
  11. data/lib/generators/social_auth/install/templates/initializer.rb +15 -0
  12. data/lib/social_auth.rb +73 -0
  13. data/lib/social_auth/acts_as_social_user.rb +23 -0
  14. data/lib/social_auth/engine.rb +12 -0
  15. data/lib/social_auth/railtie.rb +7 -0
  16. data/lib/social_auth/version.rb +3 -0
  17. data/lib/tasks/social_auth_tasks.rake +4 -0
  18. data/spec/dummy/rails-4.2.0/Gemfile +42 -0
  19. data/spec/dummy/rails-4.2.0/README.rdoc +28 -0
  20. data/spec/dummy/rails-4.2.0/Rakefile +6 -0
  21. data/spec/dummy/rails-4.2.0/app/assets/javascripts/application.js +16 -0
  22. data/spec/dummy/rails-4.2.0/app/assets/stylesheets/application.css +15 -0
  23. data/spec/dummy/rails-4.2.0/app/controllers/application_controller.rb +5 -0
  24. data/spec/dummy/rails-4.2.0/app/helpers/application_helper.rb +2 -0
  25. data/spec/dummy/rails-4.2.0/app/models/user.rb +2 -0
  26. data/spec/dummy/rails-4.2.0/app/views/layouts/application.html.erb +14 -0
  27. data/spec/dummy/rails-4.2.0/bin/bundle +3 -0
  28. data/spec/dummy/rails-4.2.0/bin/rails +4 -0
  29. data/spec/dummy/rails-4.2.0/bin/rake +4 -0
  30. data/spec/dummy/rails-4.2.0/bin/setup +29 -0
  31. data/spec/dummy/rails-4.2.0/config.ru +4 -0
  32. data/spec/dummy/rails-4.2.0/config/application.rb +26 -0
  33. data/spec/dummy/rails-4.2.0/config/boot.rb +3 -0
  34. data/spec/dummy/rails-4.2.0/config/database.yml +15 -0
  35. data/spec/dummy/rails-4.2.0/config/environment.rb +5 -0
  36. data/spec/dummy/rails-4.2.0/config/environments/development.rb +41 -0
  37. data/spec/dummy/rails-4.2.0/config/environments/production.rb +79 -0
  38. data/spec/dummy/rails-4.2.0/config/environments/test.rb +42 -0
  39. data/spec/dummy/rails-4.2.0/config/initializers/assets.rb +11 -0
  40. data/spec/dummy/rails-4.2.0/config/initializers/backtrace_silencers.rb +7 -0
  41. data/spec/dummy/rails-4.2.0/config/initializers/cookies_serializer.rb +3 -0
  42. data/spec/dummy/rails-4.2.0/config/initializers/filter_parameter_logging.rb +4 -0
  43. data/spec/dummy/rails-4.2.0/config/initializers/inflections.rb +16 -0
  44. data/spec/dummy/rails-4.2.0/config/initializers/mime_types.rb +4 -0
  45. data/spec/dummy/rails-4.2.0/config/initializers/session_store.rb +3 -0
  46. data/spec/dummy/rails-4.2.0/config/initializers/social_auth.rb +15 -0
  47. data/spec/dummy/rails-4.2.0/config/initializers/wrap_parameters.rb +14 -0
  48. data/spec/dummy/rails-4.2.0/config/locales/en.yml +23 -0
  49. data/spec/dummy/rails-4.2.0/config/routes.rb +56 -0
  50. data/spec/dummy/rails-4.2.0/config/secrets.yml +22 -0
  51. data/spec/dummy/rails-4.2.0/db/migrate/20150504044515878_create_social_auth_services.rb +12 -0
  52. data/spec/dummy/rails-4.2.0/db/migrate/20150504044519_create_users.rb +9 -0
  53. data/spec/dummy/rails-4.2.0/db/schema.rb +35 -0
  54. data/spec/dummy/rails-4.2.0/db/seeds.rb +7 -0
  55. data/spec/dummy/rails-4.2.0/log/test.log +2570 -0
  56. data/spec/dummy/rails-4.2.0/public/404.html +67 -0
  57. data/spec/dummy/rails-4.2.0/public/422.html +67 -0
  58. data/spec/dummy/rails-4.2.0/public/500.html +66 -0
  59. data/spec/dummy/rails-4.2.0/public/favicon.ico +0 -0
  60. data/spec/dummy/rails-4.2.0/public/robots.txt +5 -0
  61. data/spec/dummy/rails-4.2.0/test/fixtures/users.yml +7 -0
  62. data/spec/dummy/rails-4.2.0/test/models/user_test.rb +7 -0
  63. data/spec/dummy/rails-4.2.0/test/test_helper.rb +10 -0
  64. data/spec/fixtures/vcr_cassettes/facebook_service/invalid_friends_request.yml +54 -0
  65. data/spec/fixtures/vcr_cassettes/facebook_service/invalid_request.yml +50 -0
  66. data/spec/fixtures/vcr_cassettes/facebook_service/invalid_token.yml +50 -0
  67. data/spec/fixtures/vcr_cassettes/facebook_service/valid_friends_request.yml +110 -0
  68. data/spec/fixtures/vcr_cassettes/facebook_service/valid_request.yml +55 -0
  69. data/spec/fixtures/vcr_cassettes/google_plus_service/invalid_authorization.yml +51 -0
  70. data/spec/fixtures/vcr_cassettes/google_plus_service/invalid_friends_request.yml +53 -0
  71. data/spec/fixtures/vcr_cassettes/google_plus_service/invalid_token.yml +51 -0
  72. data/spec/fixtures/vcr_cassettes/google_plus_service/valid_authorization.yml +56 -0
  73. data/spec/fixtures/vcr_cassettes/google_plus_service/valid_friends_request.yml +132 -0
  74. data/spec/fixtures/vcr_cassettes/google_plus_service/valid_request.yml +110 -0
  75. data/spec/fixtures/vcr_cassettes/twitter_service/invalid_friends_request.yml +47 -0
  76. data/spec/fixtures/vcr_cassettes/twitter_service/valid_friends_request.yml +159 -0
  77. data/spec/fixtures/vcr_cassettes/twitter_service/valid_request.yml +337 -0
  78. data/spec/models/facebook_service_spec.rb +127 -0
  79. data/spec/models/google_plus_service_spec.rb +133 -0
  80. data/spec/models/service_spec.rb +236 -0
  81. data/spec/models/twitter_service_spec.rb +100 -0
  82. data/spec/spec_helper.rb +74 -0
  83. data/spec/support/database.yml +15 -0
  84. data/spec/support/rails_template.rb +15 -0
  85. 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