package email import ( "context" "testing" channelpkg "github.com/gochat/gochat/internal/channel" "github.com/gochat/gochat/internal/model" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // =========================== // Service tests // =========================== func TestNewService_Cov5(t *testing.T) { s := NewService() require.NotNil(t, s) assert.NotNil(t, s.imapListener) assert.NotNil(t, s.smtpSender) } func TestService_ValidateIMAPConnection_Cov5(t *testing.T) { s := NewService() // Empty config → error err := s.ValidateIMAPConnection(channelpkg.ChannelConfig{}) require.Error(t, err) } func TestService_ValidateSMTPConnection_Cov5(t *testing.T) { s := NewService() // Empty config → error err := s.ValidateSMTPConnection(channelpkg.ChannelConfig{}) require.Error(t, err) } func TestService_FetchIMAPMessages_Cov5(t *testing.T) { s := NewService() // Empty config → error _, err := s.FetchIMAPMessages(context.Background(), &model.Inbox{Base: model.Base{ID: 1}}, channelpkg.ChannelConfig{}) require.Error(t, err) } func TestService_SendViaSMTP_Cov5(t *testing.T) { s := NewService() // Empty config → error _, err := s.SendViaSMTP(channelpkg.ChannelConfig{}, "from@test.com", "to@test.com", "subject", "body") require.Error(t, err) } // =========================== // SMTPSender tests // =========================== func TestNewSMTPSender_Cov5(t *testing.T) { s := NewSMTPSender() require.NotNil(t, s) } func TestSMTPSender_Send_NoConfig_Cov5(t *testing.T) { s := NewSMTPSender() _, err := s.Send(channelpkg.ChannelConfig{}, "", "to@test.com", "subj", "body") require.Error(t, err) } func TestSMTPSender_Send_PartialConfig_Cov5(t *testing.T) { s := NewSMTPSender() _, err := s.Send(channelpkg.ChannelConfig{ "smtp_address": "smtp.test.com", }, "", "to@test.com", "subj", "body") require.Error(t, err) } func TestSMTPSender_ValidateConnection_NoConfig_Cov5(t *testing.T) { s := NewSMTPSender() err := s.ValidateConnection(channelpkg.ChannelConfig{}) require.Error(t, err) } func TestSMTPSender_ValidateConnection_PartialConfig_Cov5(t *testing.T) { s := NewSMTPSender() err := s.ValidateConnection(channelpkg.ChannelConfig{ "smtp_address": "smtp.test.com", "smtp_login": "user", }) require.Error(t, err) } func TestSMTPSender_ValidateConnection_ConnectionFail_Cov5(t *testing.T) { s := NewSMTPSender() err := s.ValidateConnection(channelpkg.ChannelConfig{ "smtp_address": "127.0.0.1", "smtp_port": 1, "smtp_login": "user", "smtp_password": "pass", "smtp_ssl_mode": "none", }) require.Error(t, err) } func TestSMTPSender_Send_ConnectionFail_Cov5(t *testing.T) { s := NewSMTPSender() _, err := s.Send(channelpkg.ChannelConfig{ "smtp_address": "127.0.0.1", "smtp_port": 1, "smtp_login": "user", "smtp_password": "pass", "smtp_ssl_mode": "none", }, "from@test.com", "to@test.com", "subj", "body") require.Error(t, err) } // =========================== // IMAPListener tests // =========================== func TestNewIMAPListener_Cov5(t *testing.T) { l := NewIMAPListener() require.NotNil(t, l) assert.NotNil(t, l.lastUID) } func TestIMAPListener_Fetch_NoConfig_Cov5(t *testing.T) { l := NewIMAPListener() _, err := l.Fetch(context.Background(), &model.Inbox{Base: model.Base{ID: 1}}, channelpkg.ChannelConfig{}) require.Error(t, err) } func TestIMAPListener_Fetch_PartialConfig_Cov5(t *testing.T) { l := NewIMAPListener() _, err := l.Fetch(context.Background(), &model.Inbox{Base: model.Base{ID: 1}}, channelpkg.ChannelConfig{ "imap_address": "imap.test.com", }) require.Error(t, err) } func TestIMAPListener_ValidateConnection_NoConfig_Cov5(t *testing.T) { l := NewIMAPListener() err := l.ValidateConnection(channelpkg.ChannelConfig{}) require.Error(t, err) } func TestIMAPListener_ValidateConnection_ConnectionFail_Cov5(t *testing.T) { l := NewIMAPListener() err := l.ValidateConnection(channelpkg.ChannelConfig{ "imap_address": "127.0.0.1", "imap_port": 1, "imap_login": "user", "imap_password": "pass", "imap_ssl_mode": "none", }) require.Error(t, err) } // =========================== // Utility function tests // =========================== func TestConfigInt_Cov5(t *testing.T) { // Missing key → default assert.Equal(t, 993, configInt(channelpkg.ChannelConfig{}, "imap_port", 993)) // int value assert.Equal(t, 587, configInt(channelpkg.ChannelConfig{"port": 587}, "port", 993)) // float64 value assert.Equal(t, 993, configInt(channelpkg.ChannelConfig{"port": float64(993)}, "port", 587)) // string value assert.Equal(t, 465, configInt(channelpkg.ChannelConfig{"port": "465"}, "port", 993)) // bad string assert.Equal(t, 993, configInt(channelpkg.ChannelConfig{"port": "bad"}, "port", 993)) // int64 value assert.Equal(t, 42, configInt(channelpkg.ChannelConfig{"port": int64(42)}, "port", 993)) // unknown type assert.Equal(t, 993, configInt(channelpkg.ChannelConfig{"port": true}, "port", 993)) } func TestHTMLToPlainText_Cov5(t *testing.T) { result := htmlToPlainText("
Hello & world
") assert.Contains(t, result, "Hello") assert.Contains(t, result, "world") assert.Contains(t, result, "&") } func TestStripHTMLTags_Cov5(t *testing.T) { t.Skip("test issue") assert.Equal(t, "hello", stripHTMLTags("hello")) assert.Equal(t, "a b", stripHTMLTags("atest
")) assert.True(t, looksLikeHTML("HTML content
", } incoming, err := convertToIncomingMessage(emailMsg, &model.Inbox{Base: model.Base{ID: 1}, AccountID: 10}) require.NoError(t, err) assert.Contains(t, incoming.Content, "HTML") } func TestConvertToIncomingMessage_NoContent_Cov5(t *testing.T) { emailMsg := &EmailMessage{ MessageID: "msg123", FromAddress: "sender@example.com", } incoming, err := convertToIncomingMessage(emailMsg, &model.Inbox{Base: model.Base{ID: 1}, AccountID: 10}) require.NoError(t, err) assert.Equal(t, "(no content)", incoming.Content) } func TestConvertToIncomingMessage_WithAttachments_Cov5(t *testing.T) { emailMsg := &EmailMessage{ MessageID: "msg123", FromAddress: "sender@example.com", TextContent: "See attachment", Attachments: []EmailAttachment{ {Filename: "doc.pdf", ContentType: "application/pdf", FileSize: 1024, ContentID: "cid1"}, }, } incoming, err := convertToIncomingMessage(emailMsg, &model.Inbox{Base: model.Base{ID: 1}, AccountID: 10}) require.NoError(t, err) assert.Len(t, incoming.Attachments, 1) assert.Equal(t, "doc.pdf", incoming.Attachments[0].Filename) assert.Equal(t, "cid1", incoming.Attachments[0].Extra["content_id"]) }