To gitea and beyond, let's go(-yco)
This commit is contained in:
104
internal/testutils/smtp_client.go
Normal file
104
internal/testutils/smtp_client.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package testutils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AsyncEmailSender interface {
|
||||
Send(to, subject, body string) error
|
||||
SendAsync(to, subject, body string) <-chan error
|
||||
SetTimeout(timeout time.Duration)
|
||||
}
|
||||
|
||||
type TestSMTPClient struct {
|
||||
sender AsyncEmailSender
|
||||
server *TestEmailServer
|
||||
}
|
||||
|
||||
func NewTestSMTPClient(factory func(port int) AsyncEmailSender) (*TestSMTPClient, error) {
|
||||
server, err := NewTestEmailServer()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
||||
sender := factory(server.GetPort())
|
||||
if sender == nil {
|
||||
server.Close()
|
||||
return nil, fmt.Errorf("smtp sender factory returned nil")
|
||||
}
|
||||
|
||||
return &TestSMTPClient{
|
||||
sender: sender,
|
||||
server: server,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) Sender() AsyncEmailSender {
|
||||
return c.sender
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) Server() *TestEmailServer {
|
||||
return c.server
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) Close() error {
|
||||
if c == nil || c.server == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return c.server.Close()
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) SendTestEmail(to, subject, body string) error {
|
||||
if c == nil || c.sender == nil {
|
||||
return fmt.Errorf("smtp sender not configured")
|
||||
}
|
||||
|
||||
return c.sender.Send(to, subject, body)
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) SendTestEmailAsync(to, subject, body string) <-chan error {
|
||||
if c == nil || c.sender == nil {
|
||||
result := make(chan error, 1)
|
||||
result <- fmt.Errorf("smtp sender not configured")
|
||||
close(result)
|
||||
return result
|
||||
}
|
||||
|
||||
return c.sender.SendAsync(to, subject, body)
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) WaitForEmail(timeout time.Duration) bool {
|
||||
if c == nil || c.server == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return c.server.WaitForEmails(1, timeout)
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) GetReceivedEmails() []TestEmail {
|
||||
if c == nil || c.server == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return c.server.GetEmails()
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) ClearReceivedEmails() {
|
||||
if c == nil || c.server == nil {
|
||||
return
|
||||
}
|
||||
|
||||
c.server.ClearEmails()
|
||||
}
|
||||
|
||||
func (c *TestSMTPClient) SetTimeout(timeout time.Duration) {
|
||||
if c == nil || c.sender == nil {
|
||||
return
|
||||
}
|
||||
|
||||
c.sender.SetTimeout(timeout)
|
||||
}
|
||||
Reference in New Issue
Block a user