github.com/mailgun/mailgun-go/v3@v3.6.4/parse_test.go (about) 1 package mailgun 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 "time" 8 9 "github.com/facebookgo/ensure" 10 "github.com/mailgun/mailgun-go/v3/events" 11 ) 12 13 func TestParseErrors(t *testing.T) { 14 _, err := ParseEvent([]byte("")) 15 ensure.DeepEqual(t, err.Error(), "failed to recognize event: EOF") 16 17 _, err = ParseEvent([]byte(`{"event": "unknown_event"}`)) 18 ensure.DeepEqual(t, err.Error(), "unsupported event: 'unknown_event'") 19 20 _, err = ParseEvent([]byte(`{ 21 "event": "accepted", 22 "timestamp": "1420255392.850187" 23 }`)) 24 errMsg := "failed to parse event 'accepted': parse error: expected number near offset 59 of '1420255392...'" 25 ensure.DeepEqual(t, err.Error(), errMsg) 26 } 27 28 func TestParseSuccess(t *testing.T) { 29 event, err := ParseEvent([]byte(`{ 30 "event": "accepted", 31 "timestamp": 1420255392.850187, 32 "user-variables": { 33 "custom": "value", 34 "parent": {"child": "user defined variable"}, 35 "a-list": [1,2,3,4,5] 36 }, 37 "envelope": { 38 "sender": "noreply@example.com", 39 "transport": "smtp", 40 "mail-from": null, 41 "targets": "me@example.com" 42 }, 43 "message": { 44 "headers": { 45 "to": "me@example.com", 46 "subject": "Test message going through the bus.", 47 "message-id": "20150103032312.125890.23497@example.com", 48 "from": "Example <noreply@example.com>" 49 }, 50 "recipients": [ 51 "me@example.com" 52 ], 53 "attachments": [], 54 "size": 6830 55 }, 56 "tags": [ 57 "sell_email_new" 58 ], 59 "campaigns": [ 60 { 61 "id": "d2yb8", 62 "name": "wantlist" 63 } 64 ], 65 "recipient": "dude@example.com", 66 "recipient-domain": "example.com", 67 "method": "http", 68 "flags": { 69 "is-system-test": false, 70 "is-big": false, 71 "is-test-mode": false, 72 "is-authenticated": false, 73 "is-routed": null 74 } 75 }`)) 76 ensure.Nil(t, err) 77 ensure.DeepEqual(t, reflect.TypeOf(event).String(), "*events.Accepted") 78 subject := event.(*events.Accepted).Message.Headers.Subject 79 ensure.DeepEqual(t, subject, "Test message going through the bus.") 80 81 // Make sure the next event parsing attempt will zero the fields. 82 event2, err := ParseEvent([]byte(`{ 83 "event": "accepted", 84 "timestamp": 1533922516.538978, 85 "recipient": "someone@example.com" 86 }`)) 87 ensure.Nil(t, err) 88 89 ensure.DeepEqual(t, event2.GetTimestamp(), 90 time.Date(2018, 8, 10, 17, 35, 16, 538978048, time.UTC)) 91 ensure.DeepEqual(t, event2.(*events.Accepted).Message.Headers.Subject, "") 92 // Make sure the second attempt of Parse doesn't overwrite the first event struct. 93 ensure.DeepEqual(t, event.(*events.Accepted).Recipient, "dude@example.com") 94 95 ensure.DeepEqual(t, event.(*events.Accepted).UserVariables["custom"], "value") 96 child := event.(*events.Accepted).UserVariables["parent"].(map[string]interface{})["child"] 97 ensure.DeepEqual(t, child, "user defined variable") 98 aList := event.(*events.Accepted).UserVariables["a-list"].([]interface{}) 99 ensure.DeepEqual(t, aList, []interface{}{1.0, 2.0, 3.0, 4.0, 5.0}) 100 } 101 102 func TestParseResponse(t *testing.T) { 103 // Make sure the next event parsing attempt will zero the fields. 104 evnts, err := parseResponse([]byte(`{ 105 "items": [ 106 { 107 "event": "accepted", 108 "timestamp": 1533922516.538978, 109 "recipient": "someone@example.com" 110 }, 111 { 112 "event": "delivered", 113 "timestamp": 1533922516.538978, 114 "recipient": "test@mailgun.test" 115 } 116 ], 117 "paging": { 118 "next": "https://next", 119 "first": "https://first", 120 "last": "https://last", 121 "previous": "https://prev" 122 } 123 }`)) 124 ensure.Nil(t, err) 125 126 ensure.DeepEqual(t, evnts[0].GetName(), "accepted") 127 ensure.DeepEqual(t, evnts[0].(*events.Accepted).Recipient, "someone@example.com") 128 129 ensure.DeepEqual(t, evnts[1].GetName(), "delivered") 130 ensure.DeepEqual(t, evnts[1].(*events.Delivered).Recipient, "test@mailgun.test") 131 } 132 133 func TestTimeStamp(t *testing.T) { 134 var event events.Generic 135 ts := time.Date(2018, 8, 10, 17, 35, 16, 538978048, time.UTC) 136 event.SetTimestamp(ts) 137 ensure.DeepEqual(t, event.GetTimestamp(), ts) 138 139 event.Timestamp = 1546899001.019501 140 ensure.DeepEqual(t, event.GetTimestamp(), 141 time.Date(2019, 1, 7, 22, 10, 01, 19501056, time.UTC)) 142 } 143 144 func TestEventNames(t *testing.T) { 145 for name := range EventNames { 146 event, err := ParseEvent([]byte(fmt.Sprintf(`{"event": "%s"}`, name))) 147 ensure.Nil(t, err) 148 ensure.DeepEqual(t, event.GetName(), name) 149 } 150 } 151 152 func TestEventMessageWithAttachment(t *testing.T) { 153 body := []byte(`{ 154 "event": "delivered", 155 "message": { 156 "headers": { 157 "to": "alice@example.com", 158 "message-id": "alice@example.com", 159 "from": "Bob <bob@example.com>", 160 "subject": "Hi Alice"}, 161 "attachments": [{"filename": "doc.pdf", 162 "content-type": "application/pdf", 163 "size": 139214}], 164 "size": 142698}}`) 165 event, err := ParseEvent(body) 166 ensure.Nil(t, err) 167 ensure.DeepEqual(t, event.(*events.Delivered).Message.Attachments[0].FileName, "doc.pdf") 168 } 169 170 func TestStored(t *testing.T) { 171 var key = "WyJlODlmYTdhNTE3IiwghODAyMTQ4MDEzMTUiXSLCAib2xkY29rZSJd" 172 var url = "https://api.mailgun.net/v2/domains/mg/messages/Wy9JZlJd" 173 body := []byte(fmt.Sprintf(`{ 174 "event": "stored", 175 "storage": { 176 "key": "%s", 177 "url": "%s" 178 }}`, key, url)) 179 event, err := ParseEvent(body) 180 ensure.Nil(t, err) 181 ensure.DeepEqual(t, event.(*events.Stored).Storage.Key, key) 182 ensure.DeepEqual(t, event.(*events.Stored).Storage.URL, url) 183 }