Return new_topic in open message when a fresh topic is subscribed to

Associated tests
This commit is contained in:
Karmanyaah Malhotra 2023-12-17 16:59:23 -06:00
parent 9bbb1ac064
commit 0d607c7107
2 changed files with 60 additions and 3 deletions

View File

@ -1218,8 +1218,11 @@ func (s *Server) handleSubscribeHTTP(w http.ResponseWriter, r *http.Request, v *
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
createdNewTopics := false
subscriberIDs := make([]int, 0)
for _, t := range topics {
createdNewTopics = createdNewTopics || t.NeverSubscribed()
subscriberIDs = append(subscriberIDs, t.Subscribe(sub, v.MaybeUserID(), cancel))
}
defer func() {
@ -1227,7 +1230,7 @@ func (s *Server) handleSubscribeHTTP(w http.ResponseWriter, r *http.Request, v *
topics[i].Unsubscribe(subscriberID) // Order!
}
}()
if err := sub(v, newOpenMessage(topicsStr)); err != nil { // Send out open message
if err := sub(v, newOpenMessage(topicsStr, createdNewTopics)); err != nil { // Send out open message
return err
}
if err := s.sendOldMessages(topics, since, scheduled, v, sub); err != nil {
@ -1367,8 +1370,11 @@ func (s *Server) handleSubscribeWS(w http.ResponseWriter, r *http.Request, v *vi
}
return s.sendOldMessages(topics, since, scheduled, v, sub)
}
createdNewTopic := false
subscriberIDs := make([]int, 0)
for _, t := range topics {
createdNewTopic = createdNewTopic || t.NeverSubscribed()
subscriberIDs = append(subscriberIDs, t.Subscribe(sub, v.MaybeUserID(), cancel))
}
defer func() {
@ -1376,7 +1382,8 @@ func (s *Server) handleSubscribeWS(w http.ResponseWriter, r *http.Request, v *vi
topics[i].Unsubscribe(subscriberID) // Order!
}
}()
if err := sub(v, newOpenMessage(topicsStr)); err != nil { // Send out open message
if err := sub(v, newOpenMessage(topicsStr, createdNewTopic)); err != nil { // Send out open message
return err
}
if err := s.sendOldMessages(topics, since, scheduled, v, sub); err != nil {

View File

@ -136,7 +136,7 @@ func TestServer_SubscribeOpenAndKeepalive(t *testing.T) {
require.Equal(t, openEvent, messages[0].Event)
require.Equal(t, "mytopic", messages[0].Topic)
require.Equal(t, "", messages[0].Message)
require.Equal(t, "new_topic", messages[0].Message)
require.Equal(t, "", messages[0].Title)
require.Equal(t, 0, messages[0].Priority)
require.Nil(t, messages[0].Tags)
@ -147,6 +147,56 @@ func TestServer_SubscribeOpenAndKeepalive(t *testing.T) {
require.Equal(t, "", messages[1].Title)
require.Equal(t, 0, messages[1].Priority)
require.Nil(t, messages[1].Tags)
// The next time subscribing to the same topic will not result in new_topic on open
rr = httptest.NewRecorder()
ctx, cancel = context.WithCancel(context.Background())
req, err = http.NewRequestWithContext(ctx, "GET", "/mytopic/json", nil)
if err != nil {
t.Fatal(err)
}
go func() {
s.handle(rr, req)
doneChan <- true
}()
time.Sleep(300 * time.Millisecond)
cancel()
<-doneChan
messages = toMessages(t, rr.Body.String())
require.Equal(t, 1, len(messages))
require.Equal(t, openEvent, messages[0].Event)
require.Equal(t, "mytopic", messages[0].Topic)
require.Equal(t, "", messages[0].Message)
require.Equal(t, "", messages[0].Title)
require.Equal(t, 0, messages[0].Priority)
require.Nil(t, messages[0].Tags)
// Subscribing to any new topic again will result in new_topic being sent
rr = httptest.NewRecorder()
ctx, cancel = context.WithCancel(context.Background())
req, err = http.NewRequestWithContext(ctx, "GET", "/mytopic,topic2/json", nil)
if err != nil {
t.Fatal(err)
}
go func() {
s.handle(rr, req)
doneChan <- true
}()
time.Sleep(300 * time.Millisecond)
cancel()
<-doneChan
messages = toMessages(t, rr.Body.String())
require.Equal(t, 1, len(messages))
require.Equal(t, openEvent, messages[0].Event)
require.Equal(t, "mytopic,topic2", messages[0].Topic)
require.Equal(t, "new_topic", messages[0].Message)
require.Equal(t, "", messages[0].Title)
require.Equal(t, 0, messages[0].Priority)
require.Nil(t, messages[0].Tags)
}
func TestServer_PublishAndSubscribe(t *testing.T) {