github.com/mailgun/mailgun-go/v3@v3.6.4/events_test.go (about) 1 package mailgun_test 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/facebookgo/ensure" 10 "github.com/mailgun/mailgun-go/v3" 11 "github.com/mailgun/mailgun-go/v3/events" 12 ) 13 14 func TestEventIteratorGetNext(t *testing.T) { 15 mg := mailgun.NewMailgun(testDomain, testKey) 16 mg.SetAPIBase(server.URL()) 17 18 it := mg.ListEvents(&mailgun.ListEventOptions{Limit: 5}) 19 20 var firstPage, secondPage, previousPage []mailgun.Event 21 var ctx = context.Background() 22 23 ensure.True(t, it.Next(ctx, &firstPage)) 24 ensure.True(t, it.Paging.Next != "") 25 ensure.True(t, len(firstPage) != 0) 26 firstIterator := *it 27 28 ensure.True(t, it.Next(ctx, &secondPage)) 29 ensure.True(t, len(secondPage) != 0) 30 31 // Pages should be different 32 ensure.NotDeepEqual(t, firstPage, secondPage) 33 ensure.True(t, firstIterator.Paging.Next != it.Paging.Next) 34 ensure.True(t, firstIterator.Paging.Previous != it.Paging.Previous) 35 ensure.Nil(t, it.Err()) 36 37 // Previous() 38 ensure.True(t, it.First(ctx, &firstPage)) 39 ensure.True(t, it.Next(ctx, &secondPage)) 40 41 ensure.True(t, it.Previous(ctx, &previousPage)) 42 ensure.True(t, len(previousPage) != 0) 43 ensure.DeepEqual(t, previousPage[0].GetID(), firstPage[0].GetID()) 44 45 // First() 46 ensure.True(t, it.First(ctx, &firstPage)) 47 ensure.True(t, len(firstPage) != 0) 48 49 // Calling first resets the iterator to the first page 50 ensure.True(t, it.Next(ctx, &secondPage)) 51 ensure.NotDeepEqual(t, firstPage, secondPage) 52 53 // Last() 54 var lastPage []mailgun.Event 55 ensure.True(t, it.Next(ctx, &firstPage)) 56 ensure.True(t, len(firstPage) != 0) 57 58 // Calling Last() is invalid unless you first use First() or Next() 59 ensure.True(t, it.Last(ctx, &lastPage)) 60 ensure.True(t, len(lastPage) != 0) 61 } 62 63 func TestEventPoller(t *testing.T) { 64 mg := mailgun.NewMailgun(testDomain, testKey) 65 mg.SetAPIBase(server.URL()) 66 67 // Very short poll interval 68 it := mg.PollEvents(&mailgun.ListEventOptions{ 69 // Only events with a timestamp after this date/time will be returned 70 Begin: time.Now().Add(time.Second * -3), 71 // How often we poll the api for new events 72 PollInterval: time.Second * 4}) 73 74 eventChan := make(chan mailgun.Event, 1) 75 ctx, cancel := context.WithCancel(context.Background()) 76 go func() { 77 // Poll until our email event arrives 78 var page []mailgun.Event 79 for it.Poll(ctx, &page) { 80 for _, e := range page { 81 eventChan <- e 82 } 83 } 84 close(eventChan) 85 }() 86 87 // Send an email 88 m := mg.NewMessage("root@"+testDomain, "Subject", "Text Body", "user@"+testDomain) 89 msg, id, err := mg.Send(ctx, m) 90 ensure.Nil(t, err) 91 92 t.Logf("New Email: %s Id: %s\n", msg, id) 93 94 var accepted *events.Accepted 95 for e := range eventChan { 96 switch event := e.(type) { 97 case *events.Accepted: 98 t.Logf("Accepted Event: %s - %v", event.Message.Headers.MessageID, event.GetTimestamp()) 99 // If we find our accepted email event 100 if id == ("<" + event.Message.Headers.MessageID + ">") { 101 accepted = event 102 cancel() 103 } 104 } 105 } 106 // Ensure we found our email 107 ensure.NotNil(t, it.Err()) 108 ensure.True(t, accepted != nil) 109 ensure.DeepEqual(t, accepted.Recipient, "user@"+testDomain) 110 } 111 112 func ExampleMailgunImpl_ListEvents() { 113 mg := mailgun.NewMailgun("your-domain.com", "your-api-key") 114 mg.SetAPIBase(server.URL()) 115 116 it := mg.ListEvents(&mailgun.ListEventOptions{Limit: 100}) 117 118 var page []mailgun.Event 119 120 // The entire operation should not take longer than 30 seconds 121 ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) 122 defer cancel() 123 124 // For each page of 100 events 125 for it.Next(ctx, &page) { 126 for _, e := range page { 127 // You can access some fields via the interface 128 //fmt.Printf("Event: '%s' TimeStamp: '%s'\n", e.GetName(), e.GetTimestamp()) 129 130 // and you can act upon each event by type 131 switch event := e.(type) { 132 case *events.Accepted: 133 fmt.Printf("Accepted: auth: %t\n", event.Flags.IsAuthenticated) 134 case *events.Delivered: 135 fmt.Printf("Delivered transport: %s\n", event.Envelope.Transport) 136 case *events.Failed: 137 fmt.Printf("Failed reason: %s\n", event.Reason) 138 case *events.Clicked: 139 fmt.Printf("Clicked GeoLocation: %s\n", event.GeoLocation.Country) 140 case *events.Opened: 141 fmt.Printf("Opened GeoLocation: %s\n", event.GeoLocation.Country) 142 case *events.Rejected: 143 fmt.Printf("Rejected reason: %s\n", event.Reject.Reason) 144 case *events.Stored: 145 fmt.Printf("Stored URL: %s\n", event.Storage.URL) 146 case *events.Unsubscribed: 147 fmt.Printf("Unsubscribed client OS: %s\n", event.ClientInfo.ClientOS) 148 } 149 } 150 } 151 // Accepted: auth: false 152 // Accepted: auth: true 153 // Delivered transport: smtp 154 // Delivered transport: http 155 // Stored URL: http://mailgun.text/some/url 156 // Clicked GeoLocation: US 157 // Clicked GeoLocation: US 158 // Clicked GeoLocation: US 159 // Opened GeoLocation: US 160 // Opened GeoLocation: US 161 // Opened GeoLocation: US 162 // Unsubscribed client OS: OS X 163 // Unsubscribed client OS: OS X 164 }