stormpath-sdk 1.1.5 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -0
  3. data/.ruby-gemset +0 -0
  4. data/.travis.yml +1 -0
  5. data/CHANGES.md +20 -0
  6. data/Gemfile +0 -0
  7. data/README.md +78 -2
  8. data/Rakefile +0 -0
  9. data/lib/stormpath-sdk/api_key.rb +0 -0
  10. data/lib/stormpath-sdk/auth/authentication_result.rb +0 -0
  11. data/lib/stormpath-sdk/auth/basic_authenticator.rb +0 -0
  12. data/lib/stormpath-sdk/auth/basic_login_attempt.rb +0 -0
  13. data/lib/stormpath-sdk/auth/http_basic_authentication.rb +47 -0
  14. data/lib/stormpath-sdk/auth/http_bearer_authentication.rb +27 -0
  15. data/lib/stormpath-sdk/auth/username_password_request.rb +0 -0
  16. data/lib/stormpath-sdk/cache/cache.rb +0 -0
  17. data/lib/stormpath-sdk/cache/cache_entry.rb +0 -0
  18. data/lib/stormpath-sdk/cache/cache_manager.rb +0 -0
  19. data/lib/stormpath-sdk/cache/cache_stats.rb +0 -0
  20. data/lib/stormpath-sdk/cache/disabled_cache_store.rb +0 -0
  21. data/lib/stormpath-sdk/cache/memcached_store.rb +37 -0
  22. data/lib/stormpath-sdk/cache/memory_store.rb +0 -0
  23. data/lib/stormpath-sdk/cache/redis_store.rb +0 -0
  24. data/lib/stormpath-sdk/client.rb +0 -0
  25. data/lib/stormpath-sdk/data_store.rb +1 -0
  26. data/lib/stormpath-sdk/error.rb +5 -5
  27. data/lib/stormpath-sdk/http/authc/sauthc1_signer.rb +0 -0
  28. data/lib/stormpath-sdk/http/http_client_request_executor.rb +2 -3
  29. data/lib/stormpath-sdk/http/request.rb +12 -10
  30. data/lib/stormpath-sdk/http/response.rb +0 -0
  31. data/lib/stormpath-sdk/http/utils.rb +8 -5
  32. data/lib/stormpath-sdk/id_site/id_site_result.rb +0 -0
  33. data/lib/stormpath-sdk/oauth/access_token_authentication_result.rb +0 -0
  34. data/lib/stormpath-sdk/oauth/authenticator.rb +2 -1
  35. data/lib/stormpath-sdk/oauth/error.rb +12 -8
  36. data/lib/stormpath-sdk/oauth/id_site_grant_request.rb +0 -0
  37. data/lib/stormpath-sdk/oauth/local_access_token_verification.rb +45 -0
  38. data/lib/stormpath-sdk/oauth/password_grant.rb +9 -7
  39. data/lib/stormpath-sdk/oauth/password_grant_request.rb +3 -2
  40. data/lib/stormpath-sdk/oauth/refresh_grant_request.rb +0 -0
  41. data/lib/stormpath-sdk/oauth/remote_access_token_verification.rb +28 -0
  42. data/lib/stormpath-sdk/oauth/social_grant.rb +27 -0
  43. data/lib/stormpath-sdk/oauth/social_grant_request.rb +14 -0
  44. data/lib/stormpath-sdk/oauth/stormpath_grant_request.rb +3 -2
  45. data/lib/stormpath-sdk/oauth/verify_access_token.rb +11 -6
  46. data/lib/stormpath-sdk/oauth/{verify_token.rb → verify_token_result.rb} +1 -1
  47. data/lib/stormpath-sdk/provider/account_access.rb +0 -0
  48. data/lib/stormpath-sdk/provider/account_request.rb +0 -0
  49. data/lib/stormpath-sdk/provider/account_resolver.rb +0 -0
  50. data/lib/stormpath-sdk/provider/account_result.rb +0 -0
  51. data/lib/stormpath-sdk/provider/facebook/facebook_provider.rb +0 -0
  52. data/lib/stormpath-sdk/provider/facebook/facebook_provider_data.rb +0 -0
  53. data/lib/stormpath-sdk/provider/github/github_provider.rb +0 -0
  54. data/lib/stormpath-sdk/provider/github/github_provider_data.rb +0 -0
  55. data/lib/stormpath-sdk/provider/google/google_provider.rb +0 -0
  56. data/lib/stormpath-sdk/provider/google/google_provider_data.rb +0 -1
  57. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider.rb +0 -0
  58. data/lib/stormpath-sdk/provider/linkedin/linkedin_provider_data.rb +0 -0
  59. data/lib/stormpath-sdk/provider/provider.rb +0 -0
  60. data/lib/stormpath-sdk/provider/provider_data.rb +0 -0
  61. data/lib/stormpath-sdk/provider/saml/saml_mapping_rules.rb +0 -0
  62. data/lib/stormpath-sdk/provider/saml/saml_provider.rb +0 -0
  63. data/lib/stormpath-sdk/provider/saml/saml_provider_data.rb +0 -0
  64. data/lib/stormpath-sdk/provider/saml/saml_provider_metadata.rb +0 -0
  65. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider.rb +0 -0
  66. data/lib/stormpath-sdk/provider/stormpath/stormpath_provider_data.rb +0 -0
  67. data/lib/stormpath-sdk/resource/access_token.rb +0 -0
  68. data/lib/stormpath-sdk/resource/account_creation_policy.rb +3 -1
  69. data/lib/stormpath-sdk/resource/account_membership.rb +0 -0
  70. data/lib/stormpath-sdk/resource/account_overrides.rb +0 -0
  71. data/lib/stormpath-sdk/resource/account_store.rb +7 -8
  72. data/lib/stormpath-sdk/resource/account_store_mapping.rb +0 -0
  73. data/lib/stormpath-sdk/resource/application.rb +5 -5
  74. data/lib/stormpath-sdk/resource/base.rb +0 -0
  75. data/lib/stormpath-sdk/resource/collection.rb +0 -0
  76. data/lib/stormpath-sdk/resource/custom_data.rb +0 -0
  77. data/lib/stormpath-sdk/resource/custom_data_hash_methods.rb +0 -0
  78. data/lib/stormpath-sdk/resource/custom_data_storage.rb +0 -0
  79. data/lib/stormpath-sdk/resource/directory.rb +1 -0
  80. data/lib/stormpath-sdk/resource/email_template.rb +0 -0
  81. data/lib/stormpath-sdk/resource/email_verification_token.rb +0 -0
  82. data/lib/stormpath-sdk/resource/error.rb +2 -3
  83. data/lib/stormpath-sdk/resource/expansion.rb +0 -0
  84. data/lib/stormpath-sdk/resource/group.rb +0 -0
  85. data/lib/stormpath-sdk/resource/group_membership.rb +0 -0
  86. data/lib/stormpath-sdk/resource/instance.rb +0 -0
  87. data/lib/stormpath-sdk/resource/oauth_policy.rb +0 -0
  88. data/lib/stormpath-sdk/resource/organization.rb +1 -1
  89. data/lib/stormpath-sdk/resource/organization_account_store_mapping.rb +0 -0
  90. data/lib/stormpath-sdk/resource/password_policy.rb +0 -0
  91. data/lib/stormpath-sdk/resource/password_reset_token.rb +0 -0
  92. data/lib/stormpath-sdk/resource/password_strength.rb +0 -0
  93. data/lib/stormpath-sdk/resource/refresh_token.rb +0 -0
  94. data/lib/stormpath-sdk/resource/tenant.rb +0 -0
  95. data/lib/stormpath-sdk/resource/utils.rb +0 -0
  96. data/lib/stormpath-sdk/resource/verification_email.rb +0 -0
  97. data/lib/stormpath-sdk/util/assert.rb +0 -0
  98. data/lib/stormpath-sdk/util/uri_builder.rb +38 -0
  99. data/lib/stormpath-sdk/version.rb +2 -2
  100. data/lib/stormpath-sdk.rb +47 -39
  101. data/spec/api_key_spec.rb +0 -0
  102. data/spec/auth/basic_authenticator_spec.rb +0 -0
  103. data/spec/auth/http_basic_authentication_spec.rb +86 -0
  104. data/spec/auth/http_bearer_authentication_spec.rb +86 -0
  105. data/spec/auth/sauthc1_signer_spec.rb +0 -0
  106. data/spec/cache/cache_entry_spec.rb +0 -0
  107. data/spec/cache/cache_spec.rb +0 -0
  108. data/spec/cache/cache_stats_spec.rb +0 -0
  109. data/spec/client_spec.rb +0 -0
  110. data/spec/data_store_spec.rb +40 -16
  111. data/spec/fixtures/response/create_saml_directory.json +0 -0
  112. data/spec/fixtures/response/create_saml_directory_mapping_rules.json +0 -0
  113. data/spec/fixtures/response/get_saml_directory_provider.json +0 -0
  114. data/spec/fixtures/response/get_saml_directory_provider_metadata.json +0 -0
  115. data/spec/oauth/access_token_authentication_result_spec.rb +8 -0
  116. data/spec/provider/account_resolver_spec.rb +0 -0
  117. data/spec/provider/provider_spec.rb +0 -0
  118. data/spec/resource/account_creation_policy_spec.rb +125 -2
  119. data/spec/resource/account_store_mapping_spec.rb +0 -0
  120. data/spec/resource/account_store_spec.rb +40 -13
  121. data/spec/resource/application_spec.rb +268 -51
  122. data/spec/resource/base_spec.rb +0 -0
  123. data/spec/resource/collection_spec.rb +60 -2
  124. data/spec/resource/custom_data_spec.rb +0 -0
  125. data/spec/resource/directory_spec.rb +82 -1
  126. data/spec/resource/email_template_spec.rb +0 -0
  127. data/spec/resource/expansion_spec.rb +0 -0
  128. data/spec/resource/group_membership_spec.rb +0 -0
  129. data/spec/resource/group_spec.rb +0 -0
  130. data/spec/resource/organization_spec.rb +37 -8
  131. data/spec/resource/password_policy_spec.rb +0 -0
  132. data/spec/resource/password_strength_spec.rb +0 -0
  133. data/spec/resource/status_spec.rb +0 -0
  134. data/spec/resource/tenant_spec.rb +0 -0
  135. data/spec/spec_helper.rb +5 -6
  136. data/spec/support/custom_data_storage_behavior.rb +0 -0
  137. data/spec/support/mocked_provider_accounts.rb +129 -117
  138. data/spec/support/resource_factory.rb +0 -0
  139. data/spec/support/resource_matchers.rb +7 -0
  140. data/spec/support/test_cache_stores.rb +0 -0
  141. data/spec/support/test_request_executor.rb +0 -0
  142. data/spec/util/uri_builder_spec.rb +47 -0
  143. data/stormpath-sdk.gemspec +1 -0
  144. data/support/api.rb +0 -0
  145. metadata +29 -4
@@ -54,13 +54,13 @@ describe Stormpath::Resource::Application, :vcr do
54
54
  credentialed_uri.to_s
55
55
  end
56
56
 
57
- it "raises a LoadError with an invalid url" do
58
- expect {
57
+ it 'raises a LoadError with an invalid url' do
58
+ expect do
59
59
  Stormpath::Resource::Application.load 'this is an invalid url'
60
- }.to raise_error(Stormpath::Resource::Application::LoadError)
60
+ end.to raise_error(Stormpath::Resource::Application::LoadError)
61
61
  end
62
62
 
63
- it "instantiates client and application objects from a composite URL" do
63
+ it 'instantiates client and application objects from a composite URL' do
64
64
  loaded_application = Stormpath::Resource::Application.load(url)
65
65
  expect(loaded_application).to eq(application)
66
66
  end
@@ -761,9 +761,21 @@ describe Stormpath::Resource::Application, :vcr do
761
761
  account.delete if account
762
762
  end
763
763
 
764
- it 'retrieves the account with the reset password' do
765
- expect(reset_password_account).to be
766
- expect(reset_password_account.email).to eq(account.email)
764
+ context 'with decoded password reset token' do
765
+ it 'retrieves the account with the reset password' do
766
+ expect(reset_password_account).to be
767
+ expect(reset_password_account.email).to eq(account.email)
768
+ end
769
+ end
770
+
771
+ context 'with encoded password reset token' do
772
+ let(:password_reset_token) do
773
+ URI.encode(application.password_reset_tokens.create(email: account.email).token, '.')
774
+ end
775
+ it 'retrieves the account with the reset password' do
776
+ expect(reset_password_account).to be
777
+ expect(reset_password_account.email).to eq(account.email)
778
+ end
767
779
  end
768
780
 
769
781
  context 'and if the password is changed' do
@@ -1041,44 +1053,130 @@ describe Stormpath::Resource::Application, :vcr do
1041
1053
 
1042
1054
  before { account }
1043
1055
 
1044
- context 'generate access token' do
1056
+ context 'generate access token from password grant request' do
1045
1057
  let(:password_grant_request) { Stormpath::Oauth::PasswordGrantRequest.new account_data[:email], account_data[:password] }
1046
1058
  let(:authenticate_oauth) { application.authenticate_oauth(password_grant_request) }
1047
1059
 
1048
- it 'should return access token response' do
1049
- expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1060
+ context 'without organization_name_key' do
1061
+ it 'should return access token response' do
1062
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1063
+ end
1064
+
1065
+ it 'response should contain token data' do
1066
+ expect(authenticate_oauth.access_token).not_to be_empty
1067
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1068
+ expect(authenticate_oauth.token_type).not_to be_empty
1069
+ expect(authenticate_oauth.expires_in).not_to be_nil
1070
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1071
+ end
1050
1072
  end
1051
1073
 
1052
- it 'response should contain token data' do
1053
- expect(authenticate_oauth.access_token).not_to be_empty
1054
- expect(authenticate_oauth.refresh_token).not_to be_empty
1055
- expect(authenticate_oauth.token_type).not_to be_empty
1056
- expect(authenticate_oauth.expires_in).not_to be_nil
1057
- expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1074
+ context 'with the organization name key' do
1075
+ let!(:organization) do
1076
+ test_api_client.organizations.create name: 'rspec-test-org', name_key: 'rspec-test-org'
1077
+ end
1078
+ let(:account_directory) do
1079
+ test_api_client.directories.create(
1080
+ name: 'rspec-directory'
1081
+ )
1082
+ end
1083
+ let(:reloaded_account_directory) do
1084
+ test_api_client.directories.get(account_directory.href)
1085
+ end
1086
+ let(:password_grant_request) do
1087
+ Stormpath::Oauth::PasswordGrantRequest.new(account_data[:email],
1088
+ account_data[:password],
1089
+ organization_name_key: 'rspec-test-org')
1090
+ end
1091
+
1092
+ after do
1093
+ organization.delete
1094
+ reloaded_account_directory.delete
1095
+ end
1096
+
1097
+ before do
1098
+ test_api_client.account_store_mappings.create(
1099
+ application: application,
1100
+ account_store: organization
1101
+ )
1102
+
1103
+ test_api_client.organization_account_store_mappings.create(
1104
+ account_store: { href: account_directory.href },
1105
+ organization: { href: organization.href }
1106
+ )
1107
+
1108
+ account_directory.accounts.create account_data
1109
+ end
1110
+
1111
+ it 'should return access token response' do
1112
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1113
+ end
1114
+
1115
+ it 'response should contain token data' do
1116
+ expect(authenticate_oauth.access_token).not_to be_empty
1117
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1118
+ expect(authenticate_oauth.token_type).not_to be_empty
1119
+ expect(authenticate_oauth.expires_in).not_to be_nil
1120
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1121
+ end
1122
+
1123
+ it 'access and refresh token should contain org in payload' do
1124
+ jw_access = JWT.decode(authenticate_oauth.access_token, test_api_client.data_store.api_key.secret)
1125
+ jw_refresh = JWT.decode(authenticate_oauth.refresh_token, test_api_client.data_store.api_key.secret)
1126
+ expect(jw_access.first).to include('org')
1127
+ expect(jw_refresh.first).to include('org')
1128
+ end
1058
1129
  end
1059
1130
  end
1060
1131
 
1061
- context 'generate access token from stormpath_request' do
1062
- let(:stormpath_grant_request) do
1063
- Stormpath::Oauth::StormpathGrantRequest.new(
1064
- account,
1065
- application,
1066
- test_api_client.data_store.api_key
1067
- )
1068
- end
1132
+ context 'generate access token from stormpath_token grant request' do
1133
+ context 'where status authenticated' do
1134
+ let(:stormpath_grant_request) do
1135
+ Stormpath::Oauth::StormpathGrantRequest.new(
1136
+ account,
1137
+ application,
1138
+ test_api_client.data_store.api_key
1139
+ )
1140
+ end
1069
1141
 
1070
- let(:authenticate_oauth) { application.authenticate_oauth(stormpath_grant_request) }
1142
+ let(:authenticate_oauth) { application.authenticate_oauth(stormpath_grant_request) }
1071
1143
 
1072
- it 'should return access token response' do
1073
- expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1144
+ it 'should return access token response' do
1145
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1146
+ end
1147
+
1148
+ it 'response should contain token data' do
1149
+ expect(authenticate_oauth.access_token).not_to be_empty
1150
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1151
+ expect(authenticate_oauth.token_type).not_to be_empty
1152
+ expect(authenticate_oauth.expires_in).not_to be_nil
1153
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1154
+ end
1074
1155
  end
1075
1156
 
1076
- it 'response should contain token data' do
1077
- expect(authenticate_oauth.access_token).not_to be_empty
1078
- expect(authenticate_oauth.refresh_token).not_to be_empty
1079
- expect(authenticate_oauth.token_type).not_to be_empty
1080
- expect(authenticate_oauth.expires_in).not_to be_nil
1081
- expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1157
+ context 'where status registered' do
1158
+ let(:stormpath_grant_request) do
1159
+ Stormpath::Oauth::StormpathGrantRequest.new(
1160
+ account,
1161
+ application,
1162
+ test_api_client.data_store.api_key,
1163
+ :registered
1164
+ )
1165
+ end
1166
+
1167
+ let(:authenticate_oauth) { application.authenticate_oauth(stormpath_grant_request) }
1168
+
1169
+ it 'should return access token response' do
1170
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1171
+ end
1172
+
1173
+ it 'response should contain token data' do
1174
+ expect(authenticate_oauth.access_token).not_to be_empty
1175
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1176
+ expect(authenticate_oauth.token_type).not_to be_empty
1177
+ expect(authenticate_oauth.expires_in).not_to be_nil
1178
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1179
+ end
1082
1180
  end
1083
1181
  end
1084
1182
 
@@ -1100,13 +1198,112 @@ describe Stormpath::Resource::Application, :vcr do
1100
1198
 
1101
1199
  it 'response should contain token data' do
1102
1200
  expect(authenticate_oauth.access_token).not_to be_empty
1103
- expect(authenticate_oauth.refresh_token).not_to be_empty
1104
1201
  expect(authenticate_oauth.token_type).not_to be_empty
1105
1202
  expect(authenticate_oauth.expires_in).not_to be_nil
1106
1203
  expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1107
1204
  end
1108
1205
  end
1109
1206
 
1207
+ context 'generate access token from stormpath_social grant request' do
1208
+ let(:authenticate_oauth) { application.authenticate_oauth(social_grant_request) }
1209
+
1210
+ context 'google' do
1211
+ let(:code) { '4/WByqYc1UOvcYluBOsFyFbm8_BIZHbjklC5iEz7AdXcA' }
1212
+ let(:social_grant_request) do
1213
+ Stormpath::Oauth::SocialGrantRequest.new(:google, code: code)
1214
+ end
1215
+ before do
1216
+ stub_request(:post,
1217
+ "https://#{test_api_key_id}:#{test_api_key_secret}@api.stormpath.com/v1/applications/#{application.href.split('/').last}/oauth/token")
1218
+ .to_return(body: Stormpath::Test.mocked_social_grant_response)
1219
+ end
1220
+
1221
+ it 'should return access token response' do
1222
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1223
+ end
1224
+
1225
+ it 'response should contain token data' do
1226
+ expect(authenticate_oauth.access_token).not_to be_empty
1227
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1228
+ expect(authenticate_oauth.token_type).not_to be_empty
1229
+ expect(authenticate_oauth.expires_in).not_to be_nil
1230
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1231
+ end
1232
+ end
1233
+
1234
+ context 'linkedin' do
1235
+ let(:code) { '4/WByqYc1UOvcYluBOsFyFbm8_BIZHbjklC5iEz7AdXcA' }
1236
+ let(:social_grant_request) do
1237
+ Stormpath::Oauth::SocialGrantRequest.new(:linkedin, code: code)
1238
+ end
1239
+ before do
1240
+ stub_request(:post,
1241
+ "https://#{test_api_key_id}:#{test_api_key_secret}@api.stormpath.com/v1/applications/#{application.href.split('/').last}/oauth/token")
1242
+ .to_return(body: Stormpath::Test.mocked_social_grant_response)
1243
+ end
1244
+
1245
+ it 'should return access token response' do
1246
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1247
+ end
1248
+
1249
+ it 'response should contain token data' do
1250
+ expect(authenticate_oauth.access_token).not_to be_empty
1251
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1252
+ expect(authenticate_oauth.token_type).not_to be_empty
1253
+ expect(authenticate_oauth.expires_in).not_to be_nil
1254
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1255
+ end
1256
+ end
1257
+
1258
+ context 'facebook' do
1259
+ let(:access_token) { '4/WByqYc1UOvcYluBOsFyFbm8_BIZHbjklC5iEz7AdXcA' }
1260
+ let(:social_grant_request) do
1261
+ Stormpath::Oauth::SocialGrantRequest.new(:google, access_token: access_token)
1262
+ end
1263
+ before do
1264
+ stub_request(:post,
1265
+ "https://#{test_api_key_id}:#{test_api_key_secret}@api.stormpath.com/v1/applications/#{application.href.split('/').last}/oauth/token")
1266
+ .to_return(body: Stormpath::Test.mocked_social_grant_response)
1267
+ end
1268
+
1269
+ it 'should return access token response' do
1270
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1271
+ end
1272
+
1273
+ it 'response should contain token data' do
1274
+ expect(authenticate_oauth.access_token).not_to be_empty
1275
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1276
+ expect(authenticate_oauth.token_type).not_to be_empty
1277
+ expect(authenticate_oauth.expires_in).not_to be_nil
1278
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1279
+ end
1280
+ end
1281
+
1282
+ context 'github' do
1283
+ let(:access_token) { '4/WByqYc1UOvcYluBOsFyFbm8_BIZHbjklC5iEz7AdXcA' }
1284
+ let(:social_grant_request) do
1285
+ Stormpath::Oauth::SocialGrantRequest.new(:github, access_token: access_token)
1286
+ end
1287
+ before do
1288
+ stub_request(:post,
1289
+ "https://#{test_api_key_id}:#{test_api_key_secret}@api.stormpath.com/v1/applications/#{application.href.split('/').last}/oauth/token")
1290
+ .to_return(body: Stormpath::Test.mocked_social_grant_response)
1291
+ end
1292
+
1293
+ it 'should return access token response' do
1294
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::AccessTokenAuthenticationResult)
1295
+ end
1296
+
1297
+ it 'response should contain token data' do
1298
+ expect(authenticate_oauth.access_token).not_to be_empty
1299
+ expect(authenticate_oauth.refresh_token).not_to be_empty
1300
+ expect(authenticate_oauth.token_type).not_to be_empty
1301
+ expect(authenticate_oauth.expires_in).not_to be_nil
1302
+ expect(authenticate_oauth.stormpath_access_token_href).not_to be_empty
1303
+ end
1304
+ end
1305
+ end
1306
+
1110
1307
  context 'exchange id site token for access_token with invalid jwt' do
1111
1308
  let(:invalid_jwt_token) { 'invalid_token' }
1112
1309
 
@@ -1167,23 +1364,43 @@ describe Stormpath::Resource::Application, :vcr do
1167
1364
  end
1168
1365
 
1169
1366
  context 'validate access token' do
1170
- let(:access_token) { aquire_token.access_token }
1171
- let(:authenticate_oauth) { Stormpath::Oauth::VerifyAccessToken.new(application).verify(access_token) }
1172
-
1173
- it 'should return authentication result response' do
1174
- expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::VerifyToken)
1175
- end
1176
-
1177
- it 'returns success on valid token' do
1178
- expect(authenticate_oauth.href).not_to be_empty
1179
- expect(authenticate_oauth.account).to be_a(Stormpath::Resource::Account)
1180
- expect(authenticate_oauth.account).to eq(account)
1181
- expect(authenticate_oauth.application).to be_a(Stormpath::Resource::Application)
1182
- expect(authenticate_oauth.application).to eq(application)
1183
- expect(authenticate_oauth.jwt).not_to be_empty
1184
- expect(authenticate_oauth.tenant).to be_a(Stormpath::Resource::Tenant)
1185
- expect(authenticate_oauth.tenant).to eq(test_api_client.tenant)
1186
- expect(authenticate_oauth.expanded_jwt).not_to be_empty
1367
+ context 'remotely' do
1368
+ let(:access_token) { aquire_token.access_token }
1369
+ let(:authenticate_oauth) do
1370
+ Stormpath::Oauth::VerifyAccessToken.new(application).verify(access_token)
1371
+ end
1372
+
1373
+ it 'should return authentication result response' do
1374
+ expect(authenticate_oauth).to be_kind_of(Stormpath::Oauth::VerifyTokenResult)
1375
+ end
1376
+
1377
+ it 'returns success on valid token' do
1378
+ expect(authenticate_oauth.href).not_to be_empty
1379
+ expect(authenticate_oauth.account).to be_a(Stormpath::Resource::Account)
1380
+ expect(authenticate_oauth.account).to eq(account)
1381
+ expect(authenticate_oauth.application).to be_a(Stormpath::Resource::Application)
1382
+ expect(authenticate_oauth.application).to eq(application)
1383
+ expect(authenticate_oauth.jwt).not_to be_empty
1384
+ expect(authenticate_oauth.tenant).to be_a(Stormpath::Resource::Tenant)
1385
+ expect(authenticate_oauth.tenant).to eq(test_api_client.tenant)
1386
+ expect(authenticate_oauth.expanded_jwt).not_to be_empty
1387
+ end
1388
+ end
1389
+
1390
+ context 'locally' do
1391
+ let(:access_token) { aquire_token.access_token }
1392
+ let(:authenticate_oauth) do
1393
+ Stormpath::Oauth::VerifyAccessToken.new(application, local: true).verify(access_token)
1394
+ end
1395
+
1396
+ it 'should return local access token verification result' do
1397
+ expect(authenticate_oauth)
1398
+ .to be_kind_of(Stormpath::Oauth::LocalAccessTokenVerificationResult)
1399
+ end
1400
+
1401
+ it 'should return result that contains account' do
1402
+ expect(authenticate_oauth.account).to eq(account)
1403
+ end
1187
1404
  end
1188
1405
  end
1189
1406
 
File without changes
@@ -277,7 +277,7 @@ describe Stormpath::Resource::Collection, :vcr do
277
277
 
278
278
  # !@#$%^&*()_-+=?><:]}[{'
279
279
  # 'jlpicard/!@$%^*()_-+&=?><:]}[{'
280
- let(:username) { 'jlpicard/!@$%^ *()_-+=?><:]}[{' }
280
+ let(:username) { 'jlpicard/!@$%^ *()_-+=?><]}[{' }
281
281
 
282
282
  let!(:account) do
283
283
  directory.accounts.create username: username,
@@ -364,6 +364,64 @@ describe Stormpath::Resource::Collection, :vcr do
364
364
  end
365
365
  end
366
366
 
367
- end
367
+ context 'search accounts by custom data' do
368
+ let(:directory) { test_api_client.directories.create name: random_directory_name }
369
+
370
+ let(:account) do
371
+ directory.accounts.create(
372
+ username: 'jlpicard',
373
+ email: 'capt@enterprise.com',
374
+ givenName: 'Jean-Luc',
375
+ surname: 'Picard',
376
+ password: 'hakunaMatata179Enterprise'
377
+ )
378
+ end
379
+
380
+ let(:account2) do
381
+ directory.accounts.create(
382
+ username: 'jlpicard2',
383
+ email: 'capt2@enterprise.com',
384
+ givenName: 'Jean-Luc2',
385
+ surname: 'Picard2',
386
+ password: 'hakunaMatata179Enterprise'
387
+ )
388
+ end
389
+
390
+ after do
391
+ directory.delete
392
+ end
368
393
 
394
+ context 'camelCase' do
395
+ before do
396
+ account.custom_data['targetAttribute'] = 'findMe'
397
+ account2.custom_data['targetAttribute'] = 'findMe'
398
+ account.save
399
+ account2.save
400
+ end
401
+
402
+ it 'should search accounts by custom data attribute' do
403
+ expect(account.custom_data['targetAttribute']).to eq 'findMe'
404
+ expect(directory.accounts.count).to eq 2
405
+ sleep 1
406
+ expect(directory.accounts.search('customData.targetAttribute' => 'findMe').count).to eq(2)
407
+ end
408
+ end
409
+
410
+ context 'snake_case' do
411
+ before do
412
+ account.custom_data['target_attribute'] = 'findMe'
413
+ account2.custom_data['target_attribute'] = 'findMe'
414
+ account.save
415
+ account2.save
416
+ end
417
+
418
+ it 'should be able to fetch custom data attributes with snake case' do
419
+ expect(account.custom_data['target_attribute']).to eq 'findMe'
420
+ expect(directory.accounts.count).to eq 2
421
+ sleep 1
422
+ expect(directory.accounts.search('customData.target_attribute' => 'findMe').count).to eq(2)
423
+ end
424
+ end
425
+ end
426
+ end
369
427
  end
File without changes
@@ -83,7 +83,56 @@ describe Stormpath::Resource::Directory, :vcr do
83
83
  end
84
84
 
85
85
  it 'should be able to create and get a group' do
86
- expect(directory.groups.get group.href).to be
86
+ expect(directory.groups.get(group.href)).to be
87
+ end
88
+
89
+ context 'search' do
90
+ before do
91
+ directory.groups.create(name: 'US group', description: 'Described groups from United S.')
92
+ directory.groups.create(name: 'EU group', description: 'Described groups from Europe')
93
+ end
94
+
95
+ it 'should return groups by name' do
96
+ expect(directory.groups.search(name: 'US group').count).to eq 1
97
+ end
98
+
99
+ it 'should return groups by description' do
100
+ expect(directory.groups.search(description: 'Described groups from Europe').count).to eq 1
101
+ end
102
+
103
+ it 'should return groups when searching name with asterisks' do
104
+ expect(directory.groups.search(name: '*US*').count).to eq 1
105
+ end
106
+
107
+ it 'should return groups when searching description with asterisks' do
108
+ expect(directory.groups.search(description: '*groups*').count).to eq 2
109
+ end
110
+ end
111
+ end
112
+
113
+ context '#organizations' do
114
+ let(:organization) do
115
+ test_api_client.organizations.create(name: 'Test organization name',
116
+ name_key: 'test-organization-name-key')
117
+ end
118
+
119
+ let!(:organization_account_store_mappings) do
120
+ test_api_client.organization_account_store_mappings.create(
121
+ account_store: { href: directory.href },
122
+ organization: { href: organization.href }
123
+ )
124
+ end
125
+
126
+ after do
127
+ organization.delete
128
+ end
129
+
130
+ it 'should be able to get organizations' do
131
+ expect(directory.organizations).to include(organization)
132
+ end
133
+
134
+ it 'should be able to get specific organization with organization href' do
135
+ expect(directory.organizations.get(organization.href)).to eq organization
87
136
  end
88
137
  end
89
138
 
@@ -239,6 +288,38 @@ describe Stormpath::Resource::Directory, :vcr do
239
288
  end
240
289
  end
241
290
 
291
+ context "BCrypt 2A hashing algorithm" do
292
+ before do
293
+ account_store_mapping
294
+ @account = directory.accounts.create({
295
+ username: "jlucpicard",
296
+ email: "captain@enterprise.com",
297
+ given_name: "Jean-Luc",
298
+ surname: "Picard",
299
+ password: "$2a$10$sWvxHJIvkARbp.u2yBpuJeGzNvpxYQo7AYxAJwFRH0HptXSWyqvwy"
300
+ }, password_format: 'mcf')
301
+ end
302
+
303
+ it 'creates an account' do
304
+ expect(@account).to be_a Stormpath::Resource::Account
305
+ expect(@account.username).to eq("jlucpicard")
306
+ expect(@account.email).to eq("captain@enterprise.com")
307
+ expect(@account.given_name).to eq("Jean-Luc")
308
+ expect(@account.surname).to eq("Picard")
309
+ end
310
+
311
+ it 'can authenticate with the account credentials' do
312
+ auth_request = Stormpath::Authentication::UsernamePasswordRequest.new 'jlucpicard', 'NotSecure'
313
+ auth_result = application.authenticate_account auth_request
314
+
315
+ expect(auth_result).to be_a Stormpath::Authentication::AuthenticationResult
316
+ expect(auth_result.account).to be_a Stormpath::Resource::Account
317
+ expect(auth_result.account.email).to eq("captain@enterprise.com")
318
+ expect(auth_result.account.given_name).to eq("Jean-Luc")
319
+ expect(auth_result.account.surname).to eq("Picard")
320
+ end
321
+ end
322
+
242
323
  context 'with account data as hash' do
243
324
  let(:account_email) { random_email }
244
325
 
File without changes
File without changes
File without changes
File without changes
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Stormpath::Resource::Organization, :vcr do
4
4
 
5
5
  let(:organization) do
6
- test_api_client.organizations.create name: 'test_organization',
6
+ test_api_client.organizations.create name: 'test_ruby_organization',
7
7
  name_key: "testorganization", description: 'test organization'
8
8
  end
9
9
 
@@ -11,11 +11,13 @@ describe Stormpath::Resource::Organization, :vcr do
11
11
  organization.delete if organization
12
12
  end
13
13
 
14
- def create_organization_account_store_mapping(organization, account_store)
15
- test_api_client.organization_account_store_mappings.create({
14
+ def create_organization_account_store_mapping(organization, account_store, options = {})
15
+ test_api_client.organization_account_store_mappings.create(
16
16
  account_store: { href: account_store.href },
17
- organization: { href: organization.href }
18
- })
17
+ organization: { href: organization.href },
18
+ is_default_account_store: options[:default_account_store] || false,
19
+ is_default_group_store: options[:default_group_store] || false
20
+ )
19
21
  end
20
22
 
21
23
  describe "instances should respond to attribute property methods" do
@@ -93,10 +95,27 @@ describe Stormpath::Resource::Organization, :vcr do
93
95
  context 'accounts' do
94
96
  let(:directory) { test_api_client.directories.create name: random_directory_name }
95
97
 
96
- let(:account) { directory.accounts.create({ email: 'rubysdk@example.com', given_name: 'Ruby SDK', password: 'P@$$w0rd',surname: 'SDK' }) }
98
+ let(:account) do
99
+ directory.accounts.create(
100
+ email: 'rubysdk@example.com',
101
+ given_name: 'Ruby SDK',
102
+ password: 'P@$$w0rd',
103
+ surname: 'SDK'
104
+ )
105
+ end
106
+ let(:org_account) do
107
+ organization.accounts.create(
108
+ email: 'rubysdk2@example.com',
109
+ given_name: 'Ruby SDK',
110
+ password: 'P@$$w0rd',
111
+ surname: 'SDK'
112
+ )
113
+ end
97
114
 
98
115
  before do
99
- create_organization_account_store_mapping(organization, directory)
116
+ create_organization_account_store_mapping(organization,
117
+ directory,
118
+ default_account_store: true)
100
119
  end
101
120
 
102
121
  after do
@@ -104,10 +123,20 @@ describe Stormpath::Resource::Organization, :vcr do
104
123
  directory.delete if directory
105
124
  end
106
125
 
107
- it 'returns a collection of groups' do
126
+ it 'returns a collection of accounts' do
108
127
  expect(organization.accounts).to be_kind_of(Stormpath::Resource::Collection)
109
128
  expect(organization.accounts).to include(account)
110
129
  end
130
+
131
+ it 'can create another account' do
132
+ expect(org_account).to be_kind_of(Stormpath::Resource::Account)
133
+ expect(organization.accounts).to include(org_account)
134
+ end
135
+
136
+ it 'can get a specific account' do
137
+ expect(org_account).to be_kind_of(Stormpath::Resource::Account)
138
+ expect(organization.accounts.get(org_account.href)).to eq org_account
139
+ end
111
140
  end
112
141
 
113
142
  context 'tenant' do
File without changes
File without changes
File without changes
File without changes