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  }