File: subscriptions_test.rb

package info (click to toggle)
ruby-redis-client 0.28.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,116 kB
  • sloc: ansic: 7,517; ruby: 5,801; makefile: 246; sh: 123
file content (106 lines) | stat: -rw-r--r-- 2,939 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
# frozen_string_literal: true

require "test_helper"

class RedisClient
  class SubscriptionsTest < RedisClientTestCase
    include ClientTestHelper

    def setup
      super
      @subscription = @redis.pubsub
    end

    def test_subscribe
      assert_nil @subscription.call("SUBSCRIBE", "mychannel")

      @redis.pipelined do |pipeline|
        3.times do |i|
          pipeline.call("PUBLISH", "mychannel", "event-#{i}")
        end
      end

      events = []
      while event = @subscription.next_event
        events << event
      end

      assert_equal [
        ["subscribe", "mychannel", 1],
        ["message", "mychannel", "event-0"],
        ["message", "mychannel", "event-1"],
        ["message", "mychannel", "event-2"],
      ], events
    end

    def test_psubscribe
      assert_nil @subscription.call("PSUBSCRIBE", "my*")

      @redis.pipelined do |pipeline|
        3.times do |i|
          pipeline.call("PUBLISH", "mychannel", "event-#{i}")
        end
      end

      events = []
      while event = @subscription.next_event
        events << event
      end

      assert_equal [
        ["psubscribe", "my*", 1],
        ["pmessage", "my*", "mychannel", "event-0"],
        ["pmessage", "my*", "mychannel", "event-1"],
        ["pmessage", "my*", "mychannel", "event-2"],
      ], events
    end

    def test_connection_lost
      assert_nil @subscription.call("SUBSCRIBE", "mychannel")
      @redis.call("PUBLISH", "mychannel", "event-0")
      assert_equal ["subscribe", "mychannel", 1], @subscription.next_event
      assert_equal ["message", "mychannel", "event-0"], @subscription.next_event

      assert_nil @subscription.next_event(0.2)
      assert_nil @subscription.next_event(0.2)
    end

    def test_close
      assert_nil @subscription.call("SUBSCRIBE", "mychannel")
      @redis.pipelined do |pipeline|
        3.times do |i|
          pipeline.call("PUBLISH", "mychannel", "event-#{i}")
        end
      end

      assert_equal ["subscribe", "mychannel", 1], @subscription.next_event
      assert_equal @subscription, @subscription.close
      assert_raises ConnectionError do
        @subscription.next_event
      end
    end

    def test_next_event_timeout
      assert_nil @subscription.next_event(0.01)
    end

    def test_pubsub_with_disabled_reconnection
      @redis.send(:ensure_connected, retryable: false) do
        refute_nil @redis.pubsub
      end
    end

    def test_pubsub_timeout_retry
      assert_nil @subscription.call("SUBSCRIBE", "mychannel")
      refute_nil @subscription.next_event # subscribed event

      assert_nil @subscription.next_event(0.01)
      @redis.call("PUBLISH", "mychannel", "test")
      1.times.each do # rubocop:disable Lint/UselessTimes
        # We use 1.times.each to change the stack depth.
        # See https://github.com/redis-rb/redis-client/issues/221
        refute_nil @subscription.next_event
      end
    end
  end
end