keycloak_ruby 0.2.0 → 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: 1b7102d00536558b7b36e60884ddf78f31c675c2a16e02662fc907b234ee1913
4
- data.tar.gz: 5d354bc56a1639a26b63bb5c3699580effded5bc0601a8679c8036fa192b4e7d
3
+ metadata.gz: dab863bc25bb5a8c853b4792d3b190c473718e4435e3123150ea04cf3e7d135b
4
+ data.tar.gz: fa732b217abe15b324be2b173b740dc2e54743ee9a7a430258b603c8dfa68fc5
5
5
  SHA512:
6
- metadata.gz: 36dae08b9022816c03ba59fb3fb2c9578641743c183162a70d6f1f009c0399d9dd66fcb56174c648d4a454b26986957bce9e76cb2614f9871d1d17282ec00db1
7
- data.tar.gz: 801fa2a2d87504cda27a7cdbc39054f821734bf75ab656244e414e4982bc59ef3b2ff5117f6de4de77f9fbe8d0b8e8502436f1ca1811bc2eeadb32d8cabab7db
6
+ metadata.gz: fabda0c8e26181776ca2846b75985b84dd320aef47437f4ee6d617f3f5d58cf95454079163cbca733dab44fd392853e44f0c5c84a0a32f25763cd4373d2c78cd
7
+ data.tar.gz: 660fc8396f0456432b6722b66517a58a48768517b5f559d9741e93081eba8aa4817650a1da26c9d44ffe317071217c167ecd7b764da12547ee9a0caf957e9719
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.2.0"
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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keycloak_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Arkhipov
@@ -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