2019-07-17 15:02:42 -04:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2019-07-17 15:02:42 -04:00
2019-09-24 13:02:49 +08:00
package mailer
2019-07-17 15:02:42 -04:00
import (
2019-11-07 10:34:28 -03:00
"bytes"
2022-03-22 23:22:54 +08:00
"context"
2022-02-03 23:01:16 +00:00
"fmt"
2019-07-17 15:02:42 -04:00
"html/template"
2024-03-13 11:34:58 +01:00
"io"
"mime/quotedprintable"
2023-01-14 16:57:10 +01:00
"regexp"
2022-02-03 23:01:16 +00:00
"strings"
2019-07-17 15:02:42 -04:00
"testing"
2019-11-07 10:34:28 -03:00
texttmpl "text/template"
2019-07-17 15:02:42 -04:00
2022-08-25 10:31:57 +08:00
activities_model "code.gitea.io/gitea/models/activities"
2022-04-08 17:11:15 +08:00
"code.gitea.io/gitea/models/db"
2022-06-13 17:37:59 +08:00
issues_model "code.gitea.io/gitea/models/issues"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 22:36:47 +08:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2024-03-13 11:34:58 +01:00
"code.gitea.io/gitea/modules/markup"
2019-07-17 15:02:42 -04:00
"code.gitea.io/gitea/modules/setting"
2024-11-29 17:15:41 -08:00
sender_service "code.gitea.io/gitea/services/mailer/sender"
2022-02-06 07:44:30 -08:00
2019-07-17 15:02:42 -04:00
"github.com/stretchr/testify/assert"
)
2019-11-07 10:34:28 -03:00
const subjectTpl = `
{ { . SubjectPrefix } } [ { { . Repo } } ] @ { { . Doer . Name } } # { { . Issue . Index } } - { { . Issue . Title } }
`
const bodyTpl = `
2019-07-17 15:02:42 -04:00
< ! DOCTYPE html >
< html >
< head >
< meta http - equiv = "Content-Type" content = "text/html; charset=utf-8" / >
< title > { { . Subject } } < / title >
< / head >
< body >
< p > { { . Body } } < / p >
< p >
-- -
< br >
< a href = "{{.Link}}" > View it on Gitea < / a > .
< / p >
< / body >
< / html >
`
2022-06-13 17:37:59 +08:00
func prepareMailerTest ( t * testing . T ) ( doer * user_model . User , repo * repo_model . Repository , issue * issues_model . Issue , comment * issues_model . Comment ) {
2021-11-12 22:36:47 +08:00
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-01-20 18:46:10 +01:00
mailService := setting . Mailer {
2019-09-24 13:02:49 +08:00
From : "test@gitea.com" ,
}
2019-07-17 15:02:42 -04:00
2019-09-24 13:02:49 +08:00
setting . MailService = & mailService
setting . Domain = "localhost"
2019-07-17 15:02:42 -04:00
2022-08-16 10:22:25 +08:00
doer = unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
repo = unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 , Owner : doer } )
issue = unittest . AssertExistsAndLoadBean ( t , & issues_model . Issue { ID : 1 , Repo : repo , Poster : doer } )
2022-04-08 17:11:15 +08:00
assert . NoError ( t , issue . LoadRepo ( db . DefaultContext ) )
2022-08-16 10:22:25 +08:00
comment = unittest . AssertExistsAndLoadBean ( t , & issues_model . Comment { ID : 2 , Issue : issue } )
2022-06-20 12:02:49 +02:00
return doer , repo , issue , comment
2021-05-22 08:47:16 +02:00
}
func TestComposeIssueCommentMessage ( t * testing . T ) {
doer , _ , issue , comment := prepareMailerTest ( t )
2019-07-17 15:02:42 -04:00
2024-11-24 16:18:57 +08:00
markup . Init ( & markup . RenderHelperFuncs {
2024-03-13 11:34:58 +01:00
IsUsernameMentionable : func ( ctx context . Context , username string ) bool {
return username == doer . Name
} ,
} )
2023-01-14 16:57:10 +01:00
setting . IncomingEmail . Enabled = true
defer func ( ) { setting . IncomingEmail . Enabled = false } ( )
2022-08-08 20:04:28 +02:00
subjectTemplates = texttmpl . Must ( texttmpl . New ( "issue/comment" ) . Parse ( subjectTpl ) )
bodyTemplates = template . Must ( template . New ( "issue/comment" ) . Parse ( bodyTpl ) )
2019-07-17 15:02:42 -04:00
2021-11-24 17:49:20 +08:00
recipients := [ ] * user_model . User { { Name : "Test" , Email : "test@gitea.com" } , { Name : "Test2" , Email : "test2@gitea.com" } }
2022-01-20 18:46:10 +01:00
msgs , err := composeIssueCommentMessages ( & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
2022-08-25 10:31:57 +08:00
Issue : issue , Doer : doer , ActionType : activities_model . ActionCommentIssue ,
2024-03-13 11:34:58 +01:00
Content : fmt . Sprintf ( "test @%s %s#%d body" , doer . Name , issue . Repo . FullName ( ) , issue . Index ) ,
Comment : comment ,
2022-01-20 18:46:10 +01:00
} , "en-US" , recipients , false , "issue comment" )
2021-04-20 06:25:08 +08:00
assert . NoError ( t , err )
2019-11-18 05:08:20 -03:00
assert . Len ( t , msgs , 2 )
2020-01-16 17:55:36 +00:00
gomailMsg := msgs [ 0 ] . ToMessage ( )
2024-12-04 14:33:43 -08:00
replyTo := gomailMsg . GetGenHeader ( "Reply-To" ) [ 0 ]
subject := gomailMsg . GetGenHeader ( "Subject" ) [ 0 ]
2023-01-14 16:57:10 +01:00
2024-12-04 14:33:43 -08:00
assert . Len ( t , gomailMsg . GetAddrHeader ( "To" ) , 1 , "exactly one recipient is expected in the To field" )
2023-01-14 16:57:10 +01:00
tokenRegex := regexp . MustCompile ( ` \Aincoming\+(.+)@localhost\z ` )
assert . Regexp ( t , tokenRegex , replyTo )
token := tokenRegex . FindAllStringSubmatch ( replyTo , 1 ) [ 0 ] [ 1 ]
assert . Equal ( t , "Re: " , subject [ : 4 ] , "Comment reply subject should contain Re:" )
assert . Equal ( t , "Re: [user2/repo1] @user2 #1 - issue1" , subject )
2024-12-04 14:33:43 -08:00
assert . Equal ( t , "<user2/repo1/issues/1@localhost>" , gomailMsg . GetGenHeader ( "In-Reply-To" ) [ 0 ] , "In-Reply-To header doesn't match" )
assert . ElementsMatch ( t , [ ] string { "<user2/repo1/issues/1@localhost>" , "<reply-" + token + "@localhost>" } , gomailMsg . GetGenHeader ( "References" ) , "References header doesn't match" )
assert . Equal ( t , "<user2/repo1/issues/1/comment/2@localhost>" , gomailMsg . GetGenHeader ( "Message-ID" ) [ 0 ] , "Message-ID header doesn't match" )
assert . Equal ( t , "<mailto:" + replyTo + ">" , gomailMsg . GetGenHeader ( "List-Post" ) [ 0 ] )
assert . Len ( t , gomailMsg . GetGenHeader ( "List-Unsubscribe" ) , 2 ) // url + mailto
2024-03-13 11:34:58 +01:00
var buf bytes . Buffer
gomailMsg . WriteTo ( & buf )
b , err := io . ReadAll ( quotedprintable . NewReader ( & buf ) )
assert . NoError ( t , err )
// text/plain
assert . Contains ( t , string ( b ) , fmt . Sprintf ( ` ( %s ) ` , doer . HTMLURL ( ) ) )
assert . Contains ( t , string ( b ) , fmt . Sprintf ( ` ( %s ) ` , issue . HTMLURL ( ) ) )
// text/html
assert . Contains ( t , string ( b ) , fmt . Sprintf ( ` href="%s" ` , doer . HTMLURL ( ) ) )
assert . Contains ( t , string ( b ) , fmt . Sprintf ( ` href="%s" ` , issue . HTMLURL ( ) ) )
2019-07-17 15:02:42 -04:00
}
func TestComposeIssueMessage ( t * testing . T ) {
2021-05-22 08:47:16 +02:00
doer , _ , issue , _ := prepareMailerTest ( t )
2019-07-17 15:02:42 -04:00
2022-08-08 20:04:28 +02:00
subjectTemplates = texttmpl . Must ( texttmpl . New ( "issue/new" ) . Parse ( subjectTpl ) )
bodyTemplates = template . Must ( template . New ( "issue/new" ) . Parse ( bodyTpl ) )
2019-07-17 15:02:42 -04:00
2021-11-24 17:49:20 +08:00
recipients := [ ] * user_model . User { { Name : "Test" , Email : "test@gitea.com" } , { Name : "Test2" , Email : "test2@gitea.com" } }
2022-01-20 18:46:10 +01:00
msgs , err := composeIssueCommentMessages ( & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
2022-08-25 10:31:57 +08:00
Issue : issue , Doer : doer , ActionType : activities_model . ActionCreateIssue ,
2022-01-20 18:46:10 +01:00
Content : "test body" ,
} , "en-US" , recipients , false , "issue create" )
2021-04-20 06:25:08 +08:00
assert . NoError ( t , err )
2019-11-18 05:08:20 -03:00
assert . Len ( t , msgs , 2 )
2019-07-17 15:02:42 -04:00
2020-01-16 17:55:36 +00:00
gomailMsg := msgs [ 0 ] . ToMessage ( )
2024-12-04 14:33:43 -08:00
mailto := gomailMsg . GetAddrHeader ( "To" )
subject := gomailMsg . GetGenHeader ( "Subject" )
messageID := gomailMsg . GetGenHeader ( "Message-ID" )
inReplyTo := gomailMsg . GetGenHeader ( "In-Reply-To" )
references := gomailMsg . GetGenHeader ( "References" )
2019-07-17 15:02:42 -04:00
2019-11-18 05:08:20 -03:00
assert . Len ( t , mailto , 1 , "exactly one recipient is expected in the To field" )
2019-11-07 10:34:28 -03:00
assert . Equal ( t , "[user2/repo1] @user2 #1 - issue1" , subject [ 0 ] )
2021-10-01 17:24:43 +02:00
assert . Equal ( t , "<user2/repo1/issues/1@localhost>" , inReplyTo [ 0 ] , "In-Reply-To header doesn't match" )
assert . Equal ( t , "<user2/repo1/issues/1@localhost>" , references [ 0 ] , "References header doesn't match" )
assert . Equal ( t , "<user2/repo1/issues/1@localhost>" , messageID [ 0 ] , "Message-ID header doesn't match" )
2024-12-04 14:33:43 -08:00
assert . Empty ( t , gomailMsg . GetGenHeader ( "List-Post" ) ) // incoming mail feature disabled
assert . Len ( t , gomailMsg . GetGenHeader ( "List-Unsubscribe" ) , 1 ) // url without mailto
2019-07-17 15:02:42 -04:00
}
2019-11-07 10:34:28 -03:00
func TestTemplateSelection ( t * testing . T ) {
2021-05-22 08:47:16 +02:00
doer , repo , issue , comment := prepareMailerTest ( t )
2021-11-24 17:49:20 +08:00
recipients := [ ] * user_model . User { { Name : "Test" , Email : "test@gitea.com" } }
2019-11-07 10:34:28 -03:00
2022-08-08 20:04:28 +02:00
subjectTemplates = texttmpl . Must ( texttmpl . New ( "issue/default" ) . Parse ( "issue/default/subject" ) )
texttmpl . Must ( subjectTemplates . New ( "issue/new" ) . Parse ( "issue/new/subject" ) )
texttmpl . Must ( subjectTemplates . New ( "pull/comment" ) . Parse ( "pull/comment/subject" ) )
texttmpl . Must ( subjectTemplates . New ( "issue/close" ) . Parse ( "" ) ) // Must default to fallback subject
2019-11-07 10:34:28 -03:00
2022-08-08 20:04:28 +02:00
bodyTemplates = template . Must ( template . New ( "issue/default" ) . Parse ( "issue/default/body" ) )
template . Must ( bodyTemplates . New ( "issue/new" ) . Parse ( "issue/new/body" ) )
template . Must ( bodyTemplates . New ( "pull/comment" ) . Parse ( "pull/comment/body" ) )
template . Must ( bodyTemplates . New ( "issue/close" ) . Parse ( "issue/close/body" ) )
2019-11-07 10:34:28 -03:00
2024-11-29 17:15:41 -08:00
expect := func ( t * testing . T , msg * sender_service . Message , expSubject , expBody string ) {
2024-12-04 14:33:43 -08:00
subject := msg . ToMessage ( ) . GetGenHeader ( "Subject" )
2019-11-07 10:34:28 -03:00
msgbuf := new ( bytes . Buffer )
2020-01-16 17:55:36 +00:00
_ , _ = msg . ToMessage ( ) . WriteTo ( msgbuf )
2019-11-07 10:34:28 -03:00
wholemsg := msgbuf . String ( )
assert . Equal ( t , [ ] string { expSubject } , subject )
assert . Contains ( t , wholemsg , expBody )
}
2022-01-20 18:46:10 +01:00
msg := testComposeIssueCommentMessage ( t , & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
2022-08-25 10:31:57 +08:00
Issue : issue , Doer : doer , ActionType : activities_model . ActionCreateIssue ,
2022-01-20 18:46:10 +01:00
Content : "test body" ,
} , recipients , false , "TestTemplateSelection" )
2019-11-07 10:34:28 -03:00
expect ( t , msg , "issue/new/subject" , "issue/new/body" )
2022-01-20 18:46:10 +01:00
msg = testComposeIssueCommentMessage ( t , & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
2022-08-25 10:31:57 +08:00
Issue : issue , Doer : doer , ActionType : activities_model . ActionCommentIssue ,
2022-01-20 18:46:10 +01:00
Content : "test body" , Comment : comment ,
} , recipients , false , "TestTemplateSelection" )
2019-11-07 10:34:28 -03:00
expect ( t , msg , "issue/default/subject" , "issue/default/body" )
2022-08-16 10:22:25 +08:00
pull := unittest . AssertExistsAndLoadBean ( t , & issues_model . Issue { ID : 2 , Repo : repo , Poster : doer } )
comment = unittest . AssertExistsAndLoadBean ( t , & issues_model . Comment { ID : 4 , Issue : pull } )
2022-01-20 18:46:10 +01:00
msg = testComposeIssueCommentMessage ( t , & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
2022-08-25 10:31:57 +08:00
Issue : pull , Doer : doer , ActionType : activities_model . ActionCommentPull ,
2022-01-20 18:46:10 +01:00
Content : "test body" , Comment : comment ,
} , recipients , false , "TestTemplateSelection" )
2019-11-07 10:34:28 -03:00
expect ( t , msg , "pull/comment/subject" , "pull/comment/body" )
2022-01-20 18:46:10 +01:00
msg = testComposeIssueCommentMessage ( t , & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
2022-08-25 10:31:57 +08:00
Issue : issue , Doer : doer , ActionType : activities_model . ActionCloseIssue ,
2022-01-20 18:46:10 +01:00
Content : "test body" , Comment : comment ,
} , recipients , false , "TestTemplateSelection" )
2019-11-18 05:08:20 -03:00
expect ( t , msg , "Re: [user2/repo1] issue1 (#1)" , "issue/close/body" )
2019-11-07 10:34:28 -03:00
}
func TestTemplateServices ( t * testing . T ) {
2021-05-22 08:47:16 +02:00
doer , _ , issue , comment := prepareMailerTest ( t )
2022-04-08 17:11:15 +08:00
assert . NoError ( t , issue . LoadRepo ( db . DefaultContext ) )
2019-11-07 10:34:28 -03:00
2022-06-13 17:37:59 +08:00
expect := func ( t * testing . T , issue * issues_model . Issue , comment * issues_model . Comment , doer * user_model . User ,
2022-08-25 10:31:57 +08:00
actionType activities_model . ActionType , fromMention bool , tplSubject , tplBody , expSubject , expBody string ,
2022-01-20 18:46:10 +01:00
) {
2022-08-08 20:04:28 +02:00
subjectTemplates = texttmpl . Must ( texttmpl . New ( "issue/default" ) . Parse ( tplSubject ) )
bodyTemplates = template . Must ( template . New ( "issue/default" ) . Parse ( tplBody ) )
2019-11-07 10:34:28 -03:00
2021-11-24 17:49:20 +08:00
recipients := [ ] * user_model . User { { Name : "Test" , Email : "test@gitea.com" } }
2022-01-20 18:46:10 +01:00
msg := testComposeIssueCommentMessage ( t , & mailCommentContext {
2022-03-22 23:22:54 +08:00
Context : context . TODO ( ) , // TODO: use a correct context
Issue : issue , Doer : doer , ActionType : actionType ,
2022-01-20 18:46:10 +01:00
Content : "test body" , Comment : comment ,
} , recipients , fromMention , "TestTemplateServices" )
2019-11-07 10:34:28 -03:00
2024-12-04 14:33:43 -08:00
subject := msg . ToMessage ( ) . GetGenHeader ( "Subject" )
2019-11-07 10:34:28 -03:00
msgbuf := new ( bytes . Buffer )
2020-01-16 17:55:36 +00:00
_ , _ = msg . ToMessage ( ) . WriteTo ( msgbuf )
2019-11-07 10:34:28 -03:00
wholemsg := msgbuf . String ( )
assert . Equal ( t , [ ] string { expSubject } , subject )
assert . Contains ( t , wholemsg , "\r\n" + expBody + "\r\n" )
}
2022-08-25 10:31:57 +08:00
expect ( t , issue , comment , doer , activities_model . ActionCommentIssue , false ,
2019-11-07 10:34:28 -03:00
"{{.SubjectPrefix}}[{{.Repo}}]: @{{.Doer.Name}} commented on #{{.Issue.Index}} - {{.Issue.Title}}" ,
"//{{.ActionType}},{{.ActionName}},{{if .IsMention}}norender{{end}}//" ,
"Re: [user2/repo1]: @user2 commented on #1 - issue1" ,
"//issue,comment,//" )
2022-08-25 10:31:57 +08:00
expect ( t , issue , comment , doer , activities_model . ActionCommentIssue , true ,
2019-11-07 10:34:28 -03:00
"{{if .IsMention}}must render{{end}}" ,
"//subject is: {{.Subject}}//" ,
"must render" ,
"//subject is: must render//" )
2022-08-25 10:31:57 +08:00
expect ( t , issue , comment , doer , activities_model . ActionCommentIssue , true ,
2019-11-07 10:34:28 -03:00
"{{.FallbackSubject}}" ,
"//{{.SubjectPrefix}}//" ,
"Re: [user2/repo1] issue1 (#1)" ,
"//Re: //" )
}
2019-11-18 05:08:20 -03:00
2024-11-29 17:15:41 -08:00
func testComposeIssueCommentMessage ( t * testing . T , ctx * mailCommentContext , recipients [ ] * user_model . User , fromMention bool , info string ) * sender_service . Message {
2021-05-22 08:47:16 +02:00
msgs , err := composeIssueCommentMessages ( ctx , "en-US" , recipients , fromMention , info )
2021-04-20 06:25:08 +08:00
assert . NoError ( t , err )
2019-11-18 05:08:20 -03:00
assert . Len ( t , msgs , 1 )
return msgs [ 0 ]
}
2021-05-22 08:47:16 +02:00
func TestGenerateAdditionalHeaders ( t * testing . T ) {
doer , _ , issue , _ := prepareMailerTest ( t )
2022-03-22 23:22:54 +08:00
ctx := & mailCommentContext { Context : context . TODO ( ) /* TODO: use a correct context */ , Issue : issue , Doer : doer }
2024-02-03 00:41:27 +00:00
recipient := & user_model . User { Name : "test" , Email : "test@gitea.com" }
2021-05-22 08:47:16 +02:00
headers := generateAdditionalHeaders ( ctx , "dummy-reason" , recipient )
expected := map [ string ] string {
"List-ID" : "user2/repo1 <repo1.user2.localhost>" ,
"List-Archive" : "<https://try.gitea.io/user2/repo1>" ,
"X-Gitea-Reason" : "dummy-reason" ,
2024-02-03 00:41:27 +00:00
"X-Gitea-Sender" : "user2" ,
"X-Gitea-Recipient" : "test" ,
2021-05-22 08:47:16 +02:00
"X-Gitea-Recipient-Address" : "test@gitea.com" ,
"X-Gitea-Repository" : "repo1" ,
"X-Gitea-Repository-Path" : "user2/repo1" ,
"X-Gitea-Repository-Link" : "https://try.gitea.io/user2/repo1" ,
"X-Gitea-Issue-ID" : "1" ,
"X-Gitea-Issue-Link" : "https://try.gitea.io/user2/repo1/issues/1" ,
}
for key , value := range expected {
if assert . Contains ( t , headers , key ) {
assert . Equal ( t , value , headers [ key ] )
}
}
}
2022-02-03 23:01:16 +00:00
2024-05-02 23:24:21 +08:00
func TestGenerateMessageIDForIssue ( t * testing . T ) {
2022-02-03 23:01:16 +00:00
_ , _ , issue , comment := prepareMailerTest ( t )
_ , _ , pullIssue , _ := prepareMailerTest ( t )
pullIssue . IsPull = true
type args struct {
2022-06-13 17:37:59 +08:00
issue * issues_model . Issue
comment * issues_model . Comment
2022-08-25 10:31:57 +08:00
actionType activities_model . ActionType
2022-02-03 23:01:16 +00:00
}
tests := [ ] struct {
name string
args args
prefix string
} {
{
name : "Open Issue" ,
args : args {
issue : issue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionCreateIssue ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/issues/%d@%s>" , issue . Repo . FullName ( ) , issue . Index , setting . Domain ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Open Pull" ,
args : args {
issue : pullIssue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionCreatePullRequest ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/pulls/%d@%s>" , issue . Repo . FullName ( ) , issue . Index , setting . Domain ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Comment Issue" ,
args : args {
issue : issue ,
comment : comment ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionCommentIssue ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/issues/%d/comment/%d@%s>" , issue . Repo . FullName ( ) , issue . Index , comment . ID , setting . Domain ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Comment Pull" ,
args : args {
issue : pullIssue ,
comment : comment ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionCommentPull ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/pulls/%d/comment/%d@%s>" , issue . Repo . FullName ( ) , issue . Index , comment . ID , setting . Domain ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Close Issue" ,
args : args {
issue : issue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionCloseIssue ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/issues/%d/close/" , issue . Repo . FullName ( ) , issue . Index ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Close Pull" ,
args : args {
issue : pullIssue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionClosePullRequest ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/pulls/%d/close/" , issue . Repo . FullName ( ) , issue . Index ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Reopen Issue" ,
args : args {
issue : issue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionReopenIssue ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/issues/%d/reopen/" , issue . Repo . FullName ( ) , issue . Index ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Reopen Pull" ,
args : args {
issue : pullIssue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionReopenPullRequest ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/pulls/%d/reopen/" , issue . Repo . FullName ( ) , issue . Index ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Merge Pull" ,
args : args {
issue : pullIssue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionMergePullRequest ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/pulls/%d/merge/" , issue . Repo . FullName ( ) , issue . Index ) ,
2022-02-03 23:01:16 +00:00
} ,
{
name : "Ready Pull" ,
args : args {
issue : pullIssue ,
2022-08-25 10:31:57 +08:00
actionType : activities_model . ActionPullRequestReadyForReview ,
2022-02-03 23:01:16 +00:00
} ,
2023-01-14 16:57:10 +01:00
prefix : fmt . Sprintf ( "<%s/pulls/%d/ready/" , issue . Repo . FullName ( ) , issue . Index ) ,
2022-02-03 23:01:16 +00:00
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
2024-05-02 23:24:21 +08:00
got := generateMessageIDForIssue ( tt . args . issue , tt . args . comment , tt . args . actionType )
2022-02-03 23:01:16 +00:00
if ! strings . HasPrefix ( got , tt . prefix ) {
2024-05-02 23:24:21 +08:00
t . Errorf ( "generateMessageIDForIssue() = %v, want %v" , got , tt . prefix )
2022-02-03 23:01:16 +00:00
}
} )
}
}
2024-05-02 23:24:21 +08:00
func TestGenerateMessageIDForRelease ( t * testing . T ) {
msgID := generateMessageIDForRelease ( & repo_model . Release {
ID : 1 ,
Repo : & repo_model . Repository { OwnerName : "owner" , Name : "repo" } ,
} )
assert . Equal ( t , "<owner/repo/releases/1@localhost>" , msgID )
}
2024-07-14 14:27:00 -07:00
func TestFromDisplayName ( t * testing . T ) {
template , err := texttmpl . New ( "mailFrom" ) . Parse ( "{{ .DisplayName }}" )
assert . NoError ( t , err )
setting . MailService = & setting . Mailer { FromDisplayNameFormatTemplate : template }
defer func ( ) { setting . MailService = nil } ( )
tests := [ ] struct {
userDisplayName string
fromDisplayName string
} { {
userDisplayName : "test" ,
fromDisplayName : "test" ,
} , {
userDisplayName : "Hi Its <Mee>" ,
fromDisplayName : "Hi Its <Mee>" ,
} , {
userDisplayName : "Æsir" ,
fromDisplayName : "=?utf-8?q?=C3=86sir?=" ,
} , {
userDisplayName : "new😀user" ,
fromDisplayName : "=?utf-8?q?new=F0=9F=98=80user?=" ,
} }
for _ , tc := range tests {
t . Run ( tc . userDisplayName , func ( t * testing . T ) {
user := & user_model . User { FullName : tc . userDisplayName , Name : "tmp" }
got := fromDisplayName ( user )
assert . EqualValues ( t , tc . fromDisplayName , got )
} )
}
t . Run ( "template with all available vars" , func ( t * testing . T ) {
template , err = texttmpl . New ( "mailFrom" ) . Parse ( "{{ .DisplayName }} (by {{ .AppName }} on [{{ .Domain }}])" )
assert . NoError ( t , err )
setting . MailService = & setting . Mailer { FromDisplayNameFormatTemplate : template }
oldAppName := setting . AppName
setting . AppName = "Code IT"
oldDomain := setting . Domain
setting . Domain = "code.it"
defer func ( ) {
setting . AppName = oldAppName
setting . Domain = oldDomain
} ( )
assert . EqualValues ( t , "Mister X (by Code IT on [code.it])" , fromDisplayName ( & user_model . User { FullName : "Mister X" , Name : "tmp" } ) )
} )
}