Merge pull request #51 from moriony/customer-property
Use customer property instead of deprecated user, add originator type
This commit is contained in:
commit
ff807c6501
@ -7,4 +7,5 @@ go:
|
|||||||
before_install:
|
before_install:
|
||||||
- go get -v github.com/google/go-querystring/query
|
- go get -v github.com/google/go-querystring/query
|
||||||
- go get -v github.com/h2non/gock
|
- go get -v github.com/h2non/gock
|
||||||
|
- go get -v github.com/stretchr/testify/assert
|
||||||
script: go test -v ./...
|
script: go test -v ./...
|
||||||
|
@ -187,8 +187,8 @@ func TestMgClient_TextMessages(t *testing.T) {
|
|||||||
Type: MsgTypeText,
|
Type: MsgTypeText,
|
||||||
Text: "hello!",
|
Text: "hello!",
|
||||||
},
|
},
|
||||||
Originator: "user",
|
Originator: OriginatorCustomer,
|
||||||
User: User{
|
Customer: Customer{
|
||||||
ExternalID: "6",
|
ExternalID: "6",
|
||||||
Nickname: "octopus",
|
Nickname: "octopus",
|
||||||
Firstname: "Joe",
|
Firstname: "Joe",
|
||||||
@ -228,8 +228,8 @@ func TestMgClient_ImageMessages(t *testing.T) {
|
|||||||
Type: MsgTypeImage,
|
Type: MsgTypeImage,
|
||||||
Items: []Item{{ID: uploadFileResponse.ID}},
|
Items: []Item{{ID: uploadFileResponse.ID}},
|
||||||
},
|
},
|
||||||
Originator: "user",
|
Originator: OriginatorCustomer,
|
||||||
User: User{
|
Customer: Customer{
|
||||||
ExternalID: "6",
|
ExternalID: "6",
|
||||||
Nickname: "octopus",
|
Nickname: "octopus",
|
||||||
Firstname: "Joe",
|
Firstname: "Joe",
|
||||||
|
33
v1/types.go
33
v1/types.go
@ -1,6 +1,7 @@
|
|||||||
package v1
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -47,6 +48,13 @@ const (
|
|||||||
FileSizeLimit = 20 * 1024 * 1024
|
FileSizeLimit = 20 * 1024 * 1024
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// OriginatorCustomer means message was created by customer
|
||||||
|
OriginatorCustomer Originator = iota + 1
|
||||||
|
// OriginatorChannel means message was created by channel, for example via messenger mobile application
|
||||||
|
OriginatorChannel
|
||||||
|
)
|
||||||
|
|
||||||
// MgClient type
|
// MgClient type
|
||||||
type MgClient struct {
|
type MgClient struct {
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
@ -189,8 +197,8 @@ type Channels struct {
|
|||||||
Limit int `url:"limit,omitempty" json:"limit,omitempty"`
|
Limit int `url:"limit,omitempty" json:"limit,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// User struct
|
// Customer struct
|
||||||
type User struct {
|
type Customer struct {
|
||||||
ExternalID string `json:"external_id"`
|
ExternalID string `json:"external_id"`
|
||||||
Nickname string `json:"nickname"`
|
Nickname string `json:"nickname"`
|
||||||
Firstname string `json:"first_name,omitempty"`
|
Firstname string `json:"first_name,omitempty"`
|
||||||
@ -233,8 +241,8 @@ type EditMessageRequestMessage struct {
|
|||||||
// SendData struct
|
// SendData struct
|
||||||
type SendData struct {
|
type SendData struct {
|
||||||
Message Message `json:"message"`
|
Message Message `json:"message"`
|
||||||
Originator string `json:"originator,omitempty"`
|
Originator Originator `json:"originator,omitempty"`
|
||||||
User User `json:"user"`
|
Customer Customer `json:"customer"`
|
||||||
Channel uint64 `json:"channel"`
|
Channel uint64 `json:"channel"`
|
||||||
ExternalChatID string `json:"external_chat_id"`
|
ExternalChatID string `json:"external_chat_id"`
|
||||||
Quote *SendMessageRequestQuote `json:"quote,omitempty"`
|
Quote *SendMessageRequestQuote `json:"quote,omitempty"`
|
||||||
@ -399,3 +407,20 @@ type TransportRequestMeta struct {
|
|||||||
ID uint64 `json:"id"`
|
ID uint64 `json:"id"`
|
||||||
Timestamp int64 `json:"timestamp"`
|
Timestamp int64 `json:"timestamp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrInvalidOriginator = errors.New("invalid originator")
|
||||||
|
|
||||||
|
// Originator of message
|
||||||
|
type Originator byte
|
||||||
|
|
||||||
|
// MarshalText marshals originator to text
|
||||||
|
func (o Originator) MarshalText() ([]byte, error) {
|
||||||
|
switch o {
|
||||||
|
case OriginatorCustomer:
|
||||||
|
return []byte("customer"), nil
|
||||||
|
case OriginatorChannel:
|
||||||
|
return []byte("channel"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, ErrInvalidOriginator
|
||||||
|
}
|
||||||
|
104
v1/types_test.go
Normal file
104
v1/types_test.go
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSendData_MarshalJSON(t *testing.T) {
|
||||||
|
t.Run("WithoutOriginator", func(t *testing.T) {
|
||||||
|
data, err := json.Marshal(SendData{})
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
expected := `{
|
||||||
|
"channel": 0,
|
||||||
|
"customer": {
|
||||||
|
"external_id": "",
|
||||||
|
"nickname": ""
|
||||||
|
},
|
||||||
|
"external_chat_id": "",
|
||||||
|
"message": {
|
||||||
|
"external_id": ""
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
assert.JSONEq(t, expected, string(data))
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("WithOriginator", func(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
originator Originator
|
||||||
|
string string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
OriginatorCustomer,
|
||||||
|
"customer",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
OriginatorChannel,
|
||||||
|
"channel",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern := `{
|
||||||
|
"originator": "%s",
|
||||||
|
"channel": 0,
|
||||||
|
"customer": {
|
||||||
|
"external_id": "",
|
||||||
|
"nickname": ""
|
||||||
|
},
|
||||||
|
"external_chat_id": "",
|
||||||
|
"message": {
|
||||||
|
"external_id": ""
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
data, err := json.Marshal(SendData{
|
||||||
|
Originator: c.originator,
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.JSONEq(t, fmt.Sprintf(pattern, c.string), string(data))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOriginator(t *testing.T) {
|
||||||
|
b, err := OriginatorCustomer.MarshalText()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "customer", string(b))
|
||||||
|
|
||||||
|
b, err = OriginatorChannel.MarshalText()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "channel", string(b))
|
||||||
|
|
||||||
|
t.Run("MarshalText_Valid", func(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
byte byte
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{1, "customer"},
|
||||||
|
{2, "channel"},
|
||||||
|
}
|
||||||
|
for _, c := range cases {
|
||||||
|
result, err := Originator(c.byte).MarshalText()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, c.expected, string(result))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("MarshalText_Invalid", func(t *testing.T) {
|
||||||
|
data, err := Originator(0).MarshalText()
|
||||||
|
assert.Nil(t, data)
|
||||||
|
assert.Equal(t, err, ErrInvalidOriginator)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("MarshalJSON_Invalid", func(t *testing.T) {
|
||||||
|
data, err := json.Marshal(Originator(3))
|
||||||
|
assert.Nil(t, data)
|
||||||
|
assert.EqualError(t, err, "json: error calling MarshalJSON for type v1.Originator: invalid originator")
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user