@@ -162,3 +162,85 @@ func TestPubSubShard(t *testing.T) {
162162 }
163163 })
164164}
165+
166+ func TestSPublish (t * testing.T ) {
167+ ctx := context .Background ()
168+
169+ srv := util .StartServer (t , map [string ]string {})
170+ defer srv .Close ()
171+ rdb := srv .NewClient ()
172+ defer func () { require .NoError (t , rdb .Close ()) }()
173+
174+ t .Run ("SPUBLISH to no subscribers" , func (t * testing.T ) {
175+ // Should return 0 when no subscribers
176+ n , err := rdb .Do (ctx , "SPUBLISH" , "mychannel" , "hello" ).Int ()
177+ require .NoError (t , err )
178+ require .EqualValues (t , 0 , n )
179+ })
180+
181+ t .Run ("SPUBLISH to one subscriber" , func (t * testing.T ) {
182+ pubsub := rdb .SSubscribe (ctx , "mychannel" )
183+ defer pubsub .Close ()
184+
185+ // Receive the subscription message
186+ receiveType (t , pubsub , & redis.Subscription {})
187+ require .EqualValues (t , 1 , receiveType (t , pubsub , & redis.Subscription {}).Count )
188+
189+ // Publish message
190+ n , err := rdb .Do (ctx , "SPUBLISH" , "mychannel" , "hello world" ).Int ()
191+ require .NoError (t , err )
192+ require .EqualValues (t , 1 , n )
193+
194+ // Receive the message
195+ msg := receiveType (t , pubsub , & redis.Message {})
196+ require .EqualValues (t , "mychannel" , msg .Channel )
197+ require .EqualValues (t , "hello world" , msg .Payload )
198+ })
199+
200+ t .Run ("SPUBLISH to multiple subscribers" , func (t * testing.T ) {
201+ channel := "testchannel{tag}"
202+
203+ pubsub1 := rdb .SSubscribe (ctx , channel )
204+ defer pubsub1 .Close ()
205+ receiveType (t , pubsub1 , & redis.Subscription {})
206+
207+ pubsub2 := rdb .SSubscribe (ctx , channel )
208+ defer pubsub2 .Close ()
209+ receiveType (t , pubsub2 , & redis.Subscription {})
210+
211+ // Publish message
212+ n , err := rdb .Do (ctx , "SPUBLISH" , channel , "message from spublish" ).Int ()
213+ require .NoError (t , err )
214+ require .EqualValues (t , 2 , n )
215+
216+ // Both subscribers should receive the message
217+ msg1 := receiveType (t , pubsub1 , & redis.Message {})
218+ require .EqualValues (t , "message from spublish" , msg1 .Payload )
219+
220+ msg2 := receiveType (t , pubsub2 , & redis.Message {})
221+ require .EqualValues (t , "message from spublish" , msg2 .Payload )
222+ })
223+
224+ t .Run ("SPUBLISH with cluster enabled" , func (t * testing.T ) {
225+ csrv := util .StartServer (t , map [string ]string {"cluster-enabled" : "yes" })
226+ defer csrv .Close ()
227+ crdb := csrv .NewClient ()
228+ defer func () { require .NoError (t , crdb .Close ()) }()
229+
230+ nodeID := "test_node_id_12345678901234567890123456789012"
231+ require .NoError (t , crdb .Do (ctx , "clusterx" , "SETNODEID" , nodeID ).Err ())
232+ clusterNodes := fmt .Sprintf ("%s %s %d master - 0-16383" , nodeID , csrv .Host (), csrv .Port ())
233+ require .NoError (t , crdb .Do (ctx , "clusterx" , "SETNODES" , clusterNodes , "1" ).Err ())
234+
235+ pubsub := crdb .SSubscribe (ctx , "mychannel{tag}" )
236+ defer pubsub .Close ()
237+ receiveType (t , pubsub , & redis.Subscription {})
238+
239+ n , err := crdb .Do (ctx , "SPUBLISH" , "mychannel{tag}" , "cluster message" ).Int ()
240+ require .NoError (t , err )
241+ require .EqualValues (t , 1 , n )
242+
243+ msg := receiveType (t , pubsub , & redis.Message {})
244+ require .EqualValues (t , "cluster message" , msg .Payload )
245+ })
246+ }
0 commit comments