From b47132fd05873cf912d5c83f336867fba80abc8c Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sun, 7 Apr 2024 21:50:08 -0700 Subject: [PATCH] attachments: handle sending messages with attachments --- web/server.go | 9 +-- web/server_test.go | 149 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 121 insertions(+), 37 deletions(-) diff --git a/web/server.go b/web/server.go index b6b4e7e..4e9cf46 100644 --- a/web/server.go +++ b/web/server.go @@ -241,10 +241,11 @@ func (m *MockHTTPServer) handleSendMessage(w http.ResponseWriter, r *http.Reques // Create Message message := model.Message{ - Guid: uuid.New().String(), - Text: sendMessageReq.Body, - Date: model.Date(time.Now()), - Sender: nil, // me + Guid: uuid.New().String(), + Text: sendMessageReq.Body, + Date: model.Date(time.Now()), + AttachmentGUIDs: sendMessageReq.TransferGUIDs, + Sender: nil, // me } // Send message diff --git a/web/server_test.go b/web/server_test.go index 2e54786..68e84e6 100644 --- a/web/server_test.go +++ b/web/server_test.go @@ -535,27 +535,7 @@ func TestMessageQueries(t *testing.T) { } -func TestSendMessage(t *testing.T) { - s := web.NewMockHTTPServer(web.MockHTTPServerConfiguration{AuthEnabled: false}) - httpServer := httptest.NewServer(s) - - // Mock conversation - guid := "1234567890" - conversation := model.Conversation{ - Date: model.Date(time.Now()), - Participants: []string{"Alice"}, - UnreadCount: 0, - Guid: guid, - } - - s.Server.AddConversation(conversation) - - request := web.SendMessageRequest{ - ConversationGUID: "1234567890", - Body: "This is a test.", - TransferGUIDs: []string{}, - } - +func trySendMessage(t *testing.T, httpServer *httptest.Server, request web.SendMessageRequest) string { // Encode as json requestJSON, err := json.Marshal(request) if err != nil { @@ -588,11 +568,38 @@ func TestSendMessage(t *testing.T) { t.Fatalf("Unexpected empty guid") } + return response.Guid +} + +func TestSendMessage(t *testing.T) { + s := web.NewMockHTTPServer(web.MockHTTPServerConfiguration{AuthEnabled: false}) + httpServer := httptest.NewServer(s) + + // Mock conversation + guid := "1234567890" + conversation := model.Conversation{ + Date: model.Date(time.Now()), + Participants: []string{"Alice"}, + UnreadCount: 0, + Guid: guid, + } + + s.Server.AddConversation(conversation) + + // Send it + request := web.SendMessageRequest{ + ConversationGUID: guid, + Body: "hello there", + TransferGUIDs: []string{}, + } + + responseGuid := trySendMessage(t, httpServer, request) + // Make sure message is present messages := s.Server.MessagesForConversation(&conversation) found := false for _, message := range messages { - if message.Guid == response.Guid { + if message.Guid == responseGuid { found = true break } @@ -603,12 +610,8 @@ func TestSendMessage(t *testing.T) { } } -func TestAttachments(t *testing.T) { - s := web.NewMockHTTPServer(web.MockHTTPServerConfiguration{AuthEnabled: false}) - httpServer := httptest.NewServer(s) - +func tryUploadAttachment(t *testing.T, testData string, httpServer *httptest.Server) string { // Send upload request - testData := "hello world!" attachmentDataReader := strings.NewReader(testData) resp, err := http.Post(httpServer.URL+"/uploadAttachment?filename=test.txt", "application/data", attachmentDataReader) if err != nil { @@ -626,13 +629,11 @@ func TestAttachments(t *testing.T) { t.Fatalf("Error decoding response: %s", err) } - guid := response.TransferGUID + return response.TransferGUID +} - // Cleanup after ourselves - defer s.Server.DeleteAttachment(guid) - - // Fetch it back - resp, err = http.Get(httpServer.URL + fmt.Sprintf("/attachment?guid=%s", guid)) +func tryFetchAttachment(t *testing.T, httpServer *httptest.Server, guid string) []byte { + resp, err := http.Get(httpServer.URL + fmt.Sprintf("/attachment?guid=%s", guid)) if err != nil { t.Fatalf("Error fetching attachment: %s", err) } @@ -642,7 +643,89 @@ func TestAttachments(t *testing.T) { t.Fatalf("Error reading attachment data: %s", err) } + return responseData +} + +func TestAttachments(t *testing.T) { + s := web.NewMockHTTPServer(web.MockHTTPServerConfiguration{AuthEnabled: false}) + httpServer := httptest.NewServer(s) + + testData := "hello world!" + guid := tryUploadAttachment(t, testData, httpServer) + + // Cleanup after ourselves + defer s.Server.DeleteAttachment(guid) + + // Fetch it back + responseData := tryFetchAttachment(t, httpServer, guid) + if string(responseData) != testData { t.Fatalf("Didn't get expected response data: %s (got %s)", testData, responseData) } } + +func TestSendMessageWithAttachment(t *testing.T) { + s := web.NewMockHTTPServer(web.MockHTTPServerConfiguration{AuthEnabled: false}) + httpServer := httptest.NewServer(s) + + // Mock conversation + conversation := model.Conversation{ + Date: model.Date(time.Now()), + Participants: []string{"Alice"}, + UnreadCount: 0, + Guid: "123456789", + } + + s.Server.AddConversation(conversation) + + testData := "attachment data" + attachmentGuid := tryUploadAttachment(t, testData, httpServer) + + messageRequest := web.SendMessageRequest{ + ConversationGUID: conversation.Guid, + Body: "", + TransferGUIDs: []string{attachmentGuid}, + } + + sentGuid := trySendMessage(t, httpServer, messageRequest) + + // See if our message has that attachment + resp, err := http.Get(httpServer.URL + "/messages?guid=" + conversation.Guid) + if err != nil { + t.Fatalf("TestMessages error: %s", err) + } + + 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) != 1 { + t.Fatalf("Unexpected num messages: %d (expected %d)", len(messages), 1) + } + + onlyMessage := messages[0] + if onlyMessage.Guid != sentGuid { + t.Fatalf("Unexpected guid: %s (expected %s)", onlyMessage.Guid, sentGuid) + } + + if len(onlyMessage.AttachmentGUIDs) != 1 { + t.Fatalf("Message returned didn't have expected attachment guids") + } + + if onlyMessage.AttachmentGUIDs[0] != attachmentGuid { + t.Fatalf("Message returned had wrong attachment guid: %s (expected %s)", onlyMessage.AttachmentGUIDs[0], attachmentGuid) + } + + // See if we get data back + fetchedData := tryFetchAttachment(t, httpServer, attachmentGuid) + if string(fetchedData) != testData { + t.Fatalf("Sent message attachment had incorrect data: %s (expected %s)", fetchedData, testData) + } +}