feat: initial commit

This commit is contained in:
2026-04-16 19:39:02 +02:00
commit 50d1686b1e
44 changed files with 2089 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
package usecase_test
import (
"context"
"errors"
"log/slog"
"os"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/paramah/gw_telegram/internal/application/dto"
"github.com/paramah/gw_telegram/internal/application/usecase"
"github.com/paramah/gw_telegram/internal/domain/apperror"
"github.com/paramah/gw_telegram/internal/domain/entity"
"github.com/paramah/gw_telegram/test/testutil"
)
func newTestLogger() *slog.Logger {
return slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelError}))
}
func validTextDTO() dto.IncomingMessageDTO {
return dto.IncomingMessageDTO{
MessageID: 1,
ChatID: 100,
UserID: 200,
Username: "testuser",
Text: "Hello, I need help",
Timestamp: time.Now(),
Language: "en",
}
}
func TestHandleTextMessage_Execute_HappyPath(t *testing.T) {
router := &testutil.FakeIntentRouter{
RouteResult: entity.Route{
IntentName: "general_query",
Target: entity.RouteTarget{
Type: entity.RouteTargetN8n,
WorkflowID: "general-webhook",
},
},
}
dispatcher := &testutil.FakeWorkflowDispatcher{
Response: entity.WorkflowResponse{
ReplyText: "Here is my response",
},
}
sessions := &testutil.FakeSessionStore{}
gateway := &testutil.FakeMessageGateway{}
uc := usecase.NewHandleTextMessage(router, dispatcher, sessions, gateway, newTestLogger())
err := uc.Execute(context.Background(), validTextDTO())
require.NoError(t, err)
assert.Equal(t, 1, dispatcher.CallCount)
assert.Equal(t, "Here is my response", gateway.LastSentText)
assert.Equal(t, int64(100), gateway.LastChatID)
}
func TestHandleTextMessage_Execute_EmptyText(t *testing.T) {
uc := usecase.NewHandleTextMessage(
&testutil.FakeIntentRouter{},
&testutil.FakeWorkflowDispatcher{},
&testutil.FakeSessionStore{},
&testutil.FakeMessageGateway{},
newTestLogger(),
)
in := validTextDTO()
in.Text = ""
err := uc.Execute(context.Background(), in)
assert.ErrorIs(t, err, apperror.ErrMessageEmpty)
}
func TestHandleTextMessage_Execute_RouteNotFound(t *testing.T) {
router := &testutil.FakeIntentRouter{Error: apperror.ErrRouteNotFound}
dispatcher := &testutil.FakeWorkflowDispatcher{}
sessions := &testutil.FakeSessionStore{}
gateway := &testutil.FakeMessageGateway{}
uc := usecase.NewHandleTextMessage(router, dispatcher, sessions, gateway, newTestLogger())
err := uc.Execute(context.Background(), validTextDTO())
assert.Error(t, err)
assert.True(t, errors.Is(err, apperror.ErrRouteNotFound))
assert.Equal(t, 0, dispatcher.CallCount)
assert.NotEmpty(t, gateway.LastSentText) // error message sent to user
}
func TestHandleTextMessage_Execute_DispatchError(t *testing.T) {
router := &testutil.FakeIntentRouter{
RouteResult: entity.Route{IntentName: "general_query"},
}
dispatcher := &testutil.FakeWorkflowDispatcher{
Error: errors.New("n8n unavailable"),
}
sessions := &testutil.FakeSessionStore{}
gateway := &testutil.FakeMessageGateway{}
uc := usecase.NewHandleTextMessage(router, dispatcher, sessions, gateway, newTestLogger())
err := uc.Execute(context.Background(), validTextDTO())
assert.Error(t, err)
assert.Equal(t, 1, dispatcher.CallCount)
assert.NotEmpty(t, gateway.LastSentText) // fallback error message sent to user
}
func TestHandleTextMessage_Execute_SessionPersisted(t *testing.T) {
router := &testutil.FakeIntentRouter{
RouteResult: entity.Route{
IntentName: "general_query",
Target: entity.RouteTarget{WorkflowID: "wf-1"},
},
}
dispatcher := &testutil.FakeWorkflowDispatcher{
Response: entity.WorkflowResponse{ReplyText: "OK"},
}
sessions := &testutil.FakeSessionStore{}
gateway := &testutil.FakeMessageGateway{}
uc := usecase.NewHandleTextMessage(router, dispatcher, sessions, gateway, newTestLogger())
err := uc.Execute(context.Background(), validTextDTO())
require.NoError(t, err)
assert.True(t, sessions.SetCalled)
assert.Equal(t, "wf-1", sessions.LastSetSession.CurrentWorkflow)
}