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  }