doorkeeper 5.1.0 → 5.3.0

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 (163) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +3 -3
  3. data/CHANGELOG.md +881 -0
  4. data/CONTRIBUTING.md +11 -9
  5. data/Dangerfile +2 -2
  6. data/Dockerfile +29 -0
  7. data/Gemfile +4 -3
  8. data/NEWS.md +1 -814
  9. data/README.md +11 -3
  10. data/RELEASING.md +6 -5
  11. data/app/controllers/doorkeeper/application_controller.rb +2 -2
  12. data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
  13. data/app/controllers/doorkeeper/applications_controller.rb +1 -0
  14. data/app/controllers/doorkeeper/authorizations_controller.rb +16 -9
  15. data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -2
  16. data/app/controllers/doorkeeper/tokens_controller.rb +32 -9
  17. data/app/views/doorkeeper/applications/_form.html.erb +0 -6
  18. data/app/views/doorkeeper/applications/show.html.erb +1 -1
  19. data/config/locales/en.yml +8 -2
  20. data/doorkeeper.gemspec +9 -1
  21. data/gemfiles/rails_5_0.gemfile +3 -2
  22. data/gemfiles/rails_5_1.gemfile +3 -2
  23. data/gemfiles/rails_5_2.gemfile +3 -2
  24. data/gemfiles/rails_6_0.gemfile +4 -3
  25. data/gemfiles/rails_master.gemfile +3 -2
  26. data/lib/doorkeeper/config/option.rb +13 -7
  27. data/lib/doorkeeper/config.rb +157 -42
  28. data/lib/doorkeeper/errors.rb +13 -18
  29. data/lib/doorkeeper/grape/helpers.rb +6 -2
  30. data/lib/doorkeeper/helpers/controller.rb +28 -7
  31. data/lib/doorkeeper/models/access_grant_mixin.rb +7 -6
  32. data/lib/doorkeeper/models/access_token_mixin.rb +99 -20
  33. data/lib/doorkeeper/models/application_mixin.rb +3 -3
  34. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  35. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  36. data/lib/doorkeeper/models/concerns/revocable.rb +0 -27
  37. data/lib/doorkeeper/oauth/authorization/code.rb +12 -14
  38. data/lib/doorkeeper/oauth/authorization/token.rb +10 -7
  39. data/lib/doorkeeper/oauth/authorization_code_request.rb +31 -15
  40. data/lib/doorkeeper/oauth/base_request.rb +10 -4
  41. data/lib/doorkeeper/oauth/client.rb +7 -8
  42. data/lib/doorkeeper/oauth/client_credentials/creator.rb +23 -2
  43. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +7 -7
  44. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +10 -2
  45. data/lib/doorkeeper/oauth/client_credentials_request.rb +1 -1
  46. data/lib/doorkeeper/oauth/code_request.rb +5 -11
  47. data/lib/doorkeeper/oauth/code_response.rb +4 -4
  48. data/lib/doorkeeper/oauth/error.rb +1 -1
  49. data/lib/doorkeeper/oauth/error_response.rb +6 -6
  50. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +7 -5
  51. data/lib/doorkeeper/oauth/helpers/unique_token.rb +8 -5
  52. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -5
  53. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  54. data/lib/doorkeeper/oauth/invalid_token_response.rb +5 -2
  55. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  56. data/lib/doorkeeper/oauth/password_access_token_request.rb +9 -4
  57. data/lib/doorkeeper/oauth/pre_authorization.rb +76 -38
  58. data/lib/doorkeeper/oauth/refresh_token_request.rb +17 -14
  59. data/lib/doorkeeper/oauth/token.rb +2 -2
  60. data/lib/doorkeeper/oauth/token_introspection.rb +26 -16
  61. data/lib/doorkeeper/oauth/token_request.rb +4 -18
  62. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  63. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  64. data/lib/doorkeeper/orm/active_record/application.rb +5 -83
  65. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +53 -0
  66. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +47 -0
  67. data/lib/doorkeeper/orm/active_record/mixins/application.rb +128 -0
  68. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +61 -0
  69. data/lib/doorkeeper/orm/active_record.rb +21 -6
  70. data/lib/doorkeeper/rails/helpers.rb +4 -4
  71. data/lib/doorkeeper/rails/routes.rb +5 -7
  72. data/lib/doorkeeper/rake/db.rake +3 -3
  73. data/lib/doorkeeper/request/authorization_code.rb +5 -3
  74. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  75. data/lib/doorkeeper/request/password.rb +2 -2
  76. data/lib/doorkeeper/request/refresh_token.rb +3 -3
  77. data/lib/doorkeeper/request.rb +7 -12
  78. data/lib/doorkeeper/server.rb +3 -7
  79. data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
  80. data/lib/doorkeeper/version.rb +1 -1
  81. data/lib/doorkeeper.rb +6 -3
  82. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  83. data/lib/generators/doorkeeper/confidential_applications_generator.rb +1 -1
  84. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  85. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  86. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
  87. data/lib/generators/doorkeeper/templates/initializer.rb +149 -33
  88. data/lib/generators/doorkeeper/templates/migration.rb.erb +4 -1
  89. data/spec/controllers/application_metal_controller_spec.rb +1 -1
  90. data/spec/controllers/applications_controller_spec.rb +95 -1
  91. data/spec/controllers/authorizations_controller_spec.rb +156 -75
  92. data/spec/controllers/protected_resources_controller_spec.rb +28 -20
  93. data/spec/controllers/token_info_controller_spec.rb +1 -1
  94. data/spec/controllers/tokens_controller_spec.rb +206 -38
  95. data/spec/dummy/config/application.rb +3 -1
  96. data/spec/dummy/config/initializers/doorkeeper.rb +54 -9
  97. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +3 -3
  98. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +1 -1
  99. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +1 -1
  100. data/spec/generators/install_generator_spec.rb +1 -1
  101. data/spec/generators/previous_refresh_token_generator_spec.rb +2 -2
  102. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +1 -1
  103. data/spec/lib/config_spec.rb +104 -7
  104. data/spec/lib/doorkeeper_spec.rb +1 -1
  105. data/spec/lib/models/revocable_spec.rb +3 -3
  106. data/spec/lib/oauth/authorization_code_request_spec.rb +129 -115
  107. data/spec/lib/oauth/base_request_spec.rb +154 -135
  108. data/spec/lib/oauth/base_response_spec.rb +27 -29
  109. data/spec/lib/oauth/client/credentials_spec.rb +1 -1
  110. data/spec/lib/oauth/client_credentials/creator_spec.rb +43 -3
  111. data/spec/lib/oauth/client_credentials/issuer_spec.rb +12 -12
  112. data/spec/lib/oauth/client_credentials/validation_spec.rb +4 -4
  113. data/spec/lib/oauth/client_credentials_integration_spec.rb +16 -18
  114. data/spec/lib/oauth/client_credentials_request_spec.rb +78 -80
  115. data/spec/lib/oauth/client_spec.rb +26 -26
  116. data/spec/lib/oauth/code_request_spec.rb +34 -35
  117. data/spec/lib/oauth/code_response_spec.rb +21 -25
  118. data/spec/lib/oauth/error_response_spec.rb +42 -44
  119. data/spec/lib/oauth/error_spec.rb +12 -14
  120. data/spec/lib/oauth/forbidden_token_response_spec.rb +11 -13
  121. data/spec/lib/oauth/helpers/scope_checker_spec.rb +30 -18
  122. data/spec/lib/oauth/helpers/uri_checker_spec.rb +17 -2
  123. data/spec/lib/oauth/invalid_request_response_spec.rb +73 -0
  124. data/spec/lib/oauth/invalid_token_response_spec.rb +32 -34
  125. data/spec/lib/oauth/password_access_token_request_spec.rb +145 -147
  126. data/spec/lib/oauth/pre_authorization_spec.rb +161 -153
  127. data/spec/lib/oauth/refresh_token_request_spec.rb +138 -138
  128. data/spec/lib/oauth/scopes_spec.rb +104 -106
  129. data/spec/lib/oauth/token_request_spec.rb +117 -110
  130. data/spec/lib/oauth/token_response_spec.rb +71 -73
  131. data/spec/lib/oauth/token_spec.rb +121 -123
  132. data/spec/lib/server_spec.rb +0 -12
  133. data/spec/models/doorkeeper/access_grant_spec.rb +21 -4
  134. data/spec/models/doorkeeper/access_token_spec.rb +42 -11
  135. data/spec/models/doorkeeper/application_spec.rb +114 -77
  136. data/spec/requests/applications/applications_request_spec.rb +1 -1
  137. data/spec/requests/endpoints/authorization_spec.rb +26 -8
  138. data/spec/requests/endpoints/token_spec.rb +1 -1
  139. data/spec/requests/flows/authorization_code_errors_spec.rb +1 -0
  140. data/spec/requests/flows/authorization_code_spec.rb +123 -45
  141. data/spec/requests/flows/client_credentials_spec.rb +38 -0
  142. data/spec/requests/flows/implicit_grant_errors_spec.rb +22 -10
  143. data/spec/requests/flows/implicit_grant_spec.rb +9 -8
  144. data/spec/requests/flows/password_spec.rb +67 -10
  145. data/spec/requests/flows/refresh_token_spec.rb +20 -20
  146. data/spec/requests/flows/revoke_token_spec.rb +37 -23
  147. data/spec/spec_helper.rb +1 -4
  148. data/spec/support/doorkeeper_rspec.rb +1 -1
  149. data/spec/support/helpers/request_spec_helper.rb +14 -2
  150. data/spec/support/shared/controllers_shared_context.rb +33 -23
  151. data/spec/validators/redirect_uri_validator_spec.rb +41 -16
  152. metadata +19 -16
  153. data/.coveralls.yml +0 -1
  154. data/.github/ISSUE_TEMPLATE.md +0 -25
  155. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  156. data/.gitignore +0 -20
  157. data/.gitlab-ci.yml +0 -16
  158. data/.hound.yml +0 -3
  159. data/.rspec +0 -1
  160. data/.rubocop.yml +0 -50
  161. data/.travis.yml +0 -35
  162. data/app/validators/redirect_uri_validator.rb +0 -50
  163. data/spec/support/http_method_shim.rb +0 -29
@@ -2,149 +2,156 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe TokenRequest do
7
- let :application do
8
- FactoryBot.create(:application, scopes: "public")
9
- end
5
+ describe Doorkeeper::OAuth::TokenRequest do
6
+ let :application do
7
+ FactoryBot.create(:application, scopes: "public")
8
+ end
10
9
 
11
- let :pre_auth do
12
- double(
13
- :pre_auth,
14
- client: application,
15
- redirect_uri: "http://tst.com/cb",
16
- state: nil,
17
- scopes: Scopes.from_string("public"),
18
- error: nil,
19
- authorizable?: true
20
- )
21
- end
10
+ let :pre_auth do
11
+ server = Doorkeeper.configuration
12
+ allow(server).to receive(:default_scopes).and_return(Doorkeeper::OAuth::Scopes.from_string("public"))
13
+ allow(server).to receive(:grant_flows).and_return(Doorkeeper::OAuth::Scopes.from_string("implicit"))
22
14
 
23
- let :owner do
24
- double :owner, id: 7866
25
- end
15
+ client = Doorkeeper::OAuth::Client.new(application)
26
16
 
27
- subject do
28
- TokenRequest.new(pre_auth, owner)
29
- end
17
+ attributes = {
18
+ client_id: client.uid,
19
+ response_type: "token",
20
+ redirect_uri: "https://app.com/callback",
21
+ }
30
22
 
31
- it "creates an access token" do
32
- expect do
33
- subject.authorize
34
- end.to change { Doorkeeper::AccessToken.count }.by(1)
35
- end
23
+ pre_auth = Doorkeeper::OAuth::PreAuthorization.new(server, attributes)
24
+ pre_auth.authorizable?
25
+ pre_auth
26
+ end
36
27
 
37
- it "returns a code response" do
38
- expect(subject.authorize).to be_a(CodeResponse)
39
- end
28
+ let :owner do
29
+ double :owner, id: 7866
30
+ end
40
31
 
41
- it "does not create token when not authorizable" do
42
- allow(pre_auth).to receive(:authorizable?).and_return(false)
43
- expect { subject.authorize }.not_to(change { Doorkeeper::AccessToken.count })
44
- end
32
+ subject do
33
+ described_class.new(pre_auth, owner)
34
+ end
35
+
36
+ it "creates an access token" do
37
+ expect do
38
+ subject.authorize
39
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
40
+ end
45
41
 
46
- it "returns a error response" do
47
- allow(pre_auth).to receive(:authorizable?).and_return(false)
48
- expect(subject.authorize).to be_a(ErrorResponse)
42
+ it "returns a code response" do
43
+ expect(subject.authorize).to be_a(Doorkeeper::OAuth::CodeResponse)
44
+ end
45
+
46
+ context "when pre_auth is denied" do
47
+ it "does not create token and returns a error response" do
48
+ expect { subject.deny }.not_to(change { Doorkeeper::AccessToken.count })
49
+ expect(subject.deny).to be_a(Doorkeeper::OAuth::ErrorResponse)
49
50
  end
51
+ end
50
52
 
51
- describe "with custom expiration" do
52
- context "when proper TTL returned" do
53
- before do
54
- Doorkeeper.configure do
55
- orm DOORKEEPER_ORM
56
- custom_access_token_expires_in do |context|
57
- context.grant_type == Doorkeeper::OAuth::IMPLICIT ? 1234 : nil
58
- end
53
+ describe "with custom expiration" do
54
+ context "when proper TTL returned" do
55
+ before do
56
+ Doorkeeper.configure do
57
+ orm DOORKEEPER_ORM
58
+ custom_access_token_expires_in do |context|
59
+ context.grant_type == Doorkeeper::OAuth::IMPLICIT ? 1234 : nil
59
60
  end
60
61
  end
62
+ end
61
63
 
62
- it "should use the custom ttl" do
63
- subject.authorize
64
- token = Doorkeeper::AccessToken.first
65
- expect(token.expires_in).to eq(1234)
66
- end
64
+ it "should use the custom ttl" do
65
+ subject.authorize
66
+ token = Doorkeeper::AccessToken.first
67
+ expect(token.expires_in).to eq(1234)
67
68
  end
69
+ end
68
70
 
69
- context "when nil TTL returned" do
70
- before do
71
- Doorkeeper.configure do
72
- orm DOORKEEPER_ORM
73
- access_token_expires_in 654
74
- custom_access_token_expires_in do |_context|
75
- nil
76
- end
71
+ context "when nil TTL returned" do
72
+ before do
73
+ Doorkeeper.configure do
74
+ orm DOORKEEPER_ORM
75
+ access_token_expires_in 654
76
+ custom_access_token_expires_in do |_context|
77
+ nil
77
78
  end
78
79
  end
80
+ end
79
81
 
80
- it "should fallback to access_token_expires_in" do
81
- subject.authorize
82
- token = Doorkeeper::AccessToken.first
83
- expect(token.expires_in).to eq(654)
84
- end
82
+ it "should fallback to access_token_expires_in" do
83
+ subject.authorize
84
+ token = Doorkeeper::AccessToken.first
85
+ expect(token.expires_in).to eq(654)
85
86
  end
87
+ end
86
88
 
87
- context "when infinite TTL returned" do
88
- before do
89
- Doorkeeper.configure do
90
- orm DOORKEEPER_ORM
91
- access_token_expires_in 654
92
- custom_access_token_expires_in do |_context|
93
- Float::INFINITY
94
- end
89
+ context "when infinite TTL returned" do
90
+ before do
91
+ Doorkeeper.configure do
92
+ orm DOORKEEPER_ORM
93
+ access_token_expires_in 654
94
+ custom_access_token_expires_in do |_context|
95
+ Float::INFINITY
95
96
  end
96
97
  end
98
+ end
97
99
 
98
- it "should fallback to access_token_expires_in" do
99
- subject.authorize
100
- token = Doorkeeper::AccessToken.first
101
- expect(token.expires_in).to be_nil
102
- end
100
+ it "should fallback to access_token_expires_in" do
101
+ subject.authorize
102
+ token = Doorkeeper::AccessToken.first
103
+ expect(token.expires_in).to be_nil
103
104
  end
104
105
  end
106
+ end
105
107
 
106
- context "token reuse" do
107
- it "creates a new token if there are no matching tokens" do
108
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
109
- expect do
110
- subject.authorize
111
- end.to change { Doorkeeper::AccessToken.count }.by(1)
112
- end
108
+ context "token reuse" do
109
+ it "creates a new token if there are no matching tokens" do
110
+ allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
111
+ expect do
112
+ subject.authorize
113
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
114
+ end
113
115
 
114
- it "creates a new token if scopes do not match" do
115
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
116
- FactoryBot.create(:access_token, application_id: pre_auth.client.id,
117
- resource_owner_id: owner.id, scopes: "")
118
- expect do
119
- subject.authorize
120
- end.to change { Doorkeeper::AccessToken.count }.by(1)
121
- end
116
+ it "creates a new token if scopes do not match" do
117
+ allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
118
+ FactoryBot.create(
119
+ :access_token, application_id: pre_auth.client.id,
120
+ resource_owner_id: owner.id, scopes: "",
121
+ )
122
+ expect do
123
+ subject.authorize
124
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
125
+ end
122
126
 
123
- it "skips token creation if there is a matching one reusable" do
124
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
125
- allow(application.scopes).to receive(:has_scopes?).and_return(true)
126
- allow(application.scopes).to receive(:all?).and_return(true)
127
+ it "skips token creation if there is a matching one reusable" do
128
+ allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
129
+ allow(application.scopes).to receive(:has_scopes?).and_return(true)
130
+ allow(application.scopes).to receive(:all?).and_return(true)
127
131
 
128
- FactoryBot.create(:access_token, application_id: pre_auth.client.id,
129
- resource_owner_id: owner.id, scopes: "public")
132
+ FactoryBot.create(
133
+ :access_token, application_id: pre_auth.client.id,
134
+ resource_owner_id: owner.id, scopes: "public",
135
+ )
130
136
 
131
- expect { subject.authorize }.not_to(change { Doorkeeper::AccessToken.count })
132
- end
137
+ expect { subject.authorize }.not_to(change { Doorkeeper::AccessToken.count })
138
+ end
133
139
 
134
- it "creates new token if there is a matching one but non reusable" do
135
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
136
- allow(application.scopes).to receive(:has_scopes?).and_return(true)
137
- allow(application.scopes).to receive(:all?).and_return(true)
140
+ it "creates new token if there is a matching one but non reusable" do
141
+ allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
142
+ allow(application.scopes).to receive(:has_scopes?).and_return(true)
143
+ allow(application.scopes).to receive(:all?).and_return(true)
138
144
 
139
- FactoryBot.create(:access_token, application_id: pre_auth.client.id,
140
- resource_owner_id: owner.id, scopes: "public")
145
+ FactoryBot.create(
146
+ :access_token, application_id: pre_auth.client.id,
147
+ resource_owner_id: owner.id, scopes: "public",
148
+ )
141
149
 
142
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
150
+ allow_any_instance_of(Doorkeeper::AccessToken).to receive(:reusable?).and_return(false)
143
151
 
144
- expect do
145
- subject.authorize
146
- end.to change { Doorkeeper::AccessToken.count }.by(1)
147
- end
152
+ expect do
153
+ subject.authorize
154
+ end.to change { Doorkeeper::AccessToken.count }.by(1)
148
155
  end
149
156
  end
150
157
  end
@@ -2,85 +2,83 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- module Doorkeeper::OAuth
6
- describe TokenResponse do
7
- subject { TokenResponse.new(double.as_null_object) }
8
-
9
- it "includes access token response headers" do
10
- headers = subject.headers
11
- expect(headers.fetch("Cache-Control")).to eq("no-store")
12
- expect(headers.fetch("Pragma")).to eq("no-cache")
5
+ describe Doorkeeper::OAuth::TokenResponse do
6
+ subject { described_class.new(double.as_null_object) }
7
+
8
+ it "includes access token response headers" do
9
+ headers = subject.headers
10
+ expect(headers.fetch("Cache-Control")).to eq("no-store")
11
+ expect(headers.fetch("Pragma")).to eq("no-cache")
12
+ end
13
+
14
+ it "status is ok" do
15
+ expect(subject.status).to eq(:ok)
16
+ end
17
+
18
+ describe ".body" do
19
+ let(:access_token) do
20
+ double :access_token,
21
+ plaintext_token: "some-token",
22
+ expires_in: "3600",
23
+ expires_in_seconds: "300",
24
+ scopes_string: "two scopes",
25
+ plaintext_refresh_token: "some-refresh-token",
26
+ token_type: "bearer",
27
+ created_at: 0
28
+ end
29
+
30
+ subject { described_class.new(access_token).body }
31
+
32
+ it "includes :access_token" do
33
+ expect(subject["access_token"]).to eq("some-token")
34
+ end
35
+
36
+ it "includes :token_type" do
37
+ expect(subject["token_type"]).to eq("bearer")
38
+ end
39
+
40
+ # expires_in_seconds is returned as `expires_in` in order to match
41
+ # the OAuth spec (section 4.2.2)
42
+ it "includes :expires_in" do
43
+ expect(subject["expires_in"]).to eq("300")
44
+ end
45
+
46
+ it "includes :scope" do
47
+ expect(subject["scope"]).to eq("two scopes")
13
48
  end
14
49
 
15
- it "status is ok" do
16
- expect(subject.status).to eq(:ok)
50
+ it "includes :refresh_token" do
51
+ expect(subject["refresh_token"]).to eq("some-refresh-token")
52
+ end
53
+
54
+ it "includes :created_at" do
55
+ expect(subject["created_at"]).to eq(0)
56
+ end
57
+ end
58
+
59
+ describe ".body filters out empty values" do
60
+ let(:access_token) do
61
+ double :access_token,
62
+ plaintext_token: "some-token",
63
+ expires_in_seconds: "",
64
+ scopes_string: "",
65
+ plaintext_refresh_token: "",
66
+ token_type: "bearer",
67
+ created_at: 0
68
+ end
69
+
70
+ subject { described_class.new(access_token).body }
71
+
72
+ it "includes :expires_in" do
73
+ expect(subject["expires_in"]).to be_nil
17
74
  end
18
75
 
19
- describe ".body" do
20
- let(:access_token) do
21
- double :access_token,
22
- plaintext_token: "some-token",
23
- expires_in: "3600",
24
- expires_in_seconds: "300",
25
- scopes_string: "two scopes",
26
- plaintext_refresh_token: "some-refresh-token",
27
- token_type: "bearer",
28
- created_at: 0
29
- end
30
-
31
- subject { TokenResponse.new(access_token).body }
32
-
33
- it "includes :access_token" do
34
- expect(subject["access_token"]).to eq("some-token")
35
- end
36
-
37
- it "includes :token_type" do
38
- expect(subject["token_type"]).to eq("bearer")
39
- end
40
-
41
- # expires_in_seconds is returned as `expires_in` in order to match
42
- # the OAuth spec (section 4.2.2)
43
- it "includes :expires_in" do
44
- expect(subject["expires_in"]).to eq("300")
45
- end
46
-
47
- it "includes :scope" do
48
- expect(subject["scope"]).to eq("two scopes")
49
- end
50
-
51
- it "includes :refresh_token" do
52
- expect(subject["refresh_token"]).to eq("some-refresh-token")
53
- end
54
-
55
- it "includes :created_at" do
56
- expect(subject["created_at"]).to eq(0)
57
- end
76
+ it "includes :scope" do
77
+ expect(subject["scope"]).to be_nil
58
78
  end
59
79
 
60
- describe ".body filters out empty values" do
61
- let(:access_token) do
62
- double :access_token,
63
- plaintext_token: "some-token",
64
- expires_in_seconds: "",
65
- scopes_string: "",
66
- plaintext_refresh_token: "",
67
- token_type: "bearer",
68
- created_at: 0
69
- end
70
-
71
- subject { TokenResponse.new(access_token).body }
72
-
73
- it "includes :expires_in" do
74
- expect(subject["expires_in"]).to be_nil
75
- end
76
-
77
- it "includes :scope" do
78
- expect(subject["scope"]).to be_nil
79
- end
80
-
81
- it "includes :refresh_token" do
82
- expect(subject["refresh_token"]).to be_nil
83
- end
80
+ it "includes :refresh_token" do
81
+ expect(subject["refresh_token"]).to be_nil
84
82
  end
85
83
  end
86
84
  end