@@ -25,11 +25,17 @@ impl Event {
25
25
/// If the variant is `Trigger`, this will page whoever is on call
26
26
/// (potentially waking them up at 3 AM).
27
27
pub fn send ( self ) -> Result < ( ) > {
28
+ #[ cfg( not( test) ) ]
29
+ let base_url = "https://events.pagerduty.com" ;
30
+ #[ cfg( test) ]
31
+ let base_url = mockito:: server_url ( ) ;
32
+
28
33
let api_token = dotenv:: var ( "PAGERDUTY_API_TOKEN" ) ?;
29
34
let service_key = dotenv:: var ( "PAGERDUTY_INTEGRATION_KEY" ) ?;
30
35
36
+ let url = format ! ( "{}/generic/2010-04-15/create_event.json" , base_url) ;
31
37
let response = Client :: new ( )
32
- . post ( "https://events.pagerduty.com/generic/2010-04-15/create_event.json" )
38
+ . post ( & url )
33
39
. header ( header:: ACCEPT , "application/vnd.pagerduty+json;version=2" )
34
40
. header ( header:: AUTHORIZATION , format ! ( "Token token={}" , api_token) )
35
41
. json ( & FullEvent {
@@ -66,3 +72,75 @@ struct InvalidEvent {
66
72
message : String ,
67
73
errors : Vec < String > ,
68
74
}
75
+
76
+ #[ cfg( test) ]
77
+ mod tests {
78
+ use super :: Event ;
79
+ use mockito:: { mock, Matcher } ;
80
+ use std:: env;
81
+
82
+ #[ test]
83
+ fn test_send ( ) {
84
+ // set environment variables for this test
85
+ env:: set_var ( "PAGERDUTY_API_TOKEN" , "secret123" ) ;
86
+ env:: set_var ( "PAGERDUTY_INTEGRATION_KEY" , "crates-io-service-key" ) ;
87
+
88
+ // setup the pagerduty API endpoint mock
89
+ let response_body = json ! ( {
90
+ "description" : "possible spam attack underway" ,
91
+ "event_type" : "trigger" ,
92
+ "incident_key" : "spam_attack" ,
93
+ "service_key" : "crates-io-service-key"
94
+ } ) ;
95
+
96
+ let mock = mock ( "POST" , "/generic/2010-04-15/create_event.json" )
97
+ . match_header ( "Accept" , "application/vnd.pagerduty+json;version=2" )
98
+ . match_header ( "Authorization" , "Token token=secret123" )
99
+ . match_header ( "Content-Type" , "application/json" )
100
+ . match_body ( Matcher :: Json ( response_body) )
101
+ . with_status ( 200 )
102
+ . create ( ) ;
103
+
104
+ // create and send the event
105
+ let event = Event :: Trigger {
106
+ incident_key : Some ( "spam_attack" . into ( ) ) ,
107
+ description : "possible spam attack underway" . into ( ) ,
108
+ } ;
109
+
110
+ let result = event. send ( ) ;
111
+
112
+ // check that the mock endpoint was triggered
113
+ mock. assert ( ) ;
114
+ assert_ok ! ( result) ;
115
+ }
116
+
117
+ #[ test]
118
+ fn test_send_with_400_error ( ) {
119
+ // set environment variables for this test
120
+ env:: set_var ( "PAGERDUTY_API_TOKEN" , "secret123" ) ;
121
+ env:: set_var ( "PAGERDUTY_INTEGRATION_KEY" , "crates-io-service-key" ) ;
122
+
123
+ // setup the pagerduty API endpoint mock
124
+ let request_body = json ! ( {
125
+ "message" : "oops" ,
126
+ "errors" : [ "something" , "went" , "wrong" ] ,
127
+ } ) ;
128
+
129
+ let mock = mock ( "POST" , "/generic/2010-04-15/create_event.json" )
130
+ . with_status ( 400 )
131
+ . with_body ( request_body. to_string ( ) )
132
+ . create ( ) ;
133
+
134
+ // create and send the event
135
+ let event = Event :: Trigger {
136
+ incident_key : Some ( "spam_attack" . into ( ) ) ,
137
+ description : "possible spam attack underway" . into ( ) ,
138
+ } ;
139
+
140
+ let result = event. send ( ) ;
141
+
142
+ // check that the mock endpoint was triggered
143
+ mock. assert ( ) ;
144
+ assert_err ! ( result) ;
145
+ }
146
+ }
0 commit comments