Skip to content

Commit ad53ab7

Browse files
committed
Add conditional guards for duplicate key detection specs based on JSON gem version support
1 parent befe5a8 commit ad53ab7

File tree

2 files changed

+54
-24
lines changed

2 files changed

+54
-24
lines changed

spec/jwt/claims/duplicate_key_spec.rb

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,20 @@ def build_jwt_with_duplicate_header(duplicate_header_json, payload_json = '{"sub
3737
end
3838

3939
context 'with raise_on_duplicate_keys!' do
40-
it 'raises DuplicateKeyError' do
40+
it 'raises DuplicateKeyError', if: JWT::JSON.supports_duplicate_key_detection? do
4141
token = JWT::EncodedToken.new(duplicate_payload_jwt)
4242
token.raise_on_duplicate_keys!
4343
expect do
4444
token.unverified_payload
4545
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
4646
end
47+
48+
it 'raises UnsupportedError', unless: JWT::JSON.supports_duplicate_key_detection? do
49+
token = JWT::EncodedToken.new(duplicate_payload_jwt)
50+
expect do
51+
token.raise_on_duplicate_keys!
52+
end.to raise_error(JWT::UnsupportedError, /JSON gem >= 2\.13\.0/)
53+
end
4754
end
4855
end
4956

@@ -58,17 +65,24 @@ def build_jwt_with_duplicate_header(duplicate_header_json, payload_json = '{"sub
5865
end
5966

6067
context 'with raise_on_duplicate_keys!' do
61-
it 'raises DuplicateKeyError for header' do
68+
it 'raises DuplicateKeyError for header', if: JWT::JSON.supports_duplicate_key_detection? do
6269
token = JWT::EncodedToken.new(duplicate_header_jwt)
6370
token.raise_on_duplicate_keys!
6471
expect do
6572
token.header
6673
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
6774
end
75+
76+
it 'raises UnsupportedError', unless: JWT::JSON.supports_duplicate_key_detection? do
77+
token = JWT::EncodedToken.new(duplicate_header_jwt)
78+
expect do
79+
token.raise_on_duplicate_keys!
80+
end.to raise_error(JWT::UnsupportedError, /JSON gem >= 2\.13\.0/)
81+
end
6882
end
6983
end
7084

71-
describe 'chaining' do
85+
describe 'chaining', if: JWT::JSON.supports_duplicate_key_detection? do
7286
let(:valid_jwt) { build_jwt_with_duplicate_payload('{"sub":"user"}') }
7387

7488
it 'returns self for method chaining' do
@@ -77,7 +91,7 @@ def build_jwt_with_duplicate_header(duplicate_header_json, payload_json = '{"sub
7791
end
7892
end
7993

80-
describe 'valid tokens' do
94+
describe 'valid tokens', if: JWT::JSON.supports_duplicate_key_detection? do
8195
let(:valid_jwt) { build_jwt_with_duplicate_payload('{"sub":"user","name":"John"}') }
8296

8397
it 'parses valid JSON without duplicates' do
@@ -92,13 +106,20 @@ def build_jwt_with_duplicate_header(duplicate_header_json, payload_json = '{"sub
92106
let(:multiple_duplicates_jwt) { build_jwt_with_duplicate_payload('{"a":1,"b":2,"a":3,"b":4}') }
93107

94108
context 'with raise_on_duplicate_keys!' do
95-
it 'raises DuplicateKeyError for the first duplicate found' do
109+
it 'raises DuplicateKeyError for the first duplicate found', if: JWT::JSON.supports_duplicate_key_detection? do
96110
token = JWT::EncodedToken.new(multiple_duplicates_jwt)
97111
token.raise_on_duplicate_keys!
98112
expect do
99113
token.unverified_payload
100114
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
101115
end
116+
117+
it 'raises UnsupportedError', unless: JWT::JSON.supports_duplicate_key_detection? do
118+
token = JWT::EncodedToken.new(multiple_duplicates_jwt)
119+
expect do
120+
token.raise_on_duplicate_keys!
121+
end.to raise_error(JWT::UnsupportedError, /JSON gem >= 2\.13\.0/)
122+
end
102123
end
103124
end
104125
end

spec/jwt/json_spec.rb

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,38 @@
2121
end
2222

2323
context 'with allow_duplicate_keys: false' do
24-
it 'raises DuplicateKeyError for duplicate keys' do
25-
expect do
26-
described_class.parse('{"a":1,"a":2}', allow_duplicate_keys: false)
27-
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
28-
end
24+
context 'when JSON gem supports duplicate key detection', if: JWT::JSON.supports_duplicate_key_detection? do
25+
it 'raises DuplicateKeyError for duplicate keys' do
26+
expect do
27+
described_class.parse('{"a":1,"a":2}', allow_duplicate_keys: false)
28+
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
29+
end
2930

30-
it 'parses valid JSON without duplicates' do
31-
result = described_class.parse('{"a":1,"b":2}', allow_duplicate_keys: false)
32-
expect(result).to eq({ 'a' => 1, 'b' => 2 })
33-
end
31+
it 'parses valid JSON without duplicates' do
32+
result = described_class.parse('{"a":1,"b":2}', allow_duplicate_keys: false)
33+
expect(result).to eq({ 'a' => 1, 'b' => 2 })
34+
end
35+
36+
it 'detects duplicates in nested objects' do
37+
json = '{"outer":{"inner":1,"inner":2}}'
38+
expect do
39+
described_class.parse(json, allow_duplicate_keys: false)
40+
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
41+
end
3442

35-
it 'detects duplicates in nested objects' do
36-
json = '{"outer":{"inner":1,"inner":2}}'
37-
expect do
38-
described_class.parse(json, allow_duplicate_keys: false)
39-
end.to raise_error(JWT::DuplicateKeyError, /duplicate key/)
43+
it 'allows same key in different objects' do
44+
json = '{"obj1":{"a":1},"obj2":{"a":2}}'
45+
result = described_class.parse(json, allow_duplicate_keys: false)
46+
expect(result['obj1']['a']).to eq(1)
47+
expect(result['obj2']['a']).to eq(2)
48+
end
4049
end
4150

42-
it 'allows same key in different objects' do
43-
json = '{"obj1":{"a":1},"obj2":{"a":2}}'
44-
result = described_class.parse(json, allow_duplicate_keys: false)
45-
expect(result['obj1']['a']).to eq(1)
46-
expect(result['obj2']['a']).to eq(2)
51+
context 'when JSON gem does not support duplicate key detection', unless: JWT::JSON.supports_duplicate_key_detection? do
52+
it 'silently allows duplicate keys (uses last value)' do
53+
result = described_class.parse('{"a":1,"a":2}', allow_duplicate_keys: false)
54+
expect(result['a']).to eq(2)
55+
end
4756
end
4857
end
4958
end

0 commit comments

Comments
 (0)