diff --git a/errs/error.go b/errs/error.go index ca3b44e..ff9578c 100644 --- a/errs/error.go +++ b/errs/error.go @@ -19,8 +19,8 @@ func (f *Failure) ApiError() string { func (f *Failure) ApiErrors() []string { var errors []string - for i := 0; i < len(f.ApiErrs); i++ { - errors = append(errors, fmt.Sprintf("%v", f.ApiErrs[i])) + for k, i := range f.ApiErrs { + errors = append(errors, fmt.Sprintf("%v: %v", k, i)) } return errors diff --git a/errs/types.go b/errs/types.go index e390d92..21b4d17 100644 --- a/errs/types.go +++ b/errs/types.go @@ -4,11 +4,11 @@ package errs type Failure struct { RuntimeErr error ApiErr string - ApiErrs []string + ApiErrs map[string]string } // FailureResponse convert json error response into object type FailureResponse struct { ErrorMsg string `json:"errorMsg,omitempty"` - Errors []string `json:"errors,omitempty"` + Errors map[string]string `json:"errors,omitempty"` } diff --git a/v5/client_test.go b/v5/client_test.go index 5548a75..72e087c 100644 --- a/v5/client_test.go +++ b/v5/client_test.go @@ -1,6 +1,7 @@ package v5 import ( + "encoding/json" "fmt" "math/rand" "net/http" @@ -9,14 +10,23 @@ import ( "strconv" "testing" "time" + + "github.com/h2non/gock" ) -var r *rand.Rand // Rand for this package. -var user, _ = strconv.Atoi(os.Getenv("RETAILCRM_USER")) -var statuses = map[int]bool{http.StatusOK: true, http.StatusCreated: true} -var id int -var ids []int -var codeCustomField string +var ( + r *rand.Rand // Rand for this package. + user, _ = strconv.Atoi(os.Getenv("RETAILCRM_USER")) + statuses = map[int]bool{http.StatusOK: true, http.StatusCreated: true} + crmUrl = os.Getenv("RETAILCRM_URL") + badUrl = "https://qwertypoiu.retailcrm.ru" + + errFail = "FailTest: error empty" + statusFail = "FailTest: status < 400" + successFail = "FailTest: Success == true" + codeFail = "test-12345" + iCodeFail = 123123 +) func init() { r = rand.New(rand.NewSource(time.Now().UnixNano())) @@ -34,11 +44,11 @@ func RandomString(strlen int) string { } func client() *Client { - return New(os.Getenv("RETAILCRM_URL"), os.Getenv("RETAILCRM_KEY")) + return New(crmUrl, os.Getenv("RETAILCRM_KEY")) } func badurlclient() *Client { - return New("https://qwertypoiu.retailcrm.ru", os.Getenv("RETAILCRM_KEY")) + return New(badUrl, os.Getenv("RETAILCRM_KEY")) } func badkeyclient() *Client { @@ -50,6 +60,7 @@ func TestGetRequest(t *testing.T) { _, status, _ := c.GetRequest("/fake-method") if status != http.StatusNotFound { + t.Fail() } } @@ -58,6 +69,7 @@ func TestPostRequest(t *testing.T) { _, status, _ := c.PostRequest("/fake-method", url.Values{}) if status != http.StatusNotFound { + t.Fail() } } @@ -81,6 +93,13 @@ func TestClient_ApiVersionsVersions(t *testing.T) { func TestClient_ApiVersionsVersionsBadUrl(t *testing.T) { c := badurlclient() + defer gock.Off() + + gock.New(badUrl). + Get("/api/api-versions"). + Reply(200). + BodyString(`{"success": false, "errorMsg" : "Account does not exist"}`) + data, status, err := c.APIVersions() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -90,33 +109,48 @@ func TestClient_ApiVersionsVersionsBadUrl(t *testing.T) { t.Errorf("%v", err.ApiError()) } - if data.Success != true { + if data.Success != false { t.Logf("%v", err.ApiError()) } } -func TestClient_ApiVersionsVersionsBadKey(t *testing.T) { +func TestClient_ApiCredentialsCredentialsBadKey(t *testing.T) { + defer gock.Off() + + gock.New(crmUrl). + Get("/api/credentials"). + Reply(403). + BodyString(`{"success": false, "errorMsg": "Wrong \"apiKey\" value"}`) + c := badkeyclient() - data, status, err := c.APIVersions() + data, status, err := c.APICredentials() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if status >= http.StatusBadRequest { + if status < http.StatusBadRequest { t.Logf("%v", err.ApiError()) } - if data.Success != true { + if data.Success != false { t.Logf("%v", err.ApiError()) } } func TestClient_ApiCredentialsCredentials(t *testing.T) { + defer gock.Off() + + gock.New(crmUrl). + Get("/api/credentials"). + Reply(200). + BodyString(`{"success": true}`) + c := client() data, status, err := c.APICredentials() if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) } if status >= http.StatusBadRequest { @@ -129,6 +163,15 @@ func TestClient_ApiCredentialsCredentials(t *testing.T) { } func TestClient_CustomersCustomers(t *testing.T) { + defer gock.Off() + + gock.New(crmUrl). + Get("/api/v5/customers"). + MatchParam("filter[city]", "Москва"). + MatchParam("page", "3"). + Reply(200). + BodyString(`{"success": true}`) + c := client() data, status, err := c.Customers(CustomersRequest{ @@ -143,11 +186,41 @@ func TestClient_CustomersCustomers(t *testing.T) { } if status >= http.StatusBadRequest { - t.Errorf("%v", err.ApiError()) + t.Logf("%v", err.ApiError()) } if data.Success != true { - t.Errorf("%v", err.ApiError()) + t.Logf("%v", err.ApiError()) + } +} + +func TestClient_CustomersCustomers_Fail(t *testing.T) { + defer gock.Off() + + gock.New(crmUrl). + Get("/api/v5/customers"). + MatchParam("filter[ids][]", codeFail). + Reply(400). + BodyString(`{"success": false,"errorMsg": "Internal Server Error"}`) + + c := client() + + data, status, err := c.Customers(CustomersRequest{ + Filter: CustomersFilter{ + Ids: []string{codeFail}, + }, + }) + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) } } @@ -167,6 +240,21 @@ func TestClient_CustomerChange(t *testing.T) { }, } + defer gock.Off() + + str, _ := json.Marshal(f) + + p := url.Values{ + "customer": {string(str)}, + } + + gock.New(crmUrl). + Post("/api/v5/customers/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 123}`) + cr, sc, err := c.CustomerCreate(f) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -183,6 +271,20 @@ func TestClient_CustomerChange(t *testing.T) { f.ID = cr.ID f.Vip = true + str, _ = json.Marshal(f) + + p = url.Values{ + "by": {string("id")}, + "customer": {string(str)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/customers/%v/edit", cr.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + ed, se, err := c.CustomerEdit(f, "id") if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -196,6 +298,12 @@ func TestClient_CustomerChange(t *testing.T) { t.Errorf("%v", err.ApiError()) } + gock.New(crmUrl). + Get(fmt.Sprintf("/api/v5/customers/%v", f.ExternalID)). + MatchParam("by", "externalId"). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.Customer(f.ExternalID, "externalId", "") if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -208,9 +316,90 @@ func TestClient_CustomerChange(t *testing.T) { if data.Success != true { t.Errorf("%v", err.ApiError()) } +} - if data.Customer.ExternalID != f.ExternalID { - t.Errorf("%v", err.ApiError()) +func TestClient_CustomerChange_Fail(t *testing.T) { + c := client() + + f := Customer{ + FirstName: "Понтелей", + } + + defer gock.Off() + + str, _ := json.Marshal(f) + + p := url.Values{ + "customer": {string(str)}, + } + + gock.New(crmUrl). + Post("/api/v5/customers/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Parameter 'externalId' in 'customer' is missing"}`) + + cr, sc, err := c.CustomerCreate(f) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if sc < http.StatusBadRequest { + t.Error(statusFail) + } + + if cr.Success != false { + t.Error(successFail) + } + + f.ID = cr.ID + f.Vip = true + + str, _ = json.Marshal(f) + + p = url.Values{ + "by": {string("id")}, + "customer": {string(str)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/customers/%v/edit", cr.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + ed, se, err := c.CustomerEdit(f, "id") + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if se < http.StatusBadRequest { + t.Error(statusFail) + } + + if ed.Success != false { + t.Error(successFail) + } + + gock.New(crmUrl). + Get(fmt.Sprintf("/api/v5/customers/%v", codeFail)). + MatchParam("by", "externalId"). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + data, status, err := c.Customer(codeFail, "externalId", "") + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) } } @@ -227,6 +416,21 @@ func TestClient_CustomersUpload(t *testing.T) { } } + defer gock.Off() + + str, _ := json.Marshal(customers) + + p := url.Values{ + "customers": {string(str)}, + } + + gock.New(crmUrl). + Post("/api/v5/customers/upload"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.CustomersUpload(customers) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -241,64 +445,63 @@ func TestClient_CustomersUpload(t *testing.T) { } } +func TestClient_CustomersUpload_Fail(t *testing.T) { + c := client() + + customers := []Customer{{ExternalID: strconv.Itoa(iCodeFail)}} + + defer gock.Off() + + str, _ := json.Marshal(customers) + p := url.Values{ + "customers": {string(str)}, + } + + gock.New(crmUrl). + Post("/api/v5/customers/upload"). + MatchType("url"). + BodyString(p.Encode()). + Reply(460). + BodyString(`{"success": false, "errorMsg": "Customers are loaded with errors"}`) + + data, status, err := c.CustomersUpload(customers) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_CustomersCombine(t *testing.T) { c := client() - dataFirst, status, err := c.CustomerCreate(Customer{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - }) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) + defer gock.Off() + + customers := []Customer{{ID: 1}, {ID: 2}} + resultCustomer := Customer{ID: 3} + + jr, _ := json.Marshal(&customers) + combineJSONOut, _ := json.Marshal(&resultCustomer) + + p := url.Values{ + "customers": {string(jr[:])}, + "resultCustomer": {string(combineJSONOut[:])}, } - if status >= http.StatusBadRequest { - t.Errorf("%v", err.ApiError()) - } + gock.New(crmUrl). + Post("/customers/combine"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) - if dataFirst.Success != true { - t.Errorf("%v", err.ApiError()) - } - - dataSecond, status, err := c.CustomerCreate(Customer{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - }) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) - } - - if status >= http.StatusBadRequest { - t.Errorf("%v", err.ApiError()) - } - - if dataSecond.Success != true { - t.Errorf("%v", err.ApiError()) - } - - dataThird, status, err := c.CustomerCreate(Customer{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - }) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) - } - - if status >= http.StatusBadRequest { - t.Errorf("%v", err.ApiError()) - } - - if dataThird.Success != true { - t.Errorf("%v", err.ApiError()) - } - - data, status, err := c.CustomersCombine([]Customer{{ID: dataFirst.ID}, {ID: dataSecond.ID}}, Customer{ID: dataThird.ID}) + data, status, err := c.CustomersCombine(customers, resultCustomer) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -312,33 +515,66 @@ func TestClient_CustomersCombine(t *testing.T) { } } -func TestClient_CustomersFixExternalIds(t *testing.T) { +func TestClient_CustomersCombine_Fail(t *testing.T) { c := client() - f := Customer{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), + + defer gock.Off() + + customers := []Customer{{}, {}} + resultCustomer := Customer{} + + jr, _ := json.Marshal(&customers) + combineJSONOut, _ := json.Marshal(&resultCustomer) + + p := url.Values{ + "customers": {string(jr[:])}, + "resultCustomer": {string(combineJSONOut[:])}, } - cr, sc, err := c.CustomerCreate(f) + gock.New(crmUrl). + Post("/customers/combine"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Invalid input parameters"}`) + + data, status, err := c.CustomersCombine([]Customer{{}, {}}, Customer{}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if sc != http.StatusCreated { - t.Errorf("%v", err.ApiError()) + if status < http.StatusBadRequest { + t.Error(statusFail) } - if cr.Success != true { - t.Errorf("%v", err.ApiError()) + if data.Success != false { + t.Error(successFail) } +} + +func TestClient_CustomersFixExternalIds(t *testing.T) { + c := client() customers := []IdentifiersPair{{ - ID: cr.ID, + ID: 123, ExternalID: RandomString(8), }} + defer gock.Off() + + jr, _ := json.Marshal(&customers) + + p := url.Values{ + "customers": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/customers/fix-external-ids"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + fx, fe, err := c.CustomersFixExternalIds(customers) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -353,6 +589,40 @@ func TestClient_CustomersFixExternalIds(t *testing.T) { } } +func TestClient_CustomersFixExternalIds_Fail(t *testing.T) { + c := client() + + customers := []IdentifiersPair{{ExternalID: RandomString(8)}} + + defer gock.Off() + + jr, _ := json.Marshal(&customers) + + p := url.Values{ + "customers": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/customers/fix-external-ids"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters", "errors": {"id": "ID must be an integer"}}`) + + data, status, err := c.CustomersFixExternalIds(customers) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_CustomersHistory(t *testing.T) { c := client() f := CustomersHistoryRequest{ @@ -360,6 +630,13 @@ func TestClient_CustomersHistory(t *testing.T) { SinceID: 20, }, } + defer gock.Off() + + gock.New(crmUrl). + Get("/customers/history"). + MatchParam("filter[sinceId]", "20"). + Reply(200). + BodyString(`{"success": true, "history": [{"id": 1}]}`) data, status, err := c.CustomersHistory(f) if err.RuntimeErr != nil { @@ -379,9 +656,47 @@ func TestClient_CustomersHistory(t *testing.T) { } } +func TestClient_CustomersHistory_Fail(t *testing.T) { + c := client() + f := CustomersHistoryRequest{ + Filter: CustomersHistoryFilter{ + StartDate: "2020-13-12", + }, + } + + defer gock.Off() + + gock.New(crmUrl). + Get("/customers/history"). + MatchParam("filter[startDate]", "2020-13-12"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters", "errors": {"children[startDate]": "Значение недопустимо."}}`) + + data, status, err := c.CustomersHistory(f) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_NotesNotes(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/customers/notes"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true, "notes": [{"id": 1}]}`) + data, status, err := c.CustomerNotes(NotesRequest{Page: 1}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -394,37 +709,66 @@ func TestClient_NotesNotes(t *testing.T) { if data.Success != true { t.Errorf("%v", err.ApiError()) } + + if len(data.Notes) == 0 { + t.Errorf("%v", err.ApiError()) + } } -func TestClient_NotesCreateDelete(t *testing.T) { +func TestClient_NotesNotes_Fail(t *testing.T) { c := client() - createCustomerResponse, createCustomerStatus, err := c.CustomerCreate(Customer{ - FirstName: "Понтелей", - LastName: "Турбин", - Patronymic: "Аристархович", - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), + defer gock.Off() + + gock.New(crmUrl). + Get("/customers/notes"). + MatchParam("filter[createdAtFrom]", "2020-13-12"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters", "errors": {"children[createdAtFrom]": "This value is not valid."}}`) + + data, status, err := c.CustomerNotes(NotesRequest{ + Filter: NotesFilter{CreatedAtFrom: "2020-13-12"}, }) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if createCustomerStatus != http.StatusCreated { - t.Errorf("%v", err.ApiError()) + if status < http.StatusBadRequest { + t.Error(statusFail) } - if createCustomerResponse.Success != true { - t.Errorf("%v", err.ApiError()) + if data.Success != false { + t.Error(successFail) } +} - noteCreateResponse, noteCreateStatus, err := c.CustomerNoteCreate(Note{ +func TestClient_NotesCreateDelete(t *testing.T) { + c := client() + + note := Note{ Text: "some text", ManagerID: user, Customer: &Customer{ - ID: createCustomerResponse.ID, + ID: 123, }, - }) + } + + defer gock.Off() + + jr, _ := json.Marshal(¬e) + + p := url.Values{ + "note": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/customers/notes/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + + noteCreateResponse, noteCreateStatus, err := c.CustomerNoteCreate(note) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -437,6 +781,17 @@ func TestClient_NotesCreateDelete(t *testing.T) { t.Errorf("%v", err.ApiError()) } + p = url.Values{ + "id": {string(1)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/api/v5/customers/notes/%d/delete", 1)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + noteDeleteResponse, noteDeleteStatus, err := c.CustomerNoteDelete(noteCreateResponse.ID) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -447,13 +802,84 @@ func TestClient_NotesCreateDelete(t *testing.T) { } if noteDeleteResponse.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_NotesCreateDelete_Fail(t *testing.T) { + c := client() + defer gock.Off() + + note := Note{ + Text: "some text", + ManagerID: user, + Customer: &Customer{}, + } + + jr, _ := json.Marshal(¬e) + + p := url.Values{ + "note": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/customers/notes/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the entity format", "errors": {"customer": "Set one of the following fields: id, externalId"}}`) + + data, status, err := c.CustomerNoteCreate(note) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } + + p = url.Values{ + "id": {string(iCodeFail)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/customers/notes/%d/delete", iCodeFail)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Note not found map"}`) + + noteDeleteResponse, noteDeleteStatus, err := c.CustomerNoteDelete(iCodeFail) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if noteDeleteStatus < http.StatusBadRequest { + t.Error(statusFail) + } + + if noteDeleteResponse.Success != false { + t.Error(successFail) + } +} + func TestClient_OrdersOrders(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/orders"). + MatchParam("filter[city]", "Москва"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true, "orders": [{"id": 1}]}`) + data, status, err := c.Orders(OrdersRequest{Filter: OrdersFilter{City: "Москва"}, Page: 1}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -464,10 +890,36 @@ func TestClient_OrdersOrders(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrdersOrders_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/orders"). + MatchParam("filter[attachments]", "7"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameterst", "errors": {"children[attachments]": "SThis value is not valid."}}`) + + data, status, err := c.Orders(OrdersRequest{Filter: OrdersFilter{Attachments: 7}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_OrderChange(t *testing.T) { c := client() @@ -481,6 +933,21 @@ func TestClient_OrderChange(t *testing.T) { Email: fmt.Sprintf("%s@example.com", random), } + defer gock.Off() + + jr, _ := json.Marshal(&f) + + p := url.Values{ + "order": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/orders/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + cr, sc, err := c.OrderCreate(f) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -497,6 +964,20 @@ func TestClient_OrderChange(t *testing.T) { f.ID = cr.ID f.CustomerComment = "test comment" + jr, _ = json.Marshal(&f) + + p = url.Values{ + "by": {string("id")}, + "order": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/%d/edit", f.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + ed, se, err := c.OrderEdit(f, "id") if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -510,6 +991,12 @@ func TestClient_OrderChange(t *testing.T) { t.Errorf("%v", err.ApiError()) } + gock.New(crmUrl). + Get(fmt.Sprintf("/orders/%s", f.ExternalID)). + MatchParam("by", "externalId"). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.Order(f.ExternalID, "externalId", "") if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -522,9 +1009,49 @@ func TestClient_OrderChange(t *testing.T) { if data.Success != true { t.Errorf("%v", err.ApiError()) } +} - if data.Order.ExternalID != f.ExternalID { - t.Errorf("%v", err.ApiError()) +func TestClient_OrderChange_Fail(t *testing.T) { + c := client() + + random := RandomString(8) + + f := Order{ + FirstName: "Понтелей", + LastName: "Турбин", + Patronymic: "Аристархович", + ExternalID: random, + Email: fmt.Sprintf("%s@example.com", random), + CustomerComment: "test comment", + } + + defer gock.Off() + + jr, _ := json.Marshal(&f) + + p := url.Values{ + "by": {string("id")}, + "order": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/%d/edit", f.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found map"}`) + + data, status, err := c.OrderEdit(f, "id") + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) } } @@ -541,6 +1068,21 @@ func TestClient_OrdersUpload(t *testing.T) { } } + defer gock.Off() + + jr, _ := json.Marshal(&orders) + + p := url.Values{ + "orders": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/orders/upload"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.OrdersUpload(orders) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -551,50 +1093,73 @@ func TestClient_OrdersUpload(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrdersUpload_Fail(t *testing.T) { + c := client() + + orders := []Order{ + { + FirstName: fmt.Sprintf("Name_%s", RandomString(8)), + LastName: fmt.Sprintf("Test_%s", RandomString(8)), + ExternalID: strconv.Itoa(iCodeFail), + Email: fmt.Sprintf("%s@example.com", RandomString(8)), + }, + } + + defer gock.Off() + + jr, _ := json.Marshal(&orders) + + p := url.Values{ + "orders": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/orders/upload"). + MatchType("url"). + BodyString(p.Encode()). + Reply(460). + BodyString(`{"success": false, "errorMsg": "Orders are loaded with errors"}`) + + data, status, err := c.OrdersUpload(orders) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_OrdersCombine(t *testing.T) { c := client() - dataFirst, status, err := c.OrderCreate(Order{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - }) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) + defer gock.Off() + + jr1, _ := json.Marshal(&Order{ID: 1}) + jr2, _ := json.Marshal(&Order{ID: 2}) + p := url.Values{ + "technique": {"ours"}, + "order": {string(jr1)}, + "resultOrder": {string(jr2)}, } - if status >= http.StatusBadRequest { - t.Errorf("%v", err.ApiError()) - } + gock.New(crmUrl). + Post("/orders/combine"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) - if dataFirst.Success != true { - t.Errorf("%v", err.ApiError()) - } - - dataSecond, status, err := c.OrderCreate(Order{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - }) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) - } - - if status >= http.StatusBadRequest { - t.Errorf("%v", err.ApiError()) - } - - if dataSecond.Success != true { - t.Errorf("%v", err.ApiError()) - } - - data, status, err := c.OrdersCombine("ours", Order{ID: dataFirst.ID}, Order{ID: dataSecond.ID}) + data, status, err := c.OrdersCombine("ours", Order{ID: 1}, Order{ID: 2}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -604,37 +1169,66 @@ func TestClient_OrdersCombine(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrdersCombine_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + jr, _ := json.Marshal(&Order{}) + p := url.Values{ + "technique": {"ours"}, + "order": {string(jr)}, + "resultOrder": {string(jr)}, + } + + gock.New(crmUrl). + Post("/orders/combine"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Invalid input parameters"}`) + + data, status, err := c.OrdersCombine("ours", Order{}, Order{}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_OrdersFixExternalIds(t *testing.T) { c := client() - f := Order{ - FirstName: fmt.Sprintf("Name_%s", RandomString(8)), - LastName: fmt.Sprintf("Test_%s", RandomString(8)), - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - } - - cr, sc, err := c.OrderCreate(f) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) - } - - if sc != http.StatusCreated { - t.Errorf("%v", err.ApiError()) - } - - if cr.Success != true { - t.Errorf("%v", err.ApiError()) - } orders := []IdentifiersPair{{ - ID: cr.ID, + ID: 123, ExternalID: RandomString(8), }} + defer gock.Off() + + jr, _ := json.Marshal(orders) + p := url.Values{ + "orders": {string(jr)}, + } + + gock.New(crmUrl). + Post("/orders/fix-external-ids"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + fx, fe, err := c.OrdersFixExternalIds(orders) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -645,13 +1239,54 @@ func TestClient_OrdersFixExternalIds(t *testing.T) { } if fx.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrdersFixExternalIds_Fail(t *testing.T) { + c := client() + orders := []IdentifiersPair{{ExternalID: RandomString(8)}} + + defer gock.Off() + + jr, _ := json.Marshal(orders) + p := url.Values{ + "orders": {string(jr)}, + } + + gock.New(crmUrl). + Post("/orders/fix-external-ids"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Invalid input parameters"}`) + + data, status, err := c.OrdersFixExternalIds(orders) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_OrdersHistory(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/orders/history"). + MatchParam("filter[sinceId]", "20"). + Reply(200). + BodyString(`{"success": true, "history": [{"id": 1}]}`) + data, status, err := c.OrdersHistory(OrdersHistoryRequest{Filter: OrdersHistoryFilter{SinceID: 20}}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -666,42 +1301,61 @@ func TestClient_OrdersHistory(t *testing.T) { } if len(data.History) == 0 { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrdersHistory_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/orders/history"). + MatchParam("filter[startDate]", "2020-13-12"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters", "errors": {"children[startDate]": "Значение недопустимо."}}`) + + data, status, err := c.OrdersHistory(OrdersHistoryRequest{Filter: OrdersHistoryFilter{StartDate: "2020-13-12"}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_PaymentCreateEditDelete(t *testing.T) { c := client() - order := Order{ - FirstName: "Понтелей", - LastName: "Турбин", - Patronymic: "Аристархович", - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - } - - createOrderResponse, status, err := c.OrderCreate(order) - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) - } - - if status != http.StatusCreated { - t.Errorf("%v", err.ApiError()) - } - - if createOrderResponse.Success != true { - t.Errorf("%v", err.ApiError()) - } - f := Payment{ Order: &Order{ - ID: createOrderResponse.ID, + ID: 123, }, Amount: 300, Type: "cash", } + defer gock.Off() + + jr, _ := json.Marshal(f) + p := url.Values{ + "payment": {string(jr)}, + } + + gock.New(crmUrl). + Post("/orders/payments/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + paymentCreateResponse, status, err := c.OrderPaymentCreate(f) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -720,6 +1374,18 @@ func TestClient_PaymentCreateEditDelete(t *testing.T) { Amount: 500, } + jr, _ = json.Marshal(k) + p = url.Values{ + "payment": {string(jr)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/payments/%d/edit", paymentCreateResponse.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + paymentEditResponse, status, err := c.OrderPaymentEdit(k, "id") if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -733,6 +1399,17 @@ func TestClient_PaymentCreateEditDelete(t *testing.T) { t.Errorf("%v", err.ApiError()) } + p = url.Values{ + "id": {string(paymentCreateResponse.ID)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/payments/%d/delete", paymentCreateResponse.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + paymentDeleteResponse, status, err := c.OrderPaymentDelete(paymentCreateResponse.ID) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -747,15 +1424,114 @@ func TestClient_PaymentCreateEditDelete(t *testing.T) { } } +func TestClient_PaymentCreateEditDelete_Fail(t *testing.T) { + c := client() + + f := Payment{ + Order: &Order{}, + Amount: 300, + Type: "cash", + } + + defer gock.Off() + + jr, _ := json.Marshal(f) + p := url.Values{ + "payment": {string(jr)}, + } + + gock.New(crmUrl). + Post("/orders/payments/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the entity format", "errors": {"order": "Set one of the following fields: id, externalId, number"}}`) + + data, status, err := c.OrderPaymentCreate(f) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } + + k := Payment{ + ID: iCodeFail, + Amount: 500, + } + + jr, _ = json.Marshal(k) + p = url.Values{ + "payment": {string(jr)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/payments/%d/edit", iCodeFail)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Payment not found"}`) + + paymentEditResponse, status, err := c.OrderPaymentEdit(k, "id") + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if paymentEditResponse.Success != false { + t.Error(successFail) + } + + p = url.Values{ + "id": {string(iCodeFail)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/payments/%d/delete", iCodeFail)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Payment not found"}`) + + paymentDeleteResponse, status, err := c.OrderPaymentDelete(iCodeFail) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if paymentDeleteResponse.Success != false { + t.Error(successFail) + } +} + func TestClient_TasksTasks(t *testing.T) { c := client() f := TasksRequest{ Filter: TasksFilter{ - Creators: []int{user}, + Creators: []int{123}, }, Page: 1, } + defer gock.Off() + + gock.New(crmUrl). + Get("/api/v5/tasks"). + MatchParam("filter[creators][]", "123"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true}`) data, status, err := c.Tasks(f) if err.RuntimeErr != nil { @@ -771,6 +1547,36 @@ func TestClient_TasksTasks(t *testing.T) { } } +func TestClient_TasksTasks_Fail(t *testing.T) { + c := client() + + f := TasksRequest{ + Filter: TasksFilter{ + Creators: []int{123123}, + }, + } + defer gock.Off() + + gock.New(crmUrl). + Get("/api/v5/tasks"). + MatchParam("filter[creators][]", "123123"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.Tasks(f) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_TaskChange(t *testing.T) { c := client() @@ -778,6 +1584,19 @@ func TestClient_TaskChange(t *testing.T) { Text: RandomString(15), PerformerID: user, } + defer gock.Off() + + jr, _ := json.Marshal(f) + p := url.Values{ + "task": {string(jr)}, + } + + gock.New(crmUrl). + Post("/tasks/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) cr, sc, err := c.TaskCreate(f) if err.RuntimeErr != nil { @@ -795,6 +1614,11 @@ func TestClient_TaskChange(t *testing.T) { f.ID = cr.ID f.Commentary = RandomString(20) + gock.New(crmUrl). + Get(fmt.Sprintf("/tasks/%d", f.ID)). + Reply(200). + BodyString(`{"success": true}`) + gt, sg, err := c.Task(f.ID) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -808,6 +1632,18 @@ func TestClient_TaskChange(t *testing.T) { t.Errorf("%v", err.ApiError()) } + jr, _ = json.Marshal(f) + p = url.Values{ + "task": {string(jr)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/tasks/%d/edit", f.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.TaskEdit(f) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -818,13 +1654,59 @@ func TestClient_TaskChange(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_TaskChange_Fail(t *testing.T) { + c := client() + + f := Task{ + Text: RandomString(15), + Commentary: RandomString(20), + } + + defer gock.Off() + + jr, _ := json.Marshal(f) + p := url.Values{ + "task": {string(jr)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/tasks/%d/edit", f.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Task is not loade", "errors": {"performerId": "This value should not be blank."}}`) + + data, status, err := c.TaskEdit(f) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_UsersUsers(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/users"). + MatchParam("filter[active]", "1"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.Users(UsersRequest{Filter: UsersFilter{Active: 1}, Page: 1}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -835,13 +1717,47 @@ func TestClient_UsersUsers(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_UsersUsers_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/users"). + MatchParam("filter[active]", "3"). + MatchParam("page", "1"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters", "errors": {"active": "he value you selected is not a valid choice."}}`) + + data, status, err := c.Users(UsersRequest{Filter: UsersFilter{Active: 3}, Page: 1}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_UsersUser(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get(fmt.Sprintf("/users/%d", user)). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.User(user) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -852,13 +1768,46 @@ func TestClient_UsersUser(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_UsersUser_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get(fmt.Sprintf("/users/%d", iCodeFail)). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + data, status, err := c.User(iCodeFail) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_UsersGroups(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/user-groups"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.UserGroups(UserGroupsRequest{Page: 1}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -876,6 +1825,19 @@ func TestClient_UsersGroups(t *testing.T) { func TestClient_UsersUpdate(t *testing.T) { c := client() + defer gock.Off() + + p := url.Values{ + "status": {string("busy")}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/users/%d/status", user)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.UserStatus(user, "busy") if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -886,13 +1848,51 @@ func TestClient_UsersUpdate(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_UsersUpdate_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + p := url.Values{ + "status": {string("busy")}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/users/%d/status", iCodeFail)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + data, status, err := c.UserStatus(iCodeFail, "busy") + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_StaticticsUpdate(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/statistic/update"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.StaticticsUpdate() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -910,6 +1910,13 @@ func TestClient_StaticticsUpdate(t *testing.T) { func TestClient_Countries(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/couriers"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.Couriers() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -927,6 +1934,13 @@ func TestClient_Countries(t *testing.T) { func TestClient_CostGroups(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/cost-groups"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.CostGroups() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -944,6 +1958,13 @@ func TestClient_CostGroups(t *testing.T) { func TestClient_CostItems(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/cost-items"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.CostItems() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -961,6 +1982,13 @@ func TestClient_CostItems(t *testing.T) { func TestClient_Couriers(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/couriers"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.Couriers() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -978,6 +2006,13 @@ func TestClient_Couriers(t *testing.T) { func TestClient_DeliveryService(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/delivery-services"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.DeliveryServices() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -995,6 +2030,13 @@ func TestClient_DeliveryService(t *testing.T) { func TestClient_DeliveryTypes(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/delivery-types"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.DeliveryTypes() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1012,6 +2054,13 @@ func TestClient_DeliveryTypes(t *testing.T) { func TestClient_LegalEntities(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/legal-entities"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.LegalEntities() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1029,6 +2078,13 @@ func TestClient_LegalEntities(t *testing.T) { func TestClient_OrderMethods(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/order-methods"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.OrderMethods() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1046,6 +2102,13 @@ func TestClient_OrderMethods(t *testing.T) { func TestClient_OrderTypes(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/order-types"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.OrderTypes() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1063,6 +2126,13 @@ func TestClient_OrderTypes(t *testing.T) { func TestClient_PaymentStatuses(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/payment-statuses"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.PaymentStatuses() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1080,6 +2150,13 @@ func TestClient_PaymentStatuses(t *testing.T) { func TestClient_PaymentTypes(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/payment-types"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.PaymentTypes() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1097,6 +2174,13 @@ func TestClient_PaymentTypes(t *testing.T) { func TestClient_PriceTypes(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/price-types"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.PriceTypes() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1114,6 +2198,13 @@ func TestClient_PriceTypes(t *testing.T) { func TestClient_ProductStatuses(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/product-statuses"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.ProductStatuses() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1131,6 +2222,13 @@ func TestClient_ProductStatuses(t *testing.T) { func TestClient_Statuses(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/statuses"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.Statuses() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1148,6 +2246,13 @@ func TestClient_Statuses(t *testing.T) { func TestClient_StatusGroups(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/status-groups"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.StatusGroups() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1165,6 +2270,13 @@ func TestClient_StatusGroups(t *testing.T) { func TestClient_Sites(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/sites"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.Sites() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1182,6 +2294,13 @@ func TestClient_Sites(t *testing.T) { func TestClient_Stores(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/reference/stores"). + Reply(200). + BodyString(`{"success": true}`) + data, st, err := c.Stores() if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1201,12 +2320,29 @@ func TestClient_CostGroupItemEdit(t *testing.T) { uid := RandomString(4) - data, st, err := c.CostGroupEdit(CostGroup{ + costGroup := CostGroup{ Code: fmt.Sprintf("cost-gr-%s", uid), Active: false, Color: "#da5c98", Name: fmt.Sprintf("CostGroup-%s", uid), - }) + } + + defer gock.Off() + + jr, _ := json.Marshal(&costGroup) + + p := url.Values{ + "costGroup": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/api/v5/reference/cost-groups/%s/edit", costGroup.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + data, st, err := c.CostGroupEdit(costGroup) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1219,14 +2355,29 @@ func TestClient_CostGroupItemEdit(t *testing.T) { t.Errorf("%v", err.ApiError()) } - idata, st, err := c.CostItemEdit(CostItem{ + costItem := CostItem{ Code: fmt.Sprintf("cost-it-%s", uid), Name: fmt.Sprintf("CostItem-%s", uid), Group: fmt.Sprintf("cost-gr-%s", uid), Type: "const", AppliesToOrders: true, Active: false, - }) + } + + jr, _ = json.Marshal(&costItem) + + p = url.Values{ + "costItem": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/api/v5/reference/cost-items/%s/edit", costItem.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + idata, st, err := c.CostItemEdit(costItem) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1236,10 +2387,85 @@ func TestClient_CostGroupItemEdit(t *testing.T) { } if idata.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_CostGroupItemEdit_Fail(t *testing.T) { + c := client() + + uid := RandomString(4) + costGroup := CostGroup{ + Code: fmt.Sprintf("cost-gr-%s", uid), + Active: false, + Name: fmt.Sprintf("CostGroup-%s", uid), + } + + defer gock.Off() + + jr, _ := json.Marshal(&costGroup) + + p := url.Values{ + "costGroup": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/cost-groups/%s/edit", costGroup.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.CostGroupEdit(costGroup) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } + + costItem := CostItem{ + Code: fmt.Sprintf("666cost-it-%s", uid), + Name: fmt.Sprintf("CostItem-%s", uid), + Group: fmt.Sprintf("cost-gr-%s", uid), + Type: "const", + AppliesToOrders: true, + Active: false, + } + + jr, _ = json.Marshal(&costItem) + + p = url.Values{ + "costItem": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/cost-items/%s/edit", costItem.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + idata, st, err := c.CostItemEdit(costItem) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if idata.Success != false { + t.Error(successFail) + } +} + func TestClient_Courier(t *testing.T) { c := client() @@ -1250,6 +2476,21 @@ func TestClient_Courier(t *testing.T) { LastName: fmt.Sprintf("%s", RandomString(5)), } + defer gock.Off() + + jr, _ := json.Marshal(&cur) + + p := url.Values{ + "courier": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/api/v5/reference/couriers/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + data, st, err := c.CourierCreate(cur) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1266,6 +2507,19 @@ func TestClient_Courier(t *testing.T) { cur.ID = data.ID cur.Patronymic = fmt.Sprintf("%s", RandomString(5)) + jr, _ = json.Marshal(&cur) + + p = url.Values{ + "courier": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/couriers/%d/edit", cur.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + idata, st, err := c.CourierEdit(cur) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1276,18 +2530,95 @@ func TestClient_Courier(t *testing.T) { } if idata.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_Courier_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + jr, _ := json.Marshal(&Courier{}) + + p := url.Values{ + "courier": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/api/v5/reference/couriers/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the entity format", "errors": {"firstName": "Specify the first name"}}`) + + data, st, err := c.CourierCreate(Courier{}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } + + cur := Courier{Patronymic: fmt.Sprintf("%s", RandomString(5))} + jr, _ = json.Marshal(&cur) + + p = url.Values{ + "courier": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/couriers/%d/edit", cur.ID)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "An attempt was made to edit a nonexistent record"}`) + + idata, st, err := c.CourierEdit(cur) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if idata.Success != false { + t.Error(successFail) + } +} + func TestClient_DeliveryServiceEdit(t *testing.T) { c := client() - data, st, err := c.DeliveryServiceEdit(DeliveryService{ + defer gock.Off() + + deliveryService := DeliveryService{ Active: false, Code: RandomString(5), Name: RandomString(5), - }) + } + + jr, _ := json.Marshal(&deliveryService) + + p := url.Values{ + "deliveryService": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/delivery-services/%s/edit", deliveryService.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true, "id": 1}`) + + data, st, err := c.DeliveryServiceEdit(deliveryService) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1297,23 +2628,77 @@ func TestClient_DeliveryServiceEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_DeliveryServiceEdit_Fail(t *testing.T) { + c := client() + defer gock.Off() + + deliveryService := DeliveryService{ + Active: false, + Name: RandomString(5), + } + + jr, _ := json.Marshal(&deliveryService) + + p := url.Values{ + "deliveryService": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/delivery-services/%s/edit", deliveryService.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.DeliveryServiceEdit(deliveryService) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_DeliveryTypeEdit(t *testing.T) { c := client() x := []string{"cash", "bank-card"} - data, st, err := c.DeliveryTypeEdit(DeliveryType{ + defer gock.Off() + + deliveryType := DeliveryType{ Active: false, Code: RandomString(5), Name: RandomString(5), DefaultCost: 300, PaymentTypes: x, DefaultForCrm: false, - }) + } + + jr, _ := json.Marshal(&deliveryType) + + p := url.Values{ + "deliveryType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/delivery-types/%s/edit", deliveryType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.DeliveryTypeEdit(deliveryType) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1323,19 +2708,76 @@ func TestClient_DeliveryTypeEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_DeliveryTypeEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + deliveryType := DeliveryType{ + Active: false, + Name: RandomString(5), + DefaultCost: 300, + PaymentTypes: []string{"cash", "bank-card"}, + DefaultForCrm: false, + } + + jr, _ := json.Marshal(&deliveryType) + + p := url.Values{ + "deliveryType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/delivery-types/%s/edit", deliveryType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.DeliveryTypeEdit(deliveryType) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_OrderMethodEdit(t *testing.T) { c := client() + defer gock.Off() - data, st, err := c.OrderMethodEdit(OrderMethod{ + orderMethod := OrderMethod{ Code: RandomString(5), Name: RandomString(5), Active: false, DefaultForCRM: false, - }) + } + + jr, _ := json.Marshal(&orderMethod) + + p := url.Values{ + "orderMethod": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/order-methods/%s/edit", orderMethod.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.OrderMethodEdit(orderMethod) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1345,19 +2787,74 @@ func TestClient_OrderMethodEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrderMethodEdit_Fail(t *testing.T) { + c := client() + defer gock.Off() + + orderMethod := OrderMethod{ + Name: RandomString(5), + Active: false, + DefaultForCRM: false, + } + + jr, _ := json.Marshal(&orderMethod) + + p := url.Values{ + "orderMethod": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/order-methods/%s/edit", orderMethod.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.OrderMethodEdit(orderMethod) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_OrderTypeEdit(t *testing.T) { c := client() - data, st, err := c.OrderTypeEdit(OrderType{ + defer gock.Off() + + orderType := OrderType{ Code: RandomString(5), Name: RandomString(5), Active: false, DefaultForCRM: false, - }) + } + + jr, _ := json.Marshal(&orderType) + + p := url.Values{ + "orderType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/order-types/%s/edit", orderType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.OrderTypeEdit(orderType) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1367,21 +2864,75 @@ func TestClient_OrderTypeEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_OrderTypeEdit_Fail(t *testing.T) { + c := client() + defer gock.Off() + + orderType := OrderType{ + Name: RandomString(5), + Active: false, + DefaultForCRM: false, + } + jr, _ := json.Marshal(&orderType) + + p := url.Values{ + "orderType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/order-types/%s/edit", orderType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.OrderTypeEdit(orderType) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_PaymentStatusEdit(t *testing.T) { c := client() - data, st, err := c.PaymentStatusEdit(PaymentStatus{ + defer gock.Off() + + paymentStatus := PaymentStatus{ Code: RandomString(5), Name: RandomString(5), Active: false, DefaultForCRM: false, PaymentTypes: []string{"cash"}, PaymentComplete: false, - }) + } + + jr, _ := json.Marshal(&paymentStatus) + + p := url.Values{ + "paymentStatus": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/payment-statuses/%s/edit", paymentStatus.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.PaymentStatusEdit(paymentStatus) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1391,19 +2942,75 @@ func TestClient_PaymentStatusEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_PaymentStatusEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + paymentStatus := PaymentStatus{ + Name: RandomString(5), + Active: false, + DefaultForCRM: false, + PaymentTypes: []string{"cash"}, + PaymentComplete: false, + } + jr, _ := json.Marshal(&paymentStatus) + + p := url.Values{ + "paymentStatus": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/payment-statuses/%s/edit", paymentStatus.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.PaymentStatusEdit(paymentStatus) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_PaymentTypeEdit(t *testing.T) { c := client() - data, st, err := c.PaymentTypeEdit(PaymentType{ + defer gock.Off() + + paymentType := PaymentType{ Code: RandomString(5), Name: RandomString(5), Active: false, DefaultForCRM: false, - }) + } + jr, _ := json.Marshal(&paymentType) + + p := url.Values{ + "paymentType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/payment-types/%s/edit", paymentType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.PaymentTypeEdit(paymentType) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1413,18 +3020,72 @@ func TestClient_PaymentTypeEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_PaymentTypeEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + paymentType := PaymentType{ + Name: RandomString(5), + Active: false, + DefaultForCRM: false, + } + jr, _ := json.Marshal(&paymentType) + + p := url.Values{ + "paymentType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/payment-types/%s/edit", paymentType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.PaymentTypeEdit(paymentType) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_PriceTypeEdit(t *testing.T) { c := client() - data, st, err := c.PriceTypeEdit(PriceType{ + defer gock.Off() + + priceType := PriceType{ Code: RandomString(5), Name: RandomString(5), Active: false, - }) + } + jr, _ := json.Marshal(&priceType) + + p := url.Values{ + "priceType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/price-types/%s/edit", priceType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.PriceTypeEdit(priceType) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1438,15 +3099,67 @@ func TestClient_PriceTypeEdit(t *testing.T) { } } +func TestClient_PriceTypeEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + priceType := PriceType{ + Name: RandomString(5), + Active: false, + } + jr, _ := json.Marshal(&priceType) + + p := url.Values{ + "priceType": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/price-types/%s/edit", priceType.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.PriceTypeEdit(priceType) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_ProductStatusEdit(t *testing.T) { c := client() - data, st, err := c.ProductStatusEdit(ProductStatus{ + defer gock.Off() + + productStatus := ProductStatus{ Code: RandomString(5), Name: RandomString(5), Active: false, CancelStatus: false, - }) + } + jr, _ := json.Marshal(&productStatus) + + p := url.Values{ + "productStatus": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/product-statuses/%s/edit", productStatus.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.ProductStatusEdit(productStatus) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1460,15 +3173,68 @@ func TestClient_ProductStatusEdit(t *testing.T) { } } +func TestClient_ProductStatusEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + productStatus := ProductStatus{ + Name: RandomString(5), + Active: false, + CancelStatus: false, + } + jr, _ := json.Marshal(&productStatus) + + p := url.Values{ + "productStatus": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/product-statuses/%s/edit", productStatus.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.ProductStatusEdit(productStatus) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_StatusEdit(t *testing.T) { c := client() - data, st, err := c.StatusEdit(Status{ + defer gock.Off() + + status := Status{ Code: RandomString(5), Name: RandomString(5), Active: false, Group: "new", - }) + } + jr, _ := json.Marshal(&status) + + p := url.Values{ + "status": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/statuses/%s/edit", status.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.StatusEdit(status) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1478,38 +3244,144 @@ func TestClient_StatusEdit(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_StatusEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + status := Status{ + Name: RandomString(5), + Active: false, + Group: "new", + } + + jr, _ := json.Marshal(&status) + + p := url.Values{ + "status": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/statuses/%s/edit", status.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.StatusEdit(status) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if st < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_SiteEdit(t *testing.T) { c := client() - data, _, err := c.SiteEdit(Site{ + defer gock.Off() + + site := Site{ Code: RandomString(5), Name: RandomString(5), URL: fmt.Sprintf("https://%s.example.com", RandomString(4)), LoadFromYml: false, - }) + } + jr, _ := json.Marshal(&site) + + p := url.Values{ + "site": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/sites/%s/edit", site.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, _, err := c.SiteEdit(site) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if data.Success == false { + t.Errorf("%v", err.ApiError()) + } +} + +func TestClient_SiteEdit_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + site := Site{ + Code: RandomString(5), + Name: RandomString(5), + LoadFromYml: false, + } + + jr, _ := json.Marshal(&site) + + p := url.Values{ + "site": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/sites/%s/edit", site.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(405). + BodyString(`{"success": false, "errorMsg": "Method Not Allowed"}`) + + data, _, err := c.SiteEdit(site) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } if data.Success != false { - t.Errorf("%v", err.ApiError()) + t.Error(successFail) } } func TestClient_StoreEdit(t *testing.T) { c := client() - data, st, err := c.StoreEdit(Store{ + defer gock.Off() + + store := Store{ Code: RandomString(5), Name: RandomString(5), Active: false, Type: "store-type-warehouse", InventoryType: "integer", - }) + } + + jr, _ := json.Marshal(&store) + + p := url.Values{ + "store": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/stores/%s/edit", store.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + data, st, err := c.StoreEdit(store) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1523,47 +3395,69 @@ func TestClient_StoreEdit(t *testing.T) { } } -func TestClient_PackChange(t *testing.T) { +func TestClient_StoreEdit_Fail(t *testing.T) { c := client() - o, status, err := c.OrderCreate(Order{ - FirstName: "Понтелей", - LastName: "Турбин", - Patronymic: "Аристархович", - ExternalID: RandomString(8), - Email: fmt.Sprintf("%s@example.com", RandomString(8)), - Items: []OrderItem{{Offer: Offer{ID: 25472}, Quantity: 5}}, - }) + defer gock.Off() + + store := Store{ + Name: RandomString(5), + Active: false, + Type: "store-type-warehouse", + InventoryType: "integer", + } + + jr, _ := json.Marshal(&store) + + p := url.Values{ + "store": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/reference/stores/%s/edit", store.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + data, st, err := c.StoreEdit(store) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if status != http.StatusCreated { - t.Errorf("%v", err.ApiError()) + if st < http.StatusBadRequest { + t.Error(statusFail) } - if o.Success != true { - t.Errorf("%v", err.ApiError()) + if data.Success != false { + t.Error(successFail) } +} - g, status, err := c.Order(strconv.Itoa(o.ID), "id", "") - if err.RuntimeErr != nil { - t.Errorf("%v", err.Error()) - } +func TestClient_PackChange(t *testing.T) { + c := client() + defer gock.Off() - if status != http.StatusOK { - t.Errorf("%v", err.ApiError()) - } - - if o.Success != true { - t.Errorf("%v", err.ApiError()) - } - - p, status, err := c.PackCreate(Pack{ + pack := Pack{ Store: "test-store", - ItemID: g.Order.Items[0].ID, + ItemID: 123, Quantity: 1, - }) + } + + jr, _ := json.Marshal(&pack) + + pr := url.Values{ + "pack": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/orders/packs/create"). + MatchType("url"). + BodyString(pr.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + + p, status, err := c.PackCreate(pack) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1576,6 +3470,11 @@ func TestClient_PackChange(t *testing.T) { t.Errorf("%v", err.ApiError()) } + gock.New(crmUrl). + Get(fmt.Sprintf("/orders/packs/%d", p.ID)). + Reply(200). + BodyString(`{"success": true}`) + s, status, err := c.Pack(p.ID) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1589,6 +3488,19 @@ func TestClient_PackChange(t *testing.T) { t.Errorf("%v", err.ApiError()) } + jr, _ = json.Marshal(&Pack{ID: p.ID, Quantity: 2}) + + pr = url.Values{ + "pack": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/packs/%d/edit", p.ID)). + MatchType("url"). + BodyString(pr.Encode()). + Reply(200). + BodyString(`{"success": true}`) + e, status, err := c.PackEdit(Pack{ID: p.ID, Quantity: 2}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1602,6 +3514,12 @@ func TestClient_PackChange(t *testing.T) { t.Errorf("%v", err.ApiError()) } + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/packs/%d/delete", p.ID)). + MatchType("url"). + Reply(200). + BodyString(`{"success": true}`) + d, status, err := c.PackDelete(p.ID) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1616,9 +3534,118 @@ func TestClient_PackChange(t *testing.T) { } } +func TestClient_PackChange_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + pack := Pack{ + Store: "test-store", + ItemID: iCodeFail, + Quantity: 1, + } + + jr, _ := json.Marshal(&pack) + + pr := url.Values{ + "pack": {string(jr[:])}, + } + + gock.New(crmUrl). + Post("/orders/packs/create"). + MatchType("url"). + BodyString(pr.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the entity format"}`) + + p, status, err := c.PackCreate(pack) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if p.Success != false { + t.Error(successFail) + } + + gock.New(crmUrl). + Get(fmt.Sprintf("/orders/packs/%d", iCodeFail)). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the entity format"}`) + + s, status, err := c.Pack(iCodeFail) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if s.Success != false { + t.Error(successFail) + } + + jr, _ = json.Marshal(&Pack{ID: iCodeFail, Quantity: 2}) + + pr = url.Values{ + "pack": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/packs/%d/edit", iCodeFail)). + MatchType("url"). + BodyString(pr.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Pack with id 123123 not found"}`) + + e, status, err := c.PackEdit(Pack{ID: iCodeFail, Quantity: 2}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if e.Success != false { + t.Error(successFail) + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/orders/packs/%d/delete", iCodeFail)). + MatchType("url"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Pack not found"}`) + + d, status, err := c.PackDelete(iCodeFail) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if d.Success != false { + t.Error(successFail) + } +} + func TestClient_PacksHistory(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/orders/packs/history"). + MatchParam("filter[sinceId]", "5"). + Reply(200). + BodyString(`{"success": true, "history": [{"id": 1}]}`) + data, status, err := c.PacksHistory(PacksHistoryRequest{Filter: OrdersHistoryFilter{SinceID: 5}}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1633,13 +3660,47 @@ func TestClient_PacksHistory(t *testing.T) { } if len(data.History) == 0 { + t.Errorf("%v", err.ApiError()) } } +func TestClient_PacksHistory_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/orders/packs/history"). + MatchParam("filter[startDate]", "2020-13-12"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.PacksHistory(PacksHistoryRequest{Filter: OrdersHistoryFilter{StartDate: "2020-13-12"}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_Packs(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/orders/packs"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.Packs(PacksRequest{Filter: PacksFilter{}, Page: 1}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1650,13 +3711,48 @@ func TestClient_Packs(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_Packs_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/orders/packs"). + MatchParam("filter[shipmentDateFrom]", "2020-13-12"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.Packs(PacksRequest{Filter: PacksFilter{ShipmentDateFrom: "2020-13-12"}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_Inventories(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/store/inventories"). + MatchParam("filter[details]", "1"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true, "id": 1}`) + data, status, err := c.Inventories(InventoriesRequest{Filter: InventoriesFilter{Details: 1}, Page: 1}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1667,13 +3763,46 @@ func TestClient_Inventories(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_Inventories_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/store/inventories"). + MatchParam("filter[sites][]", codeFail). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.Inventories(InventoriesRequest{Filter: InventoriesFilter{Sites: []string{codeFail}}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_Segments(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/segments"). + Reply(200). + BodyString(`{"success": true, "id": 1}`) + data, status, err := c.Segments(SegmentsRequest{}) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1684,17 +3813,45 @@ func TestClient_Segments(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_Segments_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/segments"). + MatchParam("filter[active]", "3"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.Segments(SegmentsRequest{Filter: SegmentsFilter{Active: 3}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + func TestClient_IntegrationModule(t *testing.T) { c := client() name := RandomString(5) code := RandomString(8) - m, status, err := c.IntegrationModuleEdit(IntegrationModule{ + defer gock.Off() + + integrationModule := IntegrationModule{ Code: code, IntegrationCode: code, Active: false, @@ -1703,7 +3860,22 @@ func TestClient_IntegrationModule(t *testing.T) { BaseURL: fmt.Sprintf("http://example.com/%s", name), ClientID: RandomString(10), Logo: "https://cdn.worldvectorlogo.com/logos/github-icon.svg", - }) + } + + jr, _ := json.Marshal(&integrationModule) + + pr := url.Values{ + "integrationModule": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/integration-modules/%s/edit", integrationModule.Code)). + MatchType("url"). + BodyString(pr.Encode()). + Reply(201). + BodyString(`{"success": true}`) + + m, status, err := c.IntegrationModuleEdit(integrationModule) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } @@ -1716,6 +3888,11 @@ func TestClient_IntegrationModule(t *testing.T) { t.Errorf("%v", err.ApiError()) } + gock.New(crmUrl). + Get(fmt.Sprintf("/integration-modules/%s", code)). + Reply(200). + BodyString(`{"success": true}`) + g, status, err := c.IntegrationModule(code) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1730,36 +3907,80 @@ func TestClient_IntegrationModule(t *testing.T) { } } -func TestClient_IntegrationModuleFail(t *testing.T) { +func TestClient_IntegrationModule_Fail(t *testing.T) { c := client() + + name := RandomString(5) code := RandomString(8) - m, status, err := c.IntegrationModuleEdit(IntegrationModule{ - Code: code, - }) - if err.RuntimeErr == nil { + defer gock.Off() + + integrationModule := IntegrationModule{ + IntegrationCode: code, + Active: false, + Name: fmt.Sprintf("Integration module %s", name), + AccountURL: fmt.Sprintf("http://example.com/%s/account", name), + BaseURL: fmt.Sprintf("http://example.com/%s", name), + ClientID: RandomString(10), + Logo: "https://cdn.worldvectorlogo.com/logos/github-icon.svg", + } + + jr, _ := json.Marshal(&integrationModule) + + pr := url.Values{ + "integrationModule": {string(jr[:])}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/integration-modules/%s/edit", integrationModule.Code)). + MatchType("url"). + BodyString(pr.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + m, status, err := c.IntegrationModuleEdit(integrationModule) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) } if status < http.StatusBadRequest { + t.Error(statusFail) } if m.Success != false { + t.Error(successFail) } - g, status, err := c.IntegrationModule(RandomString(12)) - if err.RuntimeErr == nil { + gock.New(crmUrl). + Get(fmt.Sprintf("/integration-modules/%s", code)). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + g, status, err := c.IntegrationModule(code) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) } if status < http.StatusBadRequest { + t.Error(statusFail) } if g.Success != false { + t.Error(successFail) } } func TestClient_ProductsGroup(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/store/product-groups"). + MatchParam("filter[active]", "1"). + Reply(200). + BodyString(`{"success": true}`) + g, status, err := c.ProductsGroup(ProductsGroupsRequest{ Filter: ProductsGroupsFilter{ Active: 1, @@ -1774,13 +3995,52 @@ func TestClient_ProductsGroup(t *testing.T) { } if g.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_ProductsGroup_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/store/product-groups"). + MatchParam("filter[active]", "3"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + g, status, err := c.ProductsGroup(ProductsGroupsRequest{ + Filter: ProductsGroupsFilter{ + Active: 3, + }, + }) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if g.Success != false { + t.Error(successFail) + } +} + func TestClient_Products(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/store/products"). + MatchParam("filter[active]", "1"). + MatchParam("filter[minPrice]", "1"). + Reply(200). + BodyString(`{"success": true}`) + g, status, err := c.Products(ProductsRequest{ Filter: ProductsFilter{ Active: 1, @@ -1796,16 +4056,52 @@ func TestClient_Products(t *testing.T) { } if g.Success != true { + t.Errorf("%v", err.ApiError()) } } +func TestClient_Products_Fail(t *testing.T) { + c := client() + + defer gock.Off() + + gock.New(crmUrl). + Get("/store/products"). + MatchParam("filter[active]", "3"). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + g, status, err := c.Products(ProductsRequest{ + Filter: ProductsFilter{Active: 3}, + }) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if g.Success != false { + t.Error(successFail) + } +} + func TestClient_ProductsProperties(t *testing.T) { c := client() sites := make([]string, 1) sites[0] = os.Getenv("RETAILCRM_SITE") + defer gock.Off() + + gock.New(crmUrl). + Get("/store/products"). + MatchParam("filter[sites][]", sites[0]). + Reply(200). + BodyString(`{"success": true}`) + g, status, err := c.ProductsProperties(ProductsPropertiesRequest{ Filter: ProductsPropertiesFilter{ Sites: sites, @@ -1827,6 +4123,14 @@ func TestClient_ProductsProperties(t *testing.T) { func TestClient_DeliveryShipments(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/delivery/shipments"). + MatchParam("filter[dateFrom]", "2017-10-10"). + Reply(200). + BodyString(`{"success": true}`) + g, status, err := c.DeliveryShipments(DeliveryShipmentsRequest{ Filter: ShipmentFilter{ DateFrom: "2017-10-10", @@ -1845,15 +4149,61 @@ func TestClient_DeliveryShipments(t *testing.T) { } } -func TestClient_CostCreate(t *testing.T) { +func TestClient_DeliveryShipments_Fail(t *testing.T) { c := client() - data, status, err := c.CostCreate(CostRecord{ + defer gock.Off() + + gock.New(crmUrl). + Get("/delivery/shipments"). + MatchParam("filter[stores][]", codeFail). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + g, status, err := c.DeliveryShipments(DeliveryShipmentsRequest{ + Filter: ShipmentFilter{ + Stores: []string{codeFail}, + }, + }) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if g.Success != false { + t.Error(successFail) + } +} + +func TestClient_Cost(t *testing.T) { + c := client() + + costRecord := CostRecord{ DateFrom: "2018-04-02", DateTo: "2018-04-02", Summ: 124, CostItem: "seo", - }) + } + + defer gock.Off() + + str, _ := json.Marshal(costRecord) + + p := url.Values{ + "cost": {string(str)}, + } + + gock.New(crmUrl). + Post("/costs/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 123}`) + + data, status, err := c.CostCreate(costRecord) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1867,13 +4217,17 @@ func TestClient_CostCreate(t *testing.T) { t.Errorf("%v", err.ApiError()) } - id = data.ID -} + id := data.ID -func TestClient_Costs(t *testing.T) { - c := client() + gock.New(crmUrl). + Get("/costs"). + MatchParam("filter[ids][]", strconv.Itoa(id)). + MatchParam("limit", "20"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true}`) - data, status, err := c.Costs(CostsRequest{ + costs, status, err := c.Costs(CostsRequest{ Filter: CostsFilter{ Ids: []string{strconv.Itoa(id)}, }, @@ -1889,15 +4243,16 @@ func TestClient_Costs(t *testing.T) { t.Errorf("%v", err.ApiError()) } - if data.Success != true { + if costs.Success != true { t.Errorf("%v", err.ApiError()) } -} -func TestClient_Cost(t *testing.T) { - c := client() + gock.New(crmUrl). + Get(fmt.Sprintf("/costs/%d", id)). + Reply(200). + BodyString(`{"success": true}`) - data, status, err := c.Cost(id) + cost, status, err := c.Cost(id) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1907,57 +4262,211 @@ func TestClient_Cost(t *testing.T) { t.Errorf("%v", err.ApiError()) } - if data.Success != true { + if cost.Success != true { + t.Errorf("%v", err.ApiError()) + } + + costRecord.DateFrom = "2018-04-09" + costRecord.DateTo = "2018-04-09" + costRecord.Summ = 421 + + str, _ = json.Marshal(costRecord) + + p = url.Values{ + "cost": {string(str)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/costs/%d/edit", id)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + costEdit, status, err := c.CostEdit(id, costRecord) + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if !statuses[status] { + t.Errorf("%v", err.ApiError()) + } + + if costEdit.Success != true { + t.Errorf("%v", err.ApiError()) + } + + j, _ := json.Marshal(&id) + + p = url.Values{ + "costs": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/costs/%d/delete", id)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + costDelete, status, err := c.CostDelete(id) + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if !statuses[status] { + t.Errorf("%v", err.ApiError()) + } + + if costDelete.Success != true { t.Errorf("%v", err.ApiError()) } } -func TestClient_CostEdit(t *testing.T) { +func TestClient_Cost_Fail(t *testing.T) { c := client() - data, status, err := c.CostEdit(id, CostRecord{ - DateFrom: "2018-04-09", - DateTo: "2018-04-09", - Summ: 421, + defer gock.Off() + + costRecord := CostRecord{ + DateFrom: "2018-13-13", + DateTo: "2012-04-02", + Summ: 124, CostItem: "seo", - Order: nil, + } + + str, _ := json.Marshal(costRecord) + + p := url.Values{ + "cost": {string(str)}, + } + + gock.New(crmUrl). + Post("/costs/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Cost is not loaded"}`) + + data, status, err := c.CostCreate(costRecord) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + id := data.ID + + gock.New(crmUrl). + Get("/costs"). + MatchParam("filter[sites][]", codeFail). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + costs, status, err := c.Costs(CostsRequest{ + Filter: CostsFilter{Sites: []string{codeFail}}, }) - if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if !statuses[status] { - t.Errorf("%v", err.ApiError()) + if status < http.StatusBadRequest { + t.Error(statusFail) } - if data.Success != true { - t.Errorf("%v", err.ApiError()) + if costs.Success != false { + t.Error(successFail) } -} -func TestClient_CostDelete(t *testing.T) { - c := client() - - data, status, err := c.CostDelete(id) + gock.New(crmUrl). + Get(fmt.Sprintf("/costs/%d", id)). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + cost, status, err := c.Cost(id) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if !statuses[status] { - t.Errorf("%v", err.ApiError()) + if status < http.StatusBadRequest { + t.Error(statusFail) } - if data.Success != true { - t.Errorf("%v", err.ApiError()) + if cost.Success != false { + t.Error(successFail) + } + + costRecord.DateFrom = "2020-13-12" + costRecord.DateTo = "2012-04-09" + costRecord.Summ = 421 + costRecord.Sites = []string{codeFail} + + str, _ = json.Marshal(costRecord) + + p = url.Values{ + "cost": {string(str)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/costs/%d/edit", id)). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Cost is not loaded"}`) + + costEdit, status, err := c.CostEdit(id, costRecord) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if costEdit.Success != false { + t.Error(successFail) + } + + j, _ := json.Marshal(&id) + + p = url.Values{ + "costs": {string(j)}, + } + gock.New(crmUrl). + Post(fmt.Sprintf("/costs/%d/delete", id)). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + costDelete, status, err := c.CostDelete(id) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if costDelete.Success != false { + t.Error(successFail) } } func TestClient_CostsUpload(t *testing.T) { c := client() - data, status, err := c.CostsUpload([]CostRecord{ + defer gock.Off() + + costsUpload := []CostRecord{ { Source: nil, DateFrom: "2018-04-02", @@ -1975,7 +4484,22 @@ func TestClient_CostsUpload(t *testing.T) { Order: nil, Sites: []string{"retailcrm-ru"}, }, - }) + } + + j, _ := json.Marshal(&costsUpload) + + p := url.Values{ + "costs": {string(j)}, + } + + gock.New(crmUrl). + Post("/costs/upload"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "uploadedCosts": [1, 2]}`) + + data, status, err := c.CostsUpload(costsUpload) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -1986,32 +4510,122 @@ func TestClient_CostsUpload(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } - ids = data.UploadedCosts + ids := data.UploadedCosts + + j, _ = json.Marshal(&ids) + + p = url.Values{ + "ids": {string(j)}, + } + + gock.New(crmUrl). + Post("/costs/delete"). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + costsDelete, status, err := c.CostsDelete(ids) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if !statuses[status] { + t.Errorf("%v", err.ApiError()) + } + + if costsDelete.Success != true { + + t.Errorf("%v", err.ApiError()) + } } -func TestClient_CostsDelete(t *testing.T) { +func TestClient_CostsUpload_Fail(t *testing.T) { c := client() - data, status, err := c.CostsDelete(ids) + defer gock.Off() + + costsUpload := []CostRecord{ + { + Source: nil, + DateFrom: "2018-04-03", + DateTo: "2018-04-03", + Summ: 125, + CostItem: "seo", + Order: nil, + Sites: []string{codeFail}, + }, + } + + j, _ := json.Marshal(&costsUpload) + + p := url.Values{ + "costs": {string(j)}, + } + + gock.New(crmUrl). + Post("/costs/upload"). + MatchType("url"). + BodyString(p.Encode()). + Reply(460). + BodyString(`{"success": false, "errorMsg": "Costs are loaded with errors"}`) + + data, status, err := c.CostsUpload(costsUpload) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if !statuses[status] { - t.Errorf("%v", err.ApiError()) + if status < http.StatusBadRequest { + t.Error(statusFail) } - if data.Success != true { - t.Errorf("%v", err.ApiError()) + if data.Success != false { + t.Error(successFail) + } + + ids := data.UploadedCosts + + j, _ = json.Marshal(&ids) + + p = url.Values{ + "ids": {string(j)}, + } + + gock.New(crmUrl). + Post("/costs/delete"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Expected array, but got NULL: null"}`) + + costsDelete, status, err := c.CostsDelete(ids) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if costsDelete.Success != false { + t.Error(successFail) } } func TestClient_CustomFields(t *testing.T) { c := client() + defer gock.Off() + + gock.New(crmUrl). + Get("/custom-fields"). + Reply(200). + BodyString(`{"success": true}`) + data, status, err := c.CustomFields(CustomFieldsRequest{}) if err.RuntimeErr != nil { @@ -2026,10 +4640,86 @@ func TestClient_CustomFields(t *testing.T) { t.Errorf("%v", err.ApiError()) } } -func TestClient_CustomDictionaries(t *testing.T) { + +func TestClient_CustomFields_Fail(t *testing.T) { c := client() - data, status, err := c.CustomDictionaries(CustomDictionariesRequest{ + defer gock.Off() + + gock.New(crmUrl). + Get("/custom-fields"). + MatchParam("filter[type]", codeFail). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.CustomFields(CustomFieldsRequest{Filter: CustomFieldsFilter{Type: codeFail}}) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if data.Success != false { + t.Error(successFail) + } +} + +func TestClient_CustomDictionariesCreate(t *testing.T) { + c := client() + + code := "test_" + RandomString(8) + + defer gock.Off() + + customDictionary := CustomDictionary{ + Name: "test2", + Code: code, + Elements: []Element{ + { + Name: "test", + Code: "test", + }, + }, + } + + j, _ := json.Marshal(&customDictionary) + + p := url.Values{ + "customDictionary": {string(j)}, + } + + gock.New(crmUrl). + Post("/custom-fields/dictionaries/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + + data, status, err := c.CustomDictionariesCreate(customDictionary) + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if !statuses[status] { + t.Errorf("%v", err.ApiError()) + } + + if data.Success != true { + t.Errorf("%v", err.ApiError()) + } + + gock.New(crmUrl). + Get("/custom-fields/dictionaries"). + MatchParam("filter[name]", "test"). + MatchParam("limit", "10"). + MatchParam("page", "1"). + Reply(200). + BodyString(`{"success": true}`) + + cds, status, err := c.CustomDictionaries(CustomDictionariesRequest{ Filter: CustomDictionariesFilter{ Name: "test", }, @@ -2042,18 +4732,51 @@ func TestClient_CustomDictionaries(t *testing.T) { } if !statuses[status] { + t.Errorf("%v", err.ApiError()) } - if data.Success != true { + if cds.Success != true { t.Errorf("%v", err.ApiError()) } -} -func TestClient_CustomDictionary(t *testing.T) { - c := client() + gock.New(crmUrl). + Get(fmt.Sprintf("/custom-fields/dictionaries/%s", code)). + Reply(200). + BodyString(`{"success": true}`) - data, status, err := c.CustomDictionary("test2") + cd, status, err := c.CustomDictionary(code) + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if cd.Success != true { + t.Errorf("%v", err.ApiError()) + } + + customDictionary.Name = "test223" + customDictionary.Elements = []Element{ + { + Name: "test3", + Code: "test3", + }, + } + + j, _ = json.Marshal(&customDictionary) + + p = url.Values{ + "customDictionary": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/custom-fields/dictionaries/%s/edit", customDictionary.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + cde, status, err := c.CustomDictionaryEdit(customDictionary) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -2063,15 +4786,17 @@ func TestClient_CustomDictionary(t *testing.T) { t.Errorf("%v", err.ApiError()) } - if data.Success != true { + if cde.Success != true { t.Errorf("%v", err.ApiError()) } } -func TestClient_CustomDictionariesCreate(t *testing.T) { +func TestClient_CustomDictionariesCreate_Fail(t *testing.T) { c := client() - data, status, err := c.CustomDictionariesCreate(CustomDictionary{ + defer gock.Off() + + customDictionary := CustomDictionary{ Name: "test2", Code: RandomString(8), Elements: []Element{ @@ -2080,59 +4805,106 @@ func TestClient_CustomDictionariesCreate(t *testing.T) { Code: "test", }, }, - }) + } + j, _ := json.Marshal(&customDictionary) + + p := url.Values{ + "customDictionary": {string(j)}, + } + + gock.New(crmUrl). + Post("/custom-fields/dictionaries/create"). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.CustomDictionariesCreate(customDictionary) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if !statuses[status] { - t.Errorf("%v", err.ApiError()) + if data.Success != false { + t.Error(successFail) } - if data.Success != true { - t.Errorf("%v", err.ApiError()) + gock.New(crmUrl). + Get(fmt.Sprintf("/custom-fields/dictionaries/%s", codeFail)). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + cd, status, err := c.CustomDictionary(codeFail) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) } -} -func TestClient_CustomDictionaryEdit(t *testing.T) { - c := client() + if cd.Success != false { + t.Error(successFail) + } - data, status, err := c.CustomDictionaryEdit(CustomDictionary{ - Name: "test223", - Code: "test2", - Elements: []Element{ - { - Name: "test3", - Code: "test3", - }, + customDictionary.Name = "test223" + customDictionary.Elements = []Element{ + { + Name: "test3", }, - }) + } + j, _ = json.Marshal(&customDictionary) + + p = url.Values{ + "customDictionary": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/custom-fields/dictionaries/%s/edit", customDictionary.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + cde, status, err := c.CustomDictionaryEdit(customDictionary) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if !statuses[status] { + if status < http.StatusBadRequest{ t.Errorf("%v", err.ApiError()) } - if data.Success != true { - t.Errorf("%v", err.ApiError()) + if cde.Success != false { + t.Error(successFail) } } func TestClient_CustomFieldsCreate(t *testing.T) { c := client() - codeCustomField = RandomString(8) + codeCustomField := RandomString(8) - data, status, err := c.CustomFieldsCreate(CustomFields{ + defer gock.Off() + + customFields := CustomFields{ Name: codeCustomField, Code: codeCustomField, Type: "text", Entity: "order", DisplayArea: "customer", - }) + } + + j, _ := json.Marshal(&customFields) + + p := url.Values{ + "customField": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/custom-fields/%s/create", customFields.Entity)). + MatchType("url"). + BodyString(p.Encode()). + Reply(201). + BodyString(`{"success": true, "id": 1}`) + + data, status, err := c.CustomFieldsCreate(customFields) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -2143,14 +4915,16 @@ func TestClient_CustomFieldsCreate(t *testing.T) { } if data.Success != true { + t.Errorf("%v", err.ApiError()) } -} -func TestClient_CustomField(t *testing.T) { - c := client() + gock.New(crmUrl). + Get(fmt.Sprintf("/custom-fields/%s/%s", "order", codeCustomField)). + Reply(200). + BodyString(`{"success": true}`) - data, status, err := c.CustomField("order", codeCustomField) + customField, status, err := c.CustomField("order", codeCustomField) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) @@ -2160,29 +4934,123 @@ func TestClient_CustomField(t *testing.T) { t.Errorf("%v", err.ApiError()) } - if data.Success != true { + if customField.Success != true { + t.Errorf("%v", err.ApiError()) + } + + customFields.DisplayArea = "delivery" + + j, _ = json.Marshal(&customFields) + + p = url.Values{ + "customField": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/custom-fields/%s/%s/edit", customFields.Entity, customFields.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(200). + BodyString(`{"success": true}`) + + customFieldEdit, status, err := c.CustomFieldEdit(customFields) + + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if !statuses[status] { + t.Errorf("%v", err.ApiError()) + } + + if customFieldEdit.Success != true { t.Errorf("%v", err.ApiError()) } } -func TestClient_CustomFieldEdit(t *testing.T) { +func TestClient_CustomFieldsCreate_Fail(t *testing.T) { c := client() - data, status, err := c.CustomFieldEdit(CustomFields{ - Code: codeCustomField, + codeCustomField := "test_" + RandomString(8) + + defer gock.Off() + + customFields := CustomFields{ + Name: codeCustomField, + Type: "text", Entity: "order", - DisplayArea: "delivery", - }) + DisplayArea: "customer", + } + j, _ := json.Marshal(&customFields) + + p := url.Values{ + "customField": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/custom-fields/%s/create", customFields.Entity)). + MatchType("url"). + BodyString(p.Encode()). + Reply(400). + BodyString(`{"success": false, "errorMsg": "Errors in the input parameters"}`) + + data, status, err := c.CustomFieldsCreate(customFields) if err.RuntimeErr != nil { t.Errorf("%v", err.Error()) } - if !statuses[status] { - t.Errorf("%v", err.ApiError()) + if status < http.StatusBadRequest { + t.Error(statusFail) } - if data.Success != true { - t.Errorf("%v", err.ApiError()) + if data.Success != false { + t.Error(successFail) + } + + gock.New(crmUrl). + Get(fmt.Sprintf("/custom-fields/%s/%s", "order", codeCustomField)). + Reply(404). + BodyString(`{"success": false, "errorMsg": "Not found"}`) + + customField, status, err := c.CustomField("order", codeCustomField) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if customField.Success != false { + t.Error(successFail) + } + + customFields.DisplayArea = "delivery" + + j, _ = json.Marshal(&customFields) + + p = url.Values{ + "customField": {string(j)}, + } + + gock.New(crmUrl). + Post(fmt.Sprintf("/custom-fields/%s/%s/edit", customFields.Entity, customFields.Code)). + MatchType("url"). + BodyString(p.Encode()). + Reply(404). + BodyString(`{"success": false, "errorMsg": "API method not found"}`) + + customFieldEdit, status, err := c.CustomFieldEdit(customFields) + if err.RuntimeErr != nil { + t.Errorf("%v", err.Error()) + } + + if status < http.StatusBadRequest { + t.Error(statusFail) + } + + if customFieldEdit.Success != false { + t.Error(successFail) } }