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  }