diff --git a/backend/internal/handler/api/v1/shangwutong_connector_handler_test.go b/backend/internal/handler/api/v1/shangwutong_connector_handler_test.go index 29d570f2..2820c626 100644 --- a/backend/internal/handler/api/v1/shangwutong_connector_handler_test.go +++ b/backend/internal/handler/api/v1/shangwutong_connector_handler_test.go @@ -2,6 +2,7 @@ package v1 import ( "bytes" + "context" "crypto/sha256" "encoding/hex" "encoding/json" @@ -18,6 +19,7 @@ import ( channelmodel "github.com/gochat/gochat/internal/model/channel" "github.com/gochat/gochat/internal/repository" "github.com/gochat/gochat/internal/service" + "github.com/gochat/gochat/internal/worker" "github.com/stretchr/testify/require" "gorm.io/driver/sqlite" "gorm.io/gorm" @@ -137,6 +139,21 @@ func TestShangwutongConnectorContactMetadataIsScopedAndIdempotent(t *testing.T) require.Equal(t, http.StatusOK, response.Code, response.Body.String()) require.NoError(t, db.First(ci, ci.ID).Error) require.JSONEq(t, `{"cid":"cid-1"}`, string(ci.ChannelMetadata)) + + workers := worker.NewWorkerPool(db) + dispatcher := channel.NewDispatcher(workers) + dispatcher.Register(service.NewShangwutongContactListener(db, workers)) + contacts := service.NewContactService(repository.NewContactRepo(db), nil, nil) + contacts.SetWorkerPool(workers) + _, err := contacts.Update(context.Background(), inbox.AccountID, contact.ID, service.UpdateContactRequest{Name: "Renamed"}) + require.NoError(t, err) + processed, err := workers.ProcessOne(context.Background()) + require.NoError(t, err) + require.True(t, processed) + var job model.BackgroundJob + require.NoError(t, db.Where("job_type = ?", service.TaskTypeShangwutongWebhookDelivery).First(&job).Error) + require.Contains(t, string(job.Payload), `"cid":"cid-1"`) + require.Contains(t, string(job.Payload), `"contact_name":"Renamed"`) } func setupShangwutongConnectorAPI(t *testing.T) (*gin.Engine, *gorm.DB, string, *model.Inbox, *model.Inbox) { diff --git a/backend/internal/service/shangwutong_contact_sync_test.go b/backend/internal/service/shangwutong_contact_sync_test.go index f708844b..8f6ee839 100644 --- a/backend/internal/service/shangwutong_contact_sync_test.go +++ b/backend/internal/service/shangwutong_contact_sync_test.go @@ -31,6 +31,21 @@ func TestContactUpdateQueuesDurableShangwutongEvent(t *testing.T) { require.Equal(t, contact.ID, event.ContactID) } +func TestContactUpdateRollsBackWhenDurableEventCannotBeQueued(t *testing.T) { + db := setupServiceTestDB(t) + account := createTestAccount(t, db) + contact := &model.Contact{AccountID: account.ID, Name: "旧昵称"} + require.NoError(t, db.Create(contact).Error) + svc := NewContactService(repository.NewContactRepo(db), nil, repository.NewNoteRepo(db)) + svc.SetWorkerPool(worker.NewWorkerPool(db)) + require.NoError(t, db.Migrator().DropTable(&model.BackgroundJob{})) + + _, err := svc.Update(context.Background(), account.ID, contact.ID, UpdateContactRequest{Name: "新昵称"}) + require.Error(t, err) + require.NoError(t, db.First(contact, contact.ID).Error) + require.Equal(t, "旧昵称", contact.Name) +} + func TestShangwutongContactListenerQueuesOnlyCIDBoundInboxes(t *testing.T) { db := setupServiceTestDB(t) account := createTestAccount(t, db)