Private
Public Access
1
0

Implement beforeMessageGUID/afterMessageGUID/beforeDate

This commit is contained in:
2023-08-08 21:38:04 -07:00
parent 5c9f580dff
commit 6a0b7ca225
3 changed files with 189 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ import (
"testing"
"time"
"code.severnaya.net/kordophone-mock/v2/data"
"code.severnaya.net/kordophone-mock/v2/model"
"code.severnaya.net/kordophone-mock/v2/server"
"code.severnaya.net/kordophone-mock/v2/web"
@@ -342,3 +343,100 @@ func TestMarkConversation(t *testing.T) {
t.Fatalf("Unexpected unread count: %d (expected %d)", convo.UnreadCount, 0)
}
}
func TestMessageQueries(t *testing.T) {
s := web.NewMockHTTPServer(web.MockHTTPServerConfiguration{AuthEnabled: true})
httpServer := httptest.NewServer(s)
// Mock conversation
guid := "1234567890"
conversation := model.Conversation{
Date: time.Now(),
Participants: []string{"Alice"},
UnreadCount: 0,
Guid: guid,
}
s.Server.AddConversation(conversation)
// Mock messages
numMessages := 20
for i := 0; i < numMessages; i++ {
message := data.GenerateRandomMessage(conversation.Participants)
s.Server.AppendMessageToConversation(&conversation, message)
}
// Pick a pivot message from the sorted list
sortedMessages := s.Server.MessagesForConversation(&conversation)
pivotMessage := sortedMessages[len(sortedMessages)/2]
// Query messages before the pivot, test limit also
limitMessageCount := 5
resp, err := http.Get(httpServer.URL + fmt.Sprintf("/messages?guid=%s&beforeMessageGUID=%s&limit=%d", guid, pivotMessage.Guid, limitMessageCount))
if err != nil {
t.Fatalf("TestMessageQueries error: %s", err)
}
// Decode response
body, err := io.ReadAll(resp.Body)
if err != nil {
t.Fatalf("Error decoding body: %s", body)
}
var messages []model.Message
err = json.Unmarshal(body, &messages)
if err != nil {
t.Fatalf("Error unmarshalling JSON: %s", err)
}
if len(messages) != limitMessageCount {
t.Fatalf("Unexpected num messages: %d (expected %d)", len(messages), limitMessageCount)
}
// Make sure before query is exclusive of the pivot message
for _, message := range messages {
if message.Guid == pivotMessage.Guid {
t.Fatalf("Found pivot guid in before query: %s (expected != %s)", message.Guid, pivotMessage.Guid)
}
}
// Make sure messages are actually before the pivot
for _, message := range messages {
if message.Date.After(pivotMessage.Date) {
t.Fatalf("Unexpected message date: %s (expected before %s)", message.Date, pivotMessage.Date)
}
}
// Query messages after the pivot
resp, err = http.Get(httpServer.URL + fmt.Sprintf("/messages?guid=%s&afterMessageGUID=%s", guid, pivotMessage.Guid))
if err != nil {
t.Fatalf("TestMessageQueries error: %s", err)
}
// Decode response
body, err = io.ReadAll(resp.Body)
if err != nil {
t.Fatalf("Error decoding body: %s", body)
}
messages = []model.Message{}
err = json.Unmarshal(body, &messages)
if err != nil {
t.Fatalf("Error unmarshalling JSON: %s", err)
}
// Make sure after query is exclusive of the pivot message
for _, message := range messages {
if message.Guid == pivotMessage.Guid {
t.Fatalf("Found pivot guid in after query: %s (expected != %s)", message.Guid, pivotMessage.Guid)
}
}
// Make sure messages are actually after the pivot
for _, message := range messages {
if message.Date.Before(pivotMessage.Date) {
t.Fatalf("Unexpected message date: %s (expected after %s)", message.Date, pivotMessage.Date)
}
}
}