diff --git a/models/campaign.go b/models/campaign.go index df044cf1..5abe0d1e 100644 --- a/models/campaign.go +++ b/models/campaign.go @@ -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, diff --git a/models/models_test.go b/models/models_test.go index 428817ea..02b92a91 100644 --- a/models/models_test.go +++ b/models/models_test.go @@ -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 = "Test" + 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) +}