File: commands_on_keys_test.rb

package info (click to toggle)
ruby-redis 5.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,160 kB
  • sloc: ruby: 11,445; makefile: 117; sh: 24
file content (148 lines) | stat: -rw-r--r-- 3,850 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
# frozen_string_literal: true

require "helper"

# ruby -w -Itest test/cluster_commands_on_keys_test.rb
# @see https://redis.io/commands#generic
class TestClusterCommandsOnKeys < Minitest::Test
  include Helper::Cluster

  def set_some_keys
    redis.set('key1', 'Hello')
    redis.set('key2', 'World')

    redis.set('{key}1', 'Hello')
    redis.set('{key}2', 'World')
  end

  def test_del
    set_some_keys

    assert_equal 2, redis.del('key1', 'key2')
    assert_equal 2, redis.del('{key}1', '{key}2')
  end

  def test_migrate
    redis.set('mykey', 1)

    assert_raises(Redis::CommandError, 'ERR Target instance replied with error: MOVED 14687 127.0.0.1:7002') do
      # We cannot move between cluster nodes.
      redis.migrate('mykey', host: '127.0.0.1', port: 7000)
    end

    redis_cluster_mock(migrate: ->(*_) { '-IOERR error or timeout writing to target instance' }) do |redis|
      assert_raises(Redis::CommandError, 'IOERR error or timeout writing to target instance') do
        redis.migrate('mykey', host: '127.0.0.1', port: 11_211)
      end
    end

    redis_cluster_mock(migrate: ->(*_) { '+OK' }) do |redis|
      assert_equal 'OK', redis.migrate('mykey', host: '127.0.0.1', port: 6379)
    end
  end

  def test_object
    redis.lpush('mylist', 'Hello World')
    assert_equal 1, redis.object('refcount', 'mylist')
    assert(redis.object('idletime', 'mylist') >= 0)

    redis.set('foo', 1000)
    assert_equal 'int', redis.object('encoding', 'foo')

    redis.set('bar', '1000bar')
    assert_equal 'embstr', redis.object('encoding', 'bar')
  end

  def test_randomkey
    set_some_keys
    assert_equal true, redis.randomkey.is_a?(String)
  end

  def test_rename
    set_some_keys

    assert_raises(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
      redis.rename('key1', 'key3')
    end

    assert_equal 'OK', redis.rename('{key}1', '{key}3')
  end

  def test_renamenx
    set_some_keys

    assert_raises(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
      redis.renamenx('key1', 'key2')
    end

    assert_equal false, redis.renamenx('{key}1', '{key}2')
  end

  def test_sort
    redis.lpush('mylist', 3)
    redis.lpush('mylist', 1)
    redis.lpush('mylist', 5)
    redis.lpush('mylist', 2)
    redis.lpush('mylist', 4)
    assert_equal %w[1 2 3 4 5], redis.sort('mylist')
  end

  def test_touch
    set_some_keys
    assert_equal 1, redis.touch('key1')
    assert_equal 1, redis.touch('key2')
    if version < '6'
      assert_equal 1, redis.touch('key1', 'key2')
    else
      assert_raises(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
        redis.touch('key1', 'key2')
      end
    end
    assert_equal 2, redis.touch('{key}1', '{key}2')
  end

  def test_unlink
    set_some_keys
    assert_raises(Redis::CommandError, "CROSSSLOT Keys in request don't hash to the same slot") do
      redis.unlink('key1', 'key2', 'key3')
    end
    assert_equal 2, redis.unlink('{key}1', '{key}2', '{key}3')
  end

  def test_wait
    set_some_keys
    assert_equal 3, redis.wait(1, TIMEOUT.to_i * 1000)
  end

  def test_scan
    set_some_keys

    cursor = 0
    all_keys = []
    loop do
      cursor, keys = redis.scan(cursor, match: '{key}*')
      all_keys += keys
      break if cursor == '0'
    end

    assert_equal 2, all_keys.uniq.size
  end

  def test_scan_each
    require 'securerandom'

    1000.times do |n|
      redis.set("test-#{::SecureRandom.uuid}", n)
    end

    1000.times do |n|
      redis.set("random-#{::SecureRandom.uuid}", n)
    end

    keys_result = redis.keys('test-*')
    scan_result = redis.scan_each(match: 'test-*').to_a
    assert_equal(keys_result.size, 1000)
    assert_equal(scan_result.size, 1000)
    assert_equal(scan_result.sort, keys_result.sort)
  end
end