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.
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