github.com/dzsibi/gophish@v0.7.1-0.20190719042945-1f16c7237d0d/models/campaign_test.go (about) 1 package models 2 3 import ( 4 "time" 5 6 check "gopkg.in/check.v1" 7 ) 8 9 func (s *ModelsSuite) TestGenerateSendDate(c *check.C) { 10 campaign := s.createCampaignDependencies(c) 11 // Test that if no launch date is provided, the campaign's creation date 12 // is used. 13 err := PostCampaign(&campaign, campaign.UserId) 14 c.Assert(err, check.Equals, nil) 15 c.Assert(campaign.LaunchDate, check.Equals, campaign.CreatedDate) 16 17 ms, err := GetMailLogsByCampaign(campaign.Id) 18 c.Assert(err, check.Equals, nil) 19 for _, m := range ms { 20 c.Assert(m.SendDate, check.Equals, campaign.CreatedDate) 21 } 22 23 // Test that if no send date is provided, all the emails are sent at the 24 // campaign's launch date 25 campaign = s.createCampaignDependencies(c) 26 campaign.LaunchDate = time.Now().UTC() 27 err = PostCampaign(&campaign, campaign.UserId) 28 c.Assert(err, check.Equals, nil) 29 30 ms, err = GetMailLogsByCampaign(campaign.Id) 31 c.Assert(err, check.Equals, nil) 32 for _, m := range ms { 33 c.Assert(m.SendDate, check.Equals, campaign.LaunchDate) 34 } 35 36 // Finally, test that if a send date is provided, the emails are staggered 37 // correctly. 38 campaign = s.createCampaignDependencies(c) 39 campaign.LaunchDate = time.Now().UTC() 40 campaign.SendByDate = campaign.LaunchDate.Add(2 * time.Minute) 41 err = PostCampaign(&campaign, campaign.UserId) 42 c.Assert(err, check.Equals, nil) 43 44 ms, err = GetMailLogsByCampaign(campaign.Id) 45 c.Assert(err, check.Equals, nil) 46 sendingOffset := 2 / float64(len(ms)) 47 for i, m := range ms { 48 expectedOffset := int(sendingOffset * float64(i)) 49 expectedDate := campaign.LaunchDate.Add(time.Duration(expectedOffset) * time.Minute) 50 c.Assert(m.SendDate, check.Equals, expectedDate) 51 } 52 } 53 54 func (s *ModelsSuite) TestCampaignDateValidation(c *check.C) { 55 campaign := s.createCampaignDependencies(c) 56 // If both are zero, then the campaign should start immediately with no 57 // send by date 58 err := campaign.Validate() 59 c.Assert(err, check.Equals, nil) 60 61 // If the launch date is specified, then the send date is optional 62 campaign = s.createCampaignDependencies(c) 63 campaign.LaunchDate = time.Now().UTC() 64 err = campaign.Validate() 65 c.Assert(err, check.Equals, nil) 66 67 // If the send date is greater than the launch date, then there's no 68 //problem 69 campaign = s.createCampaignDependencies(c) 70 campaign.LaunchDate = time.Now().UTC() 71 campaign.SendByDate = campaign.LaunchDate.Add(1 * time.Minute) 72 err = campaign.Validate() 73 c.Assert(err, check.Equals, nil) 74 75 // If the send date is less than the launch date, then there's an issue 76 campaign = s.createCampaignDependencies(c) 77 campaign.LaunchDate = time.Now().UTC() 78 campaign.SendByDate = campaign.LaunchDate.Add(-1 * time.Minute) 79 err = campaign.Validate() 80 c.Assert(err, check.Equals, ErrInvalidSendByDate) 81 } 82 83 func (s *ModelsSuite) TestLaunchCampaignMaillogStatus(c *check.C) { 84 // For the first test, ensure that campaigns created with the zero date 85 // (and therefore are set to launch immediately) have maillogs that are 86 // locked to prevent race conditions. 87 campaign := s.createCampaign(c) 88 ms, err := GetMailLogsByCampaign(campaign.Id) 89 c.Assert(err, check.Equals, nil) 90 91 for _, m := range ms { 92 c.Assert(m.Processing, check.Equals, true) 93 } 94 95 // Next, verify that campaigns scheduled in the future do not lock the 96 // maillogs so that they can be picked up by the background worker. 97 campaign = s.createCampaignDependencies(c) 98 campaign.Name = "New Campaign" 99 campaign.LaunchDate = time.Now().Add(1 * time.Hour) 100 c.Assert(PostCampaign(&campaign, campaign.UserId), check.Equals, nil) 101 ms, err = GetMailLogsByCampaign(campaign.Id) 102 c.Assert(err, check.Equals, nil) 103 104 for _, m := range ms { 105 c.Assert(m.Processing, check.Equals, false) 106 } 107 } 108 109 func (s *ModelsSuite) TestDeleteCampaignAlsoDeletesMailLogs(c *check.C) { 110 campaign := s.createCampaign(c) 111 ms, err := GetMailLogsByCampaign(campaign.Id) 112 c.Assert(err, check.Equals, nil) 113 c.Assert(len(ms), check.Equals, len(campaign.Results)) 114 115 err = DeleteCampaign(campaign.Id) 116 c.Assert(err, check.Equals, nil) 117 118 ms, err = GetMailLogsByCampaign(campaign.Id) 119 c.Assert(err, check.Equals, nil) 120 c.Assert(len(ms), check.Equals, 0) 121 } 122 123 func (s *ModelsSuite) TestCompleteCampaignAlsoDeletesMailLogs(c *check.C) { 124 campaign := s.createCampaign(c) 125 ms, err := GetMailLogsByCampaign(campaign.Id) 126 c.Assert(err, check.Equals, nil) 127 c.Assert(len(ms), check.Equals, len(campaign.Results)) 128 129 err = CompleteCampaign(campaign.Id, campaign.UserId) 130 c.Assert(err, check.Equals, nil) 131 132 ms, err = GetMailLogsByCampaign(campaign.Id) 133 c.Assert(err, check.Equals, nil) 134 c.Assert(len(ms), check.Equals, 0) 135 }