package usecase import ( "backend/pkg/notification/domain/entity" "backend/pkg/notification/domain/template" "backend/pkg/notification/domain/usecase" "context" "testing" "github.com/stretchr/testify/assert" ) func TestTemplateUseCase_RenderEmailTemplate(t *testing.T) { uc := MustTemplateUseCase(TemplateUseCaseParam{ TemplateRepo: nil, }) ctx := context.Background() tests := []struct { name string tmpl template.EmailTemplate params entity.TemplateParams expectedSubj string expectedBody string shouldContain []string shouldNotError bool }{ { name: "渲染基本參數", tmpl: template.EmailTemplate{ Title: "Hello {{.Username}}", Body: "
Your code is: {{.VerifyCode}}
", }, params: entity.TemplateParams{ Username: "張三", VerifyCode: "123456", }, expectedSubj: "Hello 張三", shouldContain: []string{"123456"}, shouldNotError: true, }, { name: "渲染額外參數", tmpl: template.EmailTemplate{ Title: "Welcome", Body: "Hello {{.Username}}, your link: {{.Link}}
", }, params: entity.TemplateParams{ Username: "John", Extra: map[string]string{ "Link": "https://example.com", }, }, shouldContain: []string{"John", "https://example.com"}, shouldNotError: true, }, { name: "特殊字符不轉義(簡單字符串替換)", tmpl: template.EmailTemplate{ Title: "Test", Body: "Name: {{.Username}}
", }, params: entity.TemplateParams{ Username: "", }, shouldContain: []string{""}, // 使用簡單字符串替換,不轉義 shouldNotError: true, }, { name: "空模板", tmpl: template.EmailTemplate{ Title: "", Body: "", }, params: entity.TemplateParams{ Username: "Test", }, expectedSubj: "", expectedBody: "", shouldNotError: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := uc.RenderEmailTemplate(ctx, tt.tmpl, tt.params) if tt.shouldNotError { assert.NoError(t, err) if tt.expectedSubj != "" { assert.Equal(t, tt.expectedSubj, result.Subject) } if tt.expectedBody != "" { assert.Equal(t, tt.expectedBody, result.Body) } for _, contain := range tt.shouldContain { assert.Contains(t, result.Body, contain) } } else { assert.Error(t, err) } }) } } func TestTemplateUseCase_RenderSMSTemplate(t *testing.T) { uc := MustTemplateUseCase(TemplateUseCaseParam{ TemplateRepo: nil, }) ctx := context.Background() tests := []struct { name string tmpl usecase.SMSTemplateResp params entity.TemplateParams expectedBody string shouldContain []string shouldNotError bool }{ { name: "渲染 SMS 驗證碼", tmpl: usecase.SMSTemplateResp{ Body: "您的驗證碼是:{{.VerifyCode}},請在5分鐘內使用。", }, params: entity.TemplateParams{ VerifyCode: "654321", }, shouldContain: []string{"654321", "5分鐘"}, shouldNotError: true, }, { name: "SMS 純文本替換", tmpl: usecase.SMSTemplateResp{ Body: "Hi {{.Username}}, your code: {{.VerifyCode}}", }, params: entity.TemplateParams{ Username: "