diff --git a/campaigns_test.go b/campaigns_test.go index c4a9f07..079fc2f 100644 --- a/campaigns_test.go +++ b/campaigns_test.go @@ -66,6 +66,76 @@ func newTestCampaignResults(currentPage, resultsPerPage int) *CampaignResults { } } +// newTestCampaignFeedRSS will return a dummy example for tests +func newTestCampaignFeedRSS() string { + return ` + + TonicPow + https://tonicpow.com + List of active campaigns, ordered by newest first + support@tonicpow.com (tonicpow) + Fri, 04 Jun 2021 17:20:28 +0000 + + TonicPow + https://tonicpow.com/campaign/tonicpow + Earn BSV for sharing things you like. Offer BSV for sharing your product or service. + TonicPow + Thu, 05 Sep 2019 01:50:06 +0000 + + +` +} + +// newTestCampaignFeedAtom will return a dummy example for tests +func newTestCampaignFeedAtom() string { + return ` + TonicPow + https://tonicpow.com + 2021-06-04T17:23:38Z + List of active campaigns, ordered by newest first + + + tonicpow + support@tonicpow.com + + + TonicPow + 2019-09-05T01:50:06Z + tag:tonicpow.com,2019-09-05:/campaign/tonicpow + + Earn BSV for sharing things you like. Offer BSV for sharing your product or service. + + TonicPow + + +` +} + +// newTestCampaignFeedJSON will return a dummy example for tests +func newTestCampaignFeedJSON() string { + return `{ + "version": "https://jsonfeed.org/version/1", + "title": "TonicPow", + "home_page_url": "https://tonicpow.com", + "description": "List of active campaigns, ordered by newest first", + "author": { + "name": "tonicpow" + }, + "items": [ + { + "id": "", + "url": "https://tonicpow.com/campaign/tonicpow", + "title": "TonicPow", + "summary": "Earn BSV for sharing things you like. Offer BSV for sharing your product or service.", + "date_published": "2019-09-05T01:50:06Z", + "author": { + "name": "TonicPow" + } + } + ] +}` +} + // TestClient_CreateCampaign will test the method CreateCampaign() func TestClient_CreateCampaign(t *testing.T) { // t.Parallel() (Cannot run in parallel - issues with overriding the mock client) @@ -944,6 +1014,33 @@ func TestClient_ListCampaignsByURL(t *testing.T) { assert.Nil(t, newResults) }) + t.Run("invalid target url", func(t *testing.T) { + client, err := newTestClient() + assert.NoError(t, err) + assert.NotNil(t, client) + + results := newTestCampaignResults(1, 25) + + endpoint := fmt.Sprintf("%s/%s/list?%s=%s&%s=%d&%s=%d&%s=%s&%s=%s", + EnvironmentDevelopment.apiURL, modelCampaign, + fieldTargetURL, testCampaignTargetURL, + fieldCurrentPage, 2, + fieldResultsPerPage, 5, + fieldSortBy, SortByFieldCreatedAt, + fieldSortOrder, SortOrderDesc, + ) + + err = mockResponseData(http.MethodGet, endpoint, http.StatusOK, results) + assert.NoError(t, err) + + var newResults *CampaignResults + newResults, err = client.ListCampaignsByURL( + "", 2, 5, SortByFieldCreatedAt, SortOrderDesc, + ) + assert.Error(t, err) + assert.Nil(t, newResults) + }) + t.Run("error from api (status code)", func(t *testing.T) { client, err := newTestClient() assert.NoError(t, err) @@ -1008,3 +1105,121 @@ func TestClient_ListCampaignsByURL(t *testing.T) { assert.Equal(t, apiError.Message, err.Error()) }) } + +// TestClient_CampaignsFeed will test the method CampaignsFeed() +func TestClient_CampaignsFeed(t *testing.T) { + // t.Parallel() (Cannot run in parallel - issues with overriding the mock client) + + t.Run("campaigns feeds (rss success)", func(t *testing.T) { + client, err := newTestClient() + assert.NoError(t, err) + assert.NotNil(t, client) + + results := newTestCampaignFeedRSS() + + endpoint := fmt.Sprintf( + "%s/%s/feed/?%s=%s", EnvironmentDevelopment.apiURL, + modelCampaign, fieldFeedType, FeedTypeRSS, + ) + + mockResponseFeed(endpoint, http.StatusOK, results) + + var feedResults string + feedResults, err = client.CampaignsFeed(FeedTypeRSS) + assert.NoError(t, err) + assert.Equal(t, results, feedResults) + }) + + t.Run("campaigns feeds (atom success)", func(t *testing.T) { + client, err := newTestClient() + assert.NoError(t, err) + assert.NotNil(t, client) + + results := newTestCampaignFeedAtom() + + endpoint := fmt.Sprintf( + "%s/%s/feed/?%s=%s", EnvironmentDevelopment.apiURL, + modelCampaign, fieldFeedType, FeedTypeAtom, + ) + + mockResponseFeed(endpoint, http.StatusOK, results) + + var feedResults string + feedResults, err = client.CampaignsFeed(FeedTypeAtom) + assert.NoError(t, err) + assert.Equal(t, results, feedResults) + }) + + t.Run("campaigns feeds (json success)", func(t *testing.T) { + client, err := newTestClient() + assert.NoError(t, err) + assert.NotNil(t, client) + + results := newTestCampaignFeedJSON() + + endpoint := fmt.Sprintf( + "%s/%s/feed/?%s=%s", EnvironmentDevelopment.apiURL, + modelCampaign, fieldFeedType, FeedTypeJSON, + ) + + mockResponseFeed(endpoint, http.StatusOK, results) + + var feedResults string + feedResults, err = client.CampaignsFeed(FeedTypeJSON) + assert.NoError(t, err) + assert.Equal(t, results, feedResults) + }) + + t.Run("error from api (status code)", func(t *testing.T) { + client, err := newTestClient() + assert.NoError(t, err) + assert.NotNil(t, client) + + results := newTestCampaignFeedJSON() + + endpoint := fmt.Sprintf( + "%s/%s/feed/?%s=%s", EnvironmentDevelopment.apiURL, + modelCampaign, fieldFeedType, FeedTypeJSON, + ) + + mockResponseFeed(endpoint, http.StatusBadRequest, results) + + var feedResults string + feedResults, err = client.CampaignsFeed(FeedTypeJSON) + assert.Error(t, err) + assert.Equal(t, "", feedResults) + }) + + t.Run("error from api (api error)", func(t *testing.T) { + client, err := newTestClient() + assert.NoError(t, err) + assert.NotNil(t, client) + + // results := newTestCampaignFeedJSON() + + endpoint := fmt.Sprintf( + "%s/%s/feed/?%s=%s", EnvironmentDevelopment.apiURL, + modelCampaign, fieldFeedType, FeedTypeJSON, + ) + + apiError := &Error{ + Code: 400, + Data: "field_name", + IPAddress: "127.0.0.1", + Message: "some error message", + Method: http.MethodPut, + RequestGUID: "7f3d97a8fd67ff57861904df6118dcc8", + StatusCode: http.StatusBadRequest, + URL: endpoint, + } + + err = mockResponseData(http.MethodGet, endpoint, http.StatusBadRequest, apiError) + assert.NoError(t, err) + + var feedResults string + feedResults, err = client.CampaignsFeed(FeedTypeJSON) + assert.Error(t, err) + assert.Equal(t, "", feedResults) + assert.Equal(t, apiError.Message, err.Error()) + }) +} diff --git a/examples/campaigns/feed/feed.go b/examples/campaigns/feed/feed.go new file mode 100644 index 0000000..ecca84f --- /dev/null +++ b/examples/campaigns/feed/feed.go @@ -0,0 +1,31 @@ +package main + +import ( + "log" + "os" + + "github.com/tonicpow/go-tonicpow" +) + +func main() { + + // Load the api client + client, err := tonicpow.NewClient( + tonicpow.WithAPIKey(os.Getenv("TONICPOW_API_KEY")), + tonicpow.WithEnvironmentString(os.Getenv("TONICPOW_ENVIRONMENT")), + ) + if err != nil { + log.Fatalf("error in NewClient: %s", err.Error()) + } + + // Get a RSS feed + var results string + // results, err = client.CampaignsFeed(tonicpow.FeedTypeRSS) + // results, err = client.CampaignsFeed(tonicpow.FeedTypeAtom) + results, err = client.CampaignsFeed(tonicpow.FeedTypeJSON) + if err != nil { + log.Fatalf("error in CampaignsFeed: %s", err.Error()) + } + + log.Printf(results) +} diff --git a/tonicpow_test.go b/tonicpow_test.go index 48fea4d..ec8fd38 100644 --- a/tonicpow_test.go +++ b/tonicpow_test.go @@ -2,6 +2,7 @@ package tonicpow import ( "encoding/json" + "net/http" "testing" "github.com/jarcoal/httpmock" @@ -49,3 +50,9 @@ func mockResponseData(method, endpoint string, statusCode int, model interface{} httpmock.RegisterResponder(method, endpoint, httpmock.NewStringResponder(statusCode, string(data))) return nil } + +// mockResponseFeed is used for mocking the response +func mockResponseFeed(endpoint string, statusCode int, feedResults string) { + httpmock.Reset() + httpmock.RegisterResponder(http.MethodGet, endpoint, httpmock.NewStringResponder(statusCode, feedResults)) +}