Module: CommandTower::SpecHelper

Defined in:
lib/command_tower/spec_helper.rb

Instance Method Summary collapse

Instance Method Details

Helper to extract CSRF cookie from response



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/command_tower/spec_helper.rb', line 55

def extract_csrf_cookie(response)
  csrf_cookie_name = CommandTower.config.jwt.cookie.csrf.cookie_name
  set_cookie_header = response.headers["Set-Cookie"]
  return nil unless set_cookie_header

  # Handle both string and array (when multiple cookies are set)
  cookie_headers = set_cookie_header.is_a?(Array) ? set_cookie_header : [set_cookie_header]

  cookie_headers.each do |header|
    match = header.match(/#{csrf_cookie_name}=([^;]+)/)
    return match[1] if match
  end
  nil
end

Helper to get CSRF cookie value from request



71
72
73
74
# File 'lib/command_tower/spec_helper.rb', line 71

def get_csrf_cookie_value
  csrf_cookie_name = CommandTower.config.jwt.cookie.csrf.cookie_name
  @request.cookies[csrf_cookie_name]
end

Helper method to get login token and cookie value Uses the login service directly to avoid controller double render issues

Parameters:

  • user (User)

    The user to login

  • password (String)

    The user's password

Returns:

  • (Hash)

    Hash with :token, :cookie_value, and :cookie_header



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/command_tower/spec_helper.rb', line 24

def (user:, password:)
  # Authenticate user first
  result = CommandTower::Services::Auth::PlainText::Login.(identifier: user.username, password:)
  raise "Login failed: #{result.errors.map(&:code).join(", ")}" unless result.success?

  token = result.data[:token]
  expires_at = CommandTower.config.jwt.ttl.from_now.to_time.to_s
  cookie_name = CommandTower.config.jwt.cookie.name

  # Create a mock response to set cookie
  mock_response = ActionDispatch::TestResponse.new
  CommandTower::Jwt::AuthorizationHelper.set_token(mock_response, token, expires_at: expires_at)
  cookie_header = mock_response.headers["Set-Cookie"]
  cookie_value = cookie_header&.match(/#{cookie_name}=([^;]+)/)&.[](1)

  { token:, cookie_value:, cookie_header: }
end

#set_csrf_cookie!(token) ⇒ Object

Helper to set CSRF cookie in request



43
44
45
46
# File 'lib/command_tower/spec_helper.rb', line 43

def set_csrf_cookie!(token)
  csrf_cookie_name = CommandTower.config.jwt.cookie.csrf.cookie_name
  @request.cookies[csrf_cookie_name] = token
end

#set_csrf_header!(token) ⇒ Object

Helper to set CSRF header in request



49
50
51
52
# File 'lib/command_tower/spec_helper.rb', line 49

def set_csrf_header!(token)
  csrf_header_name = CommandTower.config.jwt.cookie.csrf.header_name
  @request.headers[csrf_header_name] = token
end

#set_jwt_token!(user:, with_reset: false, token: nil) ⇒ Object



5
6
7
8
9
10
11
12
13
# File 'lib/command_tower/spec_helper.rb', line 5

def set_jwt_token!(user:, with_reset: false, token: nil)
  if token.nil?
    result = CommandTower::Jwt::LoginCreate.(user:)
    token = result.token
  end

  @request.headers[CommandTower::ApplicationController::AUTHENTICATION_HEADER] = "Bearer #{token}"
  @request.headers[CommandTower::ApplicationController::AUTHENTICATION_WITH_RESET] = "true" if with_reset
end

#unset_jwt_token!Object



15
16
17
# File 'lib/command_tower/spec_helper.rb', line 15

def unset_jwt_token!
  @request.headers[CommandTower::ApplicationController::AUTHENTICATION_HEADER] = nil
end