// Copyright 2026 tamakyi. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package mail import ( "html/template" "testing" "github.com/stretchr/testify/require" ) // TestRenderSecurityReportMail 钉住报告邮件模板本身。 // // 这封邮件一周才发一次,模板字段名写错的表现是「发出去了但正文空/漏块」, // 很难在第一时间发现。这里同时验证两件容易出错的事: // 1. HTML 片段必须原样插入(走 template.HTML),不能被转义成源码文本; // 2. 地图走 cid: 引用,邮件客户端才会把它当内嵌图而不是外链。 func TestRenderSecurityReportMail(t *testing.T) { out, err := RenderSecurityReportMail(SecurityReportMail{ Title: "2026 年 10 月 第 43 周安全状况周报", Period: "2026-10-19 ~ 2026-10-25", Generated: "2026-10-30 16:16", MapCID: "map-43", SummaryHTML: template.HTML(`
命中 554 次
`), CountriesHTML: template.HTML(`
美国160
`), Notes: template.HTML(`口径一
口径二`), }) require.NoError(t, err) // HTML 片段原样出现 require.Contains(t, out, "554") require.Contains(t, out, "美国") require.Contains(t, out, "口径一
口径二") require.NotContains(t, out, "<strong>", "片段被转义了,收件人只会看到一堆尖括号") // 地图按 Content-ID 引用 require.Contains(t, out, "cid:map-43") // 模板里的变量都应已展开 require.NotContains(t, out, "{{") require.Contains(t, out, "2026-10-19 ~ 2026-10-25") } // TestRenderSecurityReportMailNoMap 没有命中时不发地图,也就不该留一个坏图位。 func TestRenderSecurityReportMailNoMap(t *testing.T) { out, err := RenderSecurityReportMail(SecurityReportMail{Title: "空报告"}) require.NoError(t, err) require.NotContains(t, out, "cid:", "无数据时不该引用不存在的地图") require.NotContains(t, out, "{{") }