From 7d51c8e0e6ed30cf613d9c45368504d147cdfc53 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 12 Apr 2023 11:41:12 +0200 Subject: dashboard: always keep the original message in discussions It lets us always determine the discussion start date and whether the discussion was started by a bot or a human. --- dashboard/app/discussion.go | 8 +++++++- dashboard/app/discussion_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/dashboard/app/discussion.go b/dashboard/app/discussion.go index 04f0370b8..12a0392c5 100644 --- a/dashboard/app/discussion.go +++ b/dashboard/app/discussion.go @@ -174,11 +174,17 @@ func (d *Discussion) addMessages(messages []dashapi.DiscussionMessage) Discussio Time: m.Time, }) } + if len(d.Messages) == 0 { + return diff + } sort.Slice(d.Messages, func(i, j int) bool { return d.Messages[i].Time.Before(d.Messages[j].Time) }) + // Always keep the oldest message. + first := d.Messages[0] if len(d.Messages) > maxMessagesInDiscussion { - d.Messages = d.Messages[len(d.Messages)-maxMessagesInDiscussion:] + d.Messages = append([]DiscussionMessage{first}, + d.Messages[len(d.Messages)-maxMessagesInDiscussion+1:]...) } return diff } diff --git a/dashboard/app/discussion_test.go b/dashboard/app/discussion_test.go index a06ee216e..bbe87341b 100644 --- a/dashboard/app/discussion_test.go +++ b/dashboard/app/discussion_test.go @@ -5,6 +5,7 @@ package main import ( "fmt" + "reflect" "testing" "time" @@ -360,3 +361,39 @@ Hello! c.expectOK(err) client.expectEQ(len(got), 0) } + +func TestMessageOverflow(t *testing.T) { + date := time.Date(2000, time.January, 1, 1, 0, 0, 0, time.UTC) + d := &Discussion{} + first, last := dashapi.DiscussionMessage{ + ID: date.String(), + Time: date, + }, dashapi.DiscussionMessage{} + d.addMessages([]dashapi.DiscussionMessage{first}) + + const blockSize = 100 + for i := 0; i < 2*maxMessagesInDiscussion; i += blockSize { + block := []dashapi.DiscussionMessage{} + for j := 0; j < blockSize; j++ { + date = date.Add(time.Minute) + last = dashapi.DiscussionMessage{ + ID: date.String(), + Time: date, + } + block = append(block, last) + } + // Make sure that the first message always remains in place and the last one + // is the latest one. + d.addMessages(block) + if !reflect.DeepEqual(first.ID, d.Messages[0].ID) { + t.Fatalf("unexpected first messages") + } + if !reflect.DeepEqual(last.ID, d.Messages[len(d.Messages)-1].ID) { + t.Fatalf("unexpected last messages") + } + } + if len(d.Messages) != maxMessagesInDiscussion { + t.Fatalf("expected len to be equal to %d, got %d", + maxMessagesInDiscussion, len(d.Messages)) + } +} -- cgit mrf-deployment