keycloak_ruby 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c3613ac2255b37fc0dc9b318f32934e3ffc8265441b26198e33217755a1dafe
4
- data.tar.gz: 2bbc56ed4ccffb39569f7cddd03702efbb6e54c26c06522532805dc885706b8a
3
+ metadata.gz: dab863bc25bb5a8c853b4792d3b190c473718e4435e3123150ea04cf3e7d135b
4
+ data.tar.gz: fa732b217abe15b324be2b173b740dc2e54743ee9a7a430258b603c8dfa68fc5
5
5
  SHA512:
6
- metadata.gz: 375c1300c4e61f13cd673ee478edc132fe1e3fdbd9bef38dc085837cb1ed2b41400d38201165108184d5ca820dacc29a88c32cf8f60c573b03508aebd7c22556
7
- data.tar.gz: fb8df2312ee85a520b500cee485a4c7d48c6be8563ca29ed99c80aba8fa1e23aa1d13221a484fc33a40781f879603b4ac7cc0ce2e51ac089dae84054e1f3889b
6
+ metadata.gz: fabda0c8e26181776ca2846b75985b84dd320aef47437f4ee6d617f3f5d58cf95454079163cbca733dab44fd392853e44f0c5c84a0a32f25763cd4373d2c78cd
7
+ data.tar.gz: 660fc8396f0456432b6722b66517a58a48768517b5f559d9741e93081eba8aa4817650a1da26c9d44ffe317071217c167ecd7b764da12547ee9a0caf957e9719
data/.rspec_status CHANGED
@@ -1,72 +1,72 @@
1
1
  example_id | status | run_time |
2
2
  -------------------------------------------------------- | ------ | --------------- |
3
- ./spec/keycloak_ruby/client_spec.rb[1:1:1:1] | passed | 0.01913 seconds |
4
- ./spec/keycloak_ruby/client_spec.rb[1:1:2:1] | passed | 0.00265 seconds |
5
- ./spec/keycloak_ruby/client_spec.rb[1:2:1:1] | passed | 0.01006 seconds |
6
- ./spec/keycloak_ruby/client_spec.rb[1:2:2:1] | passed | 0.00242 seconds |
7
- ./spec/keycloak_ruby/client_spec.rb[1:3:1] | passed | 0.00632 seconds |
8
- ./spec/keycloak_ruby/client_spec.rb[1:3:2] | passed | 0.00535 seconds |
9
- ./spec/keycloak_ruby/client_spec.rb[1:4:1:1] | passed | 0.00262 seconds |
10
- ./spec/keycloak_ruby/client_spec.rb[1:4:2:1] | passed | 0.01842 seconds |
11
- ./spec/keycloak_ruby/client_spec.rb[1:5:1] | passed | 0.00557 seconds |
12
- ./spec/keycloak_ruby/client_spec.rb[1:6:1:1] | passed | 0.00544 seconds |
13
- ./spec/keycloak_ruby/client_spec.rb[1:6:2:1] | passed | 0.00288 seconds |
14
- ./spec/keycloak_ruby/config_spec.rb[1:1:1:1] | passed | 0.00108 seconds |
15
- ./spec/keycloak_ruby/config_spec.rb[1:1:1:2] | passed | 0.00065 seconds |
16
- ./spec/keycloak_ruby/config_spec.rb[1:1:1:3] | passed | 0.00075 seconds |
17
- ./spec/keycloak_ruby/config_spec.rb[1:1:1:4] | passed | 0.0009 seconds |
18
- ./spec/keycloak_ruby/config_spec.rb[1:1:1:5] | passed | 0.00121 seconds |
19
- ./spec/keycloak_ruby/config_spec.rb[1:1:2:1] | passed | 0.00011 seconds |
20
- ./spec/keycloak_ruby/config_spec.rb[1:2:1] | passed | 0.00066 seconds |
21
- ./spec/keycloak_ruby/config_spec.rb[1:2:2] | passed | 0.00075 seconds |
22
- ./spec/keycloak_ruby/config_spec.rb[1:2:3] | passed | 0.00066 seconds |
23
- ./spec/keycloak_ruby/config_spec.rb[1:2:4] | passed | 0.00068 seconds |
24
- ./spec/keycloak_ruby/config_spec.rb[1:3:1] | passed | 0.00064 seconds |
25
- ./spec/keycloak_ruby/config_spec.rb[1:3:2] | passed | 0.00076 seconds |
26
- ./spec/keycloak_ruby/config_spec.rb[1:3:3] | passed | 0.00063 seconds |
27
- ./spec/keycloak_ruby/config_spec.rb[1:3:4] | passed | 0.00066 seconds |
28
- ./spec/keycloak_ruby/config_spec.rb[1:4:1:1] | passed | 0.00824 seconds |
29
- ./spec/keycloak_ruby/config_spec.rb[1:4:2:1] | passed | 0.00085 seconds |
30
- ./spec/keycloak_ruby/config_spec.rb[1:4:2:2] | passed | 0.00051 seconds |
31
- ./spec/keycloak_ruby/request_performer_spec.rb[1:1:1:1] | passed | 0.00284 seconds |
32
- ./spec/keycloak_ruby/request_performer_spec.rb[1:1:1:2] | passed | 0.00203 seconds |
33
- ./spec/keycloak_ruby/request_performer_spec.rb[1:1:2:1] | passed | 0.0014 seconds |
34
- ./spec/keycloak_ruby/request_performer_spec.rb[1:1:3:1] | passed | 0.00183 seconds |
35
- ./spec/keycloak_ruby/request_performer_spec.rb[1:1:4:1] | passed | 0.00159 seconds |
36
- ./spec/keycloak_ruby/response_validator_spec.rb[1:1:1:1] | passed | 0.00123 seconds |
37
- ./spec/keycloak_ruby/response_validator_spec.rb[1:1:2:1] | passed | 0.00044 seconds |
38
- ./spec/keycloak_ruby/response_validator_spec.rb[1:1:3:1] | passed | 0.00031 seconds |
39
- ./spec/keycloak_ruby/response_validator_spec.rb[1:1:4:1] | passed | 0.00026 seconds |
40
- ./spec/keycloak_ruby/response_validator_spec.rb[1:1:5:1] | passed | 0.00026 seconds |
41
- ./spec/keycloak_ruby/response_validator_spec.rb[1:1:6:1] | passed | 0.00027 seconds |
42
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:1:1] | passed | 0.00032 seconds |
43
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:2:1] | passed | 0.00032 seconds |
44
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:3:1] | passed | 0.00057 seconds |
45
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:4:1] | passed | 0.00022 seconds |
46
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:5:1] | passed | 0.0003 seconds |
47
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:6:1] | passed | 0.00033 seconds |
48
- ./spec/keycloak_ruby/response_validator_spec.rb[1:2:7:1] | passed | 0.00034 seconds |
49
- ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:1:1] | passed | 0.00312 seconds |
50
- ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:1:2] | passed | 0.00254 seconds |
51
- ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:2:1] | passed | 0.00276 seconds |
52
- ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:3:1] | passed | 0.00222 seconds |
53
- ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:4:1] | passed | 0.0048 seconds |
54
- ./spec/keycloak_ruby/token_service_spec.rb[1:1:1:1] | passed | 0.02224 seconds |
55
- ./spec/keycloak_ruby/token_service_spec.rb[1:1:2:1] | passed | 0.00646 seconds |
56
- ./spec/keycloak_ruby/token_service_spec.rb[1:1:2:2] | passed | 0.00622 seconds |
57
- ./spec/keycloak_ruby/token_service_spec.rb[1:2:1] | passed | 0.00386 seconds |
58
- ./spec/keycloak_ruby/token_service_spec.rb[1:2:2] | passed | 0.00404 seconds |
59
- ./spec/keycloak_ruby/token_service_spec.rb[1:2:3] | passed | 0.00342 seconds |
60
- ./spec/keycloak_ruby/token_service_spec.rb[1:3:1] | passed | 0.00334 seconds |
61
- ./spec/keycloak_ruby/token_service_spec.rb[1:3:2] | passed | 0.00429 seconds |
62
- ./spec/keycloak_ruby/token_service_spec.rb[1:3:3] | passed | 0.00358 seconds |
63
- ./spec/keycloak_ruby/token_service_spec.rb[1:4:1:1] | passed | 0.0036 seconds |
64
- ./spec/keycloak_ruby/token_service_spec.rb[1:4:2:1] | passed | 0.01022 seconds |
65
- ./spec/keycloak_ruby/token_service_spec.rb[1:4:3:1] | passed | 0.00575 seconds |
66
- ./spec/keycloak_ruby/token_service_spec.rb[1:4:3:2] | passed | 0.00674 seconds |
67
- ./spec/keycloak_ruby/token_service_spec.rb[1:5:1] | passed | 0.0074 seconds |
68
- ./spec/keycloak_ruby_spec.rb[1:1] | passed | 0.00017 seconds |
69
- ./spec/keycloak_ruby_spec.rb[1:2] | passed | 0.01625 seconds |
70
- ./spec/keycloak_ruby_spec.rb[1:3:1] | passed | 0.00067 seconds |
71
- ./spec/keycloak_ruby_spec.rb[1:3:2] | passed | 0.00086 seconds |
72
- ./spec/keycloak_ruby_spec.rb[1:3:3] | passed | 0.00016 seconds |
3
+ ./spec/keycloak_ruby/client_spec.rb[1:1:1:1] | passed | 0.03057 seconds |
4
+ ./spec/keycloak_ruby/client_spec.rb[1:1:2:1] | passed | 0.00378 seconds |
5
+ ./spec/keycloak_ruby/client_spec.rb[1:2:1:1] | passed | 0.0176 seconds |
6
+ ./spec/keycloak_ruby/client_spec.rb[1:2:2:1] | passed | 0.00341 seconds |
7
+ ./spec/keycloak_ruby/client_spec.rb[1:3:1] | passed | 0.00948 seconds |
8
+ ./spec/keycloak_ruby/client_spec.rb[1:3:2] | passed | 0.00634 seconds |
9
+ ./spec/keycloak_ruby/client_spec.rb[1:4:1:1] | passed | 0.00407 seconds |
10
+ ./spec/keycloak_ruby/client_spec.rb[1:4:2:1] | passed | 0.00431 seconds |
11
+ ./spec/keycloak_ruby/client_spec.rb[1:5:1] | passed | 0.00395 seconds |
12
+ ./spec/keycloak_ruby/client_spec.rb[1:6:1:1] | passed | 0.00534 seconds |
13
+ ./spec/keycloak_ruby/client_spec.rb[1:6:2:1] | passed | 0.00304 seconds |
14
+ ./spec/keycloak_ruby/config_spec.rb[1:1:1:1] | passed | 0.00184 seconds |
15
+ ./spec/keycloak_ruby/config_spec.rb[1:1:1:2] | passed | 0.00116 seconds |
16
+ ./spec/keycloak_ruby/config_spec.rb[1:1:1:3] | passed | 0.001 seconds |
17
+ ./spec/keycloak_ruby/config_spec.rb[1:1:1:4] | passed | 0.00088 seconds |
18
+ ./spec/keycloak_ruby/config_spec.rb[1:1:1:5] | passed | 0.00085 seconds |
19
+ ./spec/keycloak_ruby/config_spec.rb[1:1:2:1] | passed | 0.00017 seconds |
20
+ ./spec/keycloak_ruby/config_spec.rb[1:2:1] | passed | 0.00092 seconds |
21
+ ./spec/keycloak_ruby/config_spec.rb[1:2:2] | passed | 0.00108 seconds |
22
+ ./spec/keycloak_ruby/config_spec.rb[1:2:3] | passed | 0.00088 seconds |
23
+ ./spec/keycloak_ruby/config_spec.rb[1:2:4] | passed | 0.00124 seconds |
24
+ ./spec/keycloak_ruby/config_spec.rb[1:3:1] | passed | 0.00112 seconds |
25
+ ./spec/keycloak_ruby/config_spec.rb[1:3:2] | passed | 0.00091 seconds |
26
+ ./spec/keycloak_ruby/config_spec.rb[1:3:3] | passed | 0.00105 seconds |
27
+ ./spec/keycloak_ruby/config_spec.rb[1:3:4] | passed | 0.00101 seconds |
28
+ ./spec/keycloak_ruby/config_spec.rb[1:4:1:1] | passed | 0.01082 seconds |
29
+ ./spec/keycloak_ruby/config_spec.rb[1:4:2:1] | passed | 0.00115 seconds |
30
+ ./spec/keycloak_ruby/config_spec.rb[1:4:2:2] | passed | 0.00074 seconds |
31
+ ./spec/keycloak_ruby/request_performer_spec.rb[1:1:1:1] | passed | 0.00291 seconds |
32
+ ./spec/keycloak_ruby/request_performer_spec.rb[1:1:1:2] | passed | 0.00276 seconds |
33
+ ./spec/keycloak_ruby/request_performer_spec.rb[1:1:2:1] | passed | 0.00239 seconds |
34
+ ./spec/keycloak_ruby/request_performer_spec.rb[1:1:3:1] | passed | 0.00193 seconds |
35
+ ./spec/keycloak_ruby/request_performer_spec.rb[1:1:4:1] | passed | 0.00157 seconds |
36
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:1:1:1] | passed | 0.00197 seconds |
37
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:1:2:1] | passed | 0.00049 seconds |
38
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:1:3:1] | passed | 0.00044 seconds |
39
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:1:4:1] | passed | 0.00034 seconds |
40
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:1:5:1] | passed | 0.00029 seconds |
41
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:1:6:1] | passed | 0.00034 seconds |
42
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:1:1] | passed | 0.00038 seconds |
43
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:2:1] | passed | 0.00059 seconds |
44
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:3:1] | passed | 0.00074 seconds |
45
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:4:1] | passed | 0.00063 seconds |
46
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:5:1] | passed | 0.00041 seconds |
47
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:6:1] | passed | 0.0005 seconds |
48
+ ./spec/keycloak_ruby/response_validator_spec.rb[1:2:7:1] | passed | 0.00039 seconds |
49
+ ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:1:1] | passed | 0.00258 seconds |
50
+ ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:1:2] | passed | 0.00224 seconds |
51
+ ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:2:1] | passed | 0.00266 seconds |
52
+ ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:3:1] | passed | 0.00154 seconds |
53
+ ./spec/keycloak_ruby/token_refresher_spec.rb[1:1:4:1] | passed | 0.00271 seconds |
54
+ ./spec/keycloak_ruby/token_service_spec.rb[1:1:1:1] | passed | 0.02588 seconds |
55
+ ./spec/keycloak_ruby/token_service_spec.rb[1:1:2:1] | passed | 0.00342 seconds |
56
+ ./spec/keycloak_ruby/token_service_spec.rb[1:1:2:2] | passed | 0.00475 seconds |
57
+ ./spec/keycloak_ruby/token_service_spec.rb[1:2:1] | passed | 0.00169 seconds |
58
+ ./spec/keycloak_ruby/token_service_spec.rb[1:2:2] | passed | 0.00118 seconds |
59
+ ./spec/keycloak_ruby/token_service_spec.rb[1:2:3] | passed | 0.00112 seconds |
60
+ ./spec/keycloak_ruby/token_service_spec.rb[1:3:1] | passed | 0.00128 seconds |
61
+ ./spec/keycloak_ruby/token_service_spec.rb[1:3:2] | passed | 0.0018 seconds |
62
+ ./spec/keycloak_ruby/token_service_spec.rb[1:3:3] | passed | 0.00148 seconds |
63
+ ./spec/keycloak_ruby/token_service_spec.rb[1:4:1:1] | passed | 0.00153 seconds |
64
+ ./spec/keycloak_ruby/token_service_spec.rb[1:4:2:1] | passed | 0.0025 seconds |
65
+ ./spec/keycloak_ruby/token_service_spec.rb[1:4:3:1] | passed | 0.00231 seconds |
66
+ ./spec/keycloak_ruby/token_service_spec.rb[1:4:3:2] | passed | 0.002 seconds |
67
+ ./spec/keycloak_ruby/token_service_spec.rb[1:5:1] | passed | 0.00245 seconds |
68
+ ./spec/keycloak_ruby_spec.rb[1:1] | passed | 0.00018 seconds |
69
+ ./spec/keycloak_ruby_spec.rb[1:2] | passed | 0.02629 seconds |
70
+ ./spec/keycloak_ruby_spec.rb[1:3:1] | passed | 0.00116 seconds |
71
+ ./spec/keycloak_ruby_spec.rb[1:3:2] | passed | 0.00102 seconds |
72
+ ./spec/keycloak_ruby_spec.rb[1:3:3] | passed | 0.00038 seconds |
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-3.4.1
1
+ ruby-4.0.1
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.0] - 2026-01-13
4
+
5
+ - Require Ruby >= 3.4
6
+
3
7
  ## [0.1.0] - 2025-04-03
4
8
 
5
9
  - Initial release
data/README.md CHANGED
@@ -181,3 +181,36 @@ For test purpose there mock helper sign_in(user)
181
181
 
182
182
  - add `require "keycloak_ruby/testing/keycloak_helpers"` to keycloak_helper.rb
183
183
  - add sign_in in tests `config.include KeycloakRuby::Testing::KeycloakHelpers`
184
+
185
+ ### Fast test login
186
+
187
+ По умолчанию `sign_in` в браузерных тестах (`:feature` / `:system`) проходит полный цикл через OmniAuth.
188
+ Чтобы ускорить тесты, можно включить быстрый логин через Rack-middleware — он записывает фейковые токены
189
+ прямо в сессию, минуя OmniAuth и Keycloak.
190
+
191
+ Добавьте в `config/keycloak.yml`:
192
+
193
+ ```yaml
194
+ test:
195
+ fast_test_login: true
196
+ # ... остальные параметры
197
+ ```
198
+
199
+ После этого `sign_in(user)` в feature/system тестах будет использовать middleware вместо полного входа.
200
+
201
+ Если в отдельном тесте нужно проверить сам логин (flash-сообщения, редиректы и т.д.),
202
+ используйте `full_sign_in(user)` — он всегда проходит полный цикл через OmniAuth.
203
+
204
+ ```ruby
205
+ # Большинство тестов — быстрый вход (при fast_test_login: true)
206
+ sign_in(user)
207
+
208
+ # Тесты, проверяющие логин
209
+ full_sign_in(user)
210
+ ```
211
+
212
+ | Тип теста | `sign_in` (fast_test_login: true) | `sign_in` (fast_test_login: false) | `full_sign_in` |
213
+ |---|---|---|---|
214
+ | `:feature` / `:system` | Middleware — сессия напрямую | OmniAuth mock → visit /login → клик | OmniAuth mock → visit /login → клик |
215
+ | `:request` | `mock_token_service` | `mock_token_service` | `mock_token_service` |
216
+ | `:controller` и др. | `mock_token_service` | `mock_token_service` | `mock_keycloak_login` без Capybara |
@@ -50,7 +50,8 @@ module KeycloakRuby
50
50
  :admin_client_id,
51
51
  :admin_client_secret,
52
52
  :oauth_client_id,
53
- :oauth_client_secret
53
+ :oauth_client_secret,
54
+ :fast_test_login
54
55
 
55
56
  attr_reader :config_path
56
57
 
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KeycloakRuby
4
+ # Подключает middleware для быстрого логина в тестах.
5
+ # Включается только если в конфиге стоит fast_test_login: true
6
+ class Railtie < ::Rails::Railtie
7
+ initializer "keycloak_ruby.test_login_middleware" do |app|
8
+ if Rails.env.test? && KeycloakRuby.config.fast_test_login
9
+ require "keycloak_ruby/testing/login_middleware"
10
+ app.middleware.insert_before ActionDispatch::Flash, KeycloakRuby::Testing::LoginMiddleware
11
+ end
12
+ end
13
+ end
14
+ end
@@ -10,7 +10,6 @@ module KeycloakRuby
10
10
  :body,
11
11
  :success_codes,
12
12
  :error_class,
13
- :error_message,
14
- keyword_init: true
13
+ :error_message
15
14
  )
16
15
  end
@@ -4,16 +4,30 @@
4
4
  # :reek:UtilityFunction :reek:ControlParameter :reek:ManualDispatch :reek:BooleanParameter :reek:LongParameterList
5
5
  module KeycloakRuby
6
6
  module Testing
7
- # Helper module for tests with Keycloak
7
+ # Хелперы для тестов с Keycloak
8
8
  module KeycloakHelpers
9
- # Combines both sign-in approaches with automatic detection of test type
9
+ # Быстрый вход: если включён fast_test_login, для браузерных тестов
10
+ # устанавливает сессию через middleware без OmniAuth.
11
+ # Если флаг выключен — идёт через полный логин.
12
+ # Для остальных типов тестов — мокирует TokenService.
10
13
  def sign_in(user, test_type: auto_detect_test_type)
14
+ case test_type
15
+ when :feature, :system
16
+ fast_login_enabled? ? visit("/__test_login__/#{user.id}") : full_sign_in(user, test_type:)
17
+ else
18
+ mock_token_service(user)
19
+ end
20
+ end
21
+
22
+ # Полная процедура входа через OmniAuth для тестов, которые проверяют сам логин.
23
+ # Проходит /login → OmniAuth callback → SessionsController#create.
24
+ def full_sign_in(user, test_type: auto_detect_test_type)
11
25
  case test_type
12
26
  when :request
13
27
  mock_token_service(user)
14
28
  when :feature, :system
15
29
  mock_keycloak_login(user, use_capybara: true)
16
- else # :controller, :view, etc.
30
+ else
17
31
  mock_keycloak_login(user, use_capybara: false)
18
32
  end
19
33
  end
@@ -31,9 +45,9 @@ module KeycloakRuby
31
45
  user_data
32
46
  end
33
47
 
34
- # Delete all users from Keycloak
48
+ # Удаление всех пользователей из Keycloak
35
49
  def self.delete_all_keycloak_users
36
- users = KeycloakRuby::User.find("") # Empty search string to find all users
50
+ users = KeycloakRuby::User.find("") # Пустая строка ищем всех
37
51
  users.each do |user|
38
52
  KeycloakRuby::User.delete_by_id(user["id"])
39
53
  end
@@ -107,17 +121,21 @@ module KeycloakRuby
107
121
  :feature
108
122
  end
109
123
  end
124
+
125
+ def fast_login_enabled?
126
+ KeycloakRuby.config.fast_test_login
127
+ end
110
128
  end
111
129
  end
112
130
  end
113
- # Automatically include in common test frameworks
131
+ # Автоматическое подключение хелперов в тестовые фреймворки
114
132
  if defined?(RSpec)
115
133
  RSpec.configure do |config|
116
134
  config.include KeycloakRuby::Testing::KeycloakHelpers
117
135
  end
118
136
  elsif defined?(Minitest)
119
137
  module Minitest
120
- # Include helpers in minitest module
138
+ # Подключение хелперов в Minitest
121
139
  class Test
122
140
  include KeycloakRuby::Testing::KeycloakHelpers
123
141
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KeycloakRuby
4
+ module Testing
5
+ # Rack-middleware для быстрой аутентификации в тестах.
6
+ # Записывает токены в сессию напрямую, минуя OmniAuth и Keycloak.
7
+ #
8
+ # Подключается автоматически в test-окружении через KeycloakRuby::Railtie.
9
+ # Используется хелпером sign_in для браузерных тестов (:feature/:system).
10
+ #
11
+ # Было: visit /login → рендер HTML → клик → OmniAuth → SessionsController → редирект
12
+ # Стало: visit /__test_login__/123 → запись сессии → 200 OK
13
+ class LoginMiddleware
14
+ TEST_LOGIN_PATH = %r{\A/__test_login__/(\d+)\z}
15
+
16
+ def initialize(app)
17
+ @app = app
18
+ end
19
+
20
+ def call(env)
21
+ if (match = env["PATH_INFO"].match(TEST_LOGIN_PATH))
22
+ handle_test_login(env, match[1].to_i)
23
+ else
24
+ @app.call(env)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def handle_test_login(env, user_id)
31
+ user = ::User.find(user_id)
32
+ fill_session(env, user)
33
+ [200, { "Content-Type" => "text/plain" }, ["Logged in"]]
34
+ rescue ActiveRecord::RecordNotFound
35
+ [404, { "Content-Type" => "text/plain" }, ["Test login failed: User #{user_id} not found"]]
36
+ end
37
+
38
+ # :reek:UtilityFunction
39
+ def fill_session(env, user)
40
+ email = user.email
41
+ expired_time = 2.hours.from_now.to_i
42
+ token_payload = { "email" => email, "exp" => expired_time }
43
+
44
+ session = env["rack.session"]
45
+ session[:access_token] = JWT.encode(token_payload, nil, "none")
46
+ session[:refresh_token] = "fake-refresh-#{email}"
47
+ session[:id_token] = "fake-id-#{email}"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -6,7 +6,7 @@ module KeycloakRuby
6
6
  # Follows Semantic Versioning 2.0 (https://semver.org)
7
7
  # @example
8
8
  # KeycloakRuby::VERSION # => "0.1.3"
9
- VERSION = "0.1.4"
9
+ VERSION = "0.2.1"
10
10
 
11
11
  # Provides version information and comparison methods for the KeycloakRuby gem.
12
12
  # This module follows Semantic Versioning 2.0 guidelines.
data/lib/keycloak_ruby.rb CHANGED
@@ -11,11 +11,13 @@ require "omniauth/rails_csrf_protection/railtie" if defined?(Rails)
11
11
  loader = Zeitwerk::Loader.for_gem
12
12
  loader.ignore(
13
13
  "#{__dir__}/generators",
14
- "#{__dir__}/templates"
14
+ "#{__dir__}/templates",
15
+ "#{__dir__}/keycloak_ruby/railtie.rb"
15
16
  )
16
17
  loader.setup
17
18
 
18
19
  require "generators/keycloak_ruby/install_generator" if defined?(Rails)
20
+ require "keycloak_ruby/railtie" if defined?(Rails::Railtie)
19
21
 
20
22
  # Module for interacting with Keycloak
21
23
  module KeycloakRuby
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keycloak_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Arkhipov
8
8
  - Georgy Shcherbakov
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-11 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '8.0'
19
+ version: '8.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '8.0'
26
+ version: '8.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: httparty
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.23'
33
+ version: '0.24'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.23'
40
+ version: '0.24'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: jwt
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.10'
47
+ version: '3.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.10'
54
+ version: '3.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: omniauth
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.0.2
89
+ version: '2.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.0.2
96
+ version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: zeitwerk
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -133,11 +133,13 @@ files:
133
133
  - lib/keycloak_ruby/client.rb
134
134
  - lib/keycloak_ruby/config.rb
135
135
  - lib/keycloak_ruby/errors.rb
136
+ - lib/keycloak_ruby/railtie.rb
136
137
  - lib/keycloak_ruby/request_params.rb
137
138
  - lib/keycloak_ruby/request_performer.rb
138
139
  - lib/keycloak_ruby/response_validator.rb
139
140
  - lib/keycloak_ruby/testing.rb
140
141
  - lib/keycloak_ruby/testing/keycloak_helpers.rb
142
+ - lib/keycloak_ruby/testing/login_middleware.rb
141
143
  - lib/keycloak_ruby/token_refresher.rb
142
144
  - lib/keycloak_ruby/token_service.rb
143
145
  - lib/keycloak_ruby/user.rb
@@ -161,14 +163,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
163
  requirements:
162
164
  - - ">="
163
165
  - !ruby/object:Gem::Version
164
- version: '3.3'
166
+ version: '3.4'
165
167
  required_rubygems_version: !ruby/object:Gem::Requirement
166
168
  requirements:
167
169
  - - ">="
168
170
  - !ruby/object:Gem::Version
169
171
  version: '0'
170
172
  requirements: []
171
- rubygems_version: 3.6.2
173
+ rubygems_version: 4.0.3
172
174
  specification_version: 4
173
175
  summary: Keycloak authentication solution for Rails
174
176
  test_files: []