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 }