package handler import ( "encoding/json" "fmt" "net/http" "net/http/httptest" "strings" "testing" "time" evnt "git.kundeng.us/phoenix/textsender-models/tx0/message/event" "git.kundeng.us/phoenix/textsender-models/tx0/message/scheduling" "github.com/google/uuid" "github.com/stretchr/testify/assert" "git.kundeng.us/phoenix/textsender-api/internal/handler/endpoint" "git.kundeng.us/phoenix/textsender-api/internal/store/mock" ) func TestRecordMessageEventResponseWithMock(t *testing.T) { now := time.Now() mockStore := mock.NewMockScheduledMessageEventStore() contactStore := mock.NewMockContactStore() messageStore := mock.NewMockMessageStore() schMsgStore := mock.NewMockScheduledMessageStore() merStore := mock.NewMockMessageEventResponseStore() apiApp, err := GetApp() assert.NoError(t, err, "Error getting app") handler := NewEventResponseHandler(apiApp, merStore) contactId := uuid.New() messageId := uuid.New() scheduledMessageId := uuid.New() testUserId := uuid.New() con := ContactTest(contactId, testUserId) msg := MessageTest(messageId, testUserId) schMsg := ScheduledMessageTest(scheduledMessageId, testUserId, now) event := scheduling.ScheduledMessageEvent{} ctx := t.Context() if err := contactStore.CreateContact(ctx, &con); err != nil { assert.NoError(t, err, "Error creating contact: %v", err) } else if err = messageStore.CreateMessage(ctx, &msg); err != nil { assert.NoError(t, err, "Error creating message: %v", err) } else if err = schMsgStore.CreateScheduledMessage(ctx, &schMsg); err != nil { assert.NoError(t, err, "Error creating scheduled message: %v", err) } event.MessageId = *msg.Id event.ContactId = *con.Id event.ScheduledMessageId = schMsg.Id if err := mockStore.CreateScheduledMessageEvent(ctx, &event); err != nil { assert.NoError(t, err, "Error creating scheduled message event: %v", err) } sent := now.Add(30 * time.Minute) var merResponse map[string]any merResponse, err = ConvertStringToMapOfAny(MERResponseInString()) assert.NoError(t, err, "Error Converting to map[string]any") testReq := RecordEventRequest{ScheduledMessageEventId: event.Id, Response: merResponse, UserId: schMsg.UserId, Sent: &sent, Status: evnt.Message_Event_Response_Status_Scheduled} jsonValue, _ := json.Marshal(testReq) req, _ := http.NewRequest("POST", endpoint.RecordEventResponse, strings.NewReader(string(jsonValue))) rr := httptest.NewRecorder() handler.RecordResponse(rr, req) assert.Equal(t, http.StatusCreated, rr.Code) var response RecordEventResponse err = json.Unmarshal(rr.Body.Bytes(), &response) assert.NoError(t, err, "Error parsing message event response:%v", err) assert.NotEmpty(t, response.Data, "No message event response created") var msgEventResp evnt.MessageEventResponse msgEventResp = *response.Data[0] assert.NotEmpty(t, msgEventResp.Response, "The response of the message event response is empty") assert.Equal(t, msgEventResp.Response, testReq.Response, "Responses do not match") } func TestGetMessageEventResponse(t *testing.T) { now := time.Now() mockStore := mock.NewMockScheduledMessageEventStore() contactStore := mock.NewMockContactStore() messageStore := mock.NewMockMessageStore() schMsgStore := mock.NewMockScheduledMessageStore() merStore := mock.NewMockMessageEventResponseStore() apiApp, err := GetApp() assert.NoError(t, err, "Error getting app") handler := NewEventResponseHandler(apiApp, merStore) contactId := uuid.New() messageId := uuid.New() scheduledMessageId := uuid.New() testUserId := uuid.New() con := ContactTest(contactId, testUserId) msg := MessageTest(messageId, testUserId) schMsg := ScheduledMessageTest(scheduledMessageId, testUserId, now) ctx := t.Context() if err := contactStore.CreateContact(ctx, &con); err != nil { assert.NoError(t, err, "Error creating contact: %v", err) } else if err = messageStore.CreateMessage(ctx, &msg); err != nil { assert.NoError(t, err, "Error creating message: %v", err) } else if err = schMsgStore.CreateScheduledMessage(ctx, &schMsg); err != nil { assert.NoError(t, err, "Error creating scheduled message: %v", err) } event := scheduling.ScheduledMessageEvent{} event.MessageId = *msg.Id event.ContactId = *con.Id event.ScheduledMessageId = schMsg.Id sent := now.Add(30 * time.Minute) if err := mockStore.CreateScheduledMessageEvent(ctx, &event); err != nil { assert.NoError(t, err, "Error creating scheduled message event: %v", err) } else { m := evnt.MessageEventResponse{} m.ScheduledMessageEventId = event.Id m.UserId = schMsg.UserId m.Status = evnt.Message_Event_Response_Status_Scheduled m.Sent = sent var merResponse map[string]any merResponse, err = ConvertStringToMapOfAny(MERResponseInString()) assert.NoError(t, err, "Error Converting to map[string]any") m.Response = merResponse if err := merStore.Create(ctx, &m); err != nil { assert.NoError(t, err, "Error creating MessageEventResponse: %v", err) } } url := fmt.Sprintf("%s?user_id=%s", endpoint.FetchMessageEventResponse, testUserId) req, _ := http.NewRequest("GET", url, nil) rr := httptest.NewRecorder() handler.RecordResponse(rr, req) assert.Equal(t, http.StatusOK, rr.Code) var response GetMessageEventResponseFetchedResponse err = json.Unmarshal(rr.Body.Bytes(), &response) assert.NoError(t, err, "Error parsing message event response: %v", err) assert.NotEmpty(t, response.Data, "No message event response found") var msgEventResp evnt.MessageEventResponse msgEventResp = *response.Data[0] assert.NotEmpty(t, msgEventResp.Response, "The response of the message event response is empty") }