Skip to content

Commit

Permalink
Merge pull request #12 from TibebeJS/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
TibebeJS authored Jan 16, 2021
2 parents d631c7b + e16fbd5 commit 0ec6404
Show file tree
Hide file tree
Showing 10 changed files with 341 additions and 340 deletions.
60 changes: 30 additions & 30 deletions checkout/chkout.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,72 +21,73 @@ import (
)

const (
CHECKOUT_BASE_URL_PROD = "https://www.yenepay.com/checkout/Home/Process/"
IPN_VERIFY_URL_PROD = "https://endpoints.yenepay.com/api/verify/ipn/"
PDT_URL_PROD = "https://endpoints.yenepay.com/api/verify/pdt/"
checkoutBaseURLProd string = "https://www.yenepay.com/checkout/Home/Process/"
ipnVerifyURLProd string = "https://endpoints.yenepay.com/api/verify/ipn/"
pdtURLProd string = "https://endpoints.yenepay.com/api/verify/pdt/"

CHECKOUT_BASE_URL_SANDBOX = "https://test.yenepay.com/Home/Process/"
IPN_VERIFY_URL_SANDBOX = "https://testapi.yenepay.com/api/verify/ipn/"
PDT_URL_SANDBOX = "https://testapi.yenepay.com/api/verify/pdt/"
checkoutBaseURLSandbox string = "https://test.yenepay.com/Home/Process/"
ipnVerifyURLSandbox string = "https://testapi.yenepay.com/api/verify/ipn/"
pdtURLSandbox string = "https://testapi.yenepay.com/api/verify/pdt/"
)

// YenePayCheckOut - main checkout model
type YenePayCheckOut struct {
}

// YenePayCheckOut Constructor
// NewYenePayCheckOut - YenePayCheckOut Constructor
func NewYenePayCheckOut() *YenePayCheckOut {
return &YenePayCheckOut{}
}

// Generate Checkout URL for Express Checkout
func (self *YenePayCheckOut) ExpressCheckoutUrl(checkoutOptions *CheckoutOption, checkoutItem *ExpressCheckoutItem) string {
// ExpressCheckoutURL - Generate Checkout URL for Express Checkout
func (checkout *YenePayCheckOut) ExpressCheckoutURL(checkoutOptions *Option, checkoutItem *ExpressCheckoutItem) string {

optsQs, _ := query.Values(checkoutOptions.GetExpressFields())

itemQs, _ := query.Values(checkoutItem)

checkoutUrl := CHECKOUT_BASE_URL_PROD + "?" + optsQs.Encode() + "&" + itemQs.Encode()
checkoutURL := checkoutBaseURLProd + "?" + optsQs.Encode() + "&" + itemQs.Encode()

if checkoutOptions.UseSandbox {
checkoutUrl = CHECKOUT_BASE_URL_SANDBOX + "?" + optsQs.Encode() + "&" + itemQs.Encode()
checkoutURL = checkoutBaseURLSandbox + "?" + optsQs.Encode() + "&" + itemQs.Encode()
}

return checkoutUrl
return checkoutURL
}

// Generate Checkout URL for Cart Checkout
func (self *YenePayCheckOut) CartCheckoutUrl(checkoutOptions *CheckoutOption, cartItems []CartCheckoutItem) string {
// CartCheckoutURL - Generate Checkout URL for Cart Checkout
func (checkout *YenePayCheckOut) CartCheckoutURL(checkoutOptions *Option, cartItems []CartCheckoutItem) string {

v, _ := query.Values(checkoutOptions)

checkoutUrl := CHECKOUT_BASE_URL_PROD + "?" + v.Encode()
checkoutURL := checkoutBaseURLProd + "?" + v.Encode()

if checkoutOptions.UseSandbox {
checkoutUrl = CHECKOUT_BASE_URL_SANDBOX + "?" + v.Encode()
checkoutURL = checkoutBaseURLSandbox + "?" + v.Encode()
}

for i, item := range cartItems {
v := reflect.ValueOf(item)
typeOfS := v.Type()

for j := 0; j < v.NumField(); j++ {
checkoutUrl += fmt.Sprintf("&Items[%d].%s=%v", i, typeOfS.Field(j).Name, v.Field(j).Interface())
checkoutURL += fmt.Sprintf("&Items[%d].%s=%v", i, typeOfS.Field(j).Name, v.Field(j).Interface())
}
}

return checkoutUrl
return checkoutURL
}

// WIP: check IPN authenticity
func (self *YenePayCheckOut) IsIPNAuthentic(ipnModel interface{}, useSandbox bool) (bool, error) {
ipnUrl := IPN_VERIFY_URL_PROD
// IsIPNAuthentic - check IPN authenticity (WIP)
func (checkout *YenePayCheckOut) IsIPNAuthentic(ipnModel interface{}, useSandbox bool) (bool, error) {
ipnURL := ipnVerifyURLProd

if useSandbox {
ipnUrl = IPN_VERIFY_URL_SANDBOX
ipnURL = ipnVerifyURLSandbox
}

reqBody, _ := json.Marshal(ipnModel)
resp, err := http.Post(ipnUrl, "application/json", bytes.NewBuffer(reqBody))
resp, err := http.Post(ipnURL, "application/json", bytes.NewBuffer(reqBody))

if err != nil {
fmt.Print(err)
Expand All @@ -105,16 +106,16 @@ func (self *YenePayCheckOut) IsIPNAuthentic(ipnModel interface{}, useSandbox boo
return true, nil
}

// WIP: Request PDT model
func (self *YenePayCheckOut) RequestPDT(pdtReq PdtRequestModel) (interface{}, error) {
pdtUrl := PDT_URL_PROD
// RequestPDT - Request PDT model (WIP)
func (checkout *YenePayCheckOut) RequestPDT(pdtReq PdtRequest) (interface{}, error) {
pdtURL := pdtURLProd

if pdtReq.UseSandbox {
pdtUrl = PDT_URL_SANDBOX
pdtURL = pdtURLSandbox
}

reqBody, _ := json.Marshal(pdtReq)
resp, err := http.Post(pdtUrl, "application/json", bytes.NewBuffer(reqBody))
resp, err := http.Post(pdtURL, "application/json", bytes.NewBuffer(reqBody))

if err != nil {
fmt.Print(err)
Expand All @@ -128,7 +129,6 @@ func (self *YenePayCheckOut) RequestPDT(pdtReq PdtRequestModel) (interface{}, er

if err != nil {
return nil, err
} else {
return result, nil
}
return result, nil
}
10 changes: 5 additions & 5 deletions checkout/chkout_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ func TestNewYenePayCheckOut(t *testing.T) {
assert.Exactly(t, expected, actual)
}

func TestGetCheckoutUrlForExpress(t *testing.T) {
func TestGetCheckoutURLForExpress(t *testing.T) {

actual := NewYenePayCheckOut().ExpressCheckoutUrl(
NewCheckoutOption(
actual := NewYenePayCheckOut().ExpressCheckoutURL(
NewOption(
OptionsParams{
true,
ExpressCheckout,
Expand All @@ -37,7 +37,7 @@ func TestGetCheckoutUrlForExpress(t *testing.T) {
),
NewExpressCheckoutItem(
ExpressParams{
ItemId: "544",
ItemID: "544",
ItemName: "PC",
UnitPrice: 30.0,
Quantity: 2,
Expand All @@ -46,7 +46,7 @@ func TestGetCheckoutUrlForExpress(t *testing.T) {
),
)

expected := "https://test.yenepay.com/Home/Process/?CancelUrl=sdfsd&ExpiresAfter=3&FailureUrl=sdfsd&IPNUrl=sdfsd&MerchantId=222&MerchantOrderId=sdfsdsdfsd&Process=Express&SuccessUrl=sdfsd&UseSandbox=true&DeliveryFee=0&Discount=0.2&HandlingFee=0&ItemId=544&ItemName=PC&Quantity=2&Tax1=0&Tax2=0&UnitPrice=30"
expected := "https://test.yenepay.com/Home/Process/?CancelURL=sdfsd&ExpiresAfter=3&FailureURL=sdfsd&IPNURL=sdfsd&MerchantID=222&MerchantOrderID=sdfsdsdfsd&Process=Express&SuccessURL=sdfsd&UseSandbox=true&DeliveryFee=0&Discount=0.2&HandlingFee=0&ItemID=544&ItemName=PC&Quantity=2&Tax1=0&Tax2=0&UnitPrice=30"

assert.Exactly(t, expected, actual)

Expand Down
44 changes: 21 additions & 23 deletions checkout/item.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
package checkout

import (
"encoding/json"

"github.com/go-playground/validator"
)

// ExpressCheckoutItem - model
type ExpressCheckoutItem struct {
ItemId string `validate:"required,min=1"`
ItemID string `validate:"required,min=1"`
ItemName string `validate:"required,min=1"`
UnitPrice float64 `validate:"min=0.1"`
Quantity int `validate:"min=1"`
Expand All @@ -18,29 +13,30 @@ type ExpressCheckoutItem struct {
Tax2 float64 `validate:"min=0.0"`
}

// Validate and Marshal CheckoutItem to JSON format
func (self *ExpressCheckoutItem) ToJSON() (string, error) {
var validate *validator.Validate = validator.New()
// // Validate and Marshal CheckoutItem to JSON format
// func (self *ExpressCheckoutItem) ToJSON() (string, error) {
// var validate *validator.Validate = validator.New()

err := validate.Struct(self)
// err := validate.Struct(self)

if err != nil {
return "", err
} else {
data, _ := json.Marshal(self)
// if err != nil {
// return "", err
// } else {
// data, _ := json.Marshal(self)

return string(data), nil
}
}
// return string(data), nil
// }
// }

// ExpressParams - argument type for constructor
type ExpressParams ExpressCheckoutItem

// ExpressCheckoutItem Constructor
// NewExpressCheckoutItem - ExpressCheckoutItem Constructor
func NewExpressCheckoutItem(
params ExpressParams,
) *ExpressCheckoutItem {
return &ExpressCheckoutItem{
params.ItemId,
params.ItemID,
params.ItemName,
params.UnitPrice,
params.Quantity,
Expand All @@ -52,19 +48,21 @@ func NewExpressCheckoutItem(
}
}

// CartCheckoutItem - model
type CartCheckoutItem struct {
ItemId string
ItemID string
ItemName string
UnitPrice float64
Quantity int
}

// CartParams - argument for constructor
type CartParams CartCheckoutItem

// CartCheckoutItem Constructor
// NewCartCheckoutItem - CartCheckoutItem Constructor
func NewCartCheckoutItem(params CartParams) *CartCheckoutItem {
return &CartCheckoutItem{
params.ItemId,
params.ItemID,
params.ItemName,
params.UnitPrice,
params.Quantity,
Expand Down
88 changes: 43 additions & 45 deletions checkout/item_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,63 +3,61 @@ package checkout
import (
"testing"

"github.com/go-playground/validator"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestItemToJSON(t *testing.T) {
actual, _ := NewExpressCheckoutItem(
ExpressParams{
"2",
"item-name",
10.0,
2,
0.0,
0.0,
0.0,
0.0,
0.0,
},
).ToJSON()
// func TestItemToJSON(t *testing.T) {
// actual, _ := NewExpressCheckoutItem(
// ExpressParams{
// "2",
// "item-name",
// 10.0,
// 2,
// 0.0,
// 0.0,
// 0.0,
// 0.0,
// 0.0,
// },
// ).ToJSON()

expected := `
{
"ItemId" : "2",
"ItemName" : "item-name",
"UnitPrice": 10.0,
"Quantity": 2,
"Discount": 0.0,
"HandlingFee": 0.0,
"DeliveryFee": 0.0,
"Tax1": 0.0,
"Tax2": 0.0
}
`
// expected := `
// {
// "ItemID" : "2",
// "ItemName" : "item-name",
// "UnitPrice": 10.0,
// "Quantity": 2,
// "Discount": 0.0,
// "HandlingFee": 0.0,
// "DeliveryFee": 0.0,
// "Tax1": 0.0,
// "Tax2": 0.0
// }
// `

require.JSONEq(t, expected, actual)
// require.JSONEq(t, expected, actual)

_, actualError := (&ExpressCheckoutItem{}).ToJSON()
// _, actualError := (&ExpressCheckoutItem{}).ToJSON()

if assert.Error(t, actualError) {
for _, err := range actualError.(validator.ValidationErrors) {
switch err.Field() {
case "ItemId":
assert.Exactly(t, "ItemId", err.Field())
assert.Exactly(t, "required", err.Tag())
case "ItemName":
assert.Exactly(t, "ItemName", err.Field())
assert.Exactly(t, "required", err.Tag())
}
// if assert.Error(t, actualError) {
// for _, err := range actualError.(validator.ValidationErrors) {
// switch err.Field() {
// case "ItemID":
// assert.Exactly(t, "ItemID", err.Field())
// assert.Exactly(t, "required", err.Tag())
// case "ItemName":
// assert.Exactly(t, "ItemName", err.Field())
// assert.Exactly(t, "required", err.Tag())
// }

}
}
}
// }
// }
// }

func TestNewExpressCheckoutItem(t *testing.T) {
item := NewExpressCheckoutItem(
ExpressParams{
ItemId: "2",
ItemID: "2",
ItemName: "item-name",
UnitPrice: 10.0,
Quantity: 2,
Expand Down
Loading

0 comments on commit 0ec6404

Please sign in to comment.