Skip to content

Commit 3a37239

Browse files
committed
Specs for session timeout
- Tests session timeout - Tests for warning and timeout message - Tests for extend session
1 parent 834f9c5 commit 3a37239

File tree

4 files changed

+458
-3
lines changed

4 files changed

+458
-3
lines changed

app/controllers/concerns/session_timeout_data.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ def session_timeout_data
1717

1818
expires_at = if last_request_at.present?
1919
last_request_at.to_i + timeout_in_seconds
20-
else
20+
else
2121
Time.current.to_i + timeout_in_seconds
22-
end
22+
end
2323

2424
data.merge(
2525
session_timeout_expires_at_value: expires_at,

app/javascript/application.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import "@hotwired/turbo-rails";
2-
import "./controllers";
2+
import { application } from "./controllers";
3+
window.Stimulus = application;
34
import * as bootstrap from "bootstrap";
45
window.bootstrap = bootstrap; // Make Bootstrap globally available
56

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
require "rails_helper"
2+
3+
RSpec.describe "Session timeout data", type: :request do
4+
include ActiveSupport::Testing::TimeHelpers
5+
let(:user) { FactoryBot.create(:user) }
6+
let(:warning_lead_time) { Rails.application.config.session_management.warning_lead_time.to_i }
7+
8+
describe "GET /" do
9+
context "when the user is signed in" do
10+
it "exposes complete session timeout attributes" do
11+
travel_to(Time.zone.local(2024, 1, 1, 12, 0, 0)) do
12+
sign_in user
13+
14+
get root_path
15+
expect(response).to have_http_status(:ok)
16+
17+
container = Nokogiri::HTML(response.body).at_css("#flash-messages")
18+
19+
expect(container["data-controller"]).to include("session-timeout")
20+
21+
expect(container["data-session-timeout-expires-at-value"].to_i)
22+
.to eq((Time.current + Devise.timeout_in).to_i)
23+
expect(container["data-session-timeout-duration-value"].to_i)
24+
.to eq(Devise.timeout_in.to_i)
25+
expect(container["data-session-timeout-warning-offset-value"].to_i)
26+
.to eq(warning_lead_time)
27+
expect(container["data-session-timeout-keepalive-url-value"])
28+
.to eq(user_session_keepalive_path)
29+
expect(container["data-session-timeout-warning-message-value"])
30+
.to eq(I18n.t("session_timeout.warning_message"))
31+
expect(container["data-session-timeout-stay-signed-in-label-value"])
32+
.to eq(I18n.t("session_timeout.stay_signed_in"))
33+
expect(container["data-session-timeout-error-message-value"])
34+
.to eq(I18n.t("session_timeout.error_message"))
35+
expect(container["data-session-timeout-expired-message-value"])
36+
.to eq(I18n.t("session_timeout.expired_message"))
37+
end
38+
end
39+
end
40+
41+
context "when the user is signed out" do
42+
it "limits data attributes to controller registration" do
43+
get new_user_session_path
44+
expect(response).to have_http_status(:ok)
45+
46+
container = Nokogiri::HTML(response.body).at_css("#flash-messages")
47+
48+
expect(container["data-controller"]).to eq("session-timeout")
49+
expect(
50+
container.attribute_nodes.map(&:name)
51+
).to contain_exactly("id", "data-controller")
52+
end
53+
end
54+
end
55+
end

0 commit comments

Comments
 (0)