Skip to content

Commit 509a114

Browse files
rameerezclaude
andcommitted
Add tests for headless helper modules
Cover TokenSession, ExpirationOptions, and ViewHelpers to bring branch coverage above the 60% CI threshold. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 78b7637 commit 509a114

3 files changed

Lines changed: 426 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
module ApiKeys
6+
module Helpers
7+
class ExpirationOptionsTest < ApiKeys::Test
8+
test "for_select returns default options" do
9+
options = ExpirationOptions.for_select
10+
11+
assert_equal 6, options.length
12+
assert_equal ["No Expiration", "no_expiration"], options.first
13+
assert_equal ["7 days", "7_days"], options[1]
14+
assert_equal ["1 year", "365_days"], options.last
15+
end
16+
17+
test "for_select without no_expiration option" do
18+
options = ExpirationOptions.for_select(include_no_expiration: false)
19+
20+
assert_equal 5, options.length
21+
refute options.any? { |label, _| label == "No Expiration" }
22+
assert_equal ["7 days", "7_days"], options.first
23+
end
24+
25+
test "for_select with custom presets" do
26+
options = ExpirationOptions.for_select(presets: [7, 30, 365])
27+
28+
assert_equal 4, options.length # includes "No Expiration"
29+
assert_equal ["No Expiration", "no_expiration"], options.first
30+
assert_equal ["7 days", "7_days"], options[1]
31+
assert_equal ["30 days", "30_days"], options[2]
32+
assert_equal ["1 year", "365_days"], options[3]
33+
end
34+
35+
test "for_select with custom presets without no_expiration" do
36+
options = ExpirationOptions.for_select(presets: [7, 30], include_no_expiration: false)
37+
38+
assert_equal 2, options.length
39+
assert_equal ["7 days", "7_days"], options.first
40+
assert_equal ["30 days", "30_days"], options.last
41+
end
42+
43+
test "for_select generates correct label for 1 day" do
44+
options = ExpirationOptions.for_select(presets: [1])
45+
46+
assert_equal ["1 day", "1_days"], options[1]
47+
end
48+
49+
test "for_select generates correct label for multiple years" do
50+
options = ExpirationOptions.for_select(presets: [730])
51+
52+
assert_equal ["2 years", "730_days"], options[1]
53+
end
54+
55+
test "parse returns nil for no_expiration" do
56+
result = ExpirationOptions.parse("no_expiration")
57+
58+
assert_nil result
59+
end
60+
61+
test "parse returns nil for blank value" do
62+
assert_nil ExpirationOptions.parse(nil)
63+
assert_nil ExpirationOptions.parse("")
64+
end
65+
66+
test "parse returns correct date for days preset" do
67+
freeze_time do
68+
result = ExpirationOptions.parse("30_days")
69+
70+
assert_in_delta 30.days.from_now.to_i, result.to_i, 1
71+
end
72+
end
73+
74+
test "parse handles singular day preset" do
75+
freeze_time do
76+
result = ExpirationOptions.parse("1_day")
77+
78+
assert_in_delta 1.day.from_now.to_i, result.to_i, 1
79+
end
80+
end
81+
82+
test "parse returns nil for invalid preset" do
83+
assert_nil ExpirationOptions.parse("invalid")
84+
assert_nil ExpirationOptions.parse("abc_days")
85+
assert_nil ExpirationOptions.parse("0_days")
86+
end
87+
88+
test "parse works with known presets" do
89+
freeze_time do
90+
result = ExpirationOptions.parse("365_days")
91+
92+
assert_in_delta 365.days.from_now.to_i, result.to_i, 1
93+
end
94+
end
95+
96+
test "default_value returns no_expiration" do
97+
assert_equal "no_expiration", ExpirationOptions.default_value
98+
end
99+
end
100+
end
101+
end

test/helpers/token_session_test.rb

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
module ApiKeys
6+
module Helpers
7+
class TokenSessionTest < ApiKeys::Test
8+
def setup
9+
@session = {}
10+
end
11+
12+
test "stores token from api_key object with token method" do
13+
api_key = mock("api_key")
14+
api_key.stubs(:respond_to?).with(:token).returns(true)
15+
api_key.stubs(:token).returns("sk_test_abc123")
16+
17+
result = TokenSession.store(@session, api_key)
18+
19+
assert_equal "sk_test_abc123", result
20+
assert_equal "sk_test_abc123", @session[:api_keys_new_token]
21+
end
22+
23+
test "stores token from object without token method using to_s" do
24+
result = TokenSession.store(@session, "plain_token_string")
25+
26+
assert_equal "plain_token_string", result
27+
assert_equal "plain_token_string", @session[:api_keys_new_token]
28+
end
29+
30+
test "stores token with custom session key" do
31+
api_key = mock("api_key")
32+
api_key.stubs(:respond_to?).with(:token).returns(true)
33+
api_key.stubs(:token).returns("custom_token")
34+
35+
TokenSession.store(@session, api_key, key: :my_custom_key)
36+
37+
assert_equal "custom_token", @session[:my_custom_key]
38+
assert_nil @session[:api_keys_new_token]
39+
end
40+
41+
test "retrieve_once returns and clears token" do
42+
@session[:api_keys_new_token] = "stored_token"
43+
44+
result = TokenSession.retrieve_once(@session)
45+
46+
assert_equal "stored_token", result
47+
assert_nil @session[:api_keys_new_token]
48+
end
49+
50+
test "retrieve_once returns nil when no token stored" do
51+
result = TokenSession.retrieve_once(@session)
52+
53+
assert_nil result
54+
end
55+
56+
test "retrieve_once with custom key" do
57+
@session[:my_key] = "my_token"
58+
59+
result = TokenSession.retrieve_once(@session, key: :my_key)
60+
61+
assert_equal "my_token", result
62+
assert_nil @session[:my_key]
63+
end
64+
65+
test "available? returns true when token present" do
66+
@session[:api_keys_new_token] = "some_token"
67+
68+
assert TokenSession.available?(@session)
69+
end
70+
71+
test "available? returns false when token not present" do
72+
refute TokenSession.available?(@session)
73+
end
74+
75+
test "available? returns false when token is blank" do
76+
@session[:api_keys_new_token] = ""
77+
78+
refute TokenSession.available?(@session)
79+
end
80+
81+
test "available? with custom key" do
82+
@session[:custom] = "token"
83+
84+
assert TokenSession.available?(@session, key: :custom)
85+
refute TokenSession.available?(@session, key: :other)
86+
end
87+
end
88+
end
89+
end

0 commit comments

Comments
 (0)