Removing duplicates in campaigns. Fixes #855

pull/890/head
Jordan Wright 2017-12-11 22:12:17 -06:00
parent aa8c770e73
commit 44154f3bf0
2 changed files with 51 additions and 0 deletions

View File

@ -404,9 +404,16 @@ func PostCampaign(c *Campaign, uid int64) error {
Logger.Println(err)
}
// Insert all the results
resultMap := make(map[string]bool)
for _, g := range c.Groups {
// Insert a result for each target in the group
for _, t := range g.Targets {
// Remove duplicate results - we should only
// send emails to unique email addresses.
if _, ok := resultMap[t.Email]; ok {
continue
}
resultMap[t.Email] = true
r := &Result{
Email: t.Email,
Position: t.Position,

View File

@ -441,3 +441,47 @@ func (s *ModelsSuite) TestResultScheduledStatus(ch *check.C) {
ch.Assert(r.Status, check.Equals, STATUS_SCHEDULED)
}
}
func (s *ModelsSuite) TestDuplicateResults(ch *check.C) {
group := Group{Name: "Test Group"}
group.Targets = []Target{
Target{Email: "test1@example.com", FirstName: "First", LastName: "Example"},
Target{Email: "test1@example.com", FirstName: "Duplicate", LastName: "Duplicate"},
Target{Email: "test2@example.com", FirstName: "Second", LastName: "Example"},
}
group.UserId = 1
ch.Assert(PostGroup(&group), check.Equals, nil)
// Add a template
t := Template{Name: "Test Template"}
t.Subject = "{{.RId}} - Subject"
t.Text = "{{.RId}} - Text"
t.HTML = "{{.RId}} - HTML"
t.UserId = 1
ch.Assert(PostTemplate(&t), check.Equals, nil)
// Add a landing page
p := Page{Name: "Test Page"}
p.HTML = "<html>Test</html>"
p.UserId = 1
ch.Assert(PostPage(&p), check.Equals, nil)
// Add a sending profile
smtp := SMTP{Name: "Test Page"}
smtp.UserId = 1
smtp.Host = "example.com"
smtp.FromAddress = "test@test.com"
ch.Assert(PostSMTP(&smtp), check.Equals, nil)
c := Campaign{Name: "Test campaign"}
c.UserId = 1
c.Template = t
c.Page = p
c.SMTP = smtp
c.Groups = []Group{group}
ch.Assert(PostCampaign(&c, c.UserId), check.Equals, nil)
ch.Assert(len(c.Results), check.Equals, 2)
ch.Assert(c.Results[0].Email, check.Equals, group.Targets[0].Email)
ch.Assert(c.Results[1].Email, check.Equals, group.Targets[2].Email)
}