@@ -143,6 +143,85 @@ func TestExpireat(t *testing.T) {
143143 }
144144}
145145
146+ func TestTouch (t * testing.T ) {
147+ s , err := Run ()
148+ ok (t , err )
149+ defer s .Close ()
150+ c , err := redis .Dial ("tcp" , s .Addr ())
151+ ok (t , err )
152+
153+ // Set something
154+ t .Run ("basic" , func (t * testing.T ) {
155+ s .SetTime (time .Unix (1234567890 , 0 ))
156+ _ , err := c .Do ("SET" , "foo" , "bar" , "EX" , 100 )
157+ ok (t , err )
158+ _ , err = c .Do ("SET" , "baz" , "qux" , "EX" , 100 )
159+ ok (t , err )
160+
161+ // Advance time, keys still exist with 1 second TTL
162+ s .FastForward (time .Second * 99 )
163+ equals (t , time .Second , s .TTL ("foo" ))
164+ equals (t , time .Second , s .TTL ("baz" ))
165+
166+ // Change TTL on a key to test that TOUCH will use the new value
167+ _ , err = c .Do ("EXPIRE" , "foo" , "200" )
168+ ok (t , err )
169+
170+ // Touch one key
171+ n , err := redis .Int (c .Do ("TOUCH" , "baz" ))
172+ ok (t , err )
173+ equals (t , 1 , n )
174+
175+ s .FastForward (time .Second * 99 )
176+ equals (t , time .Second * 101 , s .TTL ("foo" ))
177+ equals (t , time .Second , s .TTL ("baz" ))
178+
179+ // Reset TTL on multiple keys, "nay" doesn't exist
180+ n , err = redis .Int (c .Do ("TOUCH" , "foo" , "baz" , "nay" ))
181+ ok (t , err )
182+ equals (t , 2 , n )
183+
184+ equals (t , time .Second * 200 , s .TTL ("foo" ))
185+ equals (t , time .Second * 100 , s .TTL ("baz" ))
186+ })
187+
188+ t .Run ("rename" , func (t * testing.T ) {
189+ s .SetTime (time .Unix (1234567890 , 0 ))
190+ _ , err := c .Do ("SET" , "foo" , "bar" , "EX" , 100 )
191+ ok (t , err )
192+ n , err := redis .Int (c .Do ("TOUCH" , "foo" ))
193+ ok (t , err )
194+ equals (t , 1 , n )
195+
196+ s .FastForward (time .Second * 60 )
197+ equals (t , 40 * time .Second , s .TTL ("foo" ))
198+
199+ _ , err = redis .String (c .Do ("RENAME" , "foo" , "foo2" ))
200+ ok (t , err )
201+ n , err = redis .Int (c .Do ("TOUCH" , "foo2" ))
202+ ok (t , err )
203+ equals (t , 1 , n )
204+ equals (t , 100 * time .Second , s .TTL ("foo2" ))
205+ })
206+
207+ t .Run ("failure cases" , func (t * testing.T ) {
208+ _ , err := c .Do ("TOUCH" )
209+ mustFail (t , err , "ERR wrong number of arguments for 'touch' command" )
210+ })
211+
212+ t .Run ("direct" , func (t * testing.T ) {
213+ s .Set ("dir" , "bar" )
214+ s .SetTTL ("dir" , 30 * time .Second )
215+ equals (t , 30 * time .Second , s .TTL ("dir" ))
216+
217+ s .FastForward (10 * time .Second )
218+ equals (t , 20 * time .Second , s .TTL ("dir" ))
219+
220+ s .Touch ("dir" )
221+ equals (t , 30 * time .Second , s .TTL ("dir" ))
222+ })
223+ }
224+
146225func TestPexpireat (t * testing.T ) {
147226 s , err := Run ()
148227 ok (t , err )
0 commit comments