File: test_key_regularizer.rb

package info (click to toggle)
ruby-dalli 5.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 992 kB
  • sloc: ruby: 9,447; sh: 19; makefile: 4
file content (156 lines) | stat: -rw-r--r-- 4,870 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# frozen_string_literal: true

require_relative '../helper'

describe Dalli::Protocol::Meta::KeyRegularizer do
  describe '.encode' do
    it 'returns [key, false] for simple ASCII keys' do
      key = 'simple_key_123'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert_equal key, encoded_key
      refute base64
    end

    it 'returns [key, false] for ASCII keys with special characters' do
      key = 'key:with:colons-and_underscores.and.dots'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert_equal key, encoded_key
      refute base64
    end

    it 'returns [base64, true] for keys with spaces' do
      key = 'key with spaces'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert base64
      refute_equal key, encoded_key
      # Verify it's valid base64
      decoded = encoded_key.unpack1('m0')

      assert_equal key, decoded
    end

    it 'returns [base64, true] for keys with tabs' do
      key = "key\twith\ttabs"
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert base64
      decoded = encoded_key.unpack1('m0')

      assert_equal key, decoded
    end

    it 'returns [base64, true] for keys with newlines' do
      key = "key\nwith\nnewlines"
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert base64
      decoded = encoded_key.unpack1('m0')

      assert_equal key, decoded
    end

    it 'returns [base64, true] for non-ASCII keys (Unicode)' do
      key = 'clé_française'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert base64
      decoded = encoded_key.unpack1('m0').force_encoding(Encoding::UTF_8)

      assert_equal key, decoded
    end

    it 'returns [base64, true] for emoji keys' do
      key = 'user:🎉:profile'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      assert base64
      decoded = encoded_key.unpack1('m0').force_encoding(Encoding::UTF_8)

      assert_equal key, decoded
    end

    it 'handles empty keys' do
      key = ''
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(key)

      # Empty string is ASCII-only and has no whitespace
      assert_equal '', encoded_key
      refute base64
    end
  end

  describe '.decode' do
    it 'returns key unchanged when base64_encoded is false' do
      key = 'simple_key'
      result = Dalli::Protocol::Meta::KeyRegularizer.decode(key, false)

      assert_equal key, result
    end

    it 'decodes base64 key when base64_encoded is true' do
      original_key = 'key with spaces'
      encoded_key = [original_key].pack('m0')

      result = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, true)

      assert_equal original_key, result
    end

    it 'forces UTF-8 encoding on decoded keys' do
      original_key = 'clé_française'
      encoded_key = [original_key].pack('m0')

      result = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, true)

      assert_equal Encoding::UTF_8, result.encoding
      assert_equal original_key, result
    end

    it 'handles emoji keys' do
      original_key = 'user:🚀:data'
      encoded_key = [original_key].pack('m0')

      result = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, true)

      assert_equal original_key, result
      assert_equal Encoding::UTF_8, result.encoding
    end
  end

  describe 'roundtrip' do
    it 'encode then decode returns original ASCII key' do
      original_key = 'simple_key'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(original_key)
      decoded_key = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, base64)

      assert_equal original_key, decoded_key
    end

    it 'encode then decode returns original key with whitespace' do
      original_key = "key with\twhitespace\ncharacters"
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(original_key)
      decoded_key = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, base64)

      assert_equal original_key, decoded_key
    end

    it 'encode then decode returns original Unicode key' do
      original_key = '日本語キー'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(original_key)
      decoded_key = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, base64)

      assert_equal original_key, decoded_key
    end

    it 'encode then decode returns original mixed content key' do
      original_key = 'user:日本語:profile 🎉'
      encoded_key, base64 = Dalli::Protocol::Meta::KeyRegularizer.encode(original_key)
      decoded_key = Dalli::Protocol::Meta::KeyRegularizer.decode(encoded_key, base64)

      assert_equal original_key, decoded_key
    end
  end
end