Align GoChat with Chatwoot frontend contracts
This commit is contained in:
@@ -209,12 +209,27 @@ func TestUploadHandler_WidgetActiveStorageDirectUploadFlow(t *testing.T) {
|
||||
assert.Equal(t, "visitor.png", createResp["filename"])
|
||||
directUpload := createResp["direct_upload"].(map[string]any)
|
||||
assert.Equal(t, "/api/v1/widget/direct_uploads/"+signedID, directUpload["url"])
|
||||
assert.Equal(t, map[string]any{"Content-Type": "image/png"}, directUpload["headers"])
|
||||
assert.Equal(t, "gochat_local", createResp["service_name"])
|
||||
assert.Equal(t, float64(11), createResp["byte_size"])
|
||||
assert.Equal(t, "checksum-token", createResp["checksum"])
|
||||
assert.Equal(t, true, createResp["metadata"].(map[string]any)["identified"])
|
||||
assert.NotEmpty(t, createResp["key"])
|
||||
|
||||
wPut := httptest.NewRecorder()
|
||||
reqPut, _ := http.NewRequest("PUT", directUpload["url"].(string), bytes.NewReader([]byte("hello image")))
|
||||
reqPut.Header.Set("Content-Type", "image/png")
|
||||
router.ServeHTTP(wPut, reqPut)
|
||||
require.Equal(t, http.StatusOK, wPut.Code)
|
||||
var completeResp map[string]any
|
||||
require.NoError(t, json.Unmarshal(wPut.Body.Bytes(), &completeResp))
|
||||
require.Equal(t, true, completeResp["success"])
|
||||
completeData := completeResp["data"].(map[string]any)
|
||||
assert.Equal(t, signedID, completeData["upload_uuid"])
|
||||
assert.Equal(t, "visitor.png", completeData["original_name"])
|
||||
assert.Equal(t, "image", completeData["file_type"])
|
||||
assert.Equal(t, "image/png", completeData["mime_type"])
|
||||
assert.Equal(t, float64(11), completeData["file_size"])
|
||||
|
||||
var upload model.DirectUpload
|
||||
require.NoError(t, db.Where("upload_uuid = ?", signedID).First(&upload).Error)
|
||||
@@ -286,12 +301,26 @@ func TestUploadHandler_ConversationActiveStorageDirectUploadFlow(t *testing.T) {
|
||||
assert.Equal(t, "agent-note.pdf", createResp["filename"])
|
||||
directUpload := createResp["direct_upload"].(map[string]any)
|
||||
assert.Equal(t, createPath+"/"+signedID, directUpload["url"])
|
||||
assert.Equal(t, map[string]any{"Content-Type": "application/pdf"}, directUpload["headers"])
|
||||
assert.Equal(t, "gochat_local", createResp["service_name"])
|
||||
assert.Equal(t, float64(12), createResp["byte_size"])
|
||||
assert.Equal(t, "pdf-checksum", createResp["checksum"])
|
||||
assert.NotEmpty(t, createResp["key"])
|
||||
|
||||
wPut := httptest.NewRecorder()
|
||||
reqPut, _ := http.NewRequest("PUT", directUpload["url"].(string), bytes.NewReader([]byte("hello report")))
|
||||
reqPut.Header.Set("Content-Type", "application/pdf")
|
||||
router.ServeHTTP(wPut, reqPut)
|
||||
require.Equal(t, http.StatusOK, wPut.Code)
|
||||
var completeResp map[string]any
|
||||
require.NoError(t, json.Unmarshal(wPut.Body.Bytes(), &completeResp))
|
||||
require.Equal(t, true, completeResp["success"])
|
||||
completeData := completeResp["data"].(map[string]any)
|
||||
assert.Equal(t, signedID, completeData["upload_uuid"])
|
||||
assert.Equal(t, "agent-note.pdf", completeData["original_name"])
|
||||
assert.Equal(t, "file", completeData["file_type"])
|
||||
assert.Equal(t, "application/pdf", completeData["mime_type"])
|
||||
assert.Equal(t, float64(12), completeData["file_size"])
|
||||
|
||||
var upload model.DirectUpload
|
||||
require.NoError(t, db.Where("upload_uuid = ?", signedID).First(&upload).Error)
|
||||
@@ -302,6 +331,55 @@ func TestUploadHandler_ConversationActiveStorageDirectUploadFlow(t *testing.T) {
|
||||
assert.Equal(t, []byte("hello report"), storedBytes)
|
||||
}
|
||||
|
||||
func TestUploadHandler_ConversationActiveStorageDirectUploadRejectsUnsupportedMIME(t *testing.T) {
|
||||
gin.SetMode(gin.TestMode)
|
||||
db, err := gorm.Open(sqlite.Open("file::memory:"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)})
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, db.AutoMigrate(
|
||||
&model.Account{},
|
||||
&model.Inbox{},
|
||||
&model.Contact{},
|
||||
&model.Conversation{},
|
||||
&model.DirectUpload{},
|
||||
))
|
||||
|
||||
account := &model.Account{Name: "Conversation Upload Validation Org", Status: "active"}
|
||||
require.NoError(t, db.Create(account).Error)
|
||||
inbox := &model.Inbox{AccountID: account.ID, Name: "Conversation Upload Validation Inbox", ChannelType: "web_widget", Enabled: true}
|
||||
require.NoError(t, db.Create(inbox).Error)
|
||||
contact := &model.Contact{AccountID: account.ID, Name: "Composer Validation"}
|
||||
require.NoError(t, db.Create(contact).Error)
|
||||
displayID := uint(45)
|
||||
conversation := &model.Conversation{AccountID: account.ID, InboxID: inbox.ID, ContactID: contact.ID, DisplayID: &displayID, Status: "open", ChannelType: "web_widget", Channel: "web_widget"}
|
||||
require.NoError(t, db.Create(conversation).Error)
|
||||
|
||||
uploadSvc := service.NewUploadService(repository.NewDirectUploadRepo(db), &config.Config{Storage: config.StorageConfig{LocalPath: t.TempDir(), MaxFileSize: 50 << 20}}).WithConversationRepo(repository.NewConversationRepo(db))
|
||||
router := setupUploadHandlerRouter(NewUploadHandler(uploadSvc))
|
||||
|
||||
metadataBody, err := json.Marshal(map[string]any{
|
||||
"blob": map[string]any{
|
||||
"filename": "malware.exe",
|
||||
"byte_size": 12,
|
||||
"checksum": "bad-checksum",
|
||||
"content_type": "application/x-msdownload",
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
path := "/api/v1/accounts/" + strconv.FormatUint(uint64(account.ID), 10) + "/conversations/45/direct_uploads"
|
||||
req, _ := http.NewRequest("POST", path, bytes.NewReader(metadataBody))
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
router.ServeHTTP(w, req)
|
||||
|
||||
require.Equal(t, http.StatusBadRequest, w.Code)
|
||||
var payload map[string]any
|
||||
require.NoError(t, json.Unmarshal(w.Body.Bytes(), &payload))
|
||||
assert.Equal(t, false, payload["success"])
|
||||
assert.Equal(t, "VALIDATION_ERROR", payload["error"].(map[string]any)["code"])
|
||||
assert.Contains(t, payload["error"].(map[string]any)["message"], "unsupported file type")
|
||||
}
|
||||
|
||||
func TestUploadHandler_AccountDirectUpload_NoFile(t *testing.T) {
|
||||
// Create handler with nil service — we only test validation before service call
|
||||
h := &UploadHandler{svc: nil}
|
||||
|
||||
Reference in New Issue
Block a user