Skip to content

Commit

Permalink
Merge pull request #255 from thrawn01/thrawn/develop
Browse files Browse the repository at this point in the history
MockServer is now an interface
  • Loading branch information
thrawn01 authored Apr 9, 2021
2 parents afe6db0 + d0d1d03 commit e686507
Show file tree
Hide file tree
Showing 10 changed files with 114 additions and 73 deletions.
57 changes: 49 additions & 8 deletions mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,63 @@ import (
"github.com/gorilla/mux"
)

type MockServer interface {
Stop()
URL4() string
URL() string
DomainIPS() []string
DomainList() []DomainContainer
ExportList() []Export
MailingList() []MailingListContainer
RouteList() []Route
Events() []Event
Webhooks() WebHooksListResponse
}

// A mailgun api mock suitable for testing
type MockServer struct {
type mockServer struct {
srv *httptest.Server

domainIPS []string
domainList []domainContainer
domainList []DomainContainer
exportList []Export
mailingList []mailingListContainer
mailingList []MailingListContainer
routeList []Route
events []Event
webhooks WebHooksListResponse
}

func (ms *mockServer) DomainIPS() []string {
return ms.domainIPS
}

func (ms *mockServer) DomainList() []DomainContainer {
return ms.domainList
}

func (ms *mockServer) ExportList() []Export {
return ms.exportList
}

func (ms *mockServer) MailingList() []MailingListContainer {
return ms.mailingList
}

func (ms *mockServer) RouteList() []Route {
return ms.routeList
}

func (ms *mockServer) Events() []Event {
return ms.events
}

func (ms *mockServer) Webhooks() WebHooksListResponse {
return ms.webhooks
}

// Create a new instance of the mailgun API mock server
func NewMockServer() MockServer {
ms := MockServer{}
ms := mockServer{}

// Add all our handlers
r := mux.NewRouter()
Expand All @@ -48,20 +89,20 @@ func NewMockServer() MockServer {

// Start the server
ms.srv = httptest.NewServer(r)
return ms
return &ms
}

// Stop the server
func (ms *MockServer) Stop() {
func (ms *mockServer) Stop() {
ms.srv.Close()
}

func (ms *MockServer) URL4() string {
func (ms *mockServer) URL4() string {
return ms.srv.URL + "/v4"
}

// URL returns the URL used to connect to the mock server
func (ms *MockServer) URL() string {
func (ms *mockServer) URL() string {
return ms.srv.URL + "/v3"
}

Expand Down
34 changes: 17 additions & 17 deletions mock_domains.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/gorilla/mux"
)

type domainContainer struct {
type DomainContainer struct {
Domain Domain `json:"domain"`
ReceivingDNSRecords []DNSRecord `json:"receiving_dns_records"`
SendingDNSRecords []DNSRecord `json:"sending_dns_records"`
Expand All @@ -16,9 +16,9 @@ type domainContainer struct {
TagLimits *TagLimits `json:"limits,omitempty"`
}

func (ms *MockServer) addDomainRoutes(r *mux.Router) {
func (ms *mockServer) addDomainRoutes(r *mux.Router) {

ms.domainList = append(ms.domainList, domainContainer{
ms.domainList = append(ms.domainList, DomainContainer{
Domain: Domain{
CreatedAt: RFC2822Time(time.Now().UTC()),
Name: "mailgun.test",
Expand Down Expand Up @@ -101,7 +101,7 @@ func (ms *MockServer) addDomainRoutes(r *mux.Router) {
r.HandleFunc("/domains/{domain}/web_prefix", ms.updateWebPrefix).Methods(http.MethodPut)
}

func (ms *MockServer) listDomains(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) listDomains(w http.ResponseWriter, r *http.Request) {
var list []Domain
for _, domain := range ms.domainList {
list = append(list, domain.Domain)
Expand Down Expand Up @@ -137,7 +137,7 @@ func (ms *MockServer) listDomains(w http.ResponseWriter, r *http.Request) {
})
}

func (ms *MockServer) getDomain(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getDomain(w http.ResponseWriter, r *http.Request) {
for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
d.Connection = nil
Expand All @@ -149,8 +149,8 @@ func (ms *MockServer) getDomain(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) createDomain(w http.ResponseWriter, r *http.Request) {
ms.domainList = append(ms.domainList, domainContainer{
func (ms *mockServer) createDomain(w http.ResponseWriter, r *http.Request) {
ms.domainList = append(ms.domainList, DomainContainer{
Domain: Domain{
CreatedAt: RFC2822Time(time.Now()),
Name: r.FormValue("name"),
Expand All @@ -164,7 +164,7 @@ func (ms *MockServer) createDomain(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "Domain has been created"})
}

func (ms *MockServer) deleteDomain(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) deleteDomain(w http.ResponseWriter, r *http.Request) {
result := ms.domainList[:0]
for _, domain := range ms.domainList {
if domain.Domain.Name == mux.Vars(r)["domain"] {
Expand All @@ -183,7 +183,7 @@ func (ms *MockServer) deleteDomain(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) getConnection(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getConnection(w http.ResponseWriter, r *http.Request) {
for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
resp := domainConnectionResponse{
Expand All @@ -197,7 +197,7 @@ func (ms *MockServer) getConnection(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) updateConnection(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) updateConnection(w http.ResponseWriter, r *http.Request) {
for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Connection = &DomainConnection{
Expand All @@ -212,7 +212,7 @@ func (ms *MockServer) updateConnection(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) getTracking(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getTracking(w http.ResponseWriter, r *http.Request) {
for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
resp := domainTrackingResponse{
Expand All @@ -226,7 +226,7 @@ func (ms *MockServer) getTracking(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) updateClickTracking(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) updateClickTracking(w http.ResponseWriter, r *http.Request) {
for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Tracking.Click.Active = stringToBool(r.FormValue("active"))
Expand All @@ -238,7 +238,7 @@ func (ms *MockServer) updateClickTracking(w http.ResponseWriter, r *http.Request
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) updateOpenTracking(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) updateOpenTracking(w http.ResponseWriter, r *http.Request) {
for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Tracking.Open.Active = stringToBool(r.FormValue("active"))
Expand All @@ -250,7 +250,7 @@ func (ms *MockServer) updateOpenTracking(w http.ResponseWriter, r *http.Request)
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) updateUnsubTracking(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) updateUnsubTracking(w http.ResponseWriter, r *http.Request) {
for i, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
ms.domainList[i].Tracking.Unsubscribe.Active = stringToBool(r.FormValue("active"))
Expand All @@ -268,7 +268,7 @@ func (ms *MockServer) updateUnsubTracking(w http.ResponseWriter, r *http.Request
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) getTagLimits(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getTagLimits(w http.ResponseWriter, r *http.Request) {
for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
if d.TagLimits == nil {
Expand All @@ -284,7 +284,7 @@ func (ms *MockServer) getTagLimits(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) updateDKIMSelector(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) updateDKIMSelector(w http.ResponseWriter, r *http.Request) {
for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
if r.FormValue("dkim_selector") == "" {
Expand All @@ -299,7 +299,7 @@ func (ms *MockServer) updateDKIMSelector(w http.ResponseWriter, r *http.Request)
toJSON(w, okResp{Message: "domain not found"})
}

func (ms *MockServer) updateWebPrefix(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) updateWebPrefix(w http.ResponseWriter, r *http.Request) {
for _, d := range ms.domainList {
if d.Domain.Name == mux.Vars(r)["domain"] {
if r.FormValue("web_prefix") == "" {
Expand Down
4 changes: 2 additions & 2 deletions mock_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/mailgun/mailgun-go/v4/events"
)

func (ms *MockServer) addEventRoutes(r *mux.Router) {
func (ms *mockServer) addEventRoutes(r *mux.Router) {
r.HandleFunc("/{domain}/events", ms.listEvents).Methods(http.MethodGet)

var (
Expand Down Expand Up @@ -193,7 +193,7 @@ type eventsResponse struct {
Paging Paging `json:"paging"`
}

func (ms *MockServer) listEvents(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) listEvents(w http.ResponseWriter, r *http.Request) {
var idx []string

for _, e := range ms.events {
Expand Down
10 changes: 5 additions & 5 deletions mock_exports.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ import (
"github.com/gorilla/mux"
)

func (ms *MockServer) addExportRoutes(r *mux.Router) {
func (ms *mockServer) addExportRoutes(r *mux.Router) {
r.HandleFunc("/exports", ms.postExports).Methods(http.MethodPost)
r.HandleFunc("/exports", ms.listExports).Methods(http.MethodGet)
r.HandleFunc("/exports/{id}", ms.getExport).Methods(http.MethodGet)
r.HandleFunc("/exports/{id}/download_url", ms.getExportLink).Methods(http.MethodGet)
}

func (ms *MockServer) postExports(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) postExports(w http.ResponseWriter, r *http.Request) {
e := Export{
ID: strconv.Itoa(len(ms.exportList)),
URL: r.FormValue("url"),
Expand All @@ -25,13 +25,13 @@ func (ms *MockServer) postExports(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "success"})
}

func (ms *MockServer) listExports(w http.ResponseWriter, _ *http.Request) {
func (ms *mockServer) listExports(w http.ResponseWriter, _ *http.Request) {
toJSON(w, ExportList{
Items: ms.exportList,
})
}

func (ms *MockServer) getExport(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getExport(w http.ResponseWriter, r *http.Request) {
for _, export := range ms.exportList {
if export.ID == mux.Vars(r)["id"] {
toJSON(w, export)
Expand All @@ -42,7 +42,7 @@ func (ms *MockServer) getExport(w http.ResponseWriter, r *http.Request) {
toJSON(w, okResp{Message: "export not found"})
}

func (ms *MockServer) getExportLink(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getExportLink(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Location", "/some/s3/url")
w.WriteHeader(http.StatusFound)
}
12 changes: 6 additions & 6 deletions mock_ips.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"github.com/gorilla/mux"
)

func (ms *MockServer) addIPRoutes(r *mux.Router) {
func (ms *mockServer) addIPRoutes(r *mux.Router) {
r.HandleFunc("/ips", ms.listIPS).Methods(http.MethodGet)
r.HandleFunc("/ips/{ip}", ms.getIPAddress).Methods(http.MethodGet)
func(r *mux.Router) {
Expand All @@ -17,34 +17,34 @@ func (ms *MockServer) addIPRoutes(r *mux.Router) {
}(r.PathPrefix("/domains/{domain}/ips").Subrouter())
}

func (ms *MockServer) listIPS(w http.ResponseWriter, _ *http.Request) {
func (ms *mockServer) listIPS(w http.ResponseWriter, _ *http.Request) {
toJSON(w, ipAddressListResponse{
TotalCount: 2,
Items: []string{"172.0.0.1", "192.168.1.1"},
})
}

func (ms *MockServer) getIPAddress(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) getIPAddress(w http.ResponseWriter, r *http.Request) {
toJSON(w, IPAddress{
IP: mux.Vars(r)["ip"],
RDNS: "luna.mailgun.net",
Dedicated: true,
})
}

func (ms *MockServer) listDomainIPS(w http.ResponseWriter, _ *http.Request) {
func (ms *mockServer) listDomainIPS(w http.ResponseWriter, _ *http.Request) {
toJSON(w, ipAddressListResponse{
TotalCount: 2,
Items: ms.domainIPS,
})
}

func (ms *MockServer) postDomainIPS(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) postDomainIPS(w http.ResponseWriter, r *http.Request) {
ms.domainIPS = append(ms.domainIPS, r.FormValue("ip"))
toJSON(w, okResp{Message: "success"})
}

func (ms *MockServer) deleteDomainIPS(w http.ResponseWriter, r *http.Request) {
func (ms *mockServer) deleteDomainIPS(w http.ResponseWriter, r *http.Request) {
result := ms.domainIPS[:0]
for _, ip := range ms.domainIPS {
if ip == mux.Vars(r)["ip"] {
Expand Down
Loading

0 comments on commit e686507

Please sign in to comment.