diff --git a/pkg/controller/jenkins/notifications/smtp_test.go b/pkg/controller/jenkins/notifications/smtp_test.go index cc402dab..5267af19 100644 --- a/pkg/controller/jenkins/notifications/smtp_test.go +++ b/pkg/controller/jenkins/notifications/smtp_test.go @@ -4,10 +4,8 @@ import ( "context" "errors" "fmt" - "github.com/emersion/go-smtp" "io" "io/ioutil" - "log" "mime/quotedprintable" "net" "regexp" @@ -16,6 +14,7 @@ import ( "github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2" + "github.com/emersion/go-smtp" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,29 +26,27 @@ const ( testSMTPPassword = "password" testSMTPPort = 1025 + + testFrom = "test@localhost" + testTo = "test.to@localhost" + testSubject = "Jenkins Operator Notification" + + // Headers titles + fromHeader = "From" + toHeader = "To" + subjectHeader = "Subject" ) -var smtpEvent = Event{ - Jenkins: v1alpha2.Jenkins{ - ObjectMeta: metav1.ObjectMeta{ - Name: testCrName, - Namespace: testNamespace, - }, - }, - Phase: testPhase, - Message: testMessage, - MessagesVerbose: testMessageVerbose, - LogLevel: testLoggingLevel, +type testServer struct { + event Event } -type testServer struct{} - // Login handles a login command with username and password. func (bkd *testServer) Login(state *smtp.ConnectionState, username, password string) (smtp.Session, error) { if username != testSMTPUsername || password != testSMTPPassword { return nil, errors.New("invalid username or password") } - return &testSession{}, nil + return &testSession{event: bkd.event}, nil } // AnonymousLogin requires clients to authenticate using SMTP AUTH before sending emails @@ -58,34 +55,50 @@ func (bkd *testServer) AnonymousLogin(state *smtp.ConnectionState) (smtp.Session } // A Session is returned after successful login. -type testSession struct{} +type testSession struct { + event Event +} func (s *testSession) Mail(from string) error { - log.Println("Mail from:", from) + if from != testFrom { + return fmt.Errorf("`From` header is not equal: '%s', expected '%s'", from, testFrom) + } return nil } func (s *testSession) Rcpt(to string) error { - log.Println("Rcpt to:", to) + if to != testTo { + return fmt.Errorf("`To` header is not equal: '%s', expected '%s'", to, testTo) + } return nil } func (s *testSession) Data(r io.Reader) error { - re := regexp.MustCompile(`\t+\n\t+(.*):\n\t+(.*)\n\t+`) + contentRegex := regexp.MustCompile(`\t+\n\t+(.*):\n\t+(.*)\n\t+`) + headersRegex := regexp.MustCompile(`(.*):\s(.*)`) b, err := ioutil.ReadAll(quotedprintable.NewReader(r)) if err != nil { return err } - fmt.Println(string(b)) + content := contentRegex.FindAllStringSubmatch(string(b), -1) + headers := headersRegex.FindAllStringSubmatch(string(b), -1) - res := re.FindAllStringSubmatch(string(b), -1) + if s.event.Jenkins.Name == content[0][1] { + return fmt.Errorf("jenkins CR not identical: %s, expected: %s", content[0][1], s.event.Jenkins.Name) + } else if string(s.event.Phase) == content[1][1] { + return fmt.Errorf("phase not identical: %s, expected: %s", content[1][1], s.event.Phase) + } - if smtpEvent.Jenkins.Name == res[0][1] { - return fmt.Errorf("jenkins CR not identical: %s, expected: %s", res[0][1], smtpEvent.Jenkins.Name) - } else if string(smtpEvent.Phase) == res[1][1] { - return fmt.Errorf("phase not identical: %s, expected: %s", res[1][1], smtpEvent.Phase) + for i := range headers { + if headers[i][1] == fromHeader && headers[i][2] != testFrom { + return fmt.Errorf("`From` header is not equal: '%s', expected '%s'", headers[i][2], testFrom) + } else if headers[i][1] == toHeader && headers[i][2] != testTo { + return fmt.Errorf("`To` header is not equal: '%s', expected '%s'", headers[i][2], testTo) + } else if headers[i][1] == subjectHeader && headers[i][2] != testSubject { + return fmt.Errorf("`Subject` header is not equal: '%s', expected '%s'", headers[i][2], testSubject) + } } return nil @@ -98,6 +111,19 @@ func (s *testSession) Logout() error { } func TestSMTP_Send(t *testing.T) { + event := Event{ + Jenkins: v1alpha2.Jenkins{ + ObjectMeta: metav1.ObjectMeta{ + Name: testCrName, + Namespace: testNamespace, + }, + }, + Phase: testPhase, + Message: testMessage, + MessagesVerbose: testMessageVerbose, + LogLevel: testLoggingLevel, + } + fakeClient := fake.NewFakeClient() testUsernameSelectorKeyName := "test-username-selector" testPasswordSelectorKeyName := "test-password-selector" @@ -105,7 +131,7 @@ func TestSMTP_Send(t *testing.T) { smtpClient := SMTP{k8sClient: fakeClient} - ts := &testServer{} + ts := &testServer{event: event} // Create fake SMTP server @@ -143,11 +169,11 @@ func TestSMTP_Send(t *testing.T) { assert.NoError(t, err) }() - err = smtpClient.Send(smtpEvent, v1alpha2.Notification{ + err = smtpClient.Send(event, v1alpha2.Notification{ SMTP: &v1alpha2.SMTP{ Server: "localhost", - From: "test@localhost", - To: "test@localhost", + From: testFrom, + To: testTo, TLSInsecureSkipVerify: true, Port: testSMTPPort, UsernameSecretKeySelector: v1alpha2.SecretKeySelector{