Compare commits

...

4 commits

Author SHA1 Message Date
39568f3db6
Merge pull request #101 from RenCurs/fix-struct-cart
set json tag in struct instead url
2025-04-14 15:48:34 +03:00
Ruslan Efanov
3c2715bc36 set json tag in struct instead url 2025-04-14 15:44:26 +03:00
c62a02aa1f
Merge pull request #100 from dendd1/master
fix for clear cart method
2025-04-04 15:14:19 +03:00
Суханов Данила
871459c8b7 fix for clear cart method 2025-04-04 15:12:04 +03:00
5 changed files with 98 additions and 26 deletions

View file

@ -1965,17 +1965,17 @@ func (c *Client) CorporateCustomerEdit(customer CorporateCustomer, by string, si
// //
// var client = retailcrm.New("https://demo.url", "09jIJ") // var client = retailcrm.New("https://demo.url", "09jIJ")
// //
// data, status, err := client.ClearCart("site_id", SiteFilter{SiteBy: "id"}, // data, status, err := client.ClearCart("site_id", retailcrm.SiteFilter{SiteBy: "id"},
// ClearCartRequest{ // retailcrm.ClearCartRequest{
// CreatedAt: time.Now().String(), // ClearedAt: time.Now().String(),
// Customer: CartCustomer{ // Customer: retailcrm.CartCustomer{
// ID: 1, // ID: 1,
// ExternalID: "ext_id", // ExternalID: "ext_id",
// Site: "site", // Site: "site",
// BrowserID: "browser_id", // BrowserID: "browser_id",
// GaClientID: "ga_client_id", // GaClientID: "ga_client_id",
// }, // },
// Order: ClearCartOrder{ // Order: retailcrm.ClearCartOrder{
// ID: 1, // ID: 1,
// ExternalID: "ext_id", // ExternalID: "ext_id",
// Number: "abc123", // Number: "abc123",
@ -2027,23 +2027,23 @@ func (c *Client) ClearCart(site string, filter SiteFilter, req ClearCartRequest)
// //
// var client = retailcrm.New("https://demo.url", "09jIJ") // var client = retailcrm.New("https://demo.url", "09jIJ")
// //
// data, status, err := client.SetCart("site_id", SiteFilter{SiteBy: "id"}, // data, status, err := client.SetCart("site_id", retailcrm.SiteFilter{SiteBy: "id"},
// SetCartRequest{ // retailcrm.SetCartRequest{
// ExternalID: "ext_id", // ExternalID: "ext_id",
// DroppedAt: time.Now().String(), // DroppedAt: time.Now().String(),
// Link: "link", // Link: "link",
// Customer: CartCustomer{ // Customer: retailcrm.CartCustomer{
// ID: 1, // ID: 1,
// ExternalID: "ext_id", // ExternalID: "ext_id",
// Site: "site", // Site: "site",
// BrowserID: "browser_id", // BrowserID: "browser_id",
// GaClientID: "ga_client_id", // GaClientID: "ga_client_id",
// }, // },
// Items: []SetCartItem{ // Items: []retailcrm.SetCartItem{
// { // {
// Quantity: 1, // Quantity: 1,
// Price: 1.0, // Price: 1.0,
// Offer: SetCartOffer{ // Offer: retailcrm.SetCartOffer{
// ID: 1, // ID: 1,
// ExternalID: "ext_id", // ExternalID: "ext_id",
// XMLID: "xml_id", // XMLID: "xml_id",
@ -2097,7 +2097,8 @@ func (c *Client) SetCart(site string, filter SiteFilter, req SetCartRequest) (
// //
// var client = retailcrm.New("https://demo.url", "09jIJ") // var client = retailcrm.New("https://demo.url", "09jIJ")
// //
// data, status, err := client.GetCart("site_id","customer_id", GetCartFilter{ SiteBy: "code", By: "externalId"}) // data, status, err := client.GetCart("site_id","customer_id",
// retailcrm.GetCartFilter{ SiteBy: "code", By: "externalId"})
// //
// if err != nil { // if err != nil {
// if apiErr, ok := retailcrm.AsAPIError(err); ok { // if apiErr, ok := retailcrm.AsAPIError(err); ok {

View file

@ -1,9 +1,13 @@
package retailcrm package retailcrm
import ( import (
"bytes"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"github.com/retailcrm/api-client-go/v2/constant"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"io"
"io/ioutil" "io/ioutil"
"log" "log"
"math/rand" "math/rand"
@ -1880,15 +1884,18 @@ func TestClient_CorporateCustomerEdit(t *testing.T) {
func TestClient_ClearCart(t *testing.T) { func TestClient_ClearCart(t *testing.T) {
c := client() c := client()
tm := "2025-04-14 15:50:00"
clearedAt, err := time.Parse("2006-01-02 15:04:05", tm)
require.NoError(t, err)
site := "site_id" site := "site_id"
filter := SiteFilter{SiteBy: "id"} filter := SiteFilter{SiteBy: "id"}
request := ClearCartRequest{ request := ClearCartRequest{
CreatedAt: time.Now().String(), ClearedAt: clearedAt.UTC().Format(constant.DateTimeWithZoneFormat),
Customer: CartCustomer{ Customer: CartCustomer{
ID: 1, ID: 1,
ExternalID: "ext_id", ExternalID: "ext_id",
Site: "site", Site: "site",
BrowserID: "browser_id",
GaClientID: "ga_client_id", GaClientID: "ga_client_id",
}, },
Order: ClearCartOrder{ Order: ClearCartOrder{
@ -1898,9 +1905,40 @@ func TestClient_ClearCart(t *testing.T) {
}, },
} }
expectedJSON := `{
"clearedAt": "2025-04-14 15:50:00+00:00",
"customer": {
"id": 1,
"externalId": "ext_id",
"site": "site",
"gaClientId": "ga_client_id"
},
"order": {
"id": 1,
"externalId": "ext_id",
"number": "abc123"
}
}`
defer gock.Off() defer gock.Off()
gock.New(crmURL). gock.New(crmURL).
Post(fmt.Sprintf("/customer-interaction/%s/cart/clear", site)). Post(fmt.Sprintf("/customer-interaction/%s/cart/clear", site)).
AddMatcher(func(request *http.Request, _ *gock.Request) (bool, error) {
body, err := io.ReadAll(request.Body)
require.NoError(t, err)
request.Body = io.NopCloser(bytes.NewBuffer(body))
val, err := url.ParseQuery(string(body))
require.NoError(t, err)
val.Get("cart")
if !assert.JSONEq(t, expectedJSON, val.Get("cart")) {
return false, errors.New("unequal values")
}
return true, nil
}).
MatchParam("siteBy", filter.SiteBy). MatchParam("siteBy", filter.SiteBy).
Reply(200). Reply(200).
BodyString(`{"success":true}`) BodyString(`{"success":true}`)
@ -1926,7 +1964,7 @@ func TestClient_SetCart(t *testing.T) {
filter := SiteFilter{SiteBy: "id"} filter := SiteFilter{SiteBy: "id"}
request := SetCartRequest{ request := SetCartRequest{
ExternalID: "ext_id", ExternalID: "ext_id",
DroppedAt: time.Now().String(), DroppedAt: time.Now().UTC().Format(constant.DateTimeWithZoneFormat),
Link: "link", Link: "link",
Customer: CartCustomer{ Customer: CartCustomer{
ID: 1, ID: 1,
@ -1951,6 +1989,36 @@ func TestClient_SetCart(t *testing.T) {
defer gock.Off() defer gock.Off()
gock.New(crmURL). gock.New(crmURL).
Post(fmt.Sprintf("/customer-interaction/%s/cart/set", site)). Post(fmt.Sprintf("/customer-interaction/%s/cart/set", site)).
AddMatcher(func(req *http.Request, _ *gock.Request) (bool, error) {
body, err := io.ReadAll(req.Body)
require.NoError(t, err)
req.Body = io.NopCloser(bytes.NewBuffer(body))
val, err := url.ParseQuery(string(body))
require.NoError(t, err)
cartJSON := val.Get("cart")
var cart SetCartRequest
require.NoError(t, json.Unmarshal([]byte(cartJSON), &cart))
equal := assert.Equal(t, "ext_id", cart.ExternalID) &&
assert.NotEmpty(t, cart.DroppedAt) &&
assert.Equal(t, 1, cart.Customer.ID) &&
assert.Equal(t, "ext_id", cart.Customer.ExternalID) &&
assert.Equal(t, "site", cart.Customer.Site) &&
assert.Equal(t, "ga_client_id", cart.Customer.GaClientID) &&
assert.Equal(t, float64(1), cart.Items[0].Quantity) &&
assert.Equal(t, float64(1), cart.Items[0].Price) &&
assert.Equal(t, 1, cart.Items[0].Offer.ID) &&
assert.Equal(t, "ext_id", cart.Items[0].Offer.ExternalID) &&
assert.Equal(t, "xml_id", cart.Items[0].Offer.XMLID)
if !equal {
return false, errors.New("unequal values")
}
return true, nil
}).
MatchParam("siteBy", filter.SiteBy). MatchParam("siteBy", filter.SiteBy).
Reply(200). Reply(200).
BodyString(`{"success":true}`) BodyString(`{"success":true}`)
@ -1982,8 +2050,8 @@ func TestClient_GetCart(t *testing.T) {
expCart := Cart{ expCart := Cart{
Currency: "currency", Currency: "currency",
ExternalID: "ext_id", ExternalID: "ext_id",
DroppedAt: time.Now().String(), DroppedAt: "2025-04-14 14:32:14+03:00",
ClearedAt: time.Now().String(), ClearedAt: "2025-04-14 14:52:14+03:00",
Link: "link", Link: "link",
Items: []CartItem{ Items: []CartItem{
{ {

3
constant/date.go Normal file
View file

@ -0,0 +1,3 @@
package constant
const DateTimeWithZoneFormat = "2006-01-02 15:04:05-07:00"

View file

@ -196,18 +196,18 @@ type DeliveryShipmentsRequest struct {
// ClearCartRequest type. // ClearCartRequest type.
type ClearCartRequest struct { type ClearCartRequest struct {
CreatedAt string `url:"createdAt,omitempty"` ClearedAt string `json:"clearedAt,omitempty"`
Customer CartCustomer `url:"customer,omitempty"` Customer CartCustomer `json:"customer,omitempty"`
Order ClearCartOrder `url:"order,omitempty"` Order ClearCartOrder `json:"order,omitempty"`
} }
// SetCartRequest type. // SetCartRequest type.
type SetCartRequest struct { type SetCartRequest struct {
ExternalID string `url:"externalId,omitempty"` ExternalID string `json:"externalId,omitempty"`
DroppedAt string `url:"droppedAt,omitempty"` DroppedAt string `json:"droppedAt,omitempty"`
Link string `url:"link,omitempty"` Link string `json:"link,omitempty"`
Customer CartCustomer `url:"customer,omitempty"` Customer CartCustomer `json:"customer,omitempty"`
Items []SetCartItem `url:"items,omitempty"` Items []SetCartItem `json:"items,omitempty"`
} }
// CostsRequest type. // CostsRequest type.

View file

@ -411,7 +411,7 @@ type SerializedOrderLink struct {
// ClearCartOrder type. // ClearCartOrder type.
type ClearCartOrder struct { type ClearCartOrder struct {
ID int `json:"id,omitempty"` ID int `json:"id,omitempty"`
ExternalID string `json:"externalID,omitempty"` ExternalID string `json:"externalId,omitempty"`
Number string `json:"number,omitempty"` Number string `json:"number,omitempty"`
} }
@ -495,7 +495,7 @@ type SetCartItem struct {
// SetCartOffer type. // SetCartOffer type.
type SetCartOffer struct { type SetCartOffer struct {
ID int `json:"id,omitempty"` ID int `json:"id,omitempty"`
ExternalID string `json:"externalID,omitempty"` ExternalID string `json:"externalId,omitempty"`
XMLID string `json:"xmlId,omitempty"` XMLID string `json:"xmlId,omitempty"`
} }