Skip to content

Commit

Permalink
Added update method plus refactored code.
Browse files Browse the repository at this point in the history
  • Loading branch information
RichardKnop committed Jun 14, 2016
1 parent e8ba97b commit 2efddaa
Show file tree
Hide file tree
Showing 10 changed files with 393 additions and 161 deletions.
97 changes: 73 additions & 24 deletions README.md
Expand Up @@ -21,30 +21,79 @@ func main() {
log.Fatal(err)
}

memberResponse, err := client.CheckSubscription("john@reese.com", "list_id")
if err != nil {
errResponse, ok := err.(*mailchimp.ErrorResponse)
if !ok {
log.Fatal(err)
}
// errResponse.Type
// errResponse.Title
// errResponse.Status
// errResponse.Detail
log.Fatal(errResponse)
}
// Check if the email is already subscribed
memberResponse, err := client.CheckSubscription(
"listID",
"john@reese.com",
)

memberResponse, err = client.Subscribe("john@reese.com", "list_id", map[string]interface{}{})
if err != nil {
errResponse, ok := err.(*mailchimp.ErrorResponse)
if !ok {
log.Fatal(err)
}
// errResponse.Type
// errResponse.Title
// errResponse.Status
// errResponse.Detail
og.Fatal(errResponse)
}
// User is already subscribed, update the subscription
if err == nil {
memberResponse, err = client.UpdateSubscription(
"listID",
"john@reese.com",
map[string]interface{}{},
)

if err != nil {
// Check the error response
errResponse, ok := err.(*mailchimp.ErrorResponse)

// Could not type assert error response
if !ok {
log.Fatal(err)
}

log.Fatal(errResponse)
}

log.Printf(
"%s's subscription has been updated. Status: %s",
memberResponse.EmailAddress,
memberResponse.Status,
)
return
}

if err != nil {
// Check the error response
errResponse, ok := err.(*mailchimp.ErrorResponse)

// Could not type assert error response
if !ok {
log.Fatal(err)
}

// 404 means we can process and subscribe user,
// error other than 404 means we return error
if errResponse.Status != http.StatusNotFound {
log.Fatal(errResponse)
}
}

// Subscribe the email
memberResponse, err = client.Subscribe(
"listID",
"john@reese.com",
map[string]interface{}{},
)

if err != nil {
// Check the error response
errResponse, ok := err.(*mailchimp.ErrorResponse)

// Could not type assert error response
if !ok {
log.Fatal(err)
}

log.Fatal(errResponse)
}

log.Printf(
"%s has been subscribed successfully. Status: %s",
memberResponse.EmailAddress,
memberResponse.Status,
)
}
```
21 changes: 11 additions & 10 deletions check_subscription.go
Expand Up @@ -8,7 +8,7 @@ import (
)

// CheckSubscription ...
func (c *Client) CheckSubscription(email string, listID string) (*MemberResponse, error) {
func (c *Client) CheckSubscription(listID string, email string) (*MemberResponse, error) {
// Hash email
emailMD5 := fmt.Sprintf("%x", md5.Sum([]byte(email)))
// Make request
Expand All @@ -28,19 +28,20 @@ func (c *Client) CheckSubscription(email string, listID string) (*MemberResponse
return nil, err
}

// If the request failed
if resp.StatusCode > 299 {
errorResponse, err := extractError(data)
if err != nil {
// Allow any success status (2xx)
if resp.StatusCode/100 == 2 {
// Unmarshal response into MemberResponse struct
memberResponse := new(MemberResponse)
if err := json.Unmarshal(data, memberResponse); err != nil {
return nil, err
}
return nil, errorResponse
return memberResponse, nil
}

// Unmarshal response into MemberResponse struct
memberResponse := new(MemberResponse)
if err := json.Unmarshal(data, memberResponse); err != nil {
// Request failed
errorResponse, err := extractError(data)
if err != nil {
return nil, err
}
return memberResponse, nil
return nil, errorResponse
}
10 changes: 1 addition & 9 deletions check_subscription_test.go
Expand Up @@ -10,14 +10,6 @@ import (
"github.com/stretchr/testify/assert"
)

var notFoundErrorResponse = `{
"type": "http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/",
"title": "Resource Not Found",
"status": 404,
"detail": "The requested resource could not be found.",
"instance": ""
}`

func TestCheckSubscriptionNotFoundError(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
rw.WriteHeader(404)
Expand All @@ -38,7 +30,7 @@ func TestCheckSubscriptionNotFoundError(t *testing.T) {
baseURL, _ := url.Parse("http://localhost/")
client.SetBaseURL(baseURL)

memberResponse, err := client.CheckSubscription("john@reese.com", "list_id")
memberResponse, err := client.CheckSubscription("list_id", "john@reese.com")
assert.Nil(t, memberResponse)
assert.Equal(t, "Error 404 Resource Not Found (The requested resource could not be found.)", err.Error())

Expand Down
5 changes: 3 additions & 2 deletions client_interface.go
Expand Up @@ -7,8 +7,9 @@ import (
// ClientInterface defines exported methods
type ClientInterface interface {
// Exported methods
CheckSubscription(email string, listID string) (*MemberResponse, error)
Subscribe(email string, listID string, mergeFields map[string]interface{}) (*MemberResponse, error)
CheckSubscription(listID string, email string) (*MemberResponse, error)
Subscribe(listID string, email string, mergeFields map[string]interface{}) (*MemberResponse, error)
UpdateSubscription(listID string, email string, mergeFields map[string]interface{}) (*MemberResponse, error)
SetBaseURL(baseURL *url.URL)
GetBaseURL() *url.URL
}
39 changes: 31 additions & 8 deletions client_mock.go
Expand Up @@ -12,12 +12,12 @@ type ClientMock struct {
}

// CheckSubscription ...
func (_m *ClientMock) CheckSubscription(email string, listID string) (*MemberResponse, error) {
ret := _m.Called(email, listID)
func (_m *ClientMock) CheckSubscription(listID string, email string) (*MemberResponse, error) {
ret := _m.Called(listID, email)

var r0 *MemberResponse
if rf, ok := ret.Get(0).(func(string, string) *MemberResponse); ok {
r0 = rf(email, listID)
r0 = rf(listID, email)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*MemberResponse)
Expand All @@ -26,7 +26,7 @@ func (_m *ClientMock) CheckSubscription(email string, listID string) (*MemberRes

var r1 error
if rf, ok := ret.Get(1).(func(string, string) error); ok {
r1 = rf(email, listID)
r1 = rf(listID, email)
} else {
r1 = ret.Error(1)
}
Expand All @@ -35,12 +35,12 @@ func (_m *ClientMock) CheckSubscription(email string, listID string) (*MemberRes
}

// Subscribe ...
func (_m *ClientMock) Subscribe(email string, listID string, mergeFields map[string]interface{}) (*MemberResponse, error) {
ret := _m.Called(email, listID, mergeFields)
func (_m *ClientMock) Subscribe(listID string, email string, mergeFields map[string]interface{}) (*MemberResponse, error) {
ret := _m.Called(listID, email, mergeFields)

var r0 *MemberResponse
if rf, ok := ret.Get(0).(func(string, string, map[string]interface{}) *MemberResponse); ok {
r0 = rf(email, listID, mergeFields)
r0 = rf(listID, email, mergeFields)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*MemberResponse)
Expand All @@ -49,7 +49,30 @@ func (_m *ClientMock) Subscribe(email string, listID string, mergeFields map[str

var r1 error
if rf, ok := ret.Get(1).(func(string, string, map[string]interface{}) error); ok {
r1 = rf(email, listID, mergeFields)
r1 = rf(listID, email, mergeFields)
} else {
r1 = ret.Error(1)
}

return r0, r1
}

// UpdateSubscription ...
func (_m *ClientMock) UpdateSubscription(listID string, email string, mergeFields map[string]interface{}) (*MemberResponse, error) {
ret := _m.Called(listID, email, mergeFields)

var r0 *MemberResponse
if rf, ok := ret.Get(0).(func(string, string, map[string]interface{}) *MemberResponse); ok {
r0 = rf(listID, email, mergeFields)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*MemberResponse)
}
}

var r1 error
if rf, ok := ret.Get(1).(func(string, string, map[string]interface{}) error); ok {
r1 = rf(listID, email, mergeFields)
} else {
r1 = ret.Error(1)
}
Expand Down
21 changes: 11 additions & 10 deletions subscribe.go
Expand Up @@ -9,7 +9,7 @@ import (
)

// Subscribe ...
func (c *Client) Subscribe(email string, listID string, mergeFields map[string]interface{}) (*MemberResponse, error) {
func (c *Client) Subscribe(listID string, email string, mergeFields map[string]interface{}) (*MemberResponse, error) {
// Make request
params := map[string]interface{}{
"email_address": email,
Expand All @@ -32,19 +32,20 @@ func (c *Client) Subscribe(email string, listID string, mergeFields map[string]i
return nil, err
}

// If the request failed
if resp.StatusCode > 299 {
errorResponse, err := extractError(data)
if err != nil {
// Allow any success status (2xx)
if resp.StatusCode/100 == 2 {
// Unmarshal response into MemberResponse struct
memberResponse := new(MemberResponse)
if err := json.Unmarshal(data, memberResponse); err != nil {
return nil, err
}
return nil, errorResponse
return memberResponse, nil
}

// Unmarshal response into MemberResponse struct
memberResponse := new(MemberResponse)
if err := json.Unmarshal(data, memberResponse); err != nil {
// Request failed
errorResponse, err := extractError(data)
if err != nil {
return nil, err
}
return memberResponse, nil
return nil, errorResponse
}

0 comments on commit 2efddaa

Please sign in to comment.