github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/alerts/email_test.go (about)

     1  package alerts
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/evergreen-ci/evergreen"
     7  	"github.com/evergreen-ci/evergreen/apimodels"
     8  	"github.com/evergreen-ci/evergreen/model"
     9  	"github.com/evergreen-ci/evergreen/model/alert"
    10  	"github.com/evergreen-ci/evergreen/model/alertrecord"
    11  	"github.com/evergreen-ci/evergreen/model/build"
    12  	"github.com/evergreen-ci/evergreen/model/task"
    13  	"github.com/evergreen-ci/evergreen/model/version"
    14  	. "github.com/smartystreets/goconvey/convey"
    15  )
    16  
    17  const (
    18  	ProjectName     = "Test Project"
    19  	ProjectOwner    = "testprojowner"
    20  	ProjectId       = "testproject"
    21  	VersionRevision = "aaaaaaaaaaaaaaaaaaa"
    22  	VersionMessage  = "bbbbbbbbbb"
    23  	BuildName       = "Linux 64"
    24  	BuildId         = "b1"
    25  	TaskName        = "mainTests"
    26  	TaskId          = "t1"
    27  	TestName1       = "local/jstests/big_test.js"
    28  	TestName2       = "FunUnitTest"
    29  	TestName3       = `Windows\test\cool.exe`
    30  )
    31  
    32  func TestEmailSubject(t *testing.T) {
    33  	Convey("With failed task alert types:", t, func() {
    34  		ctx := AlertContext{
    35  			AlertRequest: &alert.AlertRequest{
    36  				Trigger: alertrecord.TaskFailedId,
    37  			},
    38  			ProjectRef: &model.ProjectRef{DisplayName: ProjectName},
    39  			Task: &task.Task{
    40  				DisplayName: TaskName,
    41  				Details:     apimodels.TaskEndDetail{},
    42  			},
    43  			Build:   &build.Build{DisplayName: BuildName},
    44  			Version: &version.Version{Revision: VersionRevision},
    45  		}
    46  		Convey("a task that timed out should return a subject", func() {
    47  			ctx.Task.Details.TimedOut = true
    48  			subj := getSubject(ctx)
    49  			So(subj, ShouldNotEqual, "")
    50  			Convey("denoting the time out and showing the task name", func() {
    51  				So(subj, ShouldContainSubstring, "Timed Out")
    52  				So(subj, ShouldContainSubstring, TaskName)
    53  				So(subj, ShouldContainSubstring, BuildName)
    54  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
    55  				So(subj, ShouldNotContainSubstring, VersionRevision[0:9])
    56  				So(subj, ShouldContainSubstring, ProjectName)
    57  			})
    58  		})
    59  		Convey("a task that failed on a system command should return a subject", func() {
    60  			ctx.Task.Details.Type = model.SystemCommandType
    61  			subj := getSubject(ctx)
    62  			So(subj, ShouldNotEqual, "")
    63  			Convey("denoting the system failure and showing the task name", func() {
    64  				So(subj, ShouldContainSubstring, "System")
    65  				So(subj, ShouldContainSubstring, TaskName)
    66  				So(subj, ShouldContainSubstring, BuildName)
    67  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
    68  				So(subj, ShouldContainSubstring, ProjectName)
    69  			})
    70  		})
    71  		Convey("a task that has a hearbeat failure should return a subject", func() {
    72  			ctx.Task.Details.Description = task.AgentHeartbeat
    73  			subj := getSummary(ctx)
    74  			So(subj, ShouldNotEqual, "")
    75  			Convey("denoting the system failure and showing the task name", func() {
    76  				So(subj, ShouldContainSubstring, "System Failure")
    77  				So(subj, ShouldContainSubstring, TaskName)
    78  				So(subj, ShouldContainSubstring, BuildName)
    79  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
    80  				So(subj, ShouldNotContainSubstring, VersionRevision[0:9])
    81  				So(subj, ShouldContainSubstring, ProjectName)
    82  			})
    83  		})
    84  		Convey("a task that failed on a normal command with no tests should return a subject", func() {
    85  			subj := getSubject(ctx)
    86  			So(subj, ShouldNotEqual, "")
    87  			Convey("denoting the failure and showing the task name", func() {
    88  				So(subj, ShouldContainSubstring, "Task Failed")
    89  				So(subj, ShouldContainSubstring, TaskName)
    90  				So(subj, ShouldContainSubstring, BuildName)
    91  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
    92  				So(subj, ShouldContainSubstring, ProjectName)
    93  			})
    94  		})
    95  		Convey("a task with two failed tests should return a subject", func() {
    96  			ctx.Task.TestResults = []task.TestResult{
    97  				{TestFile: TestName1, Status: evergreen.TestFailedStatus},
    98  				{TestFile: TestName2, Status: evergreen.TestFailedStatus},
    99  				{TestFile: TestName3, Status: evergreen.TestSucceededStatus},
   100  				{TestFile: TestName3, Status: evergreen.TestSucceededStatus},
   101  				{TestFile: TestName3, Status: evergreen.TestSucceededStatus},
   102  				{TestFile: TestName3, Status: evergreen.TestSucceededStatus},
   103  			}
   104  			subj := getSubject(ctx)
   105  			So(subj, ShouldNotEqual, "")
   106  			Convey("denoting the failure and showing the task name and failed tests", func() {
   107  				So(subj, ShouldContainSubstring, "Test Failures")
   108  				So(subj, ShouldContainSubstring, TaskName)
   109  				So(subj, ShouldContainSubstring, BuildName)
   110  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
   111  				So(subj, ShouldContainSubstring, ProjectName)
   112  				So(subj, ShouldContainSubstring, "big_test.js")
   113  				So(subj, ShouldContainSubstring, "FunUnitTest")
   114  				So(subj, ShouldNotContainSubstring, "cool.exe")
   115  				Convey("with test names properly truncated", func() {
   116  					So(subj, ShouldNotContainSubstring, "local")
   117  					So(subj, ShouldNotContainSubstring, "jstest")
   118  				})
   119  			})
   120  		})
   121  		Convey("a task with five failed tests should return a subject", func() {
   122  			ctx.Task.TestResults = []task.TestResult{
   123  				{TestFile: TestName1, Status: evergreen.TestFailedStatus},
   124  				{TestFile: TestName2, Status: evergreen.TestFailedStatus},
   125  				{TestFile: TestName3, Status: evergreen.TestFailedStatus},
   126  				{TestFile: TestName3, Status: evergreen.TestFailedStatus},
   127  				{TestFile: TestName3, Status: evergreen.TestFailedStatus},
   128  			}
   129  			subj := getSubject(ctx)
   130  			So(subj, ShouldNotEqual, "")
   131  			Convey("denoting two test failures but hiding the rest", func() {
   132  				So(subj, ShouldContainSubstring, "Test Failures")
   133  				So(subj, ShouldContainSubstring, TaskName)
   134  				So(subj, ShouldContainSubstring, BuildName)
   135  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
   136  				So(subj, ShouldContainSubstring, ProjectName)
   137  				So(subj, ShouldContainSubstring, "big_test.js")
   138  				So(subj, ShouldContainSubstring, "FunUnitTest")
   139  				So(subj, ShouldNotContainSubstring, "cool.exe")
   140  				So(subj, ShouldContainSubstring, "+3 more")
   141  			})
   142  		})
   143  		Convey("a failed task with passing tests should return a subject", func() {
   144  			ctx.Task.TestResults = []task.TestResult{
   145  				{TestFile: TestName1, Status: evergreen.TestSucceededStatus},
   146  				{TestFile: TestName2, Status: evergreen.TestSucceededStatus},
   147  				{TestFile: TestName3, Status: evergreen.TestSucceededStatus},
   148  			}
   149  			subj := getSubject(ctx)
   150  			So(subj, ShouldNotEqual, "")
   151  			Convey("denoting a task failure without a parenthetical", func() {
   152  				So(subj, ShouldContainSubstring, "Task Failed")
   153  				So(subj, ShouldContainSubstring, TaskName)
   154  				So(subj, ShouldContainSubstring, BuildName)
   155  				So(subj, ShouldContainSubstring, VersionRevision[0:8])
   156  				So(subj, ShouldContainSubstring, ProjectName)
   157  				So(subj, ShouldNotContainSubstring, "big_test.js")
   158  				So(subj, ShouldNotContainSubstring, "FunUnitTest")
   159  				So(subj, ShouldNotContainSubstring, "cool.exe")
   160  				So(subj, ShouldNotContainSubstring, "(")
   161  				So(subj, ShouldNotContainSubstring, ")")
   162  			})
   163  		})
   164  
   165  	})
   166  
   167  }