From 16cc937561acfd11cf340df8e47429e125d35fa5 Mon Sep 17 00:00:00 2001 From: leofischer Date: Mon, 13 Jan 2020 22:03:59 -0600 Subject: [PATCH] conekta-go V1.0.0 release --- CHANGELOG.md | 3 ++ README.md | 117 ++++++++++++++++++++++++++++++++++++++++ charge/charge_test.go | 5 +- mocks.go | 8 ++- readme_files/banner.png | Bin 0 -> 19857 bytes webhook/webhook_test.go | 2 +- 6 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 readme_files/banner.png diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..397c2ca --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## [1.0.0](https://github.com/conekta/conekta-php/releases/tag/v1.0.0) - 2020-01-20 +### Feature +- Initial Release of conekta-go diff --git a/README.md b/README.md new file mode 100644 index 0000000..046d8ad --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +
+ +![banner](readme_files/banner.png) + +# Conekta GO + +
+ +## Requeriments + +conekta-go is tested against against all officially supported releases (Go 1.12 and 1.13). + +## Installation + +You can import conekta-go directly from github as follows: + +```go +import ( + conekta "github.com/conekta/conekta-go" + "github.com/conekta/conekta-go/order" + "github.com/conekta/conekta-go/customer" + "time" +) +``` + +## Usage + +```go +conekta.APIKey = "key_ZLy4aP2szht1HqzkCezDEA" + +customerParams := &conekta.CustomerParams{ + Name: "Cándida Eréndira", + Email: "la.candida.erendira@gmail.com", + Phone: "55-5555-5555", +} + +lineItemParams := &conekta.LineItemsParams{ + Name: "Naranjas Robadas", + UnitPrice: 10000, + Quantity: 2, +} + +chargeParams := &conekta.ChargeParams{ + PaymentMethodParams: &conekta.PaymentMethodParams{ + Type: "oxxo_cash", + ExpiresAt: time.Now().AddDate(0, 0, 90).Unix(), + }, +} + +orderParams := &conekta.OrderParams{} +orderParams.Currency = "MXN" +orderParams.CustomerInfo = customerParams +orderParams.LineItems = append(op.LineItems, lineItemParams) +orderParams.Charges = append(op.Charges, chargeParams) + +ord, err := order.Create(orderParams) +if err != nil { + code := err.(conekta.Error).Details[0].Code + //do something +} else { + orderId := order.ID + chargeId := o.Charges.Data[0].ID + oxxoReference := o.Charges.Data[0].PaymentMethod.Reference + //do something +} +``` + +## Run Tests + +```bash +go test -v ./... +``` + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Contributing + +1. Fork the repository +2. Clone the repository +```bash + git clone git@github.com:yourUserName/conekta-go.git +``` +3. Create a branch +```bash + git checkout develop + git pull origin develop + # You should choose the name of your branch + git checkout -b +``` +4. Make necessary changes and commit those changes +```bash + git add . + git commit -m "my changes" +``` +5. Push changes to GitHub +```bash + git push origin +``` +6. Submit your changes for review, create a pull request + + To create a pull request, you need to have made your code changes on a separate branch. This branch should be named like this: **feature/my_feature** or **fix/my_fix**. + + Make sure that, if you add new features to our library, be sure to add the corresponding **unit tests**. + + If you go to your repository on GitHub, you’ll see a Compare & pull request button. Click on that button. + +*** + +## License + +Developed in Mexico by [Conekta](https://www.conekta.com). Available with [MIT License](LICENSE). + +## We are always hiring! + +If you are a comfortable working with a range of backend languages (Java, Python, Ruby, PHP, etc) and frameworks, you have solid foundation in data structures, algorithms and software design with strong analytical and debugging skills. Send us your CV and GitHub to quieroser@conekta.com diff --git a/charge/charge_test.go b/charge/charge_test.go index 06cdbda..1a4d250 100644 --- a/charge/charge_test.go +++ b/charge/charge_test.go @@ -9,6 +9,7 @@ import ( "github.com/conekta/conekta-go/customer" "github.com/conekta/conekta-go/order" "github.com/conekta/conekta-go/paymentsource" + "time" ) func init() { @@ -93,8 +94,8 @@ func TestFind(t *testing.T) { assert.Equal(t, res.PaymentMethod.Last4, "4242") assert.Equal(t, res.PaymentMethod.Brand, "visa") assert.Equal(t, res.PaymentMethod.Name, "Jorge Lopez") - assert.Equal(t, res.PaymentMethod.ExpMonth, "12") - assert.Equal(t, res.PaymentMethod.ExpYear, "19") + assert.Equal(t, res.PaymentMethod.ExpMonth, time.Now().Format("01")) + assert.Equal(t, res.PaymentMethod.ExpYear, time.Now().AddDate(1, 0, 0).Format("06")) } func TestFindError(t *testing.T) { diff --git a/mocks.go b/mocks.go index 05c77ab..0e6fdd9 100644 --- a/mocks.go +++ b/mocks.go @@ -197,17 +197,15 @@ func (p *TokenParams) Mock() *TokenParams { func (p *CardParams) Mock() *CardParams { p.Number = "4242424242424242" p.Name = "Eduardo Enriquez" - p.ExpMonth = "12" - p.ExpYear = "2020" + p.ExpMonth = time.Now().Format("01") + p.ExpYear = time.Now().AddDate(1, 0, 0).Format("2006") p.Cvc = "123" return p } // Mock fills WebhookParams with dummy data func (p *WebhookParams) Mock() *WebhookParams { - p.URL = "c.testgowebhook.com" - p.DevelopmentEnabled = true - p.ProductionEnabled = false + p.URL = "https://c.testgowebhook.com" return p } diff --git a/readme_files/banner.png b/readme_files/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..762a39234faddd70e8b3af2283f22e7ea8700f3c GIT binary patch literal 19857 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 rR<$Zn?mr#%pN{(f