Compare commits

..

1 Commits

Author SHA1 Message Date
Ricardo Ambrogi
a5cce48864 Release 5.0.2-beta.0 2020-08-05 14:07:12 +00:00
1290 changed files with 25637 additions and 92913 deletions

View File

@@ -37,21 +37,13 @@ module.exports = {
},
extends: [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
rules: {
quotes: ["error", "double"],
semi: ["error", "always"],
"@typescript-eslint/no-non-null-assertion": 0,
"@typescript-eslint/ban-types": [
"error",
{
"extendDefaults": true,
"types": {
"{}": false
}
}
]
"@typescript-eslint/no-non-null-assertion": 0
},
overrides: [
{

2
.github/CODEOWNERS vendored
View File

@@ -1 +1 @@
* @Adyen/javascript
* @KadoBOT @zaiddreakh @maassenbas @msilvagarcia @AlexandrosMor

View File

@@ -3,7 +3,7 @@ name: Bug report
about: Create a report to help us improve
title: '[BUG]'
labels: 'bug'
assignees: ''
assignees: 'KadoBOT'
---

View File

@@ -3,7 +3,7 @@ name: Feature request
about: Suggest an idea for this project
title: '[FEATURE]'
labels: 'feature'
assignees: ''
assignees: 'KadoBOT'
---

10
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: daily
time: "04:00"
open-pull-requests-limit: 10
reviewers:
- KadoBOT

7
.github/stale.yml vendored
View File

@@ -3,13 +3,6 @@ daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Label to use when marking an issue as stale
# Issues with these labels will never be considered stale
exemptLabels:
- Validating request
- Bug report
- Bug
- Enhancement
- feature
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >

View File

@@ -13,15 +13,20 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v1
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
@@ -29,7 +34,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -43,4 +48,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v1

View File

@@ -1,4 +1,4 @@
on: ["pull_request"]
on: ["push", "pull_request"]
name: Coveralls
@@ -9,12 +9,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v1
- name: Use Node.js 16.x
uses: actions/setup-node@v3
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: 16.x
node-version: 12.x
- name: npm install, npm test:coverage
run: |

View File

@@ -1,30 +0,0 @@
name: Node.js Models
on: [ workflow_dispatch ]
jobs:
generate:
runs-on: ubuntu-latest
name: Generate Models
steps:
- uses: actions/checkout@v3
- run: make models
- name: Set PR variables
id: vars
run: |
cd build/spec
echo ::set-output name=pr_title::"Update models"
echo ::set-output name=pr_body::"OpenAPI spec or templates produced new models on $(date +%d-%m-%Y) \
by [commit](https://github.com/Adyen/adyen-openapi/commit/$(git rev-parse HEAD))."
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
token: ${{ secrets.ADYEN_AUTOMATION_BOT_ACCESS_TOKEN }}
committer: ${{ secrets.ADYEN_AUTOMATION_BOT_EMAIL }}
author: ${{ secrets.ADYEN_AUTOMATION_BOT_EMAIL }}
base: develop
branch: automation/models
title: ${{ steps.vars.outputs.pr_title }}
body: ${{ steps.vars.outputs.pr_body }}
add-paths: |
src/typings

View File

@@ -1,6 +1,6 @@
name: Node.js CI
on: [pull_request]
on: [push, pull_request]
jobs:
build:
@@ -9,12 +9,12 @@ jobs:
strategy:
matrix:
node-version: [12.x, 14.x, 16.x]
node-version: [10.x, 12.x, 13.x]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: npm install, lint and test

View File

@@ -2,23 +2,51 @@ name: Node.js Package
on:
workflow_dispatch:
release:
types: [published]
inputs:
releaseArgs:
description: "Arguments to append to the release CLI command"
required: true
default: "--ci"
email:
description: "Your email (needed for the commit)"
required: true
default: "you@example.com"
name:
description: "Your name (needed for the commit)"
required: true
default: "Your Name"
jobs:
publish-npm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 14
node-version: 12
registry-url: https://registry.npmjs.org/
- run: |
npm install
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc
npm run build
npm publish
git config --global user.email "${{ github.event.inputs.email }}"
git config --global user.name "${{ github.event.inputs.name }}"
npm run release -- ${{ github.event.inputs.releaseArgs }}
env:
GITHUB_TOKEN: ${{ secrets.USER_GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
CI: true
ADYEN_API_KEY: ${{ secrets.ADYEN_API_KEY }}
ADYEN_MERCHANT: ${{ secrets.ADYEN_MERCHANT }}
ADYEN_PASSWORD: ${{ secrets.ADYEN_PASSWORD }}
ADYEN_REVIEWPAYOUT_APIKEY: ${{ secrets.ADYEN_REVIEWPAYOUT_APIKEY }}
ADYEN_REVIEWPAYOUT_PASSWORD: ${{ secrets.ADYENREVIEWPAYOUT_PASSWORD }}
ADYEN_REVIEWPAYOUT_USER: ${{ secrets.ADYENREVIEWPAYOUT_USER }}
ADYEN_STOREPAYOUT_APIKEY: ${{ secrets.ADYEN_STOREPAYOUT_APIKEY }}
ADYEN_STOREPAYOUT_PASSWORD: ${{ secrets.ADYEN_STOREPAYOUT_PASSWORD }}
ADYEN_STOREPAYOUT_USER: ${{ secrets.ADYEN_STOREPAYOUT_USER }}
ADYEN_USER: ${{ secrets.ADYEN_USER }}
ADYEN_MARKETPLACE_USER: ${{ secrets.ADYEN_MARKETPLACE_USER }}
ADYEN_MARKETPLACE_PASSWORD: ${{ secrets.ADYEN_MARKETPLACE_PASSWORD }}
ADYEN_TERMINAL_APIKEY: ${{ secrets.ADYEN_TERMINAL_APIKEY }}
ADYEN_TERMINAL_POIID: ${{ secrets.ADYEN_TERMINAL_POIID }}
ADYEN_TERMINAL_MERCHANT: ${{ secrets.ADYEN_TERMINAL_MERCHANT }}

View File

@@ -1,21 +0,0 @@
name: "Sonarcloud Analysis"
on: ["pull_request"]
jobs:
sonarcloud-analysis:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
# Disabling shallow clone to improve relevancy of SonarCloud reporting
fetch-depth: 0
- name: SonarCloud integration
uses: sonarsource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

3
.gitignore vendored
View File

@@ -12,5 +12,4 @@ node_modules
.viminfo
coverage/
.env
lib/
build/
lib/

View File

@@ -1,16 +1,10 @@
src/
.babelrc
.eslintignore
.eslintrc.js
.eslintrc.json
.gitignore
.release-it.json
CODE_OF_CONDUCT.md
CONTRIBUTING.md
Makefile
config.ts
renovate.json
.travis.yml
tsconfig.json
jest.config.js
tslint.json
.github
/**/__mocks__/
/**/__tests__/
webpack.config.js

View File

@@ -8,13 +8,17 @@
},
"github": {
"release": true,
"releaseName": "Adyen Node API Library v${version}"
"releaseName": "Release ${version}"
},
"hooks": {
"before:init": [
"npm run lint",
"npm run test"
],
"after:bump": [
"npm run build",
"npx auto-changelog -p"
],
"after:release": "echo Successfully released ${name} v${version} to ${repo.repository}."
}
}
}

View File

@@ -1,13 +1,10 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright Contributors to the ODPi Egeria project.
# General settings
sonar.organization=adyen
sonar.projectKey=Adyen_adyen-node-api-library
# Path to sources
#sonar.sources=.
sonar.exclusions=src/__mocks__/**/* , src/typings/**/* , src/__tests__/**/*
sonar.exclusions=src/__mocks__/*
sonar.exclusions=src/typings/*
#sonar.inclusions=
# Path to tests

View File

@@ -1,74 +0,0 @@
generator:=typescript-node
openapi-generator-version:=5.4.0
openapi-generator-url:=https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/$(openapi-generator-version)/openapi-generator-cli-$(openapi-generator-version).jar
openapi-generator-jar:=build/openapi-generator-cli.jar
openapi-generator-cli:=java -jar $(openapi-generator-jar)
services:=balancePlatform binlookup checkout dataProtection legalEntityManagement management payments payouts platformsAccount platformsFund platformsHostedOnboardingPage platformsNotificationConfiguration recurring storedValue terminalManagement transfer
# Generate models (for each service)
models: $(services)
binlookup: spec=BinLookupService-v52
checkout: spec=CheckoutService-v69
dataProtection: spec=DataProtectionService-v1
storedValue: spec=StoredValueService-v46
terminalManagement: spec=TfmAPIService-v1
payments: spec=PaymentService-v68
recurring: spec=RecurringService-v68
payouts: spec=PayoutService-v68
management: spec=ManagementService-v1
managementapi: spec=ManagementService-v1
managementapi: service=management
legalEntityManagement: spec=LegalEntityService-v2
balancePlatform: spec=BalancePlatformService-v2
platformsAccount: spec=AccountService-v6
platformsFund: spec=FundService-v6
platformsNotificationConfiguration: spec=NotificationConfigurationService-v6
platformsHostedOnboardingPage: spec=HopService-v6
transfer: spec=TransferService-v3
$(services): build/spec $(openapi-generator-jar)
rm -rf src/typings/$@ build/model
$(openapi-generator-cli) generate \
-i build/spec/json/$(spec).json \
-g $(generator) \
-t templates/typescript \
-o build \
--global-property models,supportingFiles \
--additional-properties=serviceName=$@
mv build/model src/typings/$@
# Service
managementapi: build/spec $(openapi-generator-jar)
$(openapi-generator-cli) generate \
-i build/spec/json/$(spec).json \
-g $(generator) \
-t templates/typescript \
-o build \
--api-package $(service) \
--model-package typings/$(service) \
--global-property apis \
--additional-properties=serviceName=$(service)
cp build/$(service)/* src/services/$(service)
sed -i.bak '/RestServiceError/d' src/services/$(service)/*
rm src/services/$(service)/*.bak
# Checkout spec (and patch version)
build/spec:
git clone https://github.com/Adyen/adyen-openapi.git build/spec
perl -i -pe's/"openapi" : "3.[0-9].[0-9]"/"openapi" : "3.0.0"/' build/spec/json/*.json
# Extract templates (copy them for modifications)
templates: $(openapi-generator-jar)
$(openapi-generator-cli) author template -g $(generator) -o build/templates/typescript
# Download the generator
$(openapi-generator-jar):
wget --quiet -o /dev/null $(openapi-generator-url) -O $(openapi-generator-jar)
# Discard generated artifacts and changed models
clean:
git checkout src/typings src/services/management
git clean -f -d src/typings src/services/management
.PHONY: templates models $(services)

161
README.md
View File

@@ -1,47 +1,30 @@
![Node js](https://user-images.githubusercontent.com/62436079/207373079-9cf9377f-f530-4b02-a515-9b64ef7b06e7.png)
# Adyen Node.js API Library
![Node.js CI](https://github.com/Adyen/adyen-node-api-library/workflows/Node.js%20CI/badge.svg)
[![Coverage Status](https://coveralls.io/repos/github/Adyen/adyen-node-api-library/badge.svg?branch=main)](https://coveralls.io/github/Adyen/adyen-node-api-library?branch=main)
[![Coverage Status](https://coveralls.io/repos/github/Adyen/adyen-node-api-library/badge.svg?branch=master)](https://coveralls.io/github/Adyen/adyen-node-api-library?branch=master)
[![Downloads](https://img.shields.io/npm/dm/@adyen/api-library.svg)](https://www.npmjs.com/package/@adyen/api-library)
![npm bundle size (scoped)](https://img.shields.io/bundlephobia/minzip/@adyen/api-library.svg)
[![Version](https://img.shields.io/npm/v/@adyen/api-library.svg)](https://www.npmjs.com/package/@adyen/api-library)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=Adyen_adyen-node-api-library&metric=alert_status)](https://sonarcloud.io/dashboard?id=Adyen_adyen-node-api-library)
[![Total alerts](https://img.shields.io/lgtm/alerts/g/Adyen/adyen-node-api-library.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Adyen/adyen-node-api-library/alerts/)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Adyen/adyen-node-api-library.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Adyen/adyen-node-api-library/context:javascript)
This is the officially supported NodeJS library for using Adyen's APIs.
The Adyen API Library for NodeJS enables you to work with Adyen APIs.
## Supported API versions
## Integration
The Library supports all APIs under the following services:
| API | Description | Service Name | Supported version |
| --- | ----------- | ------------ | ----------------- |
|[BIN lookup API](https://docs.adyen.com/api-explorer/#/BinLookup/v52/overview) | The BIN Lookup API provides endpoints for retrieving information based on a given BIN. | BinLookup | **v52** |
| [Checkout API](https://docs.adyen.com/api-explorer/#/CheckoutService/v69/overview)| Our latest integration for accepting online payments. | CheckoutAPI | **v69** |
| [Configuration API](https://docs.adyen.com/api-explorer/#/balanceplatform/v2/overview)| The Configuration API enables you to create a platform where you can onboard your users as account holders and create balance accounts, cards, and business accounts. | BalancePlatform | **v2** |
| [DataProtection API](https://docs.adyen.com/development-resources/data-protection-api) | Adyen Data Protection API provides a way for you to process [Subject Erasure Requests](https://gdpr-info.eu/art-17-gdpr/) as mandated in GDPR. Use our API to submit a request to delete shopper's data, including payment details and other related information (for example, delivery address or shopper email) | DataProtection | **v1** |
| [Legal Entity Management API](https://docs.adyen.com/api-explorer/#/legalentity/v2/overview)| Manage legal entities that contain information required for verification. | LegalEntityManagement | **v2** |
| [Local/Cloud-based Terminal API](https://docs.adyen.com/point-of-sale/terminal-api-reference)| Our point-of-sale integration. | TerminalLocalAPI or TerminalCloudAPI | - |
| [Management API](https://docs.adyen.com/api-explorer/#/ManagementService/v1/overview)| Configure and manage your Adyen company and merchant accounts, stores, and payment terminals. | Management | **v1** |
| [Payments API](https://docs.adyen.com/api-explorer/#/Payment/v68/overview)| Our classic integration for online payments. | ClassicIntegrationAPI | **v68** |
| [Payouts API](https://docs.adyen.com/api-explorer/#/Payout/v68/overview)| Endpoints for sending funds to your customers. | Payout | **v68** |
| [Platforms APIs](https://docs.adyen.com/platforms/api)| Set of APIs when using Adyen for Platforms. This API is used for the classic integration. | Platforms | - |
| [Account API](https://docs.adyen.com/api-explorer/#/Account/v6/overview) | *Platforms subclass* | Account | **v6** |
| [Fund API](https://docs.adyen.com/api-explorer/#/Fund/v6/overview) | *Platforms subclass* | Fund | **v6** |
| [Hosted onboarding API](https://docs.adyen.com/api-explorer/#/Hop/v6/overview)| *Platforms subclass* | HostedOnboardingPage | **v6** |
| [Notification Configuration API](https://docs.adyen.com/api-explorer/#/NotificationConfigurationService/v6/overview) | *Platforms subclass* | NotificationConfiguration | **v6** |
| [Platforms Notifications Webhooks](https://docs.adyen.com/api-explorer/#/NotificationService/v6/overview) || *Models only* | **v6** |
| [POS Terminal Management API](https://docs.adyen.com/api-explorer/#/postfmapi/v1/overview)| Endpoints for managing your point-of-sale payment terminals. | TerminalManagement | **v1** |
| [Recurring API](https://docs.adyen.com/api-explorer/#/Recurring/v68/overview)| Endpoints for managing saved payment details. | Recurring | **v68** |
| [Stored Value API](https://docs.adyen.com/payment-methods/gift-cards/stored-value-api) | Manage both online and point-of-sale gift cards and other stored-value cards. | StoredValue | **v46** |
| [Transfers API](https://docs.adyen.com/api-explorer/transfers/3/overview) | The Transfers API provides endpoints that can be used to get information about all your transactions, move funds within your balance platform or send funds from your balance platform to a transfer instrument. | Transfers | **v3** |
| [Webhooks](https://docs.adyen.com/api-explorer/Webhooks/1/overview) | Adyen uses webhooks to send notifications about payment status updates, newly available reports, and other events that can be subscribed to. For more information, refer to our [documentation](https://docs.adyen.com/development-resources/webhooks). | *Models only* | **v1** |
For more information, refer to our [documentation](https://docs.adyen.com/) or the [API Explorer](https://docs.adyen.com/api-explorer/).
* [x] checkout
* [x] checkout utility
* [x] payments
* [x] modifications
* [x] payouts
* [x] recurring
* [x] notifications
* [x] BIN lookup
## Prerequisites
- [Adyen test account](https://docs.adyen.com/get-started-with-adyen). To start using Adyen APIs, you will need a Merchant Account.
- [API key](https://docs.adyen.com/development-resources/api-credentials#generate-api-key). For testing, your API credential needs to have the [API PCI Payments role](https://docs.adyen.com/development-resources/api-credentials#roles).
- Node 12 or higher
## Requirements
* Node 10 or higher
## Installation
@@ -53,100 +36,12 @@ You can use NPM to add our library to your project
npm install --save @adyen/api-library
```
Alternatively, you can download the [release on GitHub](https://github.com/Adyen/adyen-node-api-library/releases).
## Documentation
* https://docs.adyen.com/developers/development-resources/libraries
* https://docs.adyen.com/developers/checkout
## HTTP Client Configuration
## Using the library
### Client initialisation
#### General use with API key
Set up the client as a singleton resource; you can then use it to create service objects for the API calls that you make to Adyen:
```typescript
const { Client } = require('@adyen/api-library');
const client = new Client({apiKey: "YOUR_API_KEY", environment: "TEST"});
```
#### General use with API key for live environment
```typescript
const { Client } = require('@adyen/api-library');
const client = new Client({apiKey: "YOUR_API_KEY", environment: "LIVE"});
```
#### General use with basic auth
```typescript
const { Client } = require('@adyen/api-library');
const client = new Client({username: "YOUR_USERNAME", password: "YOUR_PASSWORD", environment: "TEST"});
```
### Consuming Services
Every API the library supports is represented by a service object. The name of the service matching the corresponding API is listed in the [Integrations](#supported-api-versions) section of this document.
```javascript
const { Client, CheckoutAPI } = require('@adyen/api-library');
const client = new Client({apiKey: "YOUR_API_KEY", environment: "TEST"});
const paymentRequest = {
amount: {
currency: "USD",
value: 1000 // value in minor units
},
reference: "Your order number",
paymentMethod: {
type: "scheme",
encryptedCardNumber: "test_4111111111111111",
encryptedExpiryMonth: "test_03",
encryptedExpiryYear: "test_2030",
encryptedSecurityCode: "test_737"
},
shopperReference: "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
storePaymentMethod: true,
shopperInteraction: "Ecommerce",
recurringProcessingModel: "CardOnFile",
returnUrl: "https://your-company.com/...",
merchantAccount: "YOUR_MERCHANT_ACCOUNT"
};
const checkoutAPI = new CheckoutAPI(client);
checkoutAPI.payments(paymentRequest)
.then( paymentResponse => console.log(paymentResponse.pspReference))
.catch(error => console.log(error));
```
Alternatively you can make use of the Types included in this library using Typescript, and/or use the async syntax:
```typescript
const { Client, CheckoutAPI } = require('@adyen/api-library');
const client = new Client({apiKey: "YOUR_API_KEY", environment: "TEST"});
import { Types } from '@adyen/api-library';
const doPaymentsRequest = async () => {
const paymentRequest : Types.checkout.PaymentRequest = {
amount: {
currency: "USD",
value: 1000 // value in minor units
},
reference: "Your order number",
paymentMethod: {
type: Types.checkout.CardDetails.TypeEnum.Scheme,
encryptedCardNumber: "test_4111111111111111",
encryptedExpiryMonth: "test_03",
encryptedExpiryYear: "test_2030",
encryptedSecurityCode: "test_737"
},
shopperReference: "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
storePaymentMethod: true,
shopperInteraction: Types.checkout.PaymentRequest.ShopperInteractionEnum.Ecommerce,
recurringProcessingModel: Types.checkout.PaymentRequest.RecurringProcessingModelEnum.CardOnFile,
returnUrl: "https://your-company.com/...",
merchantAccount: "YOUR_MERCHANT_ACCOUNT"
};
const checkoutAPI = new CheckoutAPI(client);
const paymentResponse : Types.checkout.PaymentResponse = await checkoutAPI.payments(paymentRequest);
console.log(paymentResponse.pspReference);
}
doPaymentsRequest();
```
### Custom HTTP Client Configuration
By default, NodeJS [https](https://nodejs.org/api/https.html) will be used to submit requests to the API. But you can change that by injecting your own HttpClient on your client instance. In the example below, we use `axios`:
```javascript
@@ -193,23 +88,17 @@ client.httpClient = httpClient;
...
```
### Example integration
For a closer look at how our NodeJS library works, clone our [example integration](https://github.com/adyen-examples/adyen-node-online-payments). This includes commented code, highlighting key features and concepts, and examples of API calls that can be made using the library.
## Support
If you have a feature request, or spotted a bug or a technical problem, create a GitHub issue. For other questions, contact our [support team](https://support.adyen.com/hc/en-us/requests/new?ticket_form_id=360000705420).
## Contributing
## Contributing
We strongly encourage you to join us in contributing to this repository so everyone can benefit from:
* New features and functionality
* Resolved bug fixes and issues
* Any general improvements
Read our [**contribution guidelines**](CONTRIBUTING.md) to find out how to create a pull request.
## Support
If you have a feature request, or spotted a bug or a technical problem, create a GitHub issue. For other questions, contact our [support team](https://www.adyen.help).
Read our [**contribution guidelines**](CONTRIBUTING.md) to find out how.
## Licence
This repository is available under the [MIT license](LICENSE).
## See also
* [example integration](https://github.com/adyen-examples/adyen-node-online-payments)
MIT license. For more information, see the LICENSE file.

7538
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
{
"name": "@adyen/api-library",
"version": "12.2.0",
"version": "5.0.2-beta.0",
"description": "The Adyen API Library for NodeJS enables you to work with Adyen APIs.",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"engines": {
"node": ">=12"
"node": ">=10"
},
"repository": {
"type": "git",
@@ -28,37 +28,36 @@
"lint": "eslint 'src/**/*.ts'",
"lint:fix": "eslint --fix 'src/**/*.ts'",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"release": "release-it"
},
"author": "Ricardo Ambrogi",
"license": "MIT",
"devDependencies": {
"@types/jest": "27.5.2",
"@types/jest": "26.0.8",
"@types/nock": "11.1.0",
"@typescript-eslint/eslint-plugin": "5.43.0",
"@typescript-eslint/parser": "5.45.0",
"acorn": "^8.0.1",
"coveralls": "3.1.1",
"dotenv": "^16.0.0",
"eslint": "8.28.0",
"jest": "^27.0.6",
"jest-ts-auto-mock": "^2.0.0",
"@typescript-eslint/eslint-plugin": "2.34.0",
"@typescript-eslint/parser": "2.34.0",
"acorn": "^7.1.1",
"coveralls": "3.1.0",
"dotenv": "^8.2.0",
"eslint": "6.8.0",
"jest": "25.5.4",
"jest-ts-auto-mock": "^1.0.11",
"kind-of": "^6.0.3",
"minimist": ">=1.2.3",
"nock": "13.3.0",
"release-it": "15.5.0",
"ts-auto-mock": "^3.3.5",
"ts-jest": "^27.0.4",
"ts-loader": "9.4.2",
"nock": "13.0.3",
"release-it": "13.6.6",
"ts-auto-mock": "^1.6.0",
"ts-jest": "25.5.1",
"ts-loader": "8.0.2",
"ttypescript": "^1.5.10",
"typescript": "4.9.4"
"typescript": "3.9.7"
},
"dependencies": {
"https-proxy-agent": "5.0.1"
"https-proxy-agent": "5.0.0"
},
"optionalDependencies": {
"@types/node": "14.18.36"
"@types/node": "14.0.9"
}
}

View File

@@ -1,6 +0,0 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
]
}

View File

@@ -12,7 +12,7 @@
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2021 Adyen B.V.
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
@@ -44,14 +44,7 @@ export const createClient = (apiKey = process.env.ADYEN_API_KEY): Client => {
config.checkoutEndpoint = Client.CHECKOUT_ENDPOINT_TEST;
config.marketPayEndpoint = Client.MARKETPAY_ENDPOINT_TEST;
config.apiKey = apiKey;
config.paymentEndpoint = Client.PAYMENT_API_ENDPOINT_TEST;
config.storedValueEndpoint = Client.STOREDVALUE_API_ENDPOINT_TEST;
config.terminalManagementEndpoint = Client.TERMINAL_MANAGEMENT_API_ENDPOINT_TEST;
config.managementEndpoint = Client.MANAGEMENT_API_ENDPOINT_TEST;
config.balancePlatformEndpoint = Client.BALANCE_PLATFORM_API_ENDPOINT_TEST;
config.legalEntityManagementEndpoint = Client.LEGAL_ENTITY_MANAGEMENT_API_ENDPOINT_TEST;
config.transfersEndpoint = Client.TRANSFERS_API_ENDPOINT_TEST;
config.dataProtectionEndpoint = Client.DATA_PROTECTION_API_ENDPOINT_TEST;
config.marketPayEndpoint = Client.MARKETPAY_ENDPOINT_TEST;
return new Client({ config });
};
@@ -67,76 +60,71 @@ export const createBasicAuthClient = (): Client => {
const id = Math.floor(Math.random() * Math.floor(10000000)).toString();
const getMessageHeader = ({ messageCategory = MessageCategoryType.Payment }: { messageCategory?: MessageCategoryType } = {}): MessageHeader => ({
MessageCategory: messageCategory,
MessageClass: MessageClassType.Service,
MessageType: MessageType.Request,
POIID: process.env.ADYEN_TERMINAL_POIID!,
ProtocolVersion: "3.0",
SaleID: id,
ServiceID: id,
messageCategory,
messageClass: MessageClassType.Service,
messageType: MessageType.Request,
pOIID: process.env.ADYEN_TERMINAL_POIID!,
protocolVersion: "3.0",
saleID: id,
serviceID: id,
});
const timestamp = (): string => new Date().toISOString();
const transactionIdentification: TransactionIdentification = {
TimeStamp: timestamp(),
TransactionID: id,
timeStamp: timestamp(),
transactionID: id,
};
const saleData: SaleData = {
SaleTransactionID: transactionIdentification,
SaleToAcquirerData: {
saleTransactionID: transactionIdentification,
saleToAcquirerData: {
applicationInfo: {
merchantApplication: {
version: "1",
name: "test"
}
},
metadata: {
someMetaDataKey1: "YOUR_VALUE",
someMetaDataKey2: "YOUR_VALUE"
},
}
}
};
const amountsReq: AmountsReq = {
Currency: "EUR",
RequestedAmount: 1,
currency: "EUR",
requestedAmount: 1,
};
const paymentTransaction: PaymentTransaction = {
AmountsReq: amountsReq,
amountsReq: amountsReq,
};
const paymentRequest: PaymentRequest = {
PaymentTransaction: paymentTransaction,
SaleData: saleData,
paymentTransaction: paymentTransaction,
saleData: saleData,
};
const getReversalRequest = (poiTransaction: TransactionIdentification): ReversalRequest => ({
OriginalPOITransaction: {
POITransactionID: {
TransactionID: poiTransaction.TransactionID,
TimeStamp: poiTransaction.TimeStamp
originalPOITransaction: {
pOITransactionID: {
transactionID: poiTransaction.transactionID,
timeStamp: poiTransaction.timeStamp
},
},
ReversalReason: ReversalReasonType.MerchantCancel,
SaleData: saleData
reversalReason: ReversalReasonType.MerchantCancel
});
const getSaleToPOIRequest = (messageHeader: MessageHeader, request: Partial<SaleToPOIRequest>): SaleToPOIRequest => ({
MessageHeader: messageHeader,
messageHeader: messageHeader,
...request
});
export const createTerminalAPIPaymentRequest = (): TerminalApiRequest => {
const messageHeader = getMessageHeader();
const saleToPOIRequest = getSaleToPOIRequest(messageHeader, { PaymentRequest: paymentRequest });
return { SaleToPOIRequest: saleToPOIRequest };
const saleToPOIRequest = getSaleToPOIRequest(messageHeader, { paymentRequest });
return { saleToPOIRequest: saleToPOIRequest };
};
export const createTerminalAPIRefundRequest = (transactionIdentification: TransactionIdentification): TerminalApiRequest => {
const messageHeader = getMessageHeader({ messageCategory: MessageCategoryType.Reversal });
const saleToPOIRequest = getSaleToPOIRequest(messageHeader, { ReversalRequest: getReversalRequest(transactionIdentification) });
return { SaleToPOIRequest: saleToPOIRequest };
const saleToPOIRequest = getSaleToPOIRequest(messageHeader, { reversalRequest: getReversalRequest(transactionIdentification) });
return { saleToPOIRequest: saleToPOIRequest };
};

View File

@@ -1,33 +0,0 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
/* tslint:disable */
export const sessionsSuccess = JSON.stringify({
"amount": {
"currency": "EUR",
"value": 100
},
"countryCode": "NL",
"expiresAt": "2021-10-08T17:28:56+02:00",
"id": "CS841C62BF399F968C",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"reference": "YOUR_PAYMENT_REFERENCE",
"returnUrl": "https://your-company.com/checkout?shopperOrder=12xy..",
"sessionData": "Ab02b4c0!BQABAgAeRei/Zyr+UYwMcTlHkeYjwn143zTmCmDmWwBg+gZr8us16qqoeVFon6NexiKmZLurm05iRiLagbIIS8BtFzvtX5myx4m0N1vBJWZRDZKHP3g4cyXjEnTnK0CmNsX0bDeojkHU4qChCkn1jIux/rSSp2IIBqe1SfbGVRC9bM17Nj90fJPBxp5MFMw7HKpuvlRNj8CncKPAyPhd4pY+O3GKTiFoZKpx/kVKO7PnILEC07q4rqEzVjSW2U5ADcnR+mJ8V0YVn8Yy4KqNLn68GKMHXe2+NRvidA/UC72F72dOtV1bqxRr/0G6bCW7iuxve+M0IYZ3apHbgS1vWcvUaOI7n1u02M6SWsZDcKgsaT0PoxQkUvdU3ViG7f7Xtac8pjcOxAzhtug/B6Qx/zaTUIWBRKQM5Ga9T7Vo9s9I1Kgv3zuQqeN9OiUhB1mvoxfSPkKYTVjYooj4CELNy9+xuU8/TI+XqK24FIiTacvcJ8Vt0RCSWcE47AG4qiKPBFcBMwpUfz78ud/gu4uBHtt/bh5vJu5GG462tr5W3a/5CeGDX37sqTnrUGom86daTll+kbKo3rC4CH8+K245XNIvIVXLUGrci52lzm09ptPEh/Aj8uBGHLA4Cc0ILAi3rxI5nNcurgbAZiZ7QA3iBEih4euVXBZmKRIfY2U0ijEQLBo8mBDuOjj4GNFT2XrRVs2rwhldAEp7ImtleSI6IkFGMEFBQTEwM0NBNTM3RUFFRDg3QzI0REQ1MzkwOUI4MEE3OEE5MjNFMzgyM0Q2OERBQ0M5NEI5RkY4MzA1REMifWHVSkL3b2GTohsmKmsBVvRtOiDyOWBpV+mylCFs/EQuj7PFJBVjaLoIq1Prk4hZFhBzEf7SsQYHzfTr+BKFH+6fblTW4ObszU3YwF6ehRDaLYxv4sPdVPdguWcuxIvzRenzPlGWu78z6cj1ROHNE3uREUgmVYf9ERbMm8OKJ/uqS1pMPvCYcHIJ0IrXbloQhKaSZdJNmsjGFbfBW8Tr29foxKH280TjbauaZydPWsEuEUIyeWYFBMoozW7de/6RLrDhnQEn/We/6EmsL86QzG+JSkBFloTFo2kdttqA9dfK0l7U3HjtEXmNBFy13DTr5tJcYMz+IcTwe0PqPCgUR+MZDOpAOFc1uHdccok7sttiV4K4xTKkpThiCgrAqklNoD7UcctS5c7RaNQxrwHM5orI0vkGG2hzDXKOUNw4068u"
});

View File

@@ -19,7 +19,7 @@
export const originKeysSuccess = JSON.stringify({
originKeys: {
"https://www.your-domain.com": "pub.v2.7814286629520534.aHR0cHM6Ly93d3cueW91ci1kb21haW4xLmNvbQ.UEwIBmW9-c_uXo5wSEr2w8Hz8hVIpujXPHjpcEse3xI",
"https://www.your-domain1.com": "pub.v2.7814286629520534.aHR0cHM6Ly93d3cueW91ci1kb21haW4xLmNvbQ.UEwIBmW9-c_uXo5wSEr2w8Hz8hVIpujXPHjpcEse3xI",
"https://www.your-domain2.com": "pub.v2.7814286629520534.aHR0cHM6Ly93d3cueW91ci1kb21haW4yLmNvbQ.EP6eXBJKk0t7-QIUl6e_b1qMuMHGepxG_SlUqxAYrfY",
"https://www.your-domain3.com": "pub.v2.7814286629520534.aHR0cHM6Ly93d3cueW91ci1kb21haW4zLmNvbQ.fUvflu-YIdZSsLEH8Qqmr7ksE4ag_NYiiMXK0s6aq_4",
},

View File

@@ -1,233 +0,0 @@
export const businessLineInfo = {
"capability": "issueBankAccount",
"industryCode": "55",
"webData": [
{
"webAddress": "https://www.adyen.com"
}
],
"legalEntityId": "LE322KT223222D5FJ7THR293F",
"sourceOfFunds": {
"type": "business",
"adyenProcessedFunds": "false",
"description": "Funds from my flower shop business"
}
};
export const businessLineInfoUpdate = {
"capability": "string",
"industryCode": "string",
"legalEntityId": "string",
"salesChannels": ["string"],
"sourceOfFunds": {
"acquiringBusinessLineId": "string",
"adyenProcessedFunds": false,
"description": "string",
"type": "business"
},
"webData": [{ "webAddress": "string" }],
"webDataExemption": { "reason": "noOnlinePresence" }
};
export const document = {
"attachment": {
"content": "string",
"contentType": "string",
"filename": "string",
"pageName": "string",
"pageType": "string"
},
"attachments": [{
"content": "string",
"contentType": "string",
"filename": "string",
"pageName": "string",
"pageType": "string"
}],
"description": "string",
"expiryDate": "string",
"fileName": "string",
"id": "string",
"issuerCountry": "string",
"issuerState": "string",
"number": "string",
"owner": {
"id": "string",
"type": "string"
},
"type": "bankStatement"
};
export const onboardingLinkInfo = {
"locale": "cs-CZ",
"redirectUrl": "https://your.redirect-url.com",
"themeId": "123456789"
};
export const legalEntityInfo = {
"type": "individual",
"individual": {
"residentialAddress": {
"city": "San Francisco",
"country": "US",
"postalCode": "94107",
"street": "Brannan Street 274",
"stateOrProvince": "CA"
},
"phone": {
"countryCode": "US",
"number": "5551231234",
"type": "mobile"
},
"name": {
"firstName": "Simone",
"lastName": "Hopper"
},
"birthData": {
"dateOfBirth": "1981-12-01"
},
"email": "s.hopper@example.com"
}
};
export const genericEntityInfo = {
"entityAssociations": [{
"associatorId": "string",
"entityType": "string",
"jobTitle": "string",
"legalEntityId": "string",
"name": "string",
"type": "signatory"
}],
"individual": {
"birthData": { "dateOfBirth": "string" },
"email": "string",
"identificationData": {
"expiryDate": "string",
"issuerCountry": "string",
"issuerState": "string",
"nationalIdExempt": false,
"number": "string",
"type": "bankStatement"
},
"name": {
"firstName": "string",
"infix": "string",
"lastName": "string"
},
"nationality": "string",
"phone": {
"number": "string",
"type": "string"
},
"residentialAddress": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"taxInformation": [{
"country": "string",
"number": "string",
"type": "string"
}],
"webData": { "webAddress": "string" }
},
"organization": {
"description": "string",
"doingBusinessAs": "string",
"email": "string",
"legalName": "string",
"phone": {
"number": "string",
"type": "string"
},
"principalPlaceOfBusiness": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registeredAddress": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registrationNumber": "string",
"stockData": {
"marketIdentifier": "string",
"stockNumber": "string",
"tickerSymbol": "string"
},
"taxInformation": [{
"country": "string",
"number": "string",
"type": "string"
}],
"taxReportingClassification": {
"businessType": "other",
"financialInstitutionNumber": "string",
"mainSourceOfIncome": "businessOperation",
"type": "nonFinancialNonReportable"
},
"type": "associationIncorporated",
"vatAbsenceReason": "industryExemption",
"vatNumber": "string",
"webData": { "webAddress": "string" }
},
"soleProprietorship": {
"countryOfGoverningLaw": "string",
"doingBusinessAs": "string",
"name": "string",
"principalPlaceOfBusiness": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registeredAddress": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registrationNumber": "string",
"vatAbsenceReason": "industryExemption",
"vatNumber": "string"
}
};
export const transferInstrumentInfo = {
"bankAccount": {
"accountNumber": "string",
"accountType": "string",
"bankBicSwift": "string",
"bankCity": "string",
"bankCode": "string",
"bankName": "string",
"branchCode": "string",
"checkCode": "string",
"countryCode": "string",
"currencyCode": "string",
"iban": "string"
},
"legalEntityId": "string",
"recurringDetail": {
"merchantAccount": "string",
"reference": "string",
"shopperReference": "string"
},
"type": "bankAccount"
};

View File

@@ -1,241 +0,0 @@
export const businessLine = {
"capability": "receivePayments",
"id": "123456789",
"industryCode": "123456789",
"legalEntityId": "123456789",
"salesChannels": ["string"],
"sourceOfFunds": {
"acquiringBusinessLineId": "string",
"adyenProcessedFunds": false,
"description": "string",
"type": "business"
},
"webData": [{ "webAddress": "string" }],
"webDataExemption": { "reason": "noOnlinePresence" }
};
export const document = {
"attachment": {
"content": "string",
"contentType": "string",
"filename": "string",
"pageName": "string",
"pageType": "string"
},
"attachments": [{
"content": "string",
"contentType": "string",
"filename": "string",
"pageName": "string",
"pageType": "string"
}],
"description": "string",
"expiryDate": "string",
"fileName": "string",
"id": "123456789",
"issuerCountry": "string",
"issuerState": "string",
"number": "string",
"owner": {
"id": "123456789",
"type": "passport"
},
"type": "driversLicense"
};
export const onboardingLink = { "url": "https://your.redirect-url.com" };
export const onboardingThemes = {
"next": "string",
"previous": "string",
"themes": [{
"createdAt": "2022-10-31T01:30:00.000Z",
"description": "string",
"id": "123456789",
"properties": { "sample": "string" },
"updatedAt": "2022-10-31T01:30:00.000Z"
}]
};
export const onboardingTheme = {
"createdAt": "string",
"description": "string",
"id": "123456789",
"properties": { "sample": "string" },
"updatedAt": "string"
};
export const legalEntity = {
"documentDetails": [{
"active": false,
"fileName": "string",
"id": "string"
}],
"documents": [{ "id": "string" }],
"entityAssociations": [{
"associatorId": "string",
"entityType": "string",
"jobTitle": "string",
"legalEntityId": "string",
"name": "string",
"type": "signatory"
}],
"id": "123456789",
"individual": {
"birthData": { "dateOfBirth": "string" },
"email": "string",
"identificationData": {
"expiryDate": "string",
"issuerCountry": "string",
"issuerState": "string",
"nationalIdExempt": false,
"number": "string",
"type": "bankStatement"
},
"name": {
"firstName": "string",
"infix": "string",
"lastName": "string"
},
"nationality": "string",
"phone": {
"number": "string",
"type": "string"
},
"residentialAddress": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"taxInformation": [{
"country": "string",
"number": "string",
"type": "string"
}],
"webData": { "webAddress": "string" }
},
"organization": {
"description": "string",
"doingBusinessAs": "string",
"email": "string",
"legalName": "string",
"phone": {
"number": "string",
"type": "string"
},
"principalPlaceOfBusiness": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registeredAddress": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registrationNumber": "string",
"stockData": {
"marketIdentifier": "string",
"stockNumber": "string",
"tickerSymbol": "string"
},
"taxInformation": [{
"country": "string",
"number": "string",
"type": "string"
}],
"taxReportingClassification": {
"businessType": "other",
"financialInstitutionNumber": "string",
"mainSourceOfIncome": "businessOperation",
"type": "nonFinancialNonReportable"
},
"type": "associationIncorporated",
"vatAbsenceReason": "industryExemption",
"vatNumber": "string",
"webData": { "webAddress": "string" }
},
"reference": "string",
"soleProprietorship": {
"countryOfGoverningLaw": "string",
"doingBusinessAs": "string",
"name": "string",
"principalPlaceOfBusiness": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registeredAddress": {
"city": "string",
"country": "string",
"postalCode": "string",
"stateOrProvince": "string",
"street": "string",
"street2": "string"
},
"registrationNumber": "string",
"vatAbsenceReason": "industryExemption",
"vatNumber": "string"
},
"transferInstruments": [{ "id": "string" }],
"type": "individual"
};
export const businessLines = {
"businessLines": [{
"capability": "receivePayments",
"id": "123456789",
"industryCode": "123456789",
"legalEntityId": "123456789",
"salesChannels": ["string"],
"sourceOfFunds": {
"acquiringBusinessLineId": "string",
"adyenProcessedFunds": false,
"description": "string",
"type": "business"
},
"webData": [{ "webAddress": "string" }],
"webDataExemption": { "reason": "noOnlinePresence" }
}]
};
export const transferInstrument = {
"bankAccount": {
"accountNumber": "string",
"accountType": "string",
"bankBicSwift": "string",
"bankCity": "string",
"bankCode": "string",
"bankName": "string",
"branchCode": "string",
"checkCode": "string",
"countryCode": "string",
"currencyCode": "string",
"iban": "string"
},
"documentDetails": [{
"active": false,
"fileName": "string",
"id": "string"
}],
"id": "123456789",
"legalEntityId": "123456789",
"recurringDetail": {
"merchantAccount": "string",
"reference": "string",
"shopperReference": "string"
},
"type": "bankAccount"
};

View File

@@ -1,225 +0,0 @@
export const createMerchantRequest = {
"companyId": "YOUR_COMPANY_ACCOUNT",
"legalEntityId": "YOUR_LEGAL_ENTITY_ID",
"businessLineId": "YOUR_BUSINESS_LINE_ID",
"description": "YOUR_DESCRIPTION",
"reference": "YOUR_OWN_REFERENCE"
};
export const allowedOrigin = {
"_links": { "self": { "href": "string" } },
"domain": "string",
"id": "string"
};
export const createMerchantApiCredentialRequest = {
"roles": [
"Checkout webservice role"
],
"allowedOrigins": [
"https://www.mystore.com"
]
};
export const updateMerchantApiCredentialRequest = {
"active": false,
"allowedOrigins": ["string"],
"description": "string",
"roles": ["string"]
};
export const paymentMethodSetupInfo = {
"type": "visa",
"currencies": [
"USD"
],
"countries": [
"US"
]
};
export const updatePaymentMethodInfo = {
"countries": ["string"],
"currencies": ["string"],
"enabled": false
};
export const payoutSettingsRequest = {
"enabled": false,
"enabledFromDate": "string",
"transferInstrumentId": "string"
};
export const updatePayoutSettingsRequest = { "enabled": false };
export const shippingLocation = {
"name": "YOUR_MERCHANT_ACCOUNT Barcelona depot",
"address": {
"companyName": "YOUR_COMPANY",
"streetAddress": "El quinto pino 42",
"postalCode": "08012",
"city": "Barcelona",
"stateOrProvince": "",
"country": "ES"
},
"contact": {
"firstName": "Rita",
"lastName": "Perengano",
"phoneNumber": "+34 93 1234567",
"email": "Rita.Perengano@company.com"
}
};
export const terminalOrderRequest = {
"shippingLocation": "S2-73536B20665526704F30792642212044452F714622375D477270",
"items": [
{
"id": "TBOX-V400m-684-EU",
"name": "V400m Package",
"quantity": 1
},
{
"id": "PART-287001-EU",
"name": "Bluetooth Charging Base - V400m",
"quantity": 2
},
{
"id": "PART-620222-EU",
"name": "Receipt Roll",
"quantity": 20
}
]
};
export const logo = {
"data": ""
};
export const terminalSettings = {
"wifiProfiles": {
"profiles": [
{
"authType": "wpa-eap",
"autoWifi": false,
"bssType": "infra",
"channel": 0,
"defaultProfile": true,
"eap": "peap",
"eapCaCert": {
"data": "MD1rKS05M2JqRVFNQ...RTtLH1tLWo=",
"name": "eap-peap-ca.pem"
},
"eapIdentity": "admin",
"eapIntermediateCert": {
"data": "PD3tUS1CRDdJTiGDR...EFoLS0tLQg=",
"name": "eap-peap-client.pem"
},
"eapPwd": "EAP_PEAP_PASSWORD",
"hiddenSsid": false,
"name": "Profile-eap-peap-1",
"ssid": "your-network",
"wsec": "ccmp"
},
{
"authType": "wpa-psk",
"autoWifi": false,
"bssType": "infra",
"channel": 0,
"defaultProfile": false,
"hiddenSsid": false,
"name": "Profile-guest-wifi",
"psk": "WIFI_PASSWORD",
"ssid": "your-network",
"wsec": "ccmp"
}
],
"settings": {
"band": "2.4GHz",
"roaming": true,
"timeout": 5
}
}
};
export const createMerchantUserRequest = {
"name": {
"firstName": "John",
"lastName": "Smith"
},
"username": "johnsmith",
"email": "john.smith@example.com",
"timeZoneCode": "Europe/Amsterdam",
"roles": [
"Merchant standard role"
],
"associatedMerchantAccounts": [
"YOUR_MERCHANT_ACCOUNT"
]
};
export const updateMerchantUserRequest = {
"accountGroups": ["string"],
"active": false,
"email": "string",
"name": {
"firstName": "string",
"lastName": "string"
},
"roles": ["string"],
"timeZoneCode": "string"
};
export const createMerchantWebhookRequest = {
"acceptsExpiredCertificate": false,
"acceptsSelfSignedCertificate": false,
"acceptsUntrustedRootCertificate": false,
"active": false,
"additionalSettings": {
"includeEventCodes": ["string"],
"properties": { "sample": false }
},
"communicationFormat": "HTTP",
"description": "string",
"networkType": "LOCAL",
"password": "string",
"populateSoapActionHeader": false,
"sslVersion": "HTTP",
"type": "string",
"url": "string",
"username": "string"
};
export const updateMerchantWebhookRequest = {
"acceptsExpiredCertificate": false,
"acceptsSelfSignedCertificate": false,
"acceptsUntrustedRootCertificate": false,
"active": false,
"additionalSettings": {
"includeEventCodes": ["string"],
"properties": { "sample": false }
},
"communicationFormat": "HTTP",
"description": "string",
"networkType": "LOCAL",
"password": "string",
"populateSoapActionHeader": false,
"sslVersion": "HTTP",
"url": "string",
"username": "string"
};
export const testWebhookRequest = {
"notification": {
"amount": {
"currency": "string",
"value": 0
},
"eventCode": "string",
"eventDate": "string",
"merchantReference": "string",
"paymentMethod": "string",
"reason": "string",
"success": false
},
"types": ["string"]
};

File diff suppressed because it is too large Load Diff

View File

@@ -11,8 +11,7 @@
"totalFraudScore": "10",
"hmacSignature": "OzDjCMZIsdtDqrZ+cl\/FWC+WdESrorctXTzAzW33dXI=",
"NAME2": " VALUE2 ",
"fraudCheck-6-ShopperIpUsage": "10",
"paymentLinkId": "ABCDEFG"
"fraudCheck-6-ShopperIpUsage": "10"
},
"amount": {
"currency": "EUR",

View File

@@ -18,60 +18,54 @@
*/
export const listRecurringDetailsSuccess = {
"creationDate": "2017-03-01T11:53:11+01:00",
"details": [
creationDate: "2017-03-01T10:53:11.000",
details: [
{
"acquirer": "TestPmmAcquirer",
"acquirerAccount": "TestPmmAcquirerAccount",
"additionalData": {
"cardBin": "411111"
additionalData: {
cardBin: "411111",
},
"alias": "cardAlias",
"aliasType": "Default",
"card": {
"expiryMonth": "8",
"expiryYear": "2018",
"holderName": "Holder",
"number": "1111"
alias: "cardAlias",
aliasType: "Default",
card: {
expiryMonth: "8",
expiryYear: "2018",
holderName: "Holder",
number: "1111",
},
"contractTypes": [
"ONECLICK"
contractTypes: [
"ONECLICK",
],
"creationDate": "2017-03-07T09:43:33+01:00",
"firstPspReference": "8524888762135795",
"paymentMethodVariant": "visa",
"recurringDetailReference": "recurringReference",
"variant": "visa"
creationDate: "2017-03-01T10:53:11.000",
firstPspReference: "8524888762135795",
paymentMethodVariant: "visa",
recurringDetailReference: "recurringReference",
variant: "visa",
},
{
"acquirer": "PayPalSandbox",
"acquirerAccount": "TestPmmAcquirerAccount",
"billingAddress": {
"city": "City",
"country": "NL",
"houseNumberOrName": "1",
"postalCode": "2312aa",
"stateOrProvince": "NA",
"street": "Street"
billingAddress: {
city: "City",
country: "NL",
houseNumberOrName: "1",
postalCode: "2312aa",
stateOrProvince: "NA",
street: "Street",
},
"contractTypes": [
"RECURRING"
contractTypes: [
"RECURRING",
],
"creationDate": "2017-10-10T08:50:02+02:00",
"firstPspReference": "8515076181707110",
"paymentMethodVariant": "paypal",
"recurringDetailReference": "8315076181982020",
"tokenDetails": {
"tokenData": {
creationDate: "2017-03-01T10:53:11.000",
firstPspReference: "8515076181707110",
paymentMethodVariant: "paypal",
recurringDetailReference: "8315076181982020",
tokenDetails: {
tokenData: {
"BillingAgreementId": "B-7MA42752FE774625C",
"EmailId": "tedtest@test.nl",
"PayPal.PayerId": "H95EPL8B2KFE6",
"BillingAgreementId": "B-7MA42752FE774625C"
},
"tokenDataType": "PayPal"
tokenDataType: "PayPal",
},
"variant": "paypal"
}
variant: "paypal",
},
],
"shopperReference": "test-123",
"invalidOneclickContracts": "false"
};

View File

@@ -1,28 +0,0 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
export const notifyShopperSuccess = {
"message": "Request Processed Successfully",
"resultCode": "Success",
"shopperNotificationReference": "9915003646742627",
"storedPaymentMethodId": "8415995487234100",
"pspReference": "9915003646742627",
"reference": "Example reference",
"displayedReference": "Example displayed reference"
};

View File

@@ -365,24 +365,3 @@ export const syncRefund = {
}
}
};
export const syncResEventNotification = {
SaleToPOIRequest: {
EventNotification: {
EventToNotify: "Reject",
EventDetails: "message=Did+not+receive+a+response+from+the+POI.",
RejectedMessage: "ewoi...0KfQo=",
TimeStamp: "2020-03-31T10:28:39.515Z"
},
MessageHeader: {
DeviceID: "666568147",
MessageCategory: "Event",
MessageClass: "Event",
MessageType: "Notification",
POIID: "P400Plus-123456789",
ProtocolVersion: "3.0",
SaleID: "saleid-4c32759faaa7",
ServiceID: "31122609"
}
}
};

View File

@@ -1,135 +0,0 @@
export const transfersSuccess = {
"id" : "1W1UG35U8A9J5ZLG",
"amount" : {
"value" : 110000,
"currency" : "EUR"
},
"balanceAccountId" : "BAB8B2C3D4E5F6G7H8D9J6GD4",
"category" : "bank",
"counterparty" : {
"accountHolder" : {
"fullName" : "A. Klaassen",
"address" : {
"city" : "San Francisco",
"country" : "US",
"postalCode" : "94678",
"stateOrProvince" : "CA",
"street" : "Brannan Street",
"street2" : "274"
}
},
"accountIdentification" : {
"type" : "numberBic",
"accountNumber" : "123456789",
"bic" : "BOFAUS3NXXX"
}
},
"priority" : "wire",
"referenceForBeneficiary" : "Your reference sent to the beneficiary",
"reference" : "Your internal reference for the transfer",
"description" : "Your description for the transfer",
"direction" : "outgoing",
"reason" : "approved",
"status" : "authorised"
};
export const getTransactionSuccess = {
"accountHolderId" : "AHA1B2C3D4E5F6G7H8I9J0",
"amount" : {
"currency" : "EUR",
"value" : 9887
},
"balanceAccountId" : "BAB8B2C3D4E5F6G7H8D9J6GD4",
"balancePlatform" : "YOUR_BALANCE_PLATFORM",
"bookingDate" : "2022-03-14T12:01:00+01:00",
"category" : "bank",
"counterparty" : {
"balanceAccountId" : "NL29ADYX0000000001"
},
"createdAt" : "2022-03-14T12:01:00+01:00",
"description" : "YOUR_DESCRIPTION",
"id" : "IZK7C25U7DYVX03Y",
"instructedAmount" : {
"currency" : "EUR",
"value" : 9887
},
"reference" : "2L6C6B5U7DYULLXC",
"referenceForBeneficiary" : "YOUR_REFERENCE_FOR_BENEFICIARY",
"status" : "booked",
"transferId" : "2QP32A5U7IWC5WKG",
"type" : "bankTransfer",
"valueDate" : "2022-03-14T12:01:00+01:00"
};
export const listTransactionsSuccess = {
"data" : [
{
"accountHolderId" : "AHA1B2C3D4E5F6G7H8I9J0",
"amount" : {
"currency" : "EUR",
"value" : -9
},
"balanceAccountId" : "BAB8B2C3D4E5F6G7H8D9J6GD4",
"balancePlatform" : "YOUR_BALANCE_PLATFORM",
"bookingDate" : "2022-03-11T11:21:24+01:00",
"category" : "internal",
"createdAt" : "2022-03-11T11:21:24+01:00",
"id" : "1VVF0D5U66PIUIVP",
"instructedAmount" : {
"currency" : "EUR",
"value" : -9
},
"reference" : "REFERENCE_46e8c40e",
"status" : "booked",
"transferId" : "1VVF0D5U66PIUIVP",
"type" : "fee",
"valueDate" : "2022-03-11T11:21:24+01:00"
},
{
"accountHolderId" : "AHA1B2C3D4E5F6G7H8I9J0",
"amount" : {
"currency" : "EUR",
"value" : -46
},
"balanceAccountId" : "BAB8B2C3D4E5F6G7H8D9J6GD4",
"balancePlatform" : "YOUR_BALANCE_PLATFORM",
"bookingDate" : "2022-03-12T14:22:52+01:00",
"category" : "internal",
"createdAt" : "2022-03-12T14:22:52+01:00",
"id" : "1WEPGD5U6MS1CFK3",
"instructedAmount" : {
"currency" : "EUR",
"value" : -46
},
"reference" : "YOUR_REFERENCE",
"status" : "booked",
"transferId" : "1WEPGD5U6MS1CFK3",
"type" : "fee",
"valueDate" : "2022-03-12T14:22:52+01:00"
},
{
"accountHolderId" : "AHA1B2C3D4E5F6G7H8I9J0",
"amount" : {
"currency" : "EUR",
"value" : -8
},
"balanceAccountId" : "BAB8B2C3D4E5F6G7H8D9J6GD4",
"balancePlatform" : "YOUR_BALANCE_PLATFORM",
"bookingDate" : "2022-03-14T21:00:48+01:00",
"createdAt" : "2022-03-14T15:00:00+01:00",
"description" : "YOUR_DESCRIPTION_2",
"id" : "2QP32A5U7IWC5WKG",
"instructedAmount" : {
"currency" : "EUR",
"value" : -8
},
"status" : "booked",
"valueDate" : "2022-03-14T21:00:48+01:00"
}
],
"_links" : {
"next" : {
"href" : "https://balanceplatform-api-test.adyen.com/btl/v2/transactions?balancePlatform=Bastronaut&createdUntil=2022-03-21T00%3A00%3A00Z&createdSince=2022-03-11T00%3A00%3A00Z&limit=3&cursor=S2B-TSAjOkIrYlIlbjdqe0RreHRyM32lKRSxubXBHRkhHL2E32XitQQz5SfzpucD5HbHwpM1p6NDR1eXVQLFF6MmY33J32sobDxQYT90MHIud1hwLnd6JitcX32xJ"
}
}
};

View File

@@ -1,894 +0,0 @@
import nock from "nock";
import Client from "../client";
import { createClient } from "../__mocks__/base";
import BalancePlatform from "../services/balancePlatform";
import { balancePlatform } from "../typings";
import { AccountHolderUpdate } from "../services/balancePlaftform/accountHolders";
import { SweepConfigurationV2Create, SweepConfigurationV2Update } from "../services/balancePlaftform/balanceAccounts";
import { TransactionRuleInfoUpdate } from "../services/balancePlaftform/transactionRules";
let client: Client;
let balancePlatformService: BalancePlatform;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
scope = nock(`${client.config.balancePlatformEndpoint}/${Client.BALANCE_PLATFORM_API_VERSION}`);
balancePlatformService = new BalancePlatform(client);
});
afterEach(() => {
nock.cleanAll();
});
describe("Balance Platform", (): void => {
const balanceAccountId = "BA32272223222B59CZ3T52DKZ";
const sweepId = "SWPC4227C224555B5FTD2NT2JV4WN5";
const paymentInstrumentId = "PI32272223222B5CMD3MQ3HXX";
const paymentInstrumentGroupId = "PG3227C223222B5CMD3FJFKGZ";
const transactionRuleId = "TR3227C223222B5FCB756DV9H";
describe("AccountHolders", (): void => {
it("should support POST /accountHolders", async (): Promise<void> => {
scope.post("/accountHolders")
.reply(200, {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"contactDetails": {
"email": "s.hopper@example.com",
"phone": {
"number": "+315551231234",
"type": "Mobile"
},
"address": {
"city": "Amsterdam",
"country": "NL",
"street": "Brannan Street",
"houseNumberOrName": "274",
"postalCode": "1020CD"
}
},
"description": "S.Hopper - Staff 123",
"legalEntityId": "LE322KT223222D5FJ7THR293F",
"id": "AH3227C223222B5CMD2SXFKGT",
"status": "active"
});
const request: balancePlatform.AccountHolderInfo = {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"description": "S.Hopper - Staff 123",
"legalEntityId": "LE322KT223222D5FJ7THR293F",
"contactDetails": {
"email": "s.hopper@example.com",
"phone": {
"number": "+315551231234",
"type": balancePlatform.Phone.TypeEnum.Mobile
},
"address": {
"city": "Amsterdam",
"country": "NL",
"street": "Brannan Street",
"houseNumberOrName": "274",
"postalCode": "1020CD"
}
}
};
const response: balancePlatform.AccountHolder = await balancePlatformService.AccountHolders.create(request);
expect(response.id).toBe("AH3227C223222B5CMD2SXFKGT");
expect(response.legalEntityId).toBe("LE322KT223222D5FJ7THR293F");
});
it("should support GET /accountHolders/{id}", async (): Promise<void> => {
scope.get("/accountHolders/AH32272223222B5CM4MWJ892H")
.reply(200, {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"contactDetails": {
"address": {
"city": "Amsterdam",
"country": "NL",
"houseNumberOrName": "274",
"postalCode": "1020CD",
"street": "Brannan Street"
},
"email": "s.hopper@example.com",
"phone": {
"number": "+315551231234",
"type": "Mobile"
}
},
"description": "S.Hopper - Staff 123",
"id": "AH32272223222B5CM4MWJ892H",
"status": "Active"
});
const response: balancePlatform.AccountHolder = await balancePlatformService.AccountHolders.retrieve("AH32272223222B5CM4MWJ892H");
expect(response.id).toBe("AH32272223222B5CM4MWJ892H");
expect(response.balancePlatform).toBe("YOUR_BALANCE_PLATFORM");
});
it("should support PATCH /accountHolders/{id}", async (): Promise<void> => {
scope.patch("/accountHolders/AH32272223222B5CM4MWJ892H")
.reply(200, {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"contactDetails": {
"address": {
"city": "Amsterdam",
"country": "NL",
"houseNumberOrName": "274",
"postalCode": "1020CD",
"street": "Brannan Street"
},
"email": "s.hopper@example.com",
"phone": {
"number": "+315551231234",
"type": "Mobile"
}
},
"description": "S.Hopper - Staff 123",
"id": "AH32272223222B5CM4MWJ892H",
"status": "Suspended"
});
const request: AccountHolderUpdate = {
status: balancePlatform.AccountHolder.StatusEnum.Suspended,
legalEntityId: "LE322KT223222D5FJ7THR293F",
};
const response: balancePlatform.AccountHolder = await balancePlatformService.AccountHolders.update("AH32272223222B5CM4MWJ892H", request);
expect(response.status).toBe("Suspended");
});
it("should support GET /accountHolders/{id}/balanceAccounts", async (): Promise<void> => {
scope.get("/accountHolders/AH32272223222B5CM4MWJ892H/balanceAccounts?limit=5&offset=10")
.reply(200, {
"balanceAccounts": [
{
"accountHolderId": "AH32272223222B59K6ZKBBFNQ",
"defaultCurrencyCode": "EUR",
"id": "BA32272223222B59K6ZXHBFN6",
"status": "Active"
},
{
"accountHolderId": "AH32272223222B59K6ZKBBFNQ",
"defaultCurrencyCode": "EUR",
"id": "BA32272223222B59K72CKBFNJ",
"status": "Active"
},
{
"accountHolderId": "AH32272223222B59K6ZKBBFNQ",
"defaultCurrencyCode": "EUR",
"id": "BA32272223222B5BRR27B2M7G",
"status": "Active"
}
],
"hasNext": true,
"hasPrevious": false
});
const response: balancePlatform.PaginatedBalanceAccountsResponse = await balancePlatformService.AccountHolders.listBalanceAccounts("AH32272223222B5CM4MWJ892H", {
params: {
"limit": "5",
"offset": "10"
}
});
expect(response.balanceAccounts[0].id).toBe("BA32272223222B59K6ZXHBFN6");
});
});
describe("BalanceAccounts", (): void => {
it("should support POST /balanceAccounts", async (): Promise<void> => {
scope.post("/balanceAccounts")
.reply(200, {
"accountHolderId": "AH32272223222B59K6ZKBBFNQ",
"defaultCurrencyCode": "EUR",
"reference": "S.Hopper - Main balance account",
"balances": [
{
"available": 0,
"balance": 0,
"currency": "EUR",
"reserved": 0
}
],
"id": balanceAccountId,
"status": "active"
});
const request: balancePlatform.BalanceAccountInfo = {
"accountHolderId": "AH32272223222B59K6ZKBBFNQ",
"description": "S.Hopper - Main balance account"
};
const response: balancePlatform.BalanceAccount = await balancePlatformService.BalanceAccounts.create(request);
expect(response.id).toBe(balanceAccountId);
});
it("should support GET /balanceAccounts/{balanceAccountId}/sweeps", async (): Promise<void> => {
scope.get(`/balanceAccounts/${balanceAccountId}/sweeps?limit=5&offset=10`)
.reply(200, {
"hasNext": false,
"hasPrevious": false,
"sweeps": [
{
"id": sweepId,
"schedule": {
"type": "daily"
},
"status": "active",
"targetAmount": {
"currency": "EUR",
"value": 0
},
"triggerAmount": {
"currency": "EUR",
"value": 0
},
"type": "push",
"counterparty": {
"balanceAccountId": "BA32272223222B5FTD2KR6TJD"
},
"currency": "EUR"
}
]
});
const response: balancePlatform.BalanceSweepConfigurationsResponse = await balancePlatformService.BalanceAccounts.listSweeps(balanceAccountId, {
params: {
"limit": "5",
"offset": "10"
}
});
expect(response.hasNext).toBeFalsy();
expect(response.sweeps.length).toBe(1);
});
it("should support POST /balanceAccounts/{balanceAccountId}/sweeps", async (): Promise<void> => {
scope.post(`/balanceAccounts/${balanceAccountId}/sweeps`)
.reply(200, {
"id": sweepId,
"counterparty": {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
},
"triggerAmount": {
"currency": "EUR",
"value": 50000
},
"currency": "EUR",
"schedule": {
"type": "balance"
},
"type": "pull",
"status": "active"
});
const request: SweepConfigurationV2Create = {
"counterparty": {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
},
"triggerAmount": {
"currency": "EUR",
"value": 50000
},
"currency": "EUR",
"schedule": {
"type": balancePlatform.SweepSchedule.TypeEnum.Balance
},
"type": balancePlatform.SweepConfigurationV2.TypeEnum.Pull,
"status": balancePlatform.SweepConfigurationV2.StatusEnum.Active
};
const response: balancePlatform.SweepConfigurationV2 = await balancePlatformService.BalanceAccounts.createSweep(balanceAccountId, request);
expect(response.id).toBe(sweepId);
expect(response.triggerAmount!.value).toBe(50000);
});
it("should support DELETE /balanceAccounts/{balanceAccountId}/sweeps/{sweepId}", async (): Promise<void> => {
scope.delete(`/balanceAccounts/${balanceAccountId}/sweeps/${sweepId}`).reply(204);
await balancePlatformService.BalanceAccounts.deleteSweep(balanceAccountId, sweepId);
});
it("should support GET /balanceAccounts/{balanceAccountId}/sweeps/{sweepId}", async (): Promise<void> => {
scope.get(`/balanceAccounts/${balanceAccountId}/sweeps/${sweepId}`)
.reply(200, {
"id": sweepId,
"schedule": {
"type": "daily"
},
"status": "active",
"targetAmount": {
"currency": "EUR",
"value": 0
},
"triggerAmount": {
"currency": "EUR",
"value": 0
},
"type": "push",
"counterparty": {
"balanceAccountId": "BA32272223222B5FTD2KR6TJD"
},
"currency": "EUR"
});
const response: balancePlatform.SweepConfigurationV2 = await balancePlatformService.BalanceAccounts.retrieveSweep(balanceAccountId, sweepId);
expect(response.id).toBe(sweepId);
expect(response.status).toBe("active");
});
it("should support PATCH /balanceAccounts/{balanceAccountId}/sweeps/{sweepId}", async (): Promise<void> => {
scope.patch(`/balanceAccounts/${balanceAccountId}/sweeps/${sweepId}`)
.reply(200, {
"id": sweepId,
"counterparty": {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
},
"triggerAmount": {
"currency": "EUR",
"value": 50000
},
"currency": "EUR",
"schedule": {
"type": "balance"
},
"type": "pull",
"status": "inactive"
});
const request: SweepConfigurationV2Update = {
"status": balancePlatform.SweepConfigurationV2.StatusEnum.Inactive
};
const response: balancePlatform.SweepConfigurationV2 = await balancePlatformService.BalanceAccounts.updateSweep(balanceAccountId, sweepId, request);
expect(response.status).toBe("inactive");
});
it("should support GET /balanceAccounts/{id}", async (): Promise<void> => {
scope.get(`/balanceAccounts/${balanceAccountId}`)
.reply(200, {
"accountHolderId": "AH32272223222B59K6RTQBFNZ",
"defaultCurrencyCode": "EUR",
"balances": [
{
"available": 0,
"balance": 0,
"currency": "EUR",
"reserved": 0
}
],
"id": balanceAccountId,
"status": "Active"
});
const response: balancePlatform.BalanceAccount = await balancePlatformService.BalanceAccounts.retrieve(balanceAccountId);
expect(response.id).toBe(balanceAccountId);
expect(response.status).toBe("Active");
});
it("should support PATCH /balanceAccounts/{id}", async (): Promise<void> => {
scope.patch(`/balanceAccounts/${balanceAccountId}`)
.reply(200, {
"accountHolderId": "string",
"balances": [
{
"available": 0,
"balance": 0,
"currency": "string",
"reserved": 0
}
],
"defaultCurrencyCode": "string",
"description": "Testing",
"id": "string",
"reference": "string",
"status": "active",
"timeZone": "Europe/Amsterdam"
});
const request: balancePlatform.BalanceAccountUpdateRequest = {
"description": "Testing",
"status": balancePlatform.BalanceAccountUpdateRequest.StatusEnum.Active,
"timeZone": "Europe/Amsterdam"
};
const response: balancePlatform.BalanceAccount = await balancePlatformService.BalanceAccounts.update(balanceAccountId, request);
expect(response.status).toBe("active");
expect(response.timeZone).toBe("Europe/Amsterdam");
});
it("should support GET /balanceAccounts/{id}/paymentInstruments", async (): Promise<void> => {
scope.get(`/balanceAccounts/${balanceAccountId}/paymentInstruments?limit=3&offset=6`)
.reply(200, {
"hasNext": "true",
"hasPrevious": "false",
"paymentInstruments": [
{
"balanceAccountId": balanceAccountId,
"issuingCountryCode": "GB",
"status": "Active",
"type": "card",
"card": {
"brandVariant": "mc",
"cardholderName": "name",
"formFactor": "virtual",
"bin": "555544",
"expiration": {
"month": "12",
"year": "2022"
},
"lastFour": "2357",
"number": "************2357"
},
"id": "PI32272223222B59M5TM658DT"
},
{
"balanceAccountId": balanceAccountId,
"issuingCountryCode": "GB",
"status": "Active",
"type": "card",
"card": {
"brandVariant": "mc",
"cardholderName": "name",
"formFactor": "virtual",
"bin": "555544",
"expiration": {
"month": "01",
"year": "2023"
},
"lastFour": "8331",
"number": "************8331"
},
"id": "PI32272223222B59PXDGQDLSF"
}
]
});
const response: balancePlatform.PaginatedPaymentInstrumentsResponse = await balancePlatformService.BalanceAccounts.listPaymentInstruments(balanceAccountId, {
params: {
limit: "3",
offset: "6",
}
});
expect(response.paymentInstruments.length).toBe(2);
expect(response.paymentInstruments[0].id).toBe("PI32272223222B59M5TM658DT");
});
});
describe("General", (): void => {
it("should support GET /balancePlatforms/{id}", async (): Promise<void> => {
scope.get(`/balancePlatforms/${balanceAccountId}`)
.reply(200, {
"id": balanceAccountId,
"status": "Active"
});
const response: balancePlatform.BalancePlatform = await balancePlatformService.General.retrieve(balanceAccountId);
expect(response.id).toBe(balanceAccountId);
expect(response.status).toBe("Active");
});
it("should support GET /balancePlatforms/{id}/accountHolders", async (): Promise<void> => {
scope.get(`/balancePlatforms/${balanceAccountId}/accountHolders`)
.reply(200, {
"accountHolders": [
{
"contactDetails": {
"address": {
"city": "Amsterdam",
"country": "NL",
"houseNumberOrName": "6",
"postalCode": "12336750",
"street": "Simon Carmiggeltstraat"
}
},
"description": "J. Doe",
"id": "AH32272223222B59DDWSCCMP7",
"status": "Active"
},
{
"contactDetails": {
"address": {
"city": "Amsterdam",
"country": "NL",
"houseNumberOrName": "11",
"postalCode": "12336750",
"street": "Simon Carmiggeltstraat"
}
},
"description": "S. Hopper",
"id": "AH32272223222B59DJ7QBCMPN",
"status": "Active"
}
],
"hasNext": "true",
"hasPrevious": "false"
});
const response: balancePlatform.PaginatedAccountHoldersResponse = await balancePlatformService.General.listAccountHolders(balanceAccountId);
expect(response.accountHolders.length).toBe(2);
expect(response.accountHolders[0].id).toBe("AH32272223222B59DDWSCCMP7");
});
});
describe("PaymentInstruments", (): void => {
it("should support POST /paymentInstruments", async (): Promise<void> => {
scope.post("/paymentInstruments")
.reply(200, {
"balanceAccountId": balanceAccountId,
"description": "S. Hopper - Main card",
"issuingCountryCode": "GB",
"status": "Active",
"type": "card",
"card": {
"brand": "mc",
"brandVariant": "mcdebit",
"cardholderName": "Simon Hopper",
"formFactor": "virtual",
"bin": "555544",
"cvc": "873",
"expiration": {
"month": "01",
"year": "2024"
},
"lastFour": "3548"
},
"id": paymentInstrumentId
});
const request: balancePlatform.PaymentInstrumentInfo = {
"type": balancePlatform.PaymentInstrumentInfo.TypeEnum.Card,
"issuingCountryCode": "NL",
"balanceAccountId": balanceAccountId,
"status": balancePlatform.PaymentInstrumentInfo.StatusEnum.Inactive,
"card": {
"formFactor": balancePlatform.CardInfo.FormFactorEnum.Physical,
"brand": "mc",
"brandVariant": "mcdebit",
"cardholderName": "Sam Hopper",
"deliveryContact": {
"address": {
"city": "Amsterdam",
"country": "NL",
"stateOrProvince": "NH",
"line1": "Simon Carmiggeltstraat",
"line2": "6-50",
"postalCode": "1011DJ"
},
"name": {
"firstName": "Sam",
"lastName": "Hopper"
}
},
"configuration": {
"configurationProfileId": "YOUR_CONFIGURATION_PROFILE_ID"
},
},
"description": "S.Hopper - Main card"
};
const response: balancePlatform.PaymentInstrument = await balancePlatformService.PaymentInstruments.create(request);
expect(response.id).toBe(paymentInstrumentId);
expect(response.balanceAccountId).toBe(balanceAccountId);
});
it("should support GET /paymentInstruments/{id}", async (): Promise<void> => {
scope.get(`/paymentInstruments/${paymentInstrumentId}`)
.reply(200, {
"balanceAccountId": balanceAccountId,
"description": "S. Hopper - Main card",
"issuingCountryCode": "GB",
"status": "active",
"type": "card",
"card": {
"brand": "mc",
"brandVariant": "mcdebit",
"cardholderName": "Simon Hopper",
"formFactor": "virtual",
"bin": "555544",
"expiration": {
"month": "01",
"year": "2024"
},
"lastFour": "3548",
"number": "************3548"
},
"id": paymentInstrumentId
});
const response: balancePlatform.PaymentInstrument = await balancePlatformService.PaymentInstruments.retrieve(paymentInstrumentId);
expect(response.id).toBe(paymentInstrumentId);
expect(response.status).toBe("active");
});
it("should support PATCH /paymentInstruments/{id}", async (): Promise<void> => {
scope.patch(`/paymentInstruments/${paymentInstrumentId}`)
.reply(200, {
"balanceAccountId": "BA32272223222B5CM82WL892M",
"description": "S. Hopper - Main card",
"issuingCountryCode": "GB",
"status": "inactive",
"type": "card",
"card": {
"brand": "mc",
"brandVariant": "mcdebit",
"cardholderName": "Simon Hopper",
"formFactor": "virtual",
"bin": "555544",
"expiration": {
"month": "01",
"year": "2024"
},
"lastFour": "5785",
"number": "************5785"
},
"id": paymentInstrumentId
});
const request: balancePlatform.PaymentInstrumentUpdateRequest = {
"balanceAccountId": "BA32272223222B5CM82WL892M"
};
const response: balancePlatform.PaymentInstrument = await balancePlatformService.PaymentInstruments.update(paymentInstrumentId, request);
expect(response.id).toBe(paymentInstrumentId);
expect(response.balanceAccountId).toBe("BA32272223222B5CM82WL892M");
});
it("should support GET /paymentInstruments/{id}/transactionRules", async (): Promise<void> => {
scope.get(`/paymentInstruments/${paymentInstrumentId}/transactionRules`)
.reply(200, {
"transactionRules": [
{
"description": "Allow 5 transactions per month",
"interval": {
"type": "monthly"
},
"maxTransactions": 5,
"paymentInstrumentGroupId": paymentInstrumentGroupId,
"reference": "myRule12345",
"startDate": "2021-01-25T12:46:35.476629Z",
"status": "active",
"type": "velocity",
"id": "TR32272223222B5CMDGMC9F4F"
},
{
"amount": {
"currency": "EUR",
"value": 10000
},
"description": "Allow up to 100 EUR per month",
"interval": {
"type": "monthly"
},
"paymentInstrumentGroupId": paymentInstrumentGroupId,
"reference": "myRule16378",
"startDate": "2021-01-25T12:46:35.476629Z",
"status": "active",
"type": "velocity",
"id": "TR32272223222B5CMDGT89F4F"
}
]
});
const response: balancePlatform.TransactionRulesResponse = await balancePlatformService.PaymentInstruments.listTransactionRules(paymentInstrumentId);
expect(response.transactionRules!.length).toBe(2);
expect(response.transactionRules![0].id).toBe("TR32272223222B5CMDGMC9F4F");
});
});
describe("PaymentInstrumentGroups", (): void => {
it("should support POST /paymentInstrumentGroups", async (): Promise<void> => {
scope.post("/paymentInstrumentGroups")
.reply(200, {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"txVariant": "mc",
"id": paymentInstrumentGroupId
});
const request: balancePlatform.PaymentInstrumentGroupInfo = {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"txVariant": "mc"
};
const response: balancePlatform.PaymentInstrumentGroup = await balancePlatformService.PaymentInstrumentGroups.create(request);
expect(response.id).toBe(paymentInstrumentGroupId);
expect(response.txVariant).toBe("mc");
});
it("should support GET /paymentInstrumentGroups/{id}", async (): Promise<void> => {
scope.get(`/paymentInstrumentGroups/${paymentInstrumentGroupId}`)
.reply(200, {
"balancePlatform": "YOUR_BALANCE_PLATFORM",
"txVariant": "mc",
"id": paymentInstrumentGroupId
});
const response: balancePlatform.PaymentInstrumentGroup = await balancePlatformService.PaymentInstrumentGroups.retrieve(paymentInstrumentGroupId);
expect(response.id).toBe(paymentInstrumentGroupId);
expect(response.txVariant).toBe("mc");
});
it("should support GET /paymentInstrumentGroups/{id}/transactionRules", async (): Promise<void> => {
scope.get(`/paymentInstrumentGroups/${paymentInstrumentGroupId}/transactionRules`)
.reply(200, {
"transactionRules": [
{
"description": "Allow 5 transactions per month",
"interval": {
"type": "monthly"
},
"maxTransactions": 5,
"paymentInstrumentGroupId": paymentInstrumentGroupId,
"reference": "myRule12345",
"startDate": "2021-01-25T12:46:35.476629Z",
"status": "active",
"type": "velocity",
"id": "TR32272223222B5CMDGMC9F4F"
},
{
"amount": {
"currency": "EUR",
"value": 10000
},
"description": "Allow up to 100 EUR per month",
"interval": {
"type": "monthly"
},
"paymentInstrumentGroupId": paymentInstrumentGroupId,
"reference": "myRule16378",
"startDate": "2021-01-25T12:46:35.476629Z",
"status": "active",
"type": "velocity",
"id": "TR32272223222B5CMDGT89F4F"
}
]
});
const response: balancePlatform.TransactionRulesResponse = await balancePlatformService.PaymentInstrumentGroups.listTransactionRules(paymentInstrumentGroupId);
expect(response.transactionRules!.length).toBe(2);
expect(response.transactionRules![0].id).toBe("TR32272223222B5CMDGMC9F4F");
});
});
describe("TransactionRules", (): void => {
it("should support POST /transactionRules", async (): Promise<void> => {
scope.post("/transactionRules")
.reply(200, {
"description": "Allow only point-of-sale transactions",
"entityKey": {
"entityReference": "PI3227C223222B5BPCMFXD2XG",
"entityType": "paymentInstrument"
},
"interval": {
"timeZone": "UTC",
"type": "perTransaction"
},
"outcomeType": "hardBlock",
"reference": "YOUR_REFERENCE_4F7346",
"requestType": "authorization",
"ruleRestrictions": {
"processingTypes": {
"operation": "noneMatch",
"value": [
"pos"
]
}
},
"startDate": "2022-03-23T15:05:11.979433+01:00",
"status": "active",
"type": "blockList",
"id": transactionRuleId
});
const request: balancePlatform.TransactionRuleInfo = {
"description": "Allow only point-of-sale transactions",
"reference": "YOUR_REFERENCE_4F7346",
"entityKey": {
"entityType": "paymentInstrument",
"entityReference": "PI3227C223222B5BPCMFXD2XG"
},
"status": balancePlatform.TransactionRuleInfo.StatusEnum.Active,
"interval": {
"type": balancePlatform.TransactionRuleInterval.TypeEnum.PerTransaction
},
"ruleRestrictions": {
"processingTypes": {
"operation": "noneMatch",
"value": [
balancePlatform.ProcessingTypesRestriction.ValueEnum.Pos
]
}
},
"type": balancePlatform.TransactionRuleInfo.TypeEnum.BlockList
};
const response: balancePlatform.TransactionRule = await balancePlatformService.TransactionRules.create(request);
expect(response.id).toBe(transactionRuleId);
expect(response.status).toBe("active");
});
it("should support GET /transactionRules/{transactionRuleId}", async (): Promise<void> => {
scope.get(`/transactionRules/${transactionRuleId}`)
.reply(200, {
"transactionRule": {
"description": "Allow 5 transactions per month",
"interval": {
"type": "monthly"
},
"maxTransactions": 5,
"paymentInstrumentId": "PI3227C223222B59KGTXP884R",
"reference": "myRule12345",
"startDate": "2021-01-25T12:46:35.476629Z",
"status": "active",
"type": "velocity",
"id": transactionRuleId
}
});
const response: balancePlatform.TransactionRuleResponse = await balancePlatformService.TransactionRules.retrieve(transactionRuleId);
expect(response.transactionRule!.id).toBe(transactionRuleId);
expect(response.transactionRule!.type).toBe("velocity");
});
it("should support PATCH /transactionRules/{transactionRuleId}", async (): Promise<void> => {
scope.patch(`/transactionRules/${transactionRuleId}`)
.reply(200, {
"description": "Allow 5 transactions per month",
"interval": {
"type": "monthly"
},
"reference": "myRule12345",
"startDate": "2021-01-21T12:46:35.476629Z",
"status": "inactive",
"type": "velocity",
"id": transactionRuleId
});
const request: TransactionRuleInfoUpdate = {
"status": balancePlatform.TransactionRuleInfo.StatusEnum.Inactive
};
const response: balancePlatform.TransactionRule = await balancePlatformService.TransactionRules.update(transactionRuleId, request);
expect(response.status).toBe("inactive");
expect(response.reference).toBe("myRule12345");
});
it("should support DELETE /transactionRules/{transactionRuleId}", async (): Promise<void> => {
scope.delete(`/transactionRules/${transactionRuleId}`)
.reply(200, {
"amount": {
"currency": "EUR",
"value": 10000
},
"description": "Allow up to 100 EUR per month",
"interval": {
"type": "monthly"
},
"paymentInstrumentGroupId": "PG3227C223222B5CMD3FJFKGZ",
"reference": "myRule16378",
"startDate": "2021-01-25T12:46:35.476629Z",
"type": "velocity",
"id": transactionRuleId
});
const response: balancePlatform.TransactionRule = await balancePlatformService.TransactionRules.delete(transactionRuleId);
expect(response.id).toBe(transactionRuleId);
});
});
});

View File

@@ -1,9 +1,26 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock from "nock";
import { createClient } from "../__mocks__/base";
import {createClient} from "../__mocks__/base";
import BinLookup from "../services/binLookup";
import Client from "../client";
import HttpClientException from "../httpClient/httpClientException";
import { binlookup } from "../typings";
const threeDSAvailabilitySuccess = {
binDetails: {
@@ -15,7 +32,7 @@ const threeDSAvailabilitySuccess = {
};
let client: Client;
let binLookupService: BinLookup;
let binLookup: BinLookup;
let scope: nock.Scope;
beforeEach((): void => {
@@ -23,7 +40,7 @@ beforeEach((): void => {
nock.activate();
}
client = createClient();
binLookupService = new BinLookup(client);
binLookup = new BinLookup(client);
scope = nock(`${client.config.endpoint}${Client.BIN_LOOKUP_PAL_SUFFIX}${Client.BIN_LOOKUP_API_VERSION}`);
});
@@ -32,8 +49,9 @@ afterEach((): void => {
});
describe("Bin Lookup", function (): void {
test("should succeed on get 3ds availability", async function (): Promise<void> {
const threeDSAvailabilityRequest: binlookup.ThreeDSAvailabilityRequest = {
test.each([false, true])("should succeed on get 3ds availability. isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
const threeDSAvailabilityRequest: IBinLookup.ThreeDSAvailabilityRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
brands: ["randomBrand"],
cardNumber: "4111111111111111"
@@ -42,12 +60,13 @@ describe("Bin Lookup", function (): void {
scope.post("/get3dsAvailability")
.reply(200, threeDSAvailabilitySuccess);
const response = await binLookupService.get3dsAvailability(threeDSAvailabilityRequest);
const response = await binLookup.get3dsAvailability(threeDSAvailabilityRequest);
expect(response).toEqual< binlookup.ThreeDSAvailabilityResponse>(threeDSAvailabilitySuccess);
expect(response).toEqual<IBinLookup.ThreeDSAvailabilityResponse>(threeDSAvailabilitySuccess);
});
test("should fail with invalid merchant", async function (): Promise<void> {
test.each([false, true])("should fail with invalid merchant. isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
const threeDSAvailabilityRequest: { [key: string]: undefined|string|[] } = {
merchantAccount: undefined,
cardNumber: "4111111111111",
@@ -58,24 +77,16 @@ describe("Bin Lookup", function (): void {
.reply(403, JSON.stringify({status: 403, message: "fail", errorCode: "171"}));
try {
await binLookupService.get3dsAvailability(threeDSAvailabilityRequest as unknown as binlookup.ThreeDSAvailabilityRequest);
await binLookup.get3dsAvailability(threeDSAvailabilityRequest as unknown as IBinLookup.ThreeDSAvailabilityRequest);
fail("Expected request to fail");
} catch (e) {
expect(e instanceof HttpClientException).toBeTruthy();
}
});
test("should succeed on get cost estimate", async function (): Promise<void> {
test.each([false, true])("should succeed on get cost estimate. isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
const expected = {
cardBin: {
bin: "",
fundsAvailability: "I",
issuingBank: "ADYEN TEST BANK",
issuingCountry: "NL",
paymentMethod: "visa",
payoutEligible: "Y",
summary: "",
},
costEstimateAmount: {
currency: "EUR",
value: 10
@@ -83,7 +94,7 @@ describe("Bin Lookup", function (): void {
resultCode: "Unsupported",
surchargeType: "ZERO"
};
const costEstimateRequest: binlookup.CostEstimateRequest = {
const costEstimateRequest: IBinLookup.CostEstimateRequest = {
amount: { currency: "EUR", value: 1000 },
assumptions: {
assumeLevel3Data: true,
@@ -96,14 +107,14 @@ describe("Bin Lookup", function (): void {
mcc: "7411",
enrolledIn3DSecure: true
},
shopperInteraction: binlookup.CostEstimateRequest.ShopperInteractionEnum.Ecommerce,
shopperInteraction: "Ecommerce"
};
scope.post("/getCostEstimate")
.reply(200, expected);
const response = await binLookupService.getCostEstimate(costEstimateRequest);
const response = await binLookup.getCostEstimate(costEstimateRequest);
expect(response).toEqual(expected);
});
});
});

View File

@@ -1,6 +1,26 @@
/* eslint-disable @typescript-eslint/naming-convention */
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
/* eslint-disable @typescript-eslint/camelcase */
import checkServerIdentity from "../helpers/checkServerIdentity";
import { PeerCertificate } from "tls";
import {PeerCertificate} from "tls";
const createMockedCertificate = (CN: string): PeerCertificate => ({
subjectaltname: "Adyen B.V",

View File

@@ -1,45 +1,63 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock from "nock";
import {createClient} from "../__mocks__/base";
import { createClient } from "../__mocks__/base";
import {paymentMethodsSuccess} from "../__mocks__/checkout/paymentMethodsSuccess";
import {paymentsSuccess} from "../__mocks__/checkout/paymentsSuccess";
import {paymentDetailsSuccess} from "../__mocks__/checkout/paymentsDetailsSuccess";
import {paymentSessionSuccess} from "../__mocks__/checkout/paymentSessionSucess";
import {originKeysSuccess} from "../__mocks__/checkout/originkeysSuccess";
import {paymentsResultMultibancoSuccess} from "../__mocks__/checkout/paymentsResultMultibancoSuccess";
import {paymentsResultSuccess} from "../__mocks__/checkout/paymentsResultSucess";
import {sessionsSuccess} from "../__mocks__/checkout/sessionsSuccess";
import Client from "../client";
import Checkout from "../services/checkout";
import HttpClientException from "../httpClient/httpClientException";
import { checkout } from "../typings";
const merchantAccount = process.env.ADYEN_MERCHANT!;
const reference = "Your order number";
const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI);
function createAmountObject(currency: string, value: number): checkout.Amount {
function createAmountObject(currency: string, value: number): ICheckout.Amount {
return {
currency,
value,
};
}
function createPaymentsDetailsRequest(): checkout.DetailsRequest {
function createPaymentsDetailsRequest(): ICheckout.DetailsRequest {
return {
details: {
mD: "mdValue",
paRes: "paResValue",
MD: "mdValue",
PaRes: "paResValue",
},
paymentData: "Ab02b4c0!BQABAgCJN1wRZuGJmq8dMncmypvknj9s7l5Tj...",
};
}
export function createPaymentsCheckoutRequest(): checkout.PaymentRequest {
export function createPaymentsCheckoutRequest(): ICheckout.PaymentRequest {
const paymentMethodDetails = {
type: checkout.CardDetails.TypeEnum.Scheme,
encryptedCardNumber: "test_4111111111111111",
encryptedExpiryMonth: "test_03",
encryptedExpiryYear: "test_2030",
encryptedSecurityCode: "test_737"
cvc: "737",
expiryMonth: "03",
expiryYear: "2030",
holderName: "John Smith",
number: "4111111111111111",
type: "scheme",
};
return {
@@ -48,75 +66,27 @@ export function createPaymentsCheckoutRequest(): checkout.PaymentRequest {
paymentMethod: paymentMethodDetails,
reference,
returnUrl: "https://your-company.com/...",
enableRecurring: true,
enableOneClick: true,
shopperReference: "shopperReference",
storePaymentMethod: true
};
}
function createPaymentSessionRequest(): checkout.PaymentSetupRequest {
function createPaymentSessionRequest(): ICheckout.PaymentSetupRequest {
return {
amount: createAmountObject("USD", 1000),
countryCode: "NL",
merchantAccount,
reference,
returnUrl: "https://your-company.com/...",
channel: checkout.PaymentSetupRequest.ChannelEnum.Web,
channel: "Web",
sdkVersion: "3.7.0"
};
}
function getPaymentLinkSuccess(expiresAt: string): checkout.PaymentLinkResponse {
return {
amount: createAmountObject("USD", 1000),
expiresAt,
reference,
url: "PaymentLinkResponse.url",
id: "mocked_id",
merchantAccount,
status: checkout.PaymentLinkResponse.StatusEnum.Active
};
}
function createPaymentLinkRequest(): checkout.CreatePaymentLinkRequest {
return {
allowedPaymentMethods: ["scheme", "boletobancario"],
amount: createAmountObject("USD", 1000),
countryCode: "BR",
merchantAccount,
shopperReference: "shopperReference",
shopperEmail: "test@email.com",
shopperLocale: "pt_BR",
billingAddress: {
street: "Roque Petroni Jr",
postalCode: "59000060",
city: "São Paulo",
houseNumberOrName: "999",
country: "BR",
stateOrProvince: "SP"
},
deliveryAddress: {
street: "Roque Petroni Jr",
postalCode: "59000060",
city: "São Paulo",
houseNumberOrName: "999",
country: "BR",
stateOrProvince: "SP"
},
reference
};
}
function createSessionRequest(): checkout.CreateCheckoutSessionRequest {
return {
amount: createAmountObject("USD", 1000),
countryCode: "NL",
merchantAccount,
reference,
returnUrl: "https://your-company.com/...",
};
}
let client: Client;
let checkoutService: Checkout;
let checkout: Checkout;
let scope: nock.Scope;
beforeEach((): void => {
@@ -125,7 +95,7 @@ beforeEach((): void => {
}
client = createClient();
scope = nock(`${client.config.checkoutEndpoint}/${Client.CHECKOUT_API_VERSION}`);
checkoutService = new Checkout(client);
checkout = new Checkout(client);
});
afterEach(() => {
@@ -133,126 +103,37 @@ afterEach(() => {
});
describe("Checkout", (): void => {
test("should add idempotency key to request headers", async (): Promise<void> => {
const paymentsRequest: checkout.PaymentRequest = createPaymentsCheckoutRequest();
scope.post("/payments")
.reply(200, paymentsSuccess)
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.payments(paymentsRequest, {idempotencyKey: "testKey"});
const paymentMethodsRequest: checkout.PaymentMethodsRequest = {merchantAccount};
scope.post("/paymentMethods")
.reply(200, paymentMethodsSuccess)
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.paymentMethods(paymentMethodsRequest, {idempotencyKey: "testKey"});
const expiresAt = "2019-12-17T10:05:29Z";
const paymentLinkSuccess: checkout.PaymentLinkResponse = getPaymentLinkSuccess(expiresAt);
scope.post("/paymentLinks")
.reply(200, paymentLinkSuccess)
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.paymentLinks(createPaymentLinkRequest(), {idempotencyKey: "testKey"});
scope.patch("/paymentLinks/321")
.reply(200, { ...paymentLinkSuccess, status: "expired" })
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.updatePaymentLinks("321", "expired", {idempotencyKey: "testKey"});
scope.get("/paymentLinks/123")
.reply(200, paymentLinkSuccess)
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.getPaymentLinks("123", {idempotencyKey: "testKey"});
scope.post("/payments/details")
.reply(200, paymentDetailsSuccess)
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.paymentsDetails(createPaymentsDetailsRequest(), {idempotencyKey: "testKey"});
scope.post("/paymentSession")
.reply(200, paymentSessionSuccess)
.matchHeader("Idempotency-Key", "testKey");
const paymentSessionRequest: checkout.PaymentSetupRequest = createPaymentSessionRequest();
await checkoutService.paymentSession(paymentSessionRequest, {idempotencyKey: "testKey"});
scope.post("/payments/result")
.reply(200, paymentsResultSuccess)
.matchHeader("Idempotency-Key", "testKey");
const paymentResultRequest: checkout.PaymentVerificationRequest = {
payload: "This is a test payload",
};
await checkoutService.paymentResult(paymentResultRequest, {idempotencyKey: "testKey"});
const orderRequest: checkout.CheckoutCreateOrderRequest = {
amount: createAmountObject("USD", 1000),
merchantAccount,
reference
};
scope.post("/orders")
.reply(200, {})
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.orders(orderRequest, {idempotencyKey: "testKey"});
scope.post("/orders/cancel")
.reply(200, {})
.matchHeader("Idempotency-Key", "testKey");
await checkoutService.ordersCancel({
order: {
orderData: "mock_data",
pspReference: "mock_pspref"
},
merchantAccount
}, {idempotencyKey: "testKey"});
scope.post("/sessions")
.reply(200, sessionsSuccess)
.matchHeader("Idempotency-Key", "testKey");
const sessionsRequest: checkout.CreateCheckoutSessionRequest = createSessionRequest();
await checkoutService.sessions(sessionsRequest, {idempotencyKey: "testKey"});
});
test("should make a payment.", async (): Promise<void> => {
test.each([false, true])("should make a payment. isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/payments")
.reply(200, paymentsSuccess);
const paymentsRequest: checkout.PaymentRequest = createPaymentsCheckoutRequest();
const paymentsResponse: checkout.PaymentResponse = await checkoutService.payments(paymentsRequest);
const paymentsRequest: ICheckout.PaymentRequest = createPaymentsCheckoutRequest();
const paymentsResponse: ICheckout.PaymentResponse = await checkout.payments(paymentsRequest);
expect(paymentsResponse.pspReference).toBeTruthy();
});
test("Should properly handle error responses from API", async (): Promise<void> => {
test.each([false, true])("should return correct Exception, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
try {
scope.post("/payments")
.reply(422, {
"status": 422,
"errorCode": "200",
"message": "Field 'countryCode' is not valid.",
"errorType": "validation",
"pspReference": "DMB552CV6JHKGK82",
});
.reply(401);
const paymentsRequest: checkout.PaymentRequest = createPaymentsCheckoutRequest();
await checkoutService.payments(paymentsRequest);
fail("No exception was thrown");
} catch (error) {
expect(error instanceof HttpClientException).toBeTruthy();
if(error instanceof HttpClientException && error.responseBody) {
expect(JSON.parse(error.responseBody).errorType).toBe("validation");
} else {
fail("Error did not contain the expected data");
}
const paymentsRequest: ICheckout.PaymentRequest = createPaymentsCheckoutRequest();
await checkout.payments(paymentsRequest);
} catch (e) {
expect(e instanceof HttpClientException).toBeTruthy();
}
});
test("should have valid payment methods", async (): Promise<void> => {
const paymentMethodsRequest: checkout.PaymentMethodsRequest = {merchantAccount};
test.each([false, true])("should have valid payment methods, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
const paymentMethodsRequest: ICheckout.PaymentMethodsRequest = {merchantAccount: "MagentoMerchantTest"};
scope.post("/paymentMethods")
.reply(200, paymentMethodsSuccess);
const paymentMethodsResponse = await checkoutService.paymentMethods(paymentMethodsRequest);
const paymentMethodsResponse = await checkout.paymentMethods(paymentMethodsRequest);
if (paymentMethodsResponse && paymentMethodsResponse.paymentMethods) {
expect(paymentMethodsResponse.paymentMethods.length).toBeGreaterThan(0);
} else {
@@ -260,218 +141,101 @@ describe("Checkout", (): void => {
}
});
test("should have valid payment link", async (): Promise<void> => {
test.each([false, true])("should have valid payment link, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
const amount = createAmountObject("BRL", 1000);
const expiresAt = "2019-12-17T10:05:29Z";
const paymentLinkSuccess: checkout.PaymentLinkResponse = getPaymentLinkSuccess(expiresAt);
const paymentLinkRequest: ICheckout.CreatePaymentLinkRequest = {
allowedPaymentMethods: ["scheme", "boletobancario"],
amount,
countryCode: "BR",
merchantAccount,
shopperReference: "shopperReference",
shopperEmail: "test@email.com",
shopperLocale: "pt_BR",
billingAddress: {
street: "Roque Petroni Jr",
postalCode: "59000060",
city: "São Paulo",
houseNumberOrName: "999",
country: "BR",
stateOrProvince: "SP"
},
deliveryAddress: {
street: "Roque Petroni Jr",
postalCode: "59000060",
city: "São Paulo",
houseNumberOrName: "999",
country: "BR",
stateOrProvince: "SP"
},
reference
};
const paymentLinkSuccess: ICheckout.CreatePaymentLinkResponse = {
amount,
expiresAt,
reference,
url: "paymentLinkResponse.url"
};
scope.post("/paymentLinks").reply(200, paymentLinkSuccess);
const paymentSuccessLinkResponse = await checkoutService.paymentLinks(createPaymentLinkRequest());
const paymentSuccessLinkResponse = await checkout.paymentLinks(paymentLinkRequest);
expect(paymentSuccessLinkResponse).toBeTruthy();
});
test("should get payment link", async (): Promise<void> => {
const expiresAt = "2019-12-17T10:05:29Z";
const paymentLinkSuccess: checkout.PaymentLinkResponse = getPaymentLinkSuccess(expiresAt);
scope.post("/paymentLinks").reply(200, paymentLinkSuccess);
const paymentSuccessLinkResponse = await checkoutService.paymentLinks(createPaymentLinkRequest());
scope.get(`/paymentLinks/${paymentSuccessLinkResponse.id}`).reply(200, paymentLinkSuccess);
const paymentLink = await checkoutService.getPaymentLinks(paymentSuccessLinkResponse.id);
expect(paymentLink).toBeTruthy();
});
test("should patch payment link", async (): Promise<void> => {
const expiresAt = "2019-12-17T10:05:29Z";
const paymentLinkSuccess: checkout.PaymentLinkResponse = getPaymentLinkSuccess(expiresAt);
scope.post("/paymentLinks").reply(200, paymentLinkSuccess);
const paymentSuccessLinkResponse = await checkoutService.paymentLinks(createPaymentLinkRequest());
scope.patch(`/paymentLinks/${paymentSuccessLinkResponse.id}`).reply(200, { ...paymentLinkSuccess, status: "expired" });
const paymentLink = await checkoutService.updatePaymentLinks(paymentSuccessLinkResponse.id, "expired");
expect(paymentLink.status).toEqual("expired");
});
test("should have payment details", async (): Promise<void> => {
test.each([isCI, true])("should have payment details, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/payments/details")
.reply(200, paymentDetailsSuccess);
const paymentsResponse = await checkoutService.paymentsDetails(createPaymentsDetailsRequest());
const paymentsResponse = await checkout.paymentsDetails(createPaymentsDetailsRequest());
expect(paymentsResponse.resultCode).toEqual("Authorised");
});
test("should have payment session success", async (): Promise<void> => {
test.each([false, true])("should have payment session success, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/paymentSession")
.reply(200, paymentSessionSuccess);
const paymentSessionRequest: checkout.PaymentSetupRequest = createPaymentSessionRequest();
const paymentSessionResponse = await checkoutService.paymentSession(paymentSessionRequest);
const paymentSessionRequest: ICheckout.PaymentSetupRequest = createPaymentSessionRequest();
const paymentSessionResponse = await checkout.paymentSession(paymentSessionRequest);
expect(paymentSessionResponse.paymentSession).not.toBeUndefined();
});
test("should have payments result", async (): Promise<void> => {
test.each([isCI, true])("should have payments result, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/payments/result")
.reply(200, paymentsResultSuccess);
const paymentResultRequest: checkout.PaymentVerificationRequest = {
const paymentResultRequest: ICheckout.PaymentVerificationRequest = {
payload: "This is a test payload",
};
const paymentResultResponse = await checkoutService.paymentResult(paymentResultRequest);
const paymentResultResponse = await checkout.paymentResult(paymentResultRequest);
expect(paymentResultResponse.resultCode).toEqual("Authorised");
});
test("should have missing identifier on live", async (): Promise<void> => {
test.each([false, true])("should have missing identifier on live, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
client.setEnvironment("LIVE");
try {
new Checkout(client);
fail();
} catch (e) {
if(e instanceof Error) {
expect(e.message).toEqual("Please provide your unique live url prefix on the setEnvironment() call on the Client or provide checkoutEndpoint in your config object.");
} else {
fail();
}
expect(e.message).toEqual("Please provide your unique live url prefix on the setEnvironment() call on the Client or provide checkoutEndpoint in your config object.");
}
});
test("should succeed on multibanco payment", async (): Promise<void> => {
test.each([false, true])("should succeed on multibanco payment, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/payments")
.reply(200, paymentsResultMultibancoSuccess);
const paymentsRequest: checkout.PaymentRequest = createPaymentsCheckoutRequest();
const paymentsResponse: checkout.PaymentResponse = await checkoutService.payments(paymentsRequest);
const paymentsRequest: ICheckout.PaymentRequest = createPaymentsCheckoutRequest();
const paymentsResponse: ICheckout.PaymentResponse = await checkout.payments(paymentsRequest);
expect(paymentsResponse.pspReference).toBeTruthy();
expect(paymentsResponse.additionalData).toBeTruthy();
});
test("should get origin keys", async (): Promise<void> => {
const checkoutUtility = new Checkout(client);
const originKeysRequest: checkout.CheckoutUtilityRequest = {
originDomains: ["https://www.your-domain.com"],
};
nock(`${client.config.checkoutEndpoint}`)
.post(`/${Client.CHECKOUT_API_VERSION}/originKeys`)
.reply(200, originKeysSuccess);
const originKeysResponse = await checkoutUtility.originKeys(originKeysRequest);
if (originKeysResponse.originKeys) {
return expect(originKeysResponse.originKeys["https://www.your-domain.com"].startsWith("pub.v2")).toBeTruthy();
}
fail("Error: originKeysResponse.originKeys is empty");
});
// TODO: add gift card to PaymentMethod and unmock test
test("should get payment methods balance", async (): Promise<void> => {
const paymentMethodsRequest: checkout.CheckoutBalanceCheckRequest = {
merchantAccount,
amount: createAmountObject("USD", 1000),
paymentMethod: { },
reference: "mocked_reference"
};
const paymentMethodsBalanceResponse: checkout.CheckoutBalanceCheckResponse = {
balance: {currency: "USD", value: 1000},
resultCode: checkout.CheckoutBalanceCheckResponse.ResultCodeEnum.Success
};
scope.post("/paymentMethods/balance")
.reply(200, paymentMethodsBalanceResponse);
const paymentsResponse: checkout.CheckoutBalanceCheckResponse = await checkoutService.paymentMethodsBalance(paymentMethodsRequest);
expect(paymentsResponse.balance.value).toEqual(1000);
});
test("should create order", async (): Promise<void> => {
const expiresAt = "2019-12-17T10:05:29Z";
const orderRequest: checkout.CheckoutCreateOrderRequest = {
amount: createAmountObject("USD", 1000),
merchantAccount,
reference
};
const orderResponse: checkout.CheckoutCreateOrderResponse = {
expiresAt,
amount: createAmountObject("USD", 500),
orderData: "mocked_order_data",
remainingAmount: {currency: "USD", value: 500} ,
resultCode: checkout.CheckoutCreateOrderResponse.ResultCodeEnum.Success
};
scope.post("/orders")
.reply(200, orderResponse);
const response: checkout.CheckoutCreateOrderResponse = await checkoutService.orders(orderRequest);
expect(response).toBeTruthy();
});
test("should cancel order", async (): Promise<void> => {
const expiresAt = "2019-12-17T10:05:29Z";
const orderRequest: checkout.CheckoutCreateOrderRequest = {
amount: createAmountObject("USD", 1000),
merchantAccount,
reference
};
const orderResponse: checkout.CheckoutCreateOrderResponse = {
expiresAt,
amount: createAmountObject("USD", 500),
orderData: "mocked_order_data",
remainingAmount: {currency: "USD", value: 500},
resultCode: checkout.CheckoutCreateOrderResponse.ResultCodeEnum.Success
};
scope.post("/orders")
.reply(200, orderResponse);
const createOrderResponse: checkout.CheckoutCreateOrderResponse = await checkoutService.orders(orderRequest);
const orderCancelResponse: checkout.CheckoutCancelOrderResponse = {
pspReference: "mocked_psp_ref",
resultCode: checkout.CheckoutCancelOrderResponse.ResultCodeEnum.Received
};
scope.post("/orders/cancel")
.reply(200, orderCancelResponse);
const response: checkout.CheckoutCancelOrderResponse = await checkoutService.ordersCancel({
order: {
orderData: createOrderResponse.orderData,
pspReference: createOrderResponse.pspReference!
},
merchantAccount
});
expect(response).toBeTruthy();
});
test("should create a session.", async (): Promise<void> => {
scope.post("/sessions")
.reply(200, sessionsSuccess);
const sessionsRequest: checkout.CreateCheckoutSessionRequest = createSessionRequest();
const sessionsResponse: checkout.CreateCheckoutSessionResponse = await checkoutService.sessions(sessionsRequest);
expect(sessionsResponse.sessionData).toBeTruthy();
expect(sessionsResponse.expiresAt).toBeInstanceOf(Date);
expect(sessionsResponse.expiresAt.getFullYear()).toBeGreaterThan(0);
});
test("Should get card details", async (): Promise<void> => {
scope.post("/cardDetails")
.reply(200, {
"brands": [
{
"supported": true,
"type": "visa"
}
]
});
const cardDetailsRequest: checkout.CardDetailsRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"cardNumber": "411111"
};
const cardDetailsReponse: checkout.CardDetailsResponse = await checkoutService.cardDetails(cardDetailsRequest);
expect(cardDetailsReponse?.brands?.length).toBe(1);
});
});

View File

@@ -0,0 +1,45 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock from "nock";
import { createClient } from "../__mocks__/base";
import {originKeysSuccess} from "../__mocks__/checkoutUtility/originkeysSuccess";
import CheckoutUtility from "../services/checkoutUtility";
import Client from "../client";
describe("Checkout Utility", (): void => {
test.each([false,true])("should get origin keys. isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
const client = createClient();
const checkoutUtility = new CheckoutUtility(client);
const originKeysRequest: ICheckoutUtility.CheckoutUtilityRequest = {
originDomains: ["https://www.your-domain.com"],
};
nock(`${client.config.checkoutEndpoint}`)
.post(`/${Client.CHECKOUT_UTILITY_API_VERSION}/originKeys`)
.reply(200, originKeysSuccess);
const originKeysResponse = await checkoutUtility.originKeys(originKeysRequest);
if (originKeysResponse.originKeys) {
return expect(originKeysResponse.originKeys["https://www.your-domain.com"].startsWith("pub.v2")).toBeTruthy();
}
fail("Error: originKeysResponse.originKeys is empty");
});
});

View File

@@ -1,293 +0,0 @@
import nock from "nock";
import {createClient} from "../__mocks__/base";
import Client from "../client";
import ClassicIntegration from "../services/classicIntegration";
import { payments } from "../typings";
let client: Client;
let classicIntegration: ClassicIntegration;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
scope = nock(`${client.config.paymentEndpoint}/${Client.PAYMENT_API_VERSION}`);
classicIntegration = new ClassicIntegration(client);
});
afterEach(() => {
nock.cleanAll();
});
describe("Classic Integration", (): void => {
test("Should authorise payment", async (): Promise<void> => {
scope.post("/authorise")
.reply(200, {
"additionalData": {
"scaExemptionRequested": "transactionRiskAnalysis",
"checkout.cardAddedBrand": "visa"
},
"pspReference": "JVBXGSDM53RZNN82",
"resultCode": "Authorised",
"authCode": "011381"
}
);
const paymentRequest: payments.PaymentRequest = {
"card": {
"number": "4111111111111111",
"expiryMonth": "03",
"expiryYear": "2030",
"cvc": "737",
"holderName": "John Smith"
},
"amount": {
"value": 1500,
"currency": "EUR"
},
"reference": "YOUR_REFERENCE",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const paymentResult: payments.PaymentResult = await classicIntegration.authorise(paymentRequest);
expect(paymentResult.pspReference).toEqual("JVBXGSDM53RZNN82");
});
test("Should complete 3DS authorisation", async (): Promise<void> => {
scope.post("/authorise3d")
.reply(200, {
"additionalData": {
"scaExemptionRequested": "transactionRiskAnalysis",
"checkout.cardAddedBrand": "visa"
},
"pspReference": "JVBXGSDM53RZNN82",
"resultCode": "Authorised",
"authCode": "011381"
}
);
const paymentRequest: payments.PaymentRequest3d = {
"md": "31h..........vOXek7w",
"paResponse": "eNqtmF........wGVA4Ch",
"shopperIP": "61.294.12.12",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const paymentResult: payments.PaymentResult = await classicIntegration.authorise3d(paymentRequest);
expect(paymentResult.pspReference).toEqual("JVBXGSDM53RZNN82");
});
test("Should complete 3DS2 authorisation", async (): Promise<void> => {
scope.post("/authorise3ds2")
.reply(200, {
"additionalData": {
"scaExemptionRequested": "transactionRiskAnalysis",
"checkout.cardAddedBrand": "visa"
},
"pspReference": "JVBXGSDM53RZNN82",
"resultCode": "Authorised",
"authCode": "011381"
}
);
const paymentRequest: payments.PaymentRequest3ds2 = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"amount": {
"value": 1500,
"currency": "EUR"
},
"reference": "YOUR_REFERENCE",
"threeDS2RequestData": {
"threeDSCompInd": "Y",
"deviceChannel": "testDeviceChannel"
},
"threeDS2Token": "— - BINARY DATA - -"
};
const paymentResult: payments.PaymentResult = await classicIntegration.authorise3ds2(paymentRequest);
expect(paymentResult.pspReference).toEqual("JVBXGSDM53RZNN82");
});
test("Should get auth result after 3DS authentication", async (): Promise<void> => {
scope.post("/getAuthenticationResult").reply(200, {
"threeDS2Result": { "authenticationValue": "THREEDS2RESULT"}
});
const getAuthenticationResultrequest: payments.AuthenticationResultRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"pspReference": "9935272408535455"
};
const getAuthenticationResultResponse: payments.AuthenticationResultResponse = await classicIntegration.getAuthenticationResult(getAuthenticationResultrequest);
expect(getAuthenticationResultResponse?.threeDS2Result?.authenticationValue).toEqual("THREEDS2RESULT");
});
test("Should retrieve 3DS2 result", async (): Promise<void> => {
scope.post("/retrieve3ds2Result").reply(200, {
"threeDS2Result": { "authenticationValue": "THREEDS2RESULT"}
});
const retrieve3ds2ResultRequest: payments.ThreeDS2ResultRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"pspReference": "9935272408535455"
};
const retrieve3ds2ResultResponse: payments.ThreeDS2ResultResponse = await classicIntegration.retrieve3ds2Result(retrieve3ds2ResultRequest);
expect(retrieve3ds2ResultResponse?.threeDS2Result?.authenticationValue).toEqual("THREEDS2RESULT");
});
test("Should succesfully send Capture request", async (): Promise<void> => {
scope.post("/capture")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[capture-received]"
});
const modificationRequest: payments.CaptureRequest = {
"originalReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"modificationAmount": {
"value": 500,
"currency": "EUR"
},
"reference": "YourModificationReference",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.capture(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.CaptureReceived);
});
test("Should succesfully send Cancel request", async (): Promise<void> => {
scope.post("/cancel")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[cancel-received]"
});
const modificationRequest: payments.CancelRequest = {
"originalReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"reference": "YourModificationReference",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.cancel(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.CancelReceived);
});
test("Should succesfully send Refund request", async (): Promise<void> => {
scope.post("/refund")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[refund-received]"
});
const modificationRequest: payments.RefundRequest = {
"originalReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"modificationAmount": {
"value": 500,
"currency": "EUR"
},
"reference": "YourModificationReference",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.refund(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.RefundReceived);
});
test("Should succesfully send CancelOrRefund request", async (): Promise<void> => {
scope.post("/cancelOrRefund")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[cancelOrRefund-received]"
});
const modificationRequest: payments.CancelOrRefundRequest = {
"originalReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"reference": "YourModificationReference",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.cancelOrRefund(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.CancelOrRefundReceived);
});
test("Should succesfully send TechnicalCancel request", async (): Promise<void> => {
scope.post("/technicalCancel")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[technical-cancel-received]"
});
const modificationRequest: payments.TechnicalCancelRequest = {
"originalMerchantReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"modificationAmount": {
"value": 500,
"currency": "EUR"
},
"reference": "YourModificationReference",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.technicalCancel(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.TechnicalCancelReceived);
});
test("Should succesfully send AdjustAuthorisation request", async (): Promise<void> => {
scope.post("/adjustAuthorisation")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[adjustAuthorisation-received]"
});
const modificationRequest: payments.AdjustAuthorisationRequest = {
"originalReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"modificationAmount": {
"value": 500,
"currency": "EUR"
},
"reference": "YourModificationReference",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.adjustAuthorisation(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.AdjustAuthorisationReceived);
});
test("Should succesfully send Donate request", async (): Promise<void> => {
scope.post("/donate")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[donation-received]"
});
const modificationRequest: payments.DonationRequest = {
"originalReference": "COPY_PSP_REFERENCE_FROM_AUTHORISE_RESPONSE",
"modificationAmount": {
"value": 500,
"currency": "EUR"
},
"reference": "YOUR_DONATION_REFERENCE",
"donationAccount": "AdyenGivingDemo",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT"
};
const modificationResult: payments.ModificationResult = await classicIntegration.donate(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.DonationReceived);
});
test("Should succesfully send VoidPendingRefund request", async (): Promise<void> => {
scope.post("/voidPendingRefund")
.reply(200, {
"pspReference": "YOUR_REFERENCE",
"response": "[voidPendingRefund-received]"
});
const modificationRequest: payments.VoidPendingRefundRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"tenderReference": "5Iw8001176969533005",
"uniqueTerminalId": "VX820-123456789"
};
const modificationResult: payments.ModificationResult = await classicIntegration.voidPendingRefund(modificationRequest);
expect(modificationResult.response).toEqual(payments.ModificationResult.ResponseEnum.VoidPendingRefundReceived);
});
});

View File

@@ -1,11 +0,0 @@
import Client from "../client";
describe("API Client", function (): void {
test("should be able to make a request using basic auth", async function (): Promise<void> {
new Client({
username: process.env.ADYEN_USER!,
password: process.env.ADYEN_PASSWORD!,
environment: "TEST"
});
});
});

View File

@@ -1,59 +0,0 @@
import nock from "nock";
import { createClient } from "../__mocks__/base";
import { DataProtection } from "../services";
import Client from "../client";
import HttpClientException from "../httpClient/httpClientException";
import { dataProtection } from "../typings";
let client: Client,
dataProtectionService: DataProtection,
scope: nock.Scope;
beforeEach((): void => {
if(!nock.isActive()) {
nock.activate();
}
client = createClient();
dataProtectionService = new DataProtection(client);
scope = nock(`${client.config.dataProtectionEndpoint}/${Client.DATA_PROTECTION_API_VERSION}`);
});
afterEach(() => {
nock.cleanAll();
});
describe("DataProtection", (): void => {
test("should make succesful subjectErasure call", async (): Promise<void> => {
const requestSubjectErasureSuccess: dataProtection.SubjectErasureResponse = {
"result": dataProtection.SubjectErasureResponse.ResultEnum.Success,
};
const requestSubjectErasureRequest: dataProtection.SubjectErasureByPspReferenceRequest = {
"merchantAccount": "MY_MERCHANT_ACCOUNT",
"forceErasure": true,
"pspReference": "0123456789"
};
scope.post("/requestSubjectErasure")
.reply(200, requestSubjectErasureSuccess);
const response: dataProtection.SubjectErasureResponse = await dataProtectionService.requestSubjectErasure(requestSubjectErasureRequest);
expect(response.result).toEqual(dataProtection.SubjectErasureResponse.ResultEnum.Success);
});
test("should return correct Exception", async (): Promise<void> => {
try {
scope.post("/requestSubjectErasure")
.reply(401);
const requestSubjectErasureRequest: dataProtection.SubjectErasureByPspReferenceRequest = {
"merchantAccount": "MY_MERCHANT_ACCOUNT",
"forceErasure": true,
"pspReference": "0123456789"
};
await dataProtectionService.requestSubjectErasure(requestSubjectErasureRequest);
} catch (e) {
expect(e instanceof HttpClientException).toBeTruthy();
}
});
});

View File

@@ -1,19 +1,38 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import HmacValidator from "../utils/hmacValidator";
import { AdditionalData, NotificationItem, NotificationRequestItem } from "../typings/notification/models";
import { ApiConstants } from "../constants/apiConstants";
import {AdditionalData, NotificationItem, NotificationRequestItem} from "../typings/notification/models";
import {ApiConstants} from "../constants/apiConstants";
import NotificationRequest from "../notification/notificationRequest";
const key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";
const expectedSign = "ZNBPtI+oDyyRrLyD1XirkKnQgIAlFc07Vj27TeHsDRE=";
const notificationRequestItem: { NotificationRequestItem: NotificationRequestItem } = {
NotificationRequestItem : {
NotificationRequestItem :{
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: {currency: "EUR", value: 1000},
eventCode: NotificationRequestItem.EventCodeEnum.ReportAvailable,
eventCode: NotificationRequestItem.EventCodeEnum.REPORTAVAILABLE,
eventDate: "2019-09-21T11:45:24.637Z",
paymentMethod: "VISA",
reason: "reason",
@@ -65,32 +84,6 @@ describe("HMAC Validator", function (): void {
expect(result).toBeFalsy();
});
it("should throw error with missing hmac signature", function(): void {
expect.assertions(1);
const notificationRequestItemNoAdditionalData: NotificationRequestItem = {
pspReference: "pspReference",
originalReference: "originalReference",
merchantAccountCode: "merchantAccount",
merchantReference: "reference",
amount: {currency: "EUR", value: 1000},
eventCode: NotificationRequestItem.EventCodeEnum.ReportAvailable,
eventDate: "2019-09-21T11:45:24.637Z",
paymentMethod: "VISA",
reason: "reason",
success: NotificationRequestItem.SuccessEnum.True,
additionalData: { },
};
try {
hmacValidator.validateHMAC(notificationRequestItemNoAdditionalData, key);
} catch(error) {
if(error instanceof Error) {
expect(error.message).toEqual(`Missing ${ApiConstants.HMAC_SIGNATURE}`);
} else {
fail();
}
}
});
it("should test hmac", function () {
const data = "countryCode:currencyCode:merchantAccount:merchantReference:paymentAmount:sessionValidity:skinCode:NL:EUR:MagentoMerchantTest2:TEST-PAYMENT-2017-02-01-14\\:02\\:05:199:2017-02-02T14\\:02\\:05+01\\:00:PKz2KML1";
const key = "DFB1EB5485895CFA84146406857104ABB4CBCABDC8AAF103A624C8F6A3EAAB00";

View File

@@ -1,8 +1,27 @@
import nock, { Interceptor } from "nock";
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock, {Interceptor} from "nock";
import Client from "../client";
import Checkout from "../services/checkout";
import ApiException from "../services/exception/apiException";
import { createPaymentsCheckoutRequest } from "./checkout.spec";
import {createPaymentsCheckoutRequest} from "./checkout.spec";
import HttpClientException from "../httpClient/httpClientException";
beforeEach((): void => {
@@ -25,19 +44,15 @@ const getResponse = async ({apiKey , environment }: { apiKey: string; environmen
await checkout.payments(createPaymentsCheckoutRequest());
fail("request should fail");
} catch (e) {
if(e instanceof ErrorException){
if (errorMessageEquals) expect(e.message).toEqual(errorMessageEquals);
if (errorMessageContains) expect(e.message.toLowerCase()).toContain(errorMessageContains);
} else {
fail();
}
expect(e instanceof ErrorException).toBeTruthy();
if(errorMessageEquals) expect(e.message).toEqual(errorMessageEquals);
if(errorMessageContains) expect(e.message.toLowerCase()).toContain(errorMessageContains);
}
};
describe("HTTP Client", function (): void {
it.each`
apiKey | environment | withError | args | errorType | contains | equals
apiKey | environment | withError | args | errorType | contains | equals
${""} | ${"TEST"} | ${true} | ${["mocked_error_response"]} | ${"ApiException"} | ${"x-api-key"} | ${""}
${"MOCKED_API_KEY"} | ${"TEST"} | ${true} | ${["some_error"]} | ${"ApiException"} | ${""} | ${"some_error"}
${"API_KEY"} | ${"TEST"} | ${false} | ${[401, { status: 401, message: "Invalid Request", errorCode: "171", errorType: "validationError"}]} | ${"HttpClientException"} | ${""} | ${"HTTP Exception: 401. null: Invalid Request"}

View File

@@ -1,326 +0,0 @@
import nock from "nock";
import Client from "../client";
import {createClient} from "../__mocks__/base";
import * as models from "../typings/legalEntityManagement/models";
import {Document, LegalEntityInfo, OnboardingLinkInfo, TransferInstrumentInfo} from "../typings/legalEntityManagement/models";
import {DocumentUpdate} from "../services/legalEntityManagement/documents";
import {businessLine, businessLines, document, legalEntity, onboardingLink, onboardingTheme, onboardingThemes, transferInstrument} from "../__mocks__/legalEntityManagement/responses";
import TransferEnum = TransferInstrumentInfo.TypeEnum;
import TypeEnum = LegalEntityInfo.TypeEnum
import DocEnum = Document.TypeEnum
import {onboardingLinkInfo} from "../__mocks__/legalEntityManagement/requests";
import LegalEntityManagement from "../services/legalEntityManagement";
let client: Client;
let legalEntityManagement: LegalEntityManagement;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
scope = nock(`${client.config.legalEntityManagementEndpoint}/${Client.LEGAL_ENTITY_MANAGEMENT_API_VERSION}`);
legalEntityManagement = new LegalEntityManagement(client);
});
afterEach(() => {
nock.cleanAll();
});
describe("Legal Entity Management", (): void => {
const id = "123456789"
describe("LegalEntities", (): void => {
it("should support POST /legalEntities", async (): Promise<void> => {
scope.post("/legalEntities")
.reply(200, legalEntity);
const request: models.LegalEntityInfo = {
type : TypeEnum.Individual,
individual : undefined
};
const response: models.LegalEntity = await legalEntityManagement.LegalEntities.create(request);
expect(response.id).toBe(id);
expect(response.type).toBe("individual");
});
it("should support GET /legalEntities/{id}", async (): Promise<void> => {
scope.get(`/legalEntities/${id}`)
.reply(200, legalEntity);
const response: models.LegalEntity = await legalEntityManagement.LegalEntities.retrieve("123456789");
expect(response.id).toBe(id);
expect(response.type).toBe("individual");
});
it("should support PATCH /legalEntities/{id}", async (): Promise<void> => {
scope.patch(`/legalEntities/${id}`)
.reply(200, legalEntity);
const request: models.LegalEntityInfo = {
type : TypeEnum.Individual,
individual : undefined
};
const response: models.LegalEntity = await legalEntityManagement.LegalEntities.update(id, request);
expect(response.id).toBe(id);
expect(response.type).toBe("individual");
});
it("should support GET /legalEntities/{id}/BusinessLines", async (): Promise<void> => {
scope.get(`/legalEntities/${id}/businessLines`)
.reply(200, businessLines);
const response: models.BusinessLines = await legalEntityManagement.LegalEntities.listBusinessLines(id);
expect(response.businessLines).toEqual( [{
"capability": "receivePayments",
"id": "123456789",
"industryCode": "123456789",
"legalEntityId": "123456789",
"salesChannels": ["string"],
"sourceOfFunds": {
"acquiringBusinessLineId": "string",
"adyenProcessedFunds": false,
"description": "string",
"type": "business"
},
"webData": [{ "webAddress": "string" }],
"webDataExemption": { "reason": "noOnlinePresence" }
}]);
});
});
describe("Transfer Instruments", (): void => {
it("should support POST /transferInstruments", async (): Promise<void> => {
scope.post("/transferInstruments")
.reply(200, transferInstrument);
const request: models.TransferInstrumentInfo = {
type : TransferEnum.BankAccount,
legalEntityId : id,
bankAccount : {accountNumber: "string",
accountType: "string",
bankBicSwift: "string",
bankCity: "string",
bankCode: "string",
bankName: "string",
branchCode: "string",
checkCode: "string",
countryCode: "string",
currencyCode: "string",
iban: "string"
}
};
const response: models.TransferInstrument = await legalEntityManagement.TransferInstruments.create(request);
expect(response.id).toBe(id);
expect(response.type).toBe(TransferEnum.BankAccount);
});
it("should support GET /transferInstruments/{id}", async (): Promise<void> => {
scope.get(`/transferInstruments/${id}`)
.reply(200, transferInstrument);
const response: models.TransferInstrument = await legalEntityManagement.TransferInstruments.retrieve(id);
expect(response.id).toBe(id);
expect(response.type).toBe(TransferEnum.BankAccount);
});
it("should support PATCH /transferInstruments/{id}", async (): Promise<void> => {
scope.patch(`/transferInstruments/${id}`)
.reply(200, transferInstrument);
const request: models.TransferInstrumentInfo = {
type : TransferEnum.BankAccount,
legalEntityId : id,
bankAccount : {accountNumber: "string",
accountType: "string",
bankBicSwift: "string",
bankCity: "string",
bankCode: "string",
bankName: "string",
branchCode: "string",
checkCode: "string",
countryCode: "string",
currencyCode: "string",
iban: "string"
}
};
const response: models.TransferInstrument = await legalEntityManagement.TransferInstruments.update(id, request);
expect(response.id).toBe(id);
expect(response.type).toBe(TransferEnum.BankAccount);
});
it("should support DELETE /transferInstruments/{id}", async (): Promise<void> => {
scope.delete(`/transferInstruments/${id}`)
.reply(200);
await legalEntityManagement.TransferInstruments.delete(id);
expect(200);
});
});
describe("Business Lines", (): void => {
it("should support POST /businessLines", async (): Promise<void> => {
scope.post("/businessLines")
.reply(200, businessLine);
const request: models.BusinessLineInfo = {
capability: "receivePayments",
industryCode: id,
legalEntityId: id };
const response: models.BusinessLine = await legalEntityManagement.BusinessLineService.create(request);
expect(response.id).toBe(id);
expect(response.capability).toBe("receivePayments");
expect(response.industryCode).toBe(id);
expect(response.legalEntityId).toBe(id);
});
it("should support GET /businessLines/{id}", async (): Promise<void> => {
scope.get(`/businessLines/${id}`)
.reply(200, businessLine);
const response: models.BusinessLine = await legalEntityManagement.BusinessLineService.retrieve(id);
expect(response.id).toBe(id);
expect(response.capability).toBe("receivePayments");
});
it("should support PATCH /businessLines/{id}", async (): Promise<void> => {
scope.patch(`/businessLines/${id}`)
.reply(200, businessLine);
const request: models.BusinessLineInfo = {
capability: "receivePayments",
industryCode: id,
legalEntityId: id };
const response: models.BusinessLine = await legalEntityManagement.BusinessLineService.update(id, request);
expect(response.id).toBe(id);
expect(response.capability).toBe("receivePayments");
expect(response.industryCode).toBe(id);
expect(response.legalEntityId).toBe(id);
});
});
describe("Documents", (): void => {
it("should support POST /documents", async (): Promise<void> => {
scope.post("/documents")
.reply(200, document);
const request: DocumentUpdate = {
attachments: [{
content: "string",
contentType: "string",
filename: "string",
pageName: "string",
pageType: "string"
}],
description: "document",
owner: {
"id": "123456789",
"type": "passport"
},
type : DocEnum.DriversLicense
};
const response: models.Document = await legalEntityManagement.Documents.create(request);
expect(response.id).toBe(id);
expect(response.type).toBe(DocEnum.DriversLicense);
expect(response.owner).toEqual({id : "123456789", type : "passport" })
});
it("should support GET /documents/{id}", async (): Promise<void> => {
scope.get(`/documents/${id}`)
.reply(200, document);
const response: models.Document = await legalEntityManagement.Documents.retrieve(id);
expect(response.id).toBe(id);
expect(response.type).toBe(DocEnum.DriversLicense);
expect(response.owner).toEqual({id : "123456789", type : "passport" })
});
it("should support PATCH /documents/{id}", async (): Promise<void> => {
scope.patch(`/documents/${id}`)
.reply(200, document);
const request: DocumentUpdate = {
attachments: [{
content: "string",
contentType: "string",
filename: "string",
pageName: "string",
pageType: "string"
}],
description: "document",
owner: {
"id": "123456789",
"type": "passport"
},
type : DocEnum.DriversLicense
};
const response: models.Document = await legalEntityManagement.Documents.update(id, request);
expect(response.id).toBe(id);
expect(response.type).toBe(DocEnum.DriversLicense);
expect(response.owner).toEqual({id : "123456789", type : "passport" })
});
it("should support DELETE /documents/{id}", async (): Promise<void> => {
scope.delete(`/documents/${id}`)
.reply(200);
await legalEntityManagement.Documents.delete(id);
});
});
describe("OnboardingLinks and Themes", (): void => {
it("should support POST /onboardingLinks", async (): Promise<void> => {
scope.post(`/legalEntities/${id}/onboardingLinks`)
.reply(200, onboardingLink);
const request: OnboardingLinkInfo = onboardingLinkInfo;
const response: models.OnboardingLink = await legalEntityManagement.HostedOnboardingPage.create(id, request);
expect(response.url).toBe("https://your.redirect-url.com");
});
it("should support GET /themes", async (): Promise<void> => {
scope.get(`/themes`)
.reply(200, onboardingThemes);
const response: models.OnboardingThemes = await legalEntityManagement.HostedOnboardingPage.listThemes();
expect(response.themes[0].id).toEqual(id);
});
it("should support GET /themes/{id}", async (): Promise<void> => {
scope.get(`/themes/${id}`)
.reply(200, onboardingTheme);
const response: models.OnboardingTheme = await legalEntityManagement.HostedOnboardingPage.retrieveTheme(id);
expect(response.id).toBe(id);
});
});
});

View File

@@ -1,729 +0,0 @@
import nock from "nock";
import Client from "../client";
import { createClient } from "../__mocks__/base";
import { Management } from "../services";
import { management } from "../typings";
import * as requests from "../__mocks__/management/requests";
import * as responses from "../__mocks__/management/responses";
import HttpClientException from "../httpClient/httpClientException";
let client: Client;
let managementService: Management;
let scope: nock.Scope;
const merchantId = "merchantId";
const apiCredentialId = "apiCredentialId";
const originId = "originId";
const paymentMethodId = "paymentMethodId";
const payoutSettingsId = "payoutSettingsId";
const orderId = "orderId";
const userId = "userId";
const webhookId = "webhookId";
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
scope = nock(`${client.config.managementEndpoint}/${Client.MANAGEMENT_API_VERSION}`);
managementService = new Management(client);
});
afterEach(() => {
nock.cleanAll();
});
describe("Management", (): void => {
describe("Me", (): void => {
test("Should properly handle error responses from API", async (): Promise<void> => {
scope.post("/me/allowedOrigins")
.reply(422, {
"type": "https://docs.adyen.com/errors/not-found",
"title": "Entity was not found",
"status": 422,
"detail": "The origin id is invalid or does not exist.",
"requestId": "KQZ5LXK2VMPRMC82",
"errorCode": "30_112",
});
try {
const createAllowedOriginRequest : management.CreateAllowedOriginRequest = {
domain: "test.com",
};
await managementService.Me.createAllowedOrigin(createAllowedOriginRequest);
fail("No exception was thrown");
} catch (error) {
expect(error instanceof HttpClientException).toBeTruthy();
if(error instanceof HttpClientException && error.responseBody) {
expect(JSON.parse(error.responseBody).requestId).toBe("KQZ5LXK2VMPRMC82");
} else {
fail("Error did not contain the expected data");
}
}
});
test("Should get API credential details based on the API Key used in the request", async (): Promise<void> => {
scope.get("/me")
.reply(200, {
"id": "S2-6262224667",
"username": "ws_123456@Company.Test",
"clientKey": "test_UCP6BO23234FFEFE33E4GWX63",
"allowedIpAddresses": [],
"roles": [
"Management API - Users read and write",
"Management API - Accounts read",
"Trigger webhook notifications",
"Management API - Payout Account Settings Read And Write",
"Manage LegalEntities via API",
"Manage associated partner accounts via API",
"PSP Pos initial configuration",
],
"_links": {
"self": {
"href": "https://management-test.adyen.com/v1/me"
},
"allowedOrigins": {
"href": "https://management-test.adyen.com/v1/me/allowedOrigins"
}
},
"companyName": "Test",
"active": true,
});
const meResponse: management.MeApiCredential = await managementService.Me.retrieve();
expect(meResponse.id).toEqual("S2-6262224667");
});
test("Should add an allowed origin to the list of allowed origins", async (): Promise<void> => {
scope.post("/me/allowedOrigins")
.reply(200, {
"id": "S2-45597C41735B6D75433E2B396553453ertcdt347675B4E3B413B4C4571522A6B2921",
"domain": "https://www.us.mystore.com",
"_links": {
"self": {
"href": "https://management-test.adyen.com/v1/me/allowedOrigins/S2-45597C41735B6D75433E2B396553453ertcdt347675B4E3B413B4C4571522A6B2921"
}
}
});
const allowedOriginRequest: management.AllowedOrigin = {
"domain": "https://www.us.mystore.com"
};
const allowedOriginsResponse: management.AllowedOrigin = await managementService.Me.createAllowedOrigin(allowedOriginRequest);
expect(allowedOriginsResponse.domain).toEqual("https://www.us.mystore.com");
});
test("Should get the list of allowed origins of a API credential based on the API key used in the request", async (): Promise<void> => {
scope.get("/me/allowedOrigins")
.reply(200, {
"data": [
{
"id": "S2-45597C41735B6D75433E2B396553453ertcdt347675B4E3B413B4C4571522A6B2921",
"domain": "https://www.us.mystore.com",
"_links": {
"self": {
"href": "https://management-test.adyen.com/v1/me/allowedOrigins/S2-45597C41735B6D75433E2B396553453ertcdt347675B4E3B413B4C4571522A6B2921"
}
}
}
]
});
const allowedOriginsResponse: management.AllowedOriginsResponse = await managementService.Me.retrieveAllowedOrigins();
expect(allowedOriginsResponse.data?.length).toEqual(1);
});
});
test("Should retrieve the details of the allowed origin specified in the path", async () => {
scope.get("/me/allowedOrigins/S2-123123123123123")
.reply(200, {
"id": "S2-123123123123123",
"domain": "https://www.us.mystore.com",
"_links": {
"self": {
"href": "https://management-test.adyen.com/v1/me/allowedOrigins/S2-123123123123123"
}
}
});
const allowedOriginResponse: management.AllowedOrigin = await managementService.Me.retrieveAllowedOrigin("S2-123123123123123");
expect(allowedOriginResponse.id).toEqual("S2-123123123123123");
});
test("Should remove the allowed origin specified in the path", async () => {
scope.delete("/me/allowedOrigins/S2-123123123123123").reply(204, {});
const allowedOriginResponse: Record<string, unknown> = await managementService.Me.deleteAllowerdOrigin("S2-123123123123123");
expect(scope.isDone()).toBe(true);
expect(Object.entries(allowedOriginResponse).length).toBe(0);
});
describe("MerchantAccount", (): void => {
it("should support GET /merchants", async (): Promise<void> => {
scope.get("/merchants?pageNumber=1&pageSize=1")
.reply(200, responses.listMerchantResponse);
const response: management.ListMerchantResponse = await managementService.MerchantAccount.list({
params: {
"pageNumber": "1",
"pageSize": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants", async (): Promise<void> => {
scope.post("/merchants")
.reply(200, responses.createMerchantResponse);
const response: management.CreateMerchantResponse = await managementService.MerchantAccount.create(requests.createMerchantRequest);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}`)
.reply(200, responses.merchant);
const response: management.Merchant = await managementService.MerchantAccount.retrieve(merchantId);
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/activate", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/activate`)
.reply(200, responses.requestActivationResponse);
const response: management.RequestActivationResponse = await managementService.MerchantAccount.activate(merchantId);
expect(response).toBeTruthy();
});
});
describe("MerchantAllowedOrigins", (): void => {
it("should support GET /merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}/allowedOrigins`)
.reply(200, responses.allowedOriginsResponse);
const response: management.AllowedOriginsResponse = await managementService.MerchantAllowedOrigins.list(merchantId, apiCredentialId);
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}/allowedOrigins`)
.reply(200, responses.allowedOriginsResponse);
const response: management.AllowedOriginsResponse = await managementService.MerchantAllowedOrigins.create(merchantId, apiCredentialId, requests.allowedOrigin);
expect(response).toBeTruthy();
});
it("should support DELETE /merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins/{originId}", async (): Promise<void> => {
scope.delete(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}/allowedOrigins/${originId}`)
.reply(204);
await managementService.MerchantAllowedOrigins.delete(merchantId, apiCredentialId, originId);
});
it("should support GET /merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins/{originId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}/allowedOrigins/${originId}`)
.reply(200, responses.allowedOrigin);
const response: management.AllowedOrigin = await managementService.MerchantAllowedOrigins.retrieve(merchantId, apiCredentialId, originId);
expect(response).toBeTruthy();
});
});
describe("MerchantApiCredentials", (): void => {
it("should support GET /merchants/{merchantId}/apiCredentials", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/apiCredentials?pageNumber=1&pageSize=1`)
.reply(200, responses.listMerchantApiCredentialsResponse);
const response: management.ListMerchantApiCredentialsResponse = await managementService.MerchantApiCredentials.list(merchantId, {
params: {
"pageNumber": "1",
"pageSize": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/apiCredentials", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/apiCredentials`)
.reply(200, responses.createApiCredentialResponse);
const response: management.CreateApiCredentialResponse = await managementService.MerchantApiCredentials.create(merchantId, requests.createMerchantApiCredentialRequest);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/apiCredentials/{apiCredentialId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}`)
.reply(200, responses.apiCredential);
const response: management.ApiCredential = await managementService.MerchantApiCredentials.retrieve(merchantId, apiCredentialId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/apiCredentials/{apiCredentialId}", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}`)
.reply(200, responses.apiCredential);
const response: management.ApiCredential = await managementService.MerchantApiCredentials.update(merchantId, apiCredentialId, requests.updateMerchantApiCredentialRequest);
expect(response).toBeTruthy();
});
});
describe("MerchantApiKey", (): void => {
it("should support POST /merchants/{merchantId}/apiCredentials/{apiCredentialId}/generateApiKey", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}/generateApiKey`)
.reply(200, responses.generateApiKeyResponse);
const response: management.GenerateApiKeyResponse = await managementService.MerchantApiKey.create(merchantId, apiCredentialId);
expect(response).toBeTruthy();
});
});
describe("MerchantClientKey", (): void => {
it("should support POST /merchants/{merchantId}/apiCredentials/{apiCredentialId}/generateClientKey", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/apiCredentials/${apiCredentialId}/generateClientKey`)
.reply(200, responses.generateClientKeyResponse);
const response: management.GenerateClientKeyResponse = await managementService.MerchantClientKey.create(merchantId, apiCredentialId);
expect(response).toBeTruthy();
});
});
describe("MerchantPaymentMethods", (): void => {
it("should support GET /merchants/{merchantId}/paymentMethodSettings", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/paymentMethodSettings?storeId=1&businessLineId=1&pageNumber=1&pageSize=1`)
.reply(200, responses.paymentMethodResponse);
const response: management.PaymentMethodResponse = await managementService.MerchantPaymentMethods.listPaymentMethodSettings(merchantId, {
params: {
"storeId": "1",
"businessLineId": "1",
"pageSize": "1",
"pageNumber": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/paymentMethodSettings", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/paymentMethodSettings`)
.reply(200, responses.paymentMethod);
const response: management.PaymentMethod = await managementService.MerchantPaymentMethods.create(merchantId, {
...requests.paymentMethodSetupInfo,
type: management.PaymentMethodSetupInfo.TypeEnum.Ideal
});
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/paymentMethodSettings/{paymentMethodId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/paymentMethodSettings/${paymentMethodId}`)
.reply(200, responses.paymentMethod);
const response: management.PaymentMethod = await managementService.MerchantPaymentMethods.retrieve(merchantId, paymentMethodId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/paymentMethodSettings/{paymentMethodId}", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/paymentMethodSettings/${paymentMethodId}`)
.reply(200, responses.paymentMethod);
const response: management.PaymentMethod = await managementService.MerchantPaymentMethods.update(merchantId, paymentMethodId, requests.updatePaymentMethodInfo);
expect(response).toBeTruthy();
});
});
describe("MerchantPayoutSettings", (): void => {
it("should support GET /merchants/{merchantId}/payoutSettings", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/payoutSettings`)
.reply(200, responses.payoutSettingsResponse);
const response: management.PayoutSettingsResponse = await managementService.MerchantPayoutSettings.listPayoutSettings(merchantId);
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/payoutSettings", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/payoutSettings`)
.reply(200, responses.payoutSettings);
const response: management.PayoutSettings = await managementService.MerchantPayoutSettings.create(merchantId, requests.payoutSettingsRequest);
expect(response).toBeTruthy();
});
it("should support DELETE /merchants/{merchantId}/payoutSettings/{payoutSettingsId}", async (): Promise<void> => {
scope.delete(`/merchants/${merchantId}/payoutSettings/${payoutSettingsId}`)
.reply(200);
await managementService.MerchantPayoutSettings.delete(merchantId, payoutSettingsId);
});
it("should support GET /merchants/{merchantId}/payoutSettings/{payoutSettingsId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/payoutSettings/${payoutSettingsId}`)
.reply(200, responses.payoutSettings);
const response: management.PayoutSettings = await managementService.MerchantPayoutSettings.retrieve(merchantId, payoutSettingsId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/payoutSettings/{payoutSettingsId}", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/payoutSettings/${payoutSettingsId}`)
.reply(200, responses.payoutSettings);
const response: management.PayoutSettings = await managementService.MerchantPayoutSettings.update(merchantId, payoutSettingsId, requests.updatePayoutSettingsRequest);
expect(response).toBeTruthy();
});
});
describe("MerchantTerminalOrders", (): void => {
it("should support GET /merchants/{merchantId}/billingEntities", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/billingEntities?name=bill`)
.reply(200, responses.billingEntitiesResponse);
const response: management.BillingEntitiesResponse = await managementService.MerchantTerminalOrders.listBillingEntities(merchantId, {
params: {
"name": "bill"
}
});
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/shippingLocations", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/shippingLocations?name=1&offset=1&limit=1`)
.reply(200, responses.shippingLocationsResponse);
const response: management.ShippingLocationsResponse = await managementService.MerchantTerminalOrders.listShippingLocations(merchantId, {
params: {
"name": "1",
"offset": "1",
"limit": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/shippingLocations", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/shippingLocations`)
.reply(200, responses.shippingLocation);
const response: management.ShippingLocation = await managementService.MerchantTerminalOrders.createShippingLocation(merchantId, requests.shippingLocation);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/terminalModels", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/terminalModels`)
.reply(200, responses.terminalModelsResponse);
const response: management.TerminalModelsResponse = await managementService.MerchantTerminalOrders.listTerminalModels(merchantId);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/terminalOrders", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/terminalOrders?customerOrderReference=1&status=1&offset=1&limit=1`)
.reply(200, responses.terminalOrdersResponse);
const response: management.TerminalOrdersResponse = await managementService.MerchantTerminalOrders.listTerminalOrders(merchantId, {
params: {
"customerOrderReference": "1",
"status": "1",
"offset": "1",
"limit": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/terminalOrders", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/terminalOrders`)
.reply(200, responses.terminalOrder);
const response: management.TerminalOrder = await managementService.MerchantTerminalOrders.create(merchantId, requests.terminalOrderRequest);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/terminalOrders/{orderId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/terminalOrders/${orderId}`)
.reply(200, responses.terminalOrder);
const response: management.TerminalOrder = await managementService.MerchantTerminalOrders.retrieve(merchantId, orderId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/terminalOrders/{orderId}", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/terminalOrders/${orderId}`)
.reply(200, responses.terminalOrder);
const response: management.TerminalOrder = await managementService.MerchantTerminalOrders.update(merchantId, orderId, requests.terminalOrderRequest);
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/terminalOrders/{orderId}/cancel", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/terminalOrders/${orderId}/cancel`)
.reply(200, responses.terminalOrder);
const response: management.TerminalOrder = await managementService.MerchantTerminalOrders.cancel(merchantId, orderId);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/terminalProducts", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/terminalProducts?country=1&terminalModelId=1&offset=1&limit=1`)
.reply(200, responses.terminalProductsResponse);
const response: management.TerminalProductsResponse = await managementService.MerchantTerminalOrders.listTerminalProducts(merchantId, {
params: {
"country": "1",
"terminalModelId": "1",
"offset": "1",
"limit": "1"
}
});
expect(response).toBeTruthy();
});
});
describe("MerchantTerminalSettings", (): void => {
it("should support GET /merchants/{merchantId}/terminalLogos", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/terminalLogos?model=1`)
.reply(200, responses.logo);
const response: management.Logo = await managementService.MerchantTerminalSettings.retrieveLogo(merchantId, {
params: {
"model": "1"
}
});
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/terminalLogos", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/terminalLogos?model=1`)
.reply(200, responses.logo);
const response: management.Logo = await managementService.MerchantTerminalSettings.updateLogo(merchantId, requests.logo, {
params: {
"model": "1"
}
});
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/terminalSettings", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/terminalSettings`)
.reply(200, responses.terminalSettings);
const response: management.TerminalSettings = await managementService.MerchantTerminalSettings.retrieve(merchantId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/terminalSettings", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/terminalSettings`)
.reply(200, responses.terminalSettings);
const response: management.TerminalSettings = await managementService.MerchantTerminalSettings.update(merchantId, requests.terminalSettings);
expect(response).toBeTruthy();
});
});
describe("MerchantUsers", (): void => {
it("should support GET /merchants/{merchantId}/users", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/users?pageNumber=1&pageSize=1`)
.reply(200, responses.listMerchantUsersResponse);
const response: management.ListMerchantUsersResponse = await managementService.MerchantUsers.list(merchantId, {
params: {
"pageNumber": "1",
"pageSize": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/users", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/users`)
.reply(200, responses.createUserResponse);
const response: management.CreateUserResponse = await managementService.MerchantUsers.create(merchantId, requests.createMerchantUserRequest);
expect(response).toBeTruthy();
});
it("should support GET /merchants/{merchantId}/users/{userId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/users/${userId}`)
.reply(200, responses.user);
const response: management.User = await managementService.MerchantUsers.retrieve(merchantId, userId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/users/{userId}", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/users/${userId}`)
.reply(200, responses.user);
const response: management.User = await managementService.MerchantUsers.update(merchantId, userId, requests.updateMerchantUserRequest);
expect(response).toBeTruthy();
});
});
describe("MerchantWebhooks", (): void => {
it("should support GET /merchants/{merchantId}/webhooks", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/webhooks?pageNumber=1&pageSize=1`)
.reply(200, responses.listWebhooksResponse);
const response: management.ListWebhooksResponse = await managementService.MerchantWebhooks.list(merchantId, {
params: {
"pageNumber": "1",
"pageSize": "1"
}
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/webhooks", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/webhooks`)
.reply(200, responses.webhook);
const response: management.Webhook = await managementService.MerchantWebhooks.create(merchantId, {
...requests.createMerchantWebhookRequest,
communicationFormat: management.CreateMerchantWebhookRequest.CommunicationFormatEnum.Json,
networkType: management.CreateMerchantWebhookRequest.NetworkTypeEnum.Public,
sslVersion: management.CreateMerchantWebhookRequest.SslVersionEnum.Tls
});
expect(response).toBeTruthy();
});
it("should support DELETE /merchants/{merchantId}/webhooks/{webhookId}", async (): Promise<void> => {
scope.delete(`/merchants/${merchantId}/webhooks/${webhookId}`)
.reply(204);
await managementService.MerchantWebhooks.delete(merchantId, webhookId);
});
it("should support GET /merchants/{merchantId}/webhooks/{webhookId}", async (): Promise<void> => {
scope.get(`/merchants/${merchantId}/webhooks/${webhookId}`)
.reply(200, responses.webhook);
const response: management.Webhook = await managementService.MerchantWebhooks.retrieve(merchantId, webhookId);
expect(response).toBeTruthy();
});
it("should support PATCH /merchants/{merchantId}/webhooks/{webhookId}", async (): Promise<void> => {
scope.patch(`/merchants/${merchantId}/webhooks/${webhookId}`)
.reply(200, responses.webhook);
const response: management.Webhook = await managementService.MerchantWebhooks.update(merchantId, webhookId, {
...requests.updateMerchantWebhookRequest,
communicationFormat: management.CreateMerchantWebhookRequest.CommunicationFormatEnum.Soap,
networkType: management.CreateMerchantWebhookRequest.NetworkTypeEnum.Local,
sslVersion: management.CreateMerchantWebhookRequest.SslVersionEnum.Sslv3
});
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/webhooks/{webhookId}/generateHmac", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/webhooks/${webhookId}/generateHmac`)
.reply(200, responses.generateHmacKeyResponse);
const response: management.GenerateHmacKeyResponse = await managementService.MerchantWebhooks.generateHmac(merchantId, webhookId);
expect(response).toBeTruthy();
});
it("should support POST /merchants/{merchantId}/webhooks/{webhookId}/test", async (): Promise<void> => {
scope.post(`/merchants/${merchantId}/webhooks/${webhookId}/test`)
.reply(200, responses.testWebhookResponse);
const testWebhookRequest: management.TestWebhookRequest = {
"notification": {
"amount": {
"currency": "string",
"value": 0
},
"eventCode": "string",
"eventDate": new Date(2022, 6, 15),
"merchantReference": "string",
"paymentMethod": "string",
"reason": "string",
"success": false
},
"types": ["string"]
};
const response: management.TestWebhookResponse = await managementService.MerchantWebhooks.test(merchantId, webhookId, testWebhookRequest);
expect(response).toBeTruthy();
});
});
describe("AllowedOriginsMerchantLevelApi", (): void => {
test("Delete an allowed origin", async () => {
scope.delete("/merchants/foo/apiCredentials/BAR123/allowedOrigins/fishy%20one").reply(204);
await managementService.AllowedOriginsMerchantLevelApi
.deleteAllowedOrigin("foo", "BAR123", "fishy one");
});
test("Create an allowed origin", async () => {
const requestBody = {
"domain": "https://www.eu.mystore.com"
};
scope.post("/merchants/YOUR_MERCHANT_ACCOUNT/apiCredentials/YOUR_API_CREDENTIAL/allowedOrigins", requestBody)
.reply(200, {
"id": "YOUR_ALLOWED_ORIGIN",
"data": [
{
"domain": "https://www.eu.mystore.com",
}
],
"_links": {
"self": {
"href": "https://management-test.adyen.com/v1/merchants/YOUR_MERCHANT_ACCOUNT/apiCredentials/YOUR_API_CREDENTIAL/allowedOrigins/YOUR_ALLOWED_ORIGIN"
}
}
});
const response: management.AllowedOriginsResponse = await managementService.AllowedOriginsMerchantLevelApi
.createAllowedOrigin("YOUR_MERCHANT_ACCOUNT", "YOUR_API_CREDENTIAL", {
domain: "https://www.eu.mystore.com",
});
expect(response.data![0].domain).toEqual("https://www.eu.mystore.com");
});
});
});

View File

@@ -1,353 +0,0 @@
import nock from "nock";
import {createClient} from "../__mocks__/base";
import Checkout from "../services/checkout";
import Client from "../client";
import {
CreatePaymentAmountUpdateRequest,
CreatePaymentCancelRequest,
CreatePaymentCaptureRequest,
CreatePaymentRefundRequest, CreatePaymentReversalRequest,
CreateStandalonePaymentCancelRequest,
PaymentAmountUpdateResource,
PaymentCancelResource,
PaymentCaptureResource, PaymentRefundResource, PaymentReversalResource,
StandalonePaymentCancelResource
} from "../typings/checkout/models";
import HttpClientException from "../httpClient/httpClientException";
const invalidModificationResult = {
"status": 422,
"errorCode": "167",
"message": "Original pspReference required for this operation",
"errorType": "validation"
};
const createAmountUpdateRequest = (): CreatePaymentAmountUpdateRequest => {
return {
reference: "863620292981235A",
merchantAccount: process.env.ADYEN_MERCHANT!,
amount: {
currency: "EUR",
value: 420
},
reason: CreatePaymentAmountUpdateRequest.ReasonEnum.DelayedCharge
};
};
const createAmountUpdateResponse = (): PaymentAmountUpdateResource => {
return {
paymentPspReference: "863620292981235A",
pspReference: "863620292981235B",
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
amount: {
currency: "EUR",
value: 420,
},
reason: CreatePaymentAmountUpdateRequest.ReasonEnum.DelayedCharge,
status: PaymentAmountUpdateResource.StatusEnum.Received,
};
};
const createCancelsRequest = (): CreatePaymentCancelRequest => {
return {
reference: "863620292981235B",
merchantAccount: process.env.ADYEN_MERCHANT!,
};
};
const createCancelsResponse = (): PaymentCancelResource => {
return {
merchantAccount: process.env.ADYEN_MERCHANT!,
pspReference: "863620292981235B",
paymentPspReference: "863620292981235A",
status: PaymentCancelResource.StatusEnum.Received,
};
};
const createStandaloneCancelsRequest = (): CreateStandalonePaymentCancelRequest => {
return {
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
paymentReference: "863620292981235B",
};
};
const createStandaloneCancelsResponse = (): StandalonePaymentCancelResource => {
return {
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
paymentReference: "863620292981235B",
pspReference: "863620292981235A",
status: StandalonePaymentCancelResource.StatusEnum.Received,
};
};
const createCapturesRequest = (): CreatePaymentCaptureRequest => {
return {
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
amount: {
currency: "EUR",
value: 420,
}
};
};
function createCapturesResponse(): PaymentCaptureResource {
return {
paymentPspReference: "863620292981235A",
pspReference: "863620292981235B",
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
amount: {
currency: "EUR",
value: 420,
},
status: PaymentCaptureResource.StatusEnum.Received,
};
}
const createRefundsRequest = (): CreatePaymentRefundRequest => {
return {
merchantAccount: process.env.ADYEN_MERCHANT!,
amount: {
currency: "EUR",
value: 420,
}
};
};
const createRefundsResponse = (): PaymentRefundResource => {
return {
paymentPspReference: "863620292981235A",
pspReference: "863620292981235B",
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
amount: {
currency: "EUR",
value: 420,
},
status: PaymentRefundResource.StatusEnum.Received,
};
};
const createReversalsRequest = (): CreatePaymentReversalRequest => {
return {
merchantAccount: process.env.ADYEN_MERCHANT!
};
};
const createReversalsResponse = (): PaymentReversalResource => {
return {
paymentPspReference: "863620292981235A",
pspReference: "863620292981235B",
reference: "reference",
merchantAccount: process.env.ADYEN_MERCHANT!,
status: PaymentRefundResource.StatusEnum.Received,
};
};
let client: Client;
let checkout: Checkout;
let scope: nock.Scope;
const paymentPspReference = "863620292981235A";
const invalidPaymentPspReference = "invalid_psp_reference";
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
checkout = new Checkout(client);
scope = nock(`${client.config.checkoutEndpoint}/${Client.CHECKOUT_API_VERSION}`);
});
afterEach(() => {
nock.cleanAll();
});
describe("Modification", (): void => {
test("should perform an amount update request", async (): Promise<void> => {
const request = createAmountUpdateRequest();
scope.post(`/payments/${paymentPspReference}/amountUpdates`)
.reply(200, createAmountUpdateResponse());
try {
const result = await checkout.amountUpdates(paymentPspReference, request);
expect(result).toBeTruthy();
} catch (e) {
if(e instanceof Error) {
if(e.message) fail(e.message);
} else {
fail();
}
}
});
test("should fail to perform an amount update request", async (): Promise<void> => {
expect.assertions(2);
const request = createAmountUpdateRequest();
scope.post(`/payments/${invalidPaymentPspReference}/amountUpdates`)
.reply(422, invalidModificationResult);
try {
await checkout.amountUpdates(invalidPaymentPspReference, request);
} catch (e) {
if(e instanceof HttpClientException) {
if(e.statusCode) expect(e.statusCode).toBe(422);
expect(e.message).toContain("Original pspReference required for this operation");
} else {
fail();
}
}
});
test("should perform a cancels request", async (): Promise<void> => {
const request = createCancelsRequest();
scope.post(`/payments/${paymentPspReference}/cancels`)
.reply(200, createCancelsResponse());
try {
const result = await checkout.cancels(paymentPspReference, request);
expect(result).toBeTruthy();
} catch (e) {
if(e instanceof Error) {
if(e.message) fail(e.message);
} else {
fail();
}
}
});
test("should fail to perform a cancels request", async (): Promise<void> => {
expect.assertions(2);
const request = createCancelsRequest();
scope.post(`/payments/${invalidPaymentPspReference}/cancels`)
.reply(422, invalidModificationResult);
try {
await checkout.cancels(invalidPaymentPspReference, request);
} catch (e) {
if(e instanceof HttpClientException) {
if(e.statusCode) expect(e.statusCode).toBe(422);
expect(e.message).toContain("Original pspReference required for this operation");
} else {
fail();
}
}
});
test("should perform a standalone cancels request", async (): Promise<void> => {
const request = createStandaloneCancelsRequest();
scope.post("/cancels")
.reply(200, createStandaloneCancelsResponse());
try {
const result = await checkout.cancelsStandalone(request);
expect(result).toBeTruthy();
} catch (e) {
if(e instanceof Error) {
if(e.message) fail(e.message);
} else {
fail();
}
}
});
test("should perform a captures request", async (): Promise<void> => {
const request = createCapturesRequest();
scope.post(`/payments/${paymentPspReference}/captures`)
.reply(200, createCapturesResponse());
try {
const result = await checkout.captures(paymentPspReference, request);
expect(result).toBeTruthy();
} catch (e) {
if(e instanceof Error) {
if(e.message) fail(e.message);
} else {
fail();
}
}
});
test("should fail to perform a captures request", async (): Promise<void> => {
expect.assertions(2);
const request = createCapturesRequest();
scope.post(`/payments/${invalidPaymentPspReference}/captures`)
.reply(422, invalidModificationResult);
try {
await checkout.captures(invalidPaymentPspReference, request);
} catch (e) {
if(e instanceof HttpClientException) {
if(e.statusCode) expect(e.statusCode).toBe(422);
expect(e.message).toContain("Original pspReference required for this operation");
} else {
fail();
}
}
});
test("should perform a refunds request", async (): Promise<void> => {
const request = createRefundsRequest();
scope.post(`/payments/${paymentPspReference}/refunds`)
.reply(200, createRefundsResponse());
try {
const result = await checkout.refunds(paymentPspReference, request);
expect(result).toBeTruthy();
} catch (e) {
if(e instanceof Error) {
if(e.message) fail(e.message);
} else {
fail();
}
}
});
test("should fail to perform a refunds request", async (): Promise<void> => {
expect.assertions(2);
const request = createRefundsRequest();
scope.post(`/payments/${invalidPaymentPspReference}/refunds`)
.reply(422, invalidModificationResult);
try {
await checkout.refunds(invalidPaymentPspReference, request);
} catch (e) {
if(e instanceof HttpClientException) {
if(e.statusCode) expect(e.statusCode).toBe(422);
expect(e.message).toContain("Original pspReference required for this operation");
} else {
fail();
}
}
});
test("should perform a reversals request", async (): Promise<void> => {
const request = createReversalsRequest();
scope.post(`/payments/${paymentPspReference}/reversals`)
.reply(200, createReversalsResponse());
try {
const result = await checkout.reversals(paymentPspReference, request);
expect(result).toBeTruthy();
} catch (e) {
if(e instanceof Error) {
if(e.message) fail(e.message);
} else {
fail();
}
}
});
test("should fail to perform a reversals request", async (): Promise<void> => {
expect.assertions(2);
const request = createReversalsRequest();
scope.post(`/payments/${invalidPaymentPspReference}/reversals`)
.reply(422, invalidModificationResult);
try {
await checkout.reversals(invalidPaymentPspReference, request);
} catch (e) {
if(e instanceof HttpClientException) {
if(e.statusCode) expect(e.statusCode).toBe(422);
expect(e.message).toContain("Original pspReference required for this operation");
} else {
fail();
}
}
});
});

View File

@@ -1,10 +1,30 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import authorisationTrue from "../__mocks__/notification/authorisationTrue.json";
import captureTrue from "../__mocks__/notification/captureTrue.json";
import captureFalse from "../__mocks__/notification/captureFalse.json";
import refundTrue from "../__mocks__/notification/refundTrue.json";
import refundFalse from "../__mocks__/notification/refundFalse.json";
import NotificationRequest from "../notification/notificationRequest";
import { Notification, NotificationRequestItem } from "../typings/notification/models";
import {Notification, NotificationRequestItem} from "../typings/notification/models";
import NotificationEnum = NotificationRequestItem.EventCodeEnum;
import SuccessEnum = NotificationRequestItem.SuccessEnum;
@@ -15,10 +35,9 @@ describe("Notification Test", function (): void {
if (notificationRequest.notificationItems) {
const notificationRequestItem: NotificationRequestItem = notificationRequest.notificationItems[0];
expect(NotificationEnum.Authorisation).toEqual(notificationRequestItem.eventCode);
expect(NotificationEnum.AUTHORISATION).toEqual(notificationRequestItem.eventCode);
expect(notificationRequestItem.success === SuccessEnum.True).toBeTruthy();
expect(notificationRequestItem.pspReference).toEqual("123456789");
expect(notificationRequestItem.additionalData!.paymentLinkId).toEqual("ABCDEFG");
} else {
fail();
}
@@ -30,7 +49,7 @@ describe("Notification Test", function (): void {
if (notificationRequest.notificationItems) {
const notificationRequestItem = notificationRequest.notificationItems[0];
expect(NotificationEnum.Capture).toEqual(notificationRequestItem.eventCode);
expect(NotificationEnum.CAPTURE).toEqual(notificationRequestItem.eventCode);
expect(notificationRequestItem.success === SuccessEnum.True).toBeTruthy();
expect(notificationRequestItem.pspReference).toEqual("PSP_REFERENCE");
expect(notificationRequestItem.originalReference).toEqual("ORIGINAL_PSP");
@@ -45,7 +64,7 @@ describe("Notification Test", function (): void {
if (notificationRequest.notificationItems) {
const notificationRequestItem = notificationRequest.notificationItems[0];
expect(NotificationEnum.Capture).toEqual(notificationRequestItem.eventCode);
expect(NotificationEnum.CAPTURE).toEqual(notificationRequestItem.eventCode);
expect(notificationRequestItem.success === SuccessEnum.True).toBeFalsy();
expect(notificationRequestItem.pspReference).toEqual("PSP_REFERENCE");
expect(notificationRequestItem.originalReference).toEqual("ORIGINAL_PSP");
@@ -60,7 +79,7 @@ describe("Notification Test", function (): void {
if (notificationRequest.notificationItems) {
const notificationRequestItem = notificationRequest.notificationItems[0];
expect(NotificationEnum.Refund).toEqual(notificationRequestItem.eventCode);
expect(NotificationEnum.REFUND).toEqual(notificationRequestItem.eventCode);
expect(notificationRequestItem.success === SuccessEnum.True).toBeTruthy();
expect(notificationRequestItem.pspReference).toEqual("PSP_REFERENCE");
expect(notificationRequestItem.originalReference).toEqual("ORIGINAL_PSP");
@@ -76,7 +95,7 @@ describe("Notification Test", function (): void {
if (notificationRequest.notificationItems) {
const notificationRequestItem = notificationRequest.notificationItems[0];
expect(NotificationEnum.Refund).toEqual(notificationRequestItem.eventCode);
expect(NotificationEnum.REFUND).toEqual(notificationRequestItem.eventCode);
expect(notificationRequestItem.success === SuccessEnum.True).toBeFalsy();
expect(notificationRequestItem.pspReference).toEqual("PSP_REFERENCE");
expect(notificationRequestItem.originalReference).toEqual("ORIGINAL_PSP");

View File

@@ -1,10 +1,30 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock from "nock";
import { createClient } from "../__mocks__/base";
import {createClient} from "../__mocks__/base";
import Payout from "../services/payout";
import Client from "../client";
import { payouts } from "../typings";
import { ApiConstants } from "../constants/apiConstants";
import StoreDetailRequest = IPayouts.StoreDetailRequest;
import {ApiConstants} from "../constants/apiConstants";
const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI);
const storeDetailAndSubmitThirdParty = JSON.stringify({
additionalData: {
fraudResultType: "GREEN",
@@ -23,20 +43,20 @@ const storeDetail = JSON.stringify({
const amountAndReference = {
amount: {
value: 100,
currency: "EUR"
value: 1,
currency: "USD"
},
reference: "randomReference",
};
const defaultData = {
dateOfBirth: new Date(),
dateOfBirth: (new Date()).toISOString(),
nationality: "NL",
shopperEmail: "johndoe@email.com",
shopperReference: "shopperReference",
};
const mockStoreDetailRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!): payouts.StoreDetailRequest => ({
const mockStoreDetailRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!): IPayouts.StoreDetailRequest => ({
...defaultData,
card: {
cvc: "737",
@@ -45,34 +65,34 @@ const mockStoreDetailRequest = (merchantAccount: string = process.env.ADYEN_MERC
number: "4111111111111111",
holderName: "John Smith"
},
entityType: payouts.StoreDetailRequest.EntityTypeEnum.Company,
entityType: "NaturalPerson",
recurring: {
contract: payouts.Recurring.ContractEnum.Payout,
contract: "RECURRING"
},
merchantAccount,
});
const mockSubmitRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!): payouts.SubmitRequest => ({
const mockSubmitRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!): IPayouts.SubmitRequest => ({
selectedRecurringDetailReference: "LATEST",
recurring: {
contract: payouts.Recurring.ContractEnum.Payout
contract: "RECURRING"
},
...defaultData,
...amountAndReference,
merchantAccount,
});
const mockStoreDetailAndSubmitRequest = (merchantAccount?: string): payouts.StoreDetailAndSubmitRequest => ({
const mockStoreDetailAndSubmitRequest = (merchantAccount?: string): IPayouts.StoreDetailAndSubmitRequest => ({
...amountAndReference,
...(mockStoreDetailRequest(merchantAccount)),
});
});
const mockPayoutRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!): payouts.PayoutRequest => ({
const mockPayoutRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!): IPayouts.PayoutRequest => ({
...amountAndReference,
...defaultData,
card: {
expiryMonth: "03",
expiryYear: "2030",
expiryMonth: "10",
expiryYear: "2020",
holderName: "John Smith",
number: "4111111111111111",
},
@@ -82,7 +102,7 @@ const mockPayoutRequest = (merchantAccount: string = process.env.ADYEN_MERCHANT!
let client: Client;
let clientStore: Client;
let clientReview: Client;
let payoutService: Payout;
let payout: Payout;
let scope: nock.Scope;
beforeEach((): void => {
@@ -93,7 +113,7 @@ beforeEach((): void => {
clientStore = createClient(process.env.ADYEN_STOREPAYOUT_APIKEY);
clientReview = createClient(process.env.ADYEN_REVIEWPAYOUT_APIKEY);
scope = nock(`${client.config.endpoint}/pal/servlet/Payout/${Client.API_VERSION}`);
payoutService = new Payout(client);
payout = new Payout(client);
});
afterEach((): void => {
@@ -101,56 +121,60 @@ afterEach((): void => {
});
describe("PayoutTest", function (): void {
test("should succeed on store detail and submit third party", async function (): Promise<void> {
payoutService = new Payout(clientStore);
const request: payouts.StoreDetailAndSubmitRequest = mockStoreDetailAndSubmitRequest();
test.each([false, true])("should succeed on store detail and submit third party, isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
payout = new Payout(clientStore);
const request: IPayouts.StoreDetailAndSubmitRequest = mockStoreDetailAndSubmitRequest();
scope.post("/storeDetailAndSubmitThirdParty").reply(200, storeDetailAndSubmitThirdParty);
const result = await payoutService.storeDetailAndSubmitThirdParty(request);
const result = await payout.storeDetailAndSubmitThirdParty(request);
expect(result.resultCode).toEqual("[payout-submit-received]");
expect(result.pspReference).toBeTruthy();
});
test("should succeed on store detail", async function (): Promise<void> {
payoutService = new Payout(clientStore);
test.each([false, true])("should succeed on store detail, isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
payout = new Payout(clientStore);
scope.post("/storeDetail").reply(200, storeDetail);
const request: payouts.StoreDetailRequest = mockStoreDetailRequest();
const result = await payoutService.storeDetail(request);
const request: StoreDetailRequest = mockStoreDetailRequest();
const result = await payout.storeDetail(request);
expect("Success").toEqual(result.resultCode);
expect(result.pspReference).toBeTruthy();
expect(result.recurringDetailReference).toBeTruthy();
});
test("should succeed on confirm third party", async function (): Promise<void> {
payoutService = new Payout(clientStore);
test.each([false, true])("should succeed on confirm third party, isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
payout = new Payout(clientStore);
scope.post("/storeDetail").reply(200, storeDetail);
const storeRequest: payouts.StoreDetailRequest = mockStoreDetailRequest();
const storeResult = await payoutService.storeDetail(storeRequest);
const storeRequest: StoreDetailRequest = mockStoreDetailRequest();
const storeResult = await payout.storeDetail(storeRequest);
payoutService = new Payout(clientReview);
payout = new Payout(clientReview);
scope.post("/confirmThirdParty")
.reply(200, {
pspReference: "8815131762537886",
response: "[payout-confirm-received]"
});
const request: payouts.ModifyRequest = {
const request: IPayouts.ModifyRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
originalReference: storeResult.pspReference
};
const result = await payoutService.confirmThirdParty(request);
const result = await payout.confirmThirdParty(request);
expect(result.response).toEqual("[payout-confirm-received]");
expect(result.pspReference).toBeTruthy();
});
test("should succeed on submit third party", async function (): Promise<void> {
payoutService = new Payout(clientStore);
test.each([isCI, true])("should succeed on submit third party, isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
payout = new Payout(clientStore);
scope.post("/submitThirdParty").reply(200, storeDetailAndSubmitThirdParty);
const request: payouts.SubmitRequest = mockSubmitRequest();
const result = await payoutService.submitThirdparty(request);
const request: IPayouts.SubmitRequest = mockSubmitRequest();
const result = await payout.submitThirdparty(request);
expect(result.resultCode).toEqual("[payout-submit-received]");
expect(result.pspReference).toBeTruthy();
@@ -161,14 +185,15 @@ describe("PayoutTest", function (): void {
}
});
test("should succeed on decline third party", async function (): Promise<void> {
payoutService = new Payout(clientStore);
test.each([false, true])("should succeed on decline third party, isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
payout = new Payout(clientStore);
scope.post("/storeDetail").reply(200, storeDetail);
const storeRequest: payouts.StoreDetailRequest = mockStoreDetailRequest();
const storeResult = await payoutService.storeDetail(storeRequest);
const storeRequest: StoreDetailRequest = mockStoreDetailRequest();
const storeResult = await payout.storeDetail(storeRequest);
payoutService = new Payout(clientReview);
const request: payouts.ModifyRequest = {
payout = new Payout(clientReview);
const request: IPayouts.ModifyRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
originalReference: storeResult.pspReference
};
@@ -177,22 +202,23 @@ describe("PayoutTest", function (): void {
pspReference: "8815131762537886",
response: "[payout-decline-received]"
});
const result = await payoutService.declineThirdParty(request);
const result = await payout.declineThirdParty(request);
expect(result.response).toEqual("[payout-decline-received]");
expect(result.pspReference).toBeTruthy();
});
test("should succeed on payout", async function (): Promise<void> {
test.each([false, true])("should succeed on payout, isMock: %p", async function (isMock): Promise<void> {
!isMock && nock.restore();
scope.post("/payout").reply(200, {
pspReference: "8815131762537886",
resultCode: "Received",
});
const request = mockPayoutRequest();
const result = await payoutService.payout(request);
const result = await payout.payout(request);
expect(result.resultCode).toEqual("Received");
expect(result.pspReference).toBeTruthy();
});
});
});

View File

@@ -1,17 +1,35 @@
import nock from "nock";
import { createMock } from "ts-auto-mock";
import { createBasicAuthClient } from "../__mocks__/base";
import { documentContent } from "../__mocks__/platforms/documentContent";
import { Client, Platforms } from "../index";
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import * as A from "../typings/platformsAccount/models";
import F = IPlatformsFund;
import N = IPlatformsNotificationConfiguration;
import nock from "nock";
import {createMock} from "ts-auto-mock";
import {createBasicAuthClient} from "../__mocks__/base";
import { documentContent } from "../__mocks__/platforms/documentContent";
import {Client, Platforms} from "../index";
import A = IPlatformsAccount
import F = IPlatformsFund
import N = IPlatformsNotificationConfiguration
import H = IPlatformsHostedOnboardingPage
import AccountHolderDetails = A.AccountHolderDetails;
import NotificationConfigurationDetails = N.NotificationConfigurationDetails;
import HttpClientException from "../httpClient/httpClientException";
import { GetOnboardingUrlRequest, GetOnboardingUrlResponse, GetPciUrlRequest, GetPciUrlResponse } from "../typings/platformsHostedOnboardingPage/models";
import { DebitAccountHolderRequest, DebitAccountHolderResponse } from "../typings/platformsFund/models";
let client: Client;
let platforms: Platforms;
@@ -32,7 +50,7 @@ const accountHolderDetails: AccountHolderDetails = {
individualDetails: {
name: {
firstName: "John",
gender: A.ViasName.GenderEnum.Male,
gender: "MALE",
lastName: "Smith"
}
},
@@ -49,7 +67,7 @@ const notificationConfigurationDetails: NotificationConfigurationDetails = {
includeMode: "INCLUDE"
}
],
sslProtocol: "SSL"
sslProtocol: "SSL"
};
const assertError = (e: HttpClientException): void => {
@@ -93,11 +111,10 @@ describe("Platforms Test", function () {
["createAccountHolder", createMock<A.CreateAccountRequest>(), createMock<A.CreateAccountHolderRequest>()],
["getAccountHolder", createMock<A.GetAccountHolderRequest>(), createMock<A.GetAccountHolderRequest>()],
["updateAccountHolder", createMock<A.UpdateAccountHolderRequest>(), createMock<A.UpdateAccountHolderResponse>()],
["updateAccountHolderState", createMock<A.UpdateAccountHolderStateRequest>(), createMock<A.GetAccountHolderStatusResponse>()],
["updateAccountHolderState", createMock<A.UpdateAccountHolderStateRequest>(), createMock<A.UpdateAccountHolderStateResponse>()],
["suspendAccountHolder", createMock<A.SuspendAccountHolderRequest>(), createMock<A.SuspendAccountHolderResponse>()],
["unSuspendAccountHolder", createMock<A.UnSuspendAccountHolderRequest>(), createMock<A.UnSuspendAccountHolderResponse>()],
["closeAccountHolder", createMock<A.CloseAccountHolderRequest>(), createMock<A.CloseAccountResponse>()],
["getTaxForm", createMock<A.GetTaxFormRequest>(), createMock<A.GetTaxFormResponse>()],
];
test.each(cases)(
"should %p",
@@ -120,7 +137,6 @@ describe("Platforms Test", function () {
["refundFundsTransfer", createMock<F.RefundFundsTransferRequest>(), createMock<F.RefundFundsTransferResponse>()],
["setupBeneficiary", createMock<F.SetupBeneficiaryRequest>(), createMock<F.SetupBeneficiaryResponse>()],
["refundNotPaidOutTransfers", createMock<F.RefundNotPaidOutTransfersRequest>(), createMock<F.RefundNotPaidOutTransfersResponse>()],
["debitAccountHolder", createMock<DebitAccountHolderRequest>(), createMock<DebitAccountHolderResponse>()],
];
test.each(cases)(
"should %p",
@@ -148,7 +164,7 @@ describe("Platforms Test", function () {
"should %p",
async (...args) => {
const notificationConfiguration = platforms.NotificationConfiguration;
scope.post(`/Notification/${Client.MARKETPAY_NOTIFICATION_CONFIGURATION_API_VERSION}//${args[0]}`).reply(200, args[2]);
scope.post(`/Notification/${Client.MARKETPAY_NOTIFICATION_API_VERSION}//${args[0]}`).reply(200, args[2]);
const result = await notificationConfiguration[args[0] as string](args[1] as never);
expect(result).toMatchObject(args[2]);
@@ -158,8 +174,7 @@ describe("Platforms Test", function () {
describe("Hop", function () {
const cases = [
["getOnboardingUrl", createMock<GetOnboardingUrlRequest>(), createMock<GetOnboardingUrlResponse>()],
["getPciQuestionnaireUrl", createMock<GetPciUrlRequest>(), createMock<GetPciUrlResponse>()],
["getOnboardingUrl", createMock<H.GetOnboardingUrlRequest>(), createMock<H.GetOnboardingUrlResponse>()]
];
test.each(cases)(
"should %p",
@@ -175,44 +190,44 @@ describe("Platforms Test", function () {
});
describe.skip("Platforms Test E2E", function(): void {
beforeAll(async () => {
beforeAll(async (done) => {
accountHolder = await platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails,
legalEntity: A.CreateAccountHolderRequest.LegalEntityEnum.Individual,
legalEntity: "Individual",
});
account = await platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: {meta: "data"},
payoutSchedule: A.CreateAccountRequest.PayoutScheduleEnum.Weekly,
payoutSchedule: "WEEKLY"
});
accountHolderToSuspend = await platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails,
legalEntity: A.CreateAccountHolderRequest.LegalEntityEnum.Individual,
legalEntity: "Individual"
});
accountToClose = await platforms.Account.createAccount({
accountHolderCode: generateRandomCode(),
description: "This is a new account",
metadata: {meta: "data"},
payoutSchedule: A.CreateAccountRequest.PayoutScheduleEnum.Weekly,
payoutSchedule: "WEEKLY"
});
accountHolderToUnSuspend = await platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails,
legalEntity: A.CreateAccountHolderRequest.LegalEntityEnum.Individual,
legalEntity: "Individual"
});
await platforms.Account.suspendAccountHolder({ accountHolderCode: accountHolderToUnSuspend.accountHolderCode});
accountHolderToClose = await platforms.Account.createAccountHolder({
accountHolderCode: generateRandomCode(),
accountHolderDetails,
legalEntity: A.CreateAccountHolderRequest.LegalEntityEnum.Individual,
legalEntity: "Individual"
});
notificationConfigurationToRetrieve = await platforms.NotificationConfiguration.createNotificationConfiguration({
@@ -221,6 +236,8 @@ describe.skip("Platforms Test E2E", function(): void {
description: `${generateRandomCode()}`
}
});
done();
});
describe("Account", function(): void {
describe("Accounts E2E", function () {
@@ -229,11 +246,7 @@ describe.skip("Platforms Test E2E", function(): void {
try {
expect(accountHolder.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
it("should get account holder", async function() {
@@ -244,34 +257,26 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.accountHolderDetails.email).toEqual("random_email@example.com");
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
it("should update account holder", async function() {
nock.restore();
try {
const result = await platforms.Account.updateAccountHolder({
accountHolderCode: accountHolder.accountHolderCode,
accountHolderDetails: {
...accountHolderDetails,
address: {
country: "BE"
try {
const result = await platforms.Account.updateAccountHolder({
accountHolderCode: accountHolder.accountHolderCode,
accountHolderDetails: {
...accountHolderDetails,
address: {
country: "BE"
}
}
}
});
expect(result.accountHolderDetails!.address?.country).toEqual("BE");
} catch (e) {
if(e instanceof HttpClientException) {
});
expect(result.accountHolderDetails!.address?.country).toEqual("BE");
} catch (e) {
assertError(e);
} else {
fail();
}
}
});
it("should check account holder", async function() {
@@ -279,16 +284,12 @@ describe.skip("Platforms Test E2E", function(): void {
try {
const result = await platforms.Account.checkAccountHolder({
accountHolderCode: accountHolder.accountHolderCode,
accountStateType: A.PerformVerificationRequest.AccountStateTypeEnum.Processing,
accountStateType: "Processing",
tier: 2
});
expect(result.resultCode).toEqual("Success");
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -297,11 +298,7 @@ describe.skip("Platforms Test E2E", function(): void {
try {
expect(account.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -309,21 +306,17 @@ describe.skip("Platforms Test E2E", function(): void {
nock.restore();
try {
const result = await platforms.Account.uploadDocument({
documentContent,
documentContent: documentContent,
documentDetail: {
accountHolderCode: account.accountHolderCode,
documentType: A.DocumentDetail.DocumentTypeEnum.IdCardFront,
documentType: "ID_CARD_FRONT",
description: "test document 000",
filename: "IDCardFront.png"
}
});
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -331,10 +324,10 @@ describe.skip("Platforms Test E2E", function(): void {
nock.restore();
try {
await platforms.Account.uploadDocument({
documentContent,
documentContent: documentContent,
documentDetail: {
accountHolderCode: account.accountHolderCode,
documentType: A.DocumentDetail.DocumentTypeEnum.IdCardFront,
documentType: "ID_CARD_FRONT",
description: "test document 000",
filename: "IDCardFront.png"
}
@@ -344,11 +337,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.documentDetails![0].filename).toEqual("IDCardFront.png");
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -360,11 +349,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.status).toEqual("Closed");
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -376,11 +361,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -390,11 +371,7 @@ describe.skip("Platforms Test E2E", function(): void {
const result = await platforms.Account.unSuspendAccountHolder({ accountHolderCode: accountHolderToUnSuspend.accountHolderCode });
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -404,15 +381,11 @@ describe.skip("Platforms Test E2E", function(): void {
const result = await platforms.Account.updateAccountHolderState({
accountHolderCode: accountHolder.accountHolderCode,
disable: false,
stateType: A.UpdateAccountHolderStateRequest.StateTypeEnum.Payout
stateType: "Payout"
});
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -424,31 +397,11 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
it("should get tax form", async function() {
nock.restore();
try {
const result = await platforms.Account.getTaxForm({
accountHolderCode: accountHolder.accountHolderCode,
formType: "1099-K",
year: 2020
});
expect(result.content).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
}
});
});
});
describe("Fund", function () {
@@ -460,11 +413,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.balancePerAccount![0].detailBalance).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -476,11 +425,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.accountTransactionLists![0].transactions).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -498,11 +443,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -517,11 +458,7 @@ describe.skip("Platforms Test E2E", function(): void {
const resultStr = JSON.stringify(result);
expect(resultStr.includes("pspReference")).toBeTruthy();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -536,11 +473,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.configurationDetails.active).toBeTruthy();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -553,11 +486,7 @@ describe.skip("Platforms Test E2E", function(): void {
});
expect(result.configurationDetails.notifyURL).toEqual("https://www.adyen.com/notification-handler");
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -583,11 +512,7 @@ describe.skip("Platforms Test E2E", function(): void {
const accountHolderVerification = result.configurationDetails.eventConfigs.filter(event => event.eventType === "ACCOUNT_HOLDER_VERIFICATION")[0];
expect(accountHolderVerification.includeMode).toEqual("EXCLUDE");
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
assertError(e);
}
});
@@ -599,13 +524,9 @@ describe.skip("Platforms Test E2E", function(): void {
const result = await platforms.NotificationConfiguration.deleteNotificationConfigurations({notificationIds});
expect(result.pspReference).toBeDefined();
} catch (e) {
if(e instanceof HttpClientException) {
assertError(e);
} else {
fail();
}
}
assertError(e);
}
});
});
});
});

View File

@@ -1,33 +1,53 @@
import nock from "nock";
import { createClient } from "../__mocks__/base";
import { disableSuccess } from "../__mocks__/recurring/disableSuccess";
import { listRecurringDetailsSuccess } from "../__mocks__/recurring/listRecurringDetailsSuccess";
import { notifyShopperSuccess } from "../__mocks__/recurring/notifyShopperSuccess";
import RecurringService from "../services/recurring";
import Client from "../client";
import { recurring } from "../typings";
import {Permit} from "../typings/recurring/permit";
import {CreatePermitRequest} from "../typings/recurring/createPermitRequest";
import {ObjectSerializer} from "../typings/recurring/models";
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
const createRecurringDetailsRequest = (): recurring.RecurringDetailsRequest => {
import nock from "nock";
import {createClient} from "../__mocks__/base";
import {disableSuccess} from "../__mocks__/recurring/disableSuccess";
import {listRecurringDetailsSuccess} from "../__mocks__/recurring/listRecurringDetailsSuccess";
import Recurring from "../services/recurring";
import Client from "../client";
import {paymentsSuccess} from "../__mocks__/checkout/paymentsSuccess";
import {createPaymentsCheckoutRequest} from "./checkout.spec";
import Checkout from "../services/checkout";
const createRecurringDetailsRequest = (): IRecurring.RecurringDetailsRequest => {
return {
merchantAccount: process.env.ADYEN_MERCHANT!,
recurring: { contract: recurring.Recurring.ContractEnum.Recurring },
recurring: { contract: "RECURRING" },
shopperReference: "shopperReference",
};
};
const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI);
let client: Client;
let recurringService: RecurringService;
let recurring: Recurring;
let checkout: Checkout;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
if (!nock.isActive()){
nock.activate();
}
client = createClient();
recurringService = new RecurringService(client);
recurring = new Recurring(client);
checkout = new Checkout(client);
scope = nock(`${client.config.endpoint}/pal/servlet/Recurring/${Client.RECURRING_API_VERSION}`);
});
@@ -36,139 +56,42 @@ afterEach(() => {
});
describe("Recurring", (): void => {
test("should list recurring details", async (): Promise<void> => {
test.each([false, true])("should test have recurring details list, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/listRecurringDetails")
.reply(200, listRecurringDetailsSuccess);
const request = createRecurringDetailsRequest();
const result = await recurringService.listRecurringDetails(request);
expect(result).toBeTruthy();
expect(result.details?.[0].recurringDetailReference).toBe("recurringReference");
try {
const result = await recurring.listRecurringDetails(request);
expect(result).toBeTruthy();
} catch (e) {
fail(e.message);
}
});
test("should disable", async (): Promise<void> => {
test.each([isCI, true])("should disable, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/payments")
.reply(200, paymentsSuccess);
const paymentsRequest: ICheckout.PaymentRequest = createPaymentsCheckoutRequest();
const res = await checkout.payments(paymentsRequest);
scope.post("/disable")
.reply(200, disableSuccess);
const request: recurring.DisableRequest = {
const request: IRecurring.DisableRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
shopperReference: "shopperReference",
recurringDetailReference: "recurring.recurringDetailReference",
recurringDetailReference: res.additionalData!["recurring.recurringDetailReference"]
};
try {
const result = await recurringService.disable(request);
const result = await recurring.disable(request);
expect(result).toBeTruthy();
} catch (e) {
fail(e);
}
});
test("should send pre-debit Notification", async (): Promise<void> => {
scope.post("/notifyShopper")
.reply(200, notifyShopperSuccess);
const notifyShopperRequest: recurring.NotifyShopperRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
shopperReference: "shopperReference",
storedPaymentMethodId: "8415995487234100",
amount: {
currency: "INR",
value: 1000
},
billingDate: "2021-03-16",
reference: "Example reference",
displayedReference: "Example displayed reference"
};
try {
const result = await recurringService.notifyShopper(notifyShopperRequest);
expect(result).toBeTruthy();
} catch (e) {
fail(e);
}
});
test("should schedule account updater", async (): Promise<void> => {
const scheduleAccountUpdaterSuccess: recurring.ScheduleAccountUpdaterResult = {
pspReference: "mocked_psp",
result: "SUCCESS"
};
scope.post("/scheduleAccountUpdater")
.reply(200, scheduleAccountUpdaterSuccess);
const request: recurring.ScheduleAccountUpdaterRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
reference: "ref",
card: {
expiryMonth: "03",
expiryYear: "2030",
holderName: "John Smith",
number: "4111111111111111"
}
};
try {
const result = await recurringService.scheduleAccountUpdater(request);
expect(result).toBeTruthy();
} catch (e) {
fail(e);
}
});
test("should do a createPermit request", async (): Promise<void> => {
const createPermitResultSuccess: recurring.CreatePermitResult = {
pspReference: "1234567890"
};
scope.post("/createPermit")
.reply(200, createPermitResultSuccess);
const permit: Permit = {
validTillDate: new Date("2022-03-25"),
partnerId: "partnerID"
};
const request: recurring.CreatePermitRequest = {
permits: [permit],
merchantAccount: process.env.ADYEN_MERCHANT!,
shopperReference: "shopperRef",
recurringDetailReference: "recurringRef",
};
const serializedRequest: CreatePermitRequest = ObjectSerializer.serialize(request, "CreatePermitRequest");
expect(serializedRequest.permits[0].validTillDate?.toString()).toBe("2022-03-25T00:00:00.000Z");
try {
const result = await recurringService.createPermit(request);
expect(result).toBeTruthy();
} catch (e) {
fail(e);
}
});
test("should do a disablePermit request", async (): Promise<void> => {
const disablePermitResultSuccess: recurring.DisablePermitResult = {
pspReference: "1234567890",
status: "disabled",
};
scope.post("/disablePermit")
.reply(200, disablePermitResultSuccess);
const request: recurring.DisablePermitRequest = {
merchantAccount: process.env.ADYEN_MERCHANT!,
token: "permitToken"
};
try {
const result = await recurringService.disablePermit(request);
expect(result).toBeTruthy();
} catch (e) {
fail(e);
fail(e.message);
}
});
});

View File

@@ -1,255 +0,0 @@
import nock from "nock";
import Client from "../client";
import {createClient} from "../__mocks__/base";
import {StoredValue} from "../services";
import { storedValue } from "../typings";
let client: Client;
let storedValueService: StoredValue;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
scope = nock(`${client.config.storedValueEndpoint}/${Client.STOREDVALUE_API_VERSION}`);
storedValueService = new StoredValue(client);
});
afterEach(() => {
nock.cleanAll();
});
describe("StoredValue", (): void => {
test("Should issue Givex card", async (): Promise<void> => {
scope.post("/issue")
.reply(200, {
"currentBalance": {
"currency": "EUR",
"value": 1000
},
"pspReference": "851564651069192J",
"resultCode": "Success",
"paymentMethod": {
"number": "7219627091701347",
"securityCode": "0140",
"type": "givex"
}
});
const issueRequest: storedValue.StoredValueIssueRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store": "YOUR_STORE_ID",
"paymentMethod": {
"type": "givex"
},
"amount": {
"currency": "EUR",
"value": 1000
},
"reference": "YOUR_REFERENCE"
};
const issueResponse: storedValue.StoredValueIssueResponse = await storedValueService.issue(issueRequest);
expect(issueResponse.pspReference).toEqual("851564651069192J");
});
test("Should issue virtual Fiserv card", async (): Promise<void> => {
scope.post("/issue")
.reply(200, {
"currentBalance": {
"currency": "EUR",
"value": 1000
},
"pspReference": "851564651069192J",
"resultCode": "Success",
"paymentMethod": {
"number": "7219627091701347",
"securityCode": "0140",
"type": "givex"
}
});
const issueRequest: storedValue.StoredValueIssueRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store": "YOUR_STORE_ID",
"paymentMethod": {
"type": "valuelink"
},
// "giftCardPromoCode": "1324",
"reference": "YOUR_REFERENCE"
};
const issueResponse: storedValue.StoredValueIssueResponse = await storedValueService.issue(issueRequest);
expect(issueResponse.pspReference).toEqual("851564651069192J");
});
test("Should activate card", async (): Promise<void> => {
scope.post("/changeStatus")
.reply(200, {
"currentBalance": {
"currency": "USD",
"value": 1000
},
"pspReference": "851564652149588K",
"resultCode": "Success"
});
const statusRequest: storedValue.StoredValueStatusChangeRequest = {
"status": storedValue.StoredValueStatusChangeRequest.StatusEnum.Active,
"amount": {
"currency": "USD",
"value": 1000
},
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store":"YOUR_STORE_ID",
"paymentMethod": {
"type": "svs",
"number": "6006491286999921374",
"securityCode": "1111"
},
"reference": "YOUR_REFERENCE"
};
const changeStatusResponse: storedValue.StoredValueStatusChangeResponse = await storedValueService.changeStatus(statusRequest);
expect(changeStatusResponse.pspReference).toEqual("851564652149588K");
});
test("Should deactivate card", async (): Promise<void> => {
scope.post("/changeStatus")
.reply(200, {
"currentBalance": {
"currency": "USD",
"value": 1000
},
"pspReference": "851564652149588K",
"resultCode": "Success"
});
const statusRequest: storedValue.StoredValueStatusChangeRequest = {
"status": storedValue.StoredValueStatusChangeRequest.StatusEnum.Inactive,
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store":"YOUR_STORE_ID",
"paymentMethod": {
"type": "givex",
},
"recurringDetailReference": "7219627091701347",
"shopperReference": "YOUR_UNIQUE_SHOPPER_ID_P3fW3k9D2tvXFu6l",
"shopperInteraction": storedValue.StoredValueStatusChangeRequest.ShopperInteractionEnum.Ecommerce,
"reference": "YOUR_REFERENCE"
};
const changeStatusResponse: storedValue.StoredValueStatusChangeResponse = await storedValueService.changeStatus(statusRequest);
expect(changeStatusResponse.pspReference).toEqual("851564652149588K");
});
test("Should load funds to card", async (): Promise<void> => {
scope.post("/load")
.reply(200, {
"currentBalance": {
"currency": "USD",
"value": 30000
},
"pspReference": "851564654294247B",
"resultCode": "Success"
});
const loadRequest: storedValue.StoredValueLoadRequest = {
"amount": {
"currency": "USD",
"value": 2000
},
"loadType": storedValue.StoredValueLoadRequest.LoadTypeEnum.MerchandiseReturn,
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store":"YOUR_STORE_ID",
"paymentMethod": {
"type": "svs",
"number": "6006491286999921374",
"securityCode": "1111"
},
"reference": "YOUR_REFERENCE"
};
const loadResponse: storedValue.StoredValueLoadResponse = await storedValueService.load(loadRequest);
expect(loadResponse.pspReference).toEqual("851564654294247B");
});
test("Should check remaining balance of card", async (): Promise<void> => {
scope.post("/checkBalance")
.reply(200, {
"currentBalance": {
"currency": "EUR",
"value": 5600
},
"pspReference": "881564657480267D",
"resultCode": "Success"
});
const checkBalanceRequest: storedValue.StoredValueBalanceCheckRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store":"YOUR_STORE_ID",
"paymentMethod": {
"type": "svs",
"number": "603628672882001915092",
"securityCode": "5754"
},
"reference": "YOUR_REFERENCE"
};
const checkBalanceResponse: storedValue.StoredValueBalanceCheckResponse = await storedValueService.checkBalance(checkBalanceRequest);
expect(checkBalanceResponse.pspReference).toEqual("881564657480267D");
});
test("Should transfer full value from one card to another", async (): Promise<void> => {
scope.post("/mergeBalance")
.reply(200, {
"currentBalance": {
"currency": "EUR",
"value": 5600
},
"pspReference": "881564657480267D",
"resultCode": "Success"
});
const mergeBalanceRequest: storedValue.StoredValueBalanceMergeRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"store":"YOUR_STORE_ID",
"sourcePaymentMethod": {
"number": "7777182708544835",
"securityCode": "2329"
},
"paymentMethod": {
"type": "valuelink",
"number": "8888182708544836",
"securityCode": "2330"
},
"reference": "YOUR_REFERENCE"
};
const mergeBalanceResponse: storedValue.StoredValueBalanceMergeResponse = await storedValueService.mergebalance(mergeBalanceRequest);
expect(mergeBalanceResponse.pspReference).toEqual("881564657480267D");
});
test("Should undo transaction on card", async (): Promise<void> => {
scope.post("/voidTransaction")
.reply(200, {
"currentBalance": {
"currency": "EUR",
"value": 120000
},
"pspReference": "851564673300692A",
"resultCode": "Success"
});
const voidTransactionRequest: storedValue.StoredValueVoidRequest = {
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"originalReference": "851564654294247B",
"reference": "YOUR_REFERENCE"
};
const voidTransactionResponse: storedValue.StoredValueVoidResponse = await storedValueService.voidTransaction(voidTransactionRequest);
expect(voidTransactionResponse.pspReference).toEqual("851564673300692A");
});
});

View File

@@ -1,17 +1,36 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock from "nock";
import { createClient, createTerminalAPIPaymentRequest, createTerminalAPIRefundRequest } from "../__mocks__/base";
import { asyncRes } from "../__mocks__/terminalApi/async";
import { syncRefund, syncRes, syncResEventNotification } from "../__mocks__/terminalApi/sync";
import {createClient, createTerminalAPIPaymentRequest, createTerminalAPIRefundRequest} from "../__mocks__/base";
import {asyncRes} from "../__mocks__/terminalApi/async";
import {syncRefund, syncRes} from "../__mocks__/terminalApi/sync";
import Client from "../client";
import TerminalCloudAPI from "../services/terminalCloudAPI";
import { terminal} from "../typings";
import {TerminalApiResponse} from "../typings/terminal/models";
let client: Client;
let terminalCloudAPI: TerminalCloudAPI;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
if (!nock.isActive()){
nock.activate();
}
client = createClient(process.env.ADYEN_TERMINAL_APIKEY);
@@ -25,8 +44,10 @@ afterEach((): void => {
nock.cleanAll();
});
const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI);
describe("Terminal Cloud API", (): void => {
test("should make an async payment request", async (): Promise<void> => {
test.each([isCI, true])("should make an async payment request, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/async").reply(200, asyncRes);
const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest();
@@ -36,45 +57,29 @@ describe("Terminal Cloud API", (): void => {
expect(requestResponse).toEqual("ok");
});
test("should make a sync payment request", async (): Promise<void> => {
test.each([isCI, true])("should make a sync payment request, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/sync").reply(200, syncRes);
const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest();
const terminalAPIResponse: terminal.TerminalApiResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest);
const terminalAPIResponse: TerminalApiResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest);
expect(terminalAPIResponse.SaleToPOIResponse?.PaymentResponse).toBeDefined();
expect(terminalAPIResponse.SaleToPOIResponse?.MessageHeader).toBeDefined();
expect(terminalAPIResponse.saleToPOIResponse?.paymentResponse).toBeDefined();
expect(terminalAPIResponse.saleToPOIResponse?.messageHeader).toBeDefined();
});
test("should return event notification if response contains it", async (): Promise<void> => {
const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest();
scope.post("/sync").reply(200, syncResEventNotification);
const terminalAPIResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest);
expect(terminalAPIResponse.SaleToPOIRequest?.EventNotification).toBeDefined();
});
test("should make an async refund request", async (): Promise<void> => {
test.each([isCI, true])("should make an async refund request, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/sync").reply(200, syncRes);
const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest();
const terminalAPIResponse: terminal.TerminalApiResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest);
const pOITransactionId = terminalAPIResponse.SaleToPOIResponse!.PaymentResponse!.POIData!.POITransactionID;
expect(pOITransactionId).toBeTruthy();
const terminalAPIResponse: TerminalApiResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest);
scope.post("/sync").reply(200, syncRefund);
const terminalAPIRefundRequest = createTerminalAPIRefundRequest(pOITransactionId);
const id = Math.floor(Math.random() * Math.floor(10000000)).toString();
terminalAPIRefundRequest.SaleToPOIRequest.MessageHeader.ServiceID = id;
const saleToAcquirerData: terminal.SaleToAcquirerData = new terminal.SaleToAcquirerData();
saleToAcquirerData.currency = "EUR";
terminalAPIRefundRequest.SaleToPOIRequest.ReversalRequest!.SaleData!.SaleToAcquirerData = saleToAcquirerData;
const terminalAPIRefundRequest = createTerminalAPIRefundRequest(terminalAPIResponse.saleToPOIResponse?.paymentResponse?.pOIData.pOITransactionID!);
const terminalAPIRefundResponse = await terminalCloudAPI.sync(terminalAPIRefundRequest);
expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse?.Response.Result).toBe("Success");
}, 20000);
expect(terminalAPIRefundResponse.saleToPOIResponse?.reversalResponse).toBeDefined();
});
});

View File

@@ -1,9 +1,28 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import nock from "nock";
import { createClient, createTerminalAPIPaymentRequest } from "../__mocks__/base";
import { localEncRes, wrongEncRes } from "../__mocks__/terminalApi/local";
import {createClient, createTerminalAPIPaymentRequest} from "../__mocks__/base";
import {localEncRes, wrongEncRes} from "../__mocks__/terminalApi/local";
import Client from "../client";
import TerminalLocalAPI from "../services/terminalLocalAPI";
import { terminal } from "../typings";
import {SecurityKey, TerminalApiResponse} from "../typings/terminal/models";
import NexoCryptoException from "../services/exception/nexoCryptoException";
let client: Client;
@@ -11,7 +30,7 @@ let terminalLocalAPI: TerminalLocalAPI;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
if (!nock.isActive()){
nock.activate();
}
@@ -24,45 +43,45 @@ afterEach((): void => {
nock.cleanAll();
});
const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI);
describe("Terminal Local API", (): void => {
test("should make a local payment", async (): Promise<void> => {
test.each([isCI, true])("should make a local payment, isMock: %p", async (isMock): Promise<void> => {
!isMock && nock.restore();
scope.post("/").reply(200, localEncRes);
const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest();
const securityKey: terminal.SecurityKey = {
AdyenCryptoVersion: 0,
KeyIdentifier: "CryptoKeyIdentifier12345",
KeyVersion: 0,
Passphrase: "p@ssw0rd123456",
const securityKey: SecurityKey = {
adyenCryptoVersion: 0,
keyIdentifier: "CryptoKeyIdentifier12345",
keyVersion: 0,
passphrase: "p@ssw0rd123456",
};
const terminalApiResponse: terminal.TerminalApiResponse =
const terminalApiResponse: TerminalApiResponse =
await terminalLocalAPI.request(terminalAPIPaymentRequest, securityKey);
expect(terminalApiResponse.SaleToPOIResponse?.PaymentResponse).toBeDefined();
expect(terminalApiResponse.SaleToPOIResponse?.MessageHeader).toBeDefined();
expect(terminalApiResponse.saleToPOIResponse?.paymentResponse).toBeDefined();
expect(terminalApiResponse.saleToPOIResponse?.messageHeader).toBeDefined();
});
test("should return NexoCryptoException", async (): Promise<void> => {
test.each([isCI, true])("should return NexoCryptoException, isMock: %p", async (isMock: boolean): Promise<void> => {
!isMock && nock.restore();
scope.post("/").reply(200, wrongEncRes);
const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest();
const securityKey: terminal.SecurityKey = {
AdyenCryptoVersion: 0,
KeyIdentifier: "CryptoKeyIdentifier12345",
KeyVersion: 0,
Passphrase: "p@ssw0rd123456",
const securityKey: SecurityKey = {
adyenCryptoVersion: 0,
keyIdentifier: "CryptoKeyIdentifier12345",
keyVersion: 0,
passphrase: "p@ssw0rd123456",
};
try {
await terminalLocalAPI.request(terminalAPIPaymentRequest, securityKey);
} catch (e) {
if(e instanceof NexoCryptoException) {
expect(e.message).toEqual("Hmac validation failed");
} else {
fail();
}
expect(e instanceof NexoCryptoException);
expect(e.message).toEqual("Hmac validation failed");
}
});
});

View File

@@ -1,146 +0,0 @@
import nock from "nock";
import Client from "../client";
import { createClient } from "../__mocks__/base";
import TerminalManagement from "../services/terminalManagement";
import { terminalManagement } from "../typings";
let client: Client;
let terminalManagementService: TerminalManagement;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
scope = nock(`${client.config.terminalManagementEndpoint}/${Client.TERMINAL_MANAGEMENT_API_VERSION}`);
terminalManagementService = new TerminalManagement(client);
});
afterEach(() => {
nock.cleanAll();
});
describe("POS Terminal Management API", (): void => {
test("Should support /assignTerminals", async (): Promise<void> => {
scope.post("/assignTerminals")
.reply(200, {
"results": {
"P400Plus-275479597": "RemoveConfigScheduled"
}
});
const request: terminalManagement.AssignTerminalsRequest = {
"companyAccount": "YOUR_COMPANY_ACCOUNT",
"terminals": [
"P400Plus-275479597"
]
};
const response: terminalManagement.AssignTerminalsResponse = await terminalManagementService.assignTerminals(request);
expect(response.results["P400Plus-275479597"]).toEqual("RemoveConfigScheduled");
});
test("Should support /findTerminal", async (): Promise<void> => {
scope.post("/findTerminal")
.reply(200, {
"companyAccount": "YOUR_COMPANY_ACCOUNT",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"merchantInventory": false,
"terminal": "P400Plus-275479597"
});
const request: terminalManagement.FindTerminalRequest = {
"terminal": "P400Plus-275479597"
};
const response: terminalManagement.FindTerminalResponse = await terminalManagementService.findTerminal(request);
expect(response.terminal).toEqual("P400Plus-275479597");
});
test("Should support /getStoresUnderAccount", async (): Promise<void> => {
scope.post("/getStoresUnderAccount")
.reply(200, {
"stores": [
{
"store": "YOUR_STORE",
"description": "YOUR_STORE",
"address": {
"city": "The City",
"countryCode": "NL",
"postalCode": "1234",
"streetAddress": "The Street"
},
"status": "Active",
"merchantAccountCode": "YOUR_MERCHANT_ACCOUNT"
}
]
});
const request: terminalManagement.GetStoresUnderAccountRequest = {
"companyAccount": "YOUR_COMPANY_ACCOUNT"
};
const response: terminalManagement.GetStoresUnderAccountResponse = await terminalManagementService.getStoresUnderAccount(request);
expect(response.stores).toHaveLength(1);
expect(response.stores![0].status).toEqual("Active");
expect(response.stores![0].address?.countryCode).toEqual("NL");
});
test("Should support /getTerminalDetails", async (): Promise<void> => {
scope.post("/getTerminalDetails")
.reply(200, {
"companyAccount": "YOUR_COMPANY_ACCOUNT",
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"merchantInventory": false,
"terminal": "P400Plus-275479597",
"deviceModel": "P400Plus",
"serialNumber": "275-479-597",
"permanentTerminalId": "75479597",
"terminalStatus": "ReAssignToInventoryPending",
"firmwareVersion": "Verifone_VOS 1.57.6",
"country": "NETHERLANDS",
"dhcpEnabled": false
});
const request: terminalManagement.GetTerminalDetailsRequest = {
"terminal": "P400Plus-275479597"
};
const response: terminalManagement.GetTerminalDetailsResponse = await terminalManagementService.getTerminalDetails(request);
expect(response.deviceModel).toBe("P400Plus");
});
test("Should support /getTerminalsUnderAccount", async (): Promise<void> => {
scope.post("/getTerminalsUnderAccount")
.reply(200, {
"companyAccount": "YOUR_COMPANY_ACCOUNT",
"merchantAccounts": [
{
"merchantAccount": "YOUR_MERCHANT_ACCOUNT",
"inStoreTerminals": [
"P400Plus-275479597"
],
"stores": [
{
"store": "YOUR_STORE",
"inStoreTerminals": [
"M400-401972715"
]
}
]
}
]
});
const request: terminalManagement.GetTerminalsUnderAccountRequest = {
"companyAccount": "YOUR_COMPANY_ACCOUNT"
};
const response: terminalManagement.GetTerminalsUnderAccountResponse = await terminalManagementService.getTerminalsUnderAccount(request);
expect(response.merchantAccounts).toHaveLength(1);
expect(response.merchantAccounts![0].stores).toHaveLength(1);
expect(response.merchantAccounts![0].stores![0].inStoreTerminals).toEqual(["M400-401972715"]);
});
});

View File

@@ -1,68 +0,0 @@
import nock from "nock";
import { createClient } from "../__mocks__/base";
import { transfersSuccess, getTransactionSuccess, listTransactionsSuccess } from "../__mocks__/transfers/responses";
import Client from "../client";
import { Transfers } from "../services";
import { transfer} from "../typings";
let client: Client;
let transferService: Transfers;
let scope: nock.Scope;
beforeEach((): void => {
if (!nock.isActive()) {
nock.activate();
}
client = createClient();
transferService = new Transfers(client);
scope = nock(`https://balanceplatform-api-test.adyen.com/btl/${Client.TRANSFERS_API_VERSION}`);
});
afterEach(() => {
nock.cleanAll();
});
describe("Transfers", (): void => {
test("should transfer fund", async (): Promise<void> => {
scope.post("/transfers")
.reply(200, transfersSuccess);
const request = new transfer.TransferInfo();
request.amount = { currency: "EUR", value: 1000};
request.category = transfer.TransferInfo.CategoryEnum.Bank;
request.counterparty = {
balanceAccountId: "123",
transferInstrumentId: "transfer_id",
bankAccount: {
accountHolder: {
fullName: "Wally Bizzle"
},
accountIdentification: {
iban: "NLRABO12321",
type: transfer.IbanAccountIdentification.TypeEnum.Iban
}
},
};
const response: transfer.Transfer = await transferService.transfers(request);
expect(response.id).toEqual("1W1UG35U8A9J5ZLG");
});
test("should get transaction", async (): Promise<void> => {
scope.get("/transactions/123")
.reply(200, getTransactionSuccess);
const response: transfer.Transaction = await transferService.getTransaction("123");
expect(response.id).toEqual("IZK7C25U7DYVX03Y");
});
test("should list transactions", async (): Promise<void> => {
scope.get("/transactions")
.reply(200, listTransactionsSuccess);
const response: transfer.TransactionSearchResponse = await transferService.listTransactions();
expect(response.data?.length).toEqual(3);
if(response.data && response.data?.length > 0) {
expect(response?.data[0]?.id).toEqual("1VVF0D5U66PIUIVP");
} else {
fail();
}
});
});

View File

@@ -1,15 +1,30 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import Config from "./config";
import HttpURLConnectionClient from "./httpClient/httpURLConnectionClient";
import { version } from "../package.json";
import {version} from "../package.json";
import ClientInterface from "./httpClient/clientInterface";
type ClientParametersOverload =
| { config: Config }
| { config: Config; httpClient: ClientInterface }
| { username: string; password: string; environment: Environment}
| { username: string; password: string; environment: Environment; httpClient: ClientInterface }
| { username: string; password: string; environment: Environment; liveEndpointUrlPrefix: string }
| { username: string; password: string; environment: Environment; liveEndpointUrlPrefix: string; httpClient: ClientInterface }
| { username: string; password: string; environment: Environment; applicationName: string }
| { username: string; password: string; environment: Environment; applicationName: string; httpClient: ClientInterface }
| { username: string; password: string; environment: Environment; applicationName: string; liveEndpointUrlPrefix: string }
@@ -37,48 +52,23 @@ class Client {
public static HPP_LIVE = "https://live.adyen.com/hpp";
public static MARKETPAY_ENDPOINT_TEST = "https://cal-test.adyen.com/cal/services";
public static MARKETPAY_ENDPOINT_LIVE = "https://cal-live.adyen.com/cal/services";
public static CHECKOUT_API_VERSION = "v69";
public static API_VERSION = "v68";
public static RECURRING_API_VERSION = "v68";
public static MARKETPAY_ACCOUNT_API_VERSION = "v6";
public static MARKETPAY_FUND_API_VERSION = "v6";
public static MARKETPAY_HOP_API_VERSION = "v6";
public static API_VERSION = "v52";
public static RECURRING_API_VERSION = "v49";
public static MARKETPAY_ACCOUNT_API_VERSION = "v5";
public static MARKETPAY_FUND_API_VERSION = "v5";
public static MARKETPAY_HOP_API_VERSION = "v1"
public static MARKETPAY_NOTIFICATION_API_VERSION = "v5";
public static MARKETPAY_NOTIFICATION_CONFIGURATION_API_VERSION = "v6";
public static PAYMENT_API_VERSION = "v68";
public static STOREDVALUE_API_VERSION = "v46";
public static TERMINAL_MANAGEMENT_API_VERSION = "v1";
public static MANAGEMENT_API_VERSION = "v1";
public static LIB_NAME = "adyen-node-api-library";
public static LIB_VERSION: string = version;
public static CHECKOUT_ENDPOINT_TEST = "https://checkout-test.adyen.com/checkout";
public static CHECKOUT_ENDPOINT_LIVE_SUFFIX = "-checkout-live.adyenpayments.com/checkout";
public static CHECKOUT_API_VERSION = "v52";
public static BIN_LOOKUP_PAL_SUFFIX = "/pal/servlet/BinLookup/";
public static BIN_LOOKUP_API_VERSION = "v50";
public static CHECKOUT_UTILITY_API_VERSION = "v1";
public static TERMINAL_API_ENDPOINT_TEST = "https://terminal-api-test.adyen.com";
public static TERMINAL_API_ENDPOINT_LIVE = "https://terminal-api-live.adyen.com";
public static ENDPOINT_PROTOCOL = "https://";
public static PAYMENT_API_ENDPOINT_TEST = "https://pal-test.adyen.com/pal/servlet/Payment";
public static PAYMENT_API_ENDPOINT_LIVE = "https://pal-live.adyen.com/pal/servlet/Payment";
public static STOREDVALUE_API_ENDPOINT_TEST = "https://pal-test.adyen.com/pal/servlet/StoredValue";
public static STOREDVALUE_API_ENDPOINT_LIVE = "https://pal-live.adyen.com/pal/servlet/StoredValue";
public static TERMINAL_MANAGEMENT_API_ENDPOINT_TEST = "https://postfmapi-test.adyen.com/postfmapi/terminal";
public static TERMINAL_MANAGEMENT_API_ENDPOINT_LIVE = "https://postfmapi-live.adyen.com/postfmapi/terminal";
public static MANAGEMENT_API_ENDPOINT_TEST = "https://management-test.adyen.com";
public static MANAGEMENT_API_ENDPOINT_LIVE = "https://management-live.adyen.com";
public static BALANCE_PLATFORM_API_VERSION = "v2";
public static BALANCE_PLATFORM_API_ENDPOINT_TEST = "https://balanceplatform-api-test.adyen.com/bcl";
public static BALANCE_PLATFORM_API_ENDPOINT_LIVE = "https://balanceplatform-api-live.adyen.com/bcl";
public static LEGAL_ENTITY_MANAGEMENT_API_VERSION = "v2";
public static LEGAL_ENTITY_MANAGEMENT_API_ENDPOINT_TEST = "https://kyc-test.adyen.com/lem";
public static LEGAL_ENTITY_MANAGEMENT_API_ENDPOINT_LIVE = "https://kyc-live.adyen.com/lem";
public static TRANSFERS_API_VERSION = "v3";
public static TRANSFERS_API_ENDPOINT_TEST = "https://balanceplatform-api-test.adyen.com/btl";
public static TRANSFERS_API_ENDPOINT_LIVE = "https://balanceplatform-api-live.adyen.com/btl";
public static DATA_PROTECTION_API_VERSION = "v1";
public static DATA_PROTECTION_API_ENDPOINT_TEST = "https://ca-test.adyen.com/ca/services/DataProtectionService";
public static DATA_PROTECTION_API_ENDPOINT_LIVE = "https://ca-live.adyen.com/ca/services/DataProtectionService";
private _httpClient!: ClientInterface;
public config: Config;
@@ -94,12 +84,10 @@ class Client {
const environment = options.environment || this.config.environment;
if (environment) {
this.setEnvironment(environment, options.liveEndpointUrlPrefix);
if (options.username && options.password) {
if (options.username && options.password && options.applicationName) {
this.config.username = options.username;
this.config.password = options.password;
if(options.applicationName) {
this.config.applicationName = options.applicationName;
}
this.config.applicationName = options.applicationName;
}
if (options.apiKey) {
@@ -119,28 +107,10 @@ class Client {
this.config.hppEndpoint = Client.HPP_TEST;
this.config.checkoutEndpoint = Client.CHECKOUT_ENDPOINT_TEST;
this.config.terminalApiCloudEndpoint = Client.TERMINAL_API_ENDPOINT_TEST;
this.config.paymentEndpoint = Client.PAYMENT_API_ENDPOINT_TEST;
this.config.storedValueEndpoint = Client.STOREDVALUE_API_ENDPOINT_TEST;
this.config.terminalManagementEndpoint = Client.TERMINAL_MANAGEMENT_API_ENDPOINT_TEST;
this.config.managementEndpoint = Client.MANAGEMENT_API_ENDPOINT_TEST;
this.config.balancePlatformEndpoint = Client.BALANCE_PLATFORM_API_ENDPOINT_TEST;
this.config.legalEntityManagementEndpoint = Client.LEGAL_ENTITY_MANAGEMENT_API_ENDPOINT_TEST;
this.config.transfersEndpoint = Client.TRANSFERS_API_ENDPOINT_TEST;
this.config.dataProtectionEndpoint = Client.DATA_PROTECTION_API_ENDPOINT_TEST;
} else if (environment === "LIVE") {
this.config.endpoint = Client.ENDPOINT_LIVE;
this.config.marketPayEndpoint = Client.MARKETPAY_ENDPOINT_LIVE;
this.config.hppEndpoint = Client.HPP_LIVE;
this.config.terminalApiCloudEndpoint = Client.TERMINAL_API_ENDPOINT_LIVE;
this.config.paymentEndpoint = Client.PAYMENT_API_ENDPOINT_LIVE;
this.config.storedValueEndpoint = Client.STOREDVALUE_API_ENDPOINT_LIVE;
this.config.terminalManagementEndpoint = Client.TERMINAL_MANAGEMENT_API_ENDPOINT_LIVE;
this.config.managementEndpoint = Client.MANAGEMENT_API_ENDPOINT_LIVE;
this.config.balancePlatformEndpoint = Client.BALANCE_PLATFORM_API_ENDPOINT_LIVE;
this.config.legalEntityManagementEndpoint = Client.LEGAL_ENTITY_MANAGEMENT_API_ENDPOINT_LIVE;
this.config.transfersEndpoint = Client.TRANSFERS_API_ENDPOINT_LIVE;
this.config.dataProtectionEndpoint = Client.DATA_PROTECTION_API_ENDPOINT_LIVE;
if (liveEndpointUrlPrefix) {
this.config.endpoint =
`${Client.ENDPOINT_PROTOCOL}${liveEndpointUrlPrefix}${Client.ENDPOINT_LIVE_SUFFIX}`;

View File

@@ -34,14 +34,6 @@ interface ConfigConstructor {
checkoutEndpoint?: string;
terminalApiCloudEndpoint?: string;
terminalApiLocalEndpoint?: string;
paymentEndpoint?: string;
storedValueEndpoint?: string;
terminalManagementEndpoint?: string;
managementEndpoint?: string;
balancePlatformEndpoint?: string;
legalEntityManagementEndpoint?: string;
transfersEndpoint?: string;
dataProtectionEndpoint?: string;
}
class Config {
@@ -66,15 +58,6 @@ class Config {
public terminalApiCloudEndpoint?: string;
public terminalApiLocalEndpoint?: string;
public paymentEndpoint?: string;
public storedValueEndpoint?: string;
public terminalManagementEndpoint?: string;
public managementEndpoint?: string;
public balancePlatformEndpoint?: string;
public legalEntityManagementEndpoint?: string;
public transfersEndpoint?: string;
public dataProtectionEndpoint?: string;
public constructor(options: ConfigConstructor = {}) {
if (options.username) this.username = options.username;
if (options.password) this.password = options.password;
@@ -93,14 +76,6 @@ class Config {
if (options.checkoutEndpoint) this._checkoutEndpoint = options.checkoutEndpoint;
if (options.terminalApiCloudEndpoint) this.terminalApiCloudEndpoint = options.terminalApiCloudEndpoint;
if (options.terminalApiLocalEndpoint) this.terminalApiLocalEndpoint = options.terminalApiLocalEndpoint;
if (options.paymentEndpoint) this.paymentEndpoint = options.paymentEndpoint;
if (options.storedValueEndpoint) this.storedValueEndpoint = options.storedValueEndpoint;
if (options.terminalManagementEndpoint) this.terminalManagementEndpoint = options.terminalManagementEndpoint;
if (options.managementEndpoint) this.managementEndpoint = options.managementEndpoint;
if (options.balancePlatformEndpoint) this.balancePlatformEndpoint = options.balancePlatformEndpoint;
if (options.legalEntityManagementEndpoint) this.legalEntityManagementEndpoint = options.legalEntityManagementEndpoint;
if (options.transfersEndpoint) this.transfersEndpoint = options.transfersEndpoint;
if (options.dataProtectionEndpoint) this.dataProtectionEndpoint = options.dataProtectionEndpoint;
}
public set checkoutEndpoint(checkoutEndpoint: string | undefined) {

View File

@@ -17,7 +17,7 @@
* See the LICENSE file for more info.
*/
import { PeerCertificate } from "tls";
import {PeerCertificate} from "tls";
export default function checkServerIdentity(host: string, cert: PeerCertificate): Error | undefined {
const { subject: { CN }} = cert;

View File

@@ -20,7 +20,7 @@
import Resource from "../services/resource";
import HttpClientException from "../httpClient/httpClientException";
import ApiException from "../services/exception/apiException";
import { IRequest } from "../typings/requestOptions";
import {IRequest} from "../typings/requestOptions";
async function getJsonResponse<T>(resource: Resource, jsonRequest: T | string, requestOptions?: IRequest.Options): Promise<string>;
async function getJsonResponse<T, R>(resource: Resource, jsonRequest: T | string, requestOptions?: IRequest.Options): Promise<R>;

View File

@@ -17,7 +17,7 @@
* See the LICENSE file for more info.
*/
import { ApplicationInfo } from "../typings/applicationInfo";
import {ApplicationInfo} from "../typings/applicationInfo";
interface AppInfo { applicationInfo?: ApplicationInfo }

View File

@@ -19,8 +19,8 @@
import { AgentOptions } from "https";
import HttpClientException from "./httpClientException";
import ApiException from "../services/exception/apiException";
import { Config } from "../index";
import { IRequest } from "../typings/requestOptions";
import {Config} from "../index";
import {IRequest} from "../typings/requestOptions";
interface ClientInterface {
request(

View File

@@ -17,7 +17,7 @@
* See the LICENSE file for more info.
*/
import { IncomingHttpHeaders } from "http";
import {IncomingHttpHeaders} from "http";
interface ExceptionInterface {
message: string;
@@ -38,10 +38,10 @@ class HttpClientException implements Error {
public constructor(props: ExceptionInterface) {
this.name = "HttpClientException";
this.message = props.message;
if (props.responseHeaders) this.responseHeaders = props.responseHeaders;
if (props.responseBody) this.responseBody = props.responseBody;
if (props.errorCode) this.errorCode = props.errorCode;
if (props.statusCode) this.statusCode = props.statusCode;
if(props.responseHeaders) this.responseHeaders = props.responseHeaders;
if(props.responseBody) this.responseBody = props.responseBody;
if(props.errorCode) this.errorCode = props.errorCode;
if(props.statusCode) this.statusCode = props.statusCode;
}
}

View File

@@ -17,21 +17,21 @@
* See the LICENSE file for more info.
*/
import { ClientRequest, IncomingHttpHeaders, IncomingMessage } from "http";
import { Agent, AgentOptions, request as httpsRequest } from "https";
import { HttpsProxyAgent } from "https-proxy-agent";
import {ClientRequest, IncomingHttpHeaders, IncomingMessage} from "http";
import {Agent, AgentOptions, request as httpsRequest} from "https";
import {HttpsProxyAgent} from "https-proxy-agent";
import * as fs from "fs";
import { URL, URLSearchParams } from "url";
import {URL} from "url";
import Client from "../client";
import Config from "../config";
import HttpClientException from "./httpClientException";
import checkServerIdentity from "../helpers/checkServerIdentity";
import { ApiError } from "../typings/apiError";
import {ApiError} from "../typings/apiError";
import ApiException from "../services/exception/apiException";
import ClientInterface from "./clientInterface";
import { ApiConstants } from "../constants/apiConstants";
import { IRequest } from "../typings/requestOptions";
import {ApiConstants} from "../constants/apiConstants";
import {IRequest} from "../typings/requestOptions";
class HttpURLConnectionClient implements ClientInterface {
private static CHARSET = "utf-8";
@@ -87,10 +87,6 @@ class HttpURLConnectionClient implements ClientInterface {
requestOptions.port = url.port;
requestOptions.path = url.pathname;
if (requestOptions.params) {
requestOptions.path += "?" + new URLSearchParams(requestOptions.params).toString();
}
if (requestOptions && requestOptions.idempotencyKey) {
requestOptions.headers[ApiConstants.IDEMPOTENCY_KEY] = requestOptions.idempotencyKey;
delete requestOptions.idempotencyKey;
@@ -104,11 +100,7 @@ class HttpURLConnectionClient implements ClientInterface {
}
requestOptions.headers["Cache-Control"] = "no-cache";
if (!requestOptions.method) {
requestOptions.method = ApiConstants.METHOD_POST;
}
requestOptions.method = ApiConstants.METHOD_POST;
requestOptions.headers[ApiConstants.ACCEPT_CHARSET] = HttpURLConnectionClient.CHARSET;
requestOptions.headers[ApiConstants.USER_AGENT] = `${applicationName} ${Client.LIB_NAME}/${Client.LIB_VERSION}`;
@@ -200,8 +192,7 @@ class HttpURLConnectionClient implements ClientInterface {
};
} catch (e) {
const message = e instanceof Error ? e.message: "undefined";
return Promise.reject(new HttpClientException({ message: `Error loading certificate from path: ${message}` }));
return Promise.reject(new HttpClientException({ message: `Error loading certificate from path: ${e.message}` }));
}
}

View File

@@ -12,7 +12,7 @@
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2021 Adyen B.V.
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
@@ -24,5 +24,3 @@ export { default as Config } from "./config";
export * from "./services/";
export { hmacValidator } from "./utils";
export { default as HttpURLConnectionClient } from "./httpClient/httpURLConnectionClient";
export * as Types from "./typings";

View File

@@ -30,16 +30,16 @@ class NotificationRequest {
this.live = notification.live;
}
public get notificationItems(): NotificationRequestItem[] | undefined {
public get notificationItems(): Array<NotificationRequestItem> | undefined {
if (!this.notificationItemContainers) {
return undefined;
}
return this.notificationItemContainers.map((container): NotificationRequestItem => container.NotificationRequestItem);
return this.notificationItemContainers.map((container): NotificationRequestItem => container.notificationRequestItem);
}
public live: string;
public notificationItemContainers: NotificationItem[];
public notificationItemContainers: Array<NotificationItem>;
}
export default NotificationRequest;

View File

@@ -12,12 +12,12 @@
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2021 Adyen B.V.
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import { Cipher, createCipheriv, createDecipheriv, createHmac, randomBytes, timingSafeEqual } from "crypto";
import {Cipher, createCipheriv, createDecipheriv, createHmac, randomBytes} from "crypto";
import NexoCryptoException from "../services/exception/nexoCryptoException";
import {
MessageHeader,
@@ -28,7 +28,7 @@ import {
} from "../typings/terminal/models";
import InvalidSecurityKeyException from "./exception/invalidSecurityKeyException";
import NexoDerivedKeyGenerator from "./nexoDerivedKeyGenerator";
import { NexoEnum } from "../constants/nexoConstants";
import {NexoEnum} from "../constants/nexoConstants";
enum Modes {
ENCRYPT,
@@ -41,48 +41,48 @@ class NexoCrypto {
saleToPoiMessageJson: string,
securityKey: SecurityKey,
): SaleToPOISecuredMessage {
const derivedKey: NexoDerivedKey = NexoDerivedKeyGenerator.deriveKeyMaterial(securityKey.Passphrase);
const saleToPoiMessageByteArray = Buffer.from(saleToPoiMessageJson, "utf-8");
const derivedKey: NexoDerivedKey = NexoDerivedKeyGenerator.deriveKeyMaterial(securityKey.passphrase);
const saleToPoiMessageByteArray = Buffer.from(saleToPoiMessageJson, "ascii");
const ivNonce = NexoCrypto.generateRandomIvNonce();
const encryptedSaleToPoiMessage = NexoCrypto.crypt(saleToPoiMessageByteArray, derivedKey, ivNonce, Modes.ENCRYPT);
const encryptedSaleToPoiMessageHmac = NexoCrypto.hmac(saleToPoiMessageByteArray, derivedKey);
const securityTrailer: SecurityTrailer = {
AdyenCryptoVersion: securityKey.AdyenCryptoVersion,
Hmac: encryptedSaleToPoiMessageHmac.toString("base64"),
KeyIdentifier: securityKey.KeyIdentifier,
KeyVersion: securityKey.KeyVersion,
Nonce: ivNonce.toString("base64"),
adyenCryptoVersion: securityKey.adyenCryptoVersion,
hmac: encryptedSaleToPoiMessageHmac.toString("base64"),
keyIdentifier: securityKey.keyIdentifier,
keyVersion: securityKey.keyVersion,
nonce: ivNonce.toString("base64"),
};
return {
MessageHeader: messageHeader,
NexoBlob: encryptedSaleToPoiMessage.toString("base64"),
SecurityTrailer: securityTrailer,
messageHeader,
nexoBlob: encryptedSaleToPoiMessage.toString("base64"),
securityTrailer: securityTrailer,
};
}
public decrypt(saleToPoiSecureMessage: SaleToPOISecuredMessage, securityKey: SecurityKey): string {
NexoCrypto.validateSecurityKey(securityKey);
const encryptedSaleToPoiMessageByteArray = Buffer.from(saleToPoiSecureMessage.NexoBlob, "base64");
const derivedKey = NexoDerivedKeyGenerator.deriveKeyMaterial(securityKey.Passphrase);
const ivNonce = Buffer.from(saleToPoiSecureMessage.SecurityTrailer.Nonce, "base64");
const encryptedSaleToPoiMessageByteArray = Buffer.from(saleToPoiSecureMessage.nexoBlob, "base64");
const derivedKey = NexoDerivedKeyGenerator.deriveKeyMaterial(securityKey.passphrase);
const ivNonce = Buffer.from(saleToPoiSecureMessage.securityTrailer.nonce, "base64");
const decryptedSaleToPoiMessageByteArray =
NexoCrypto.crypt(encryptedSaleToPoiMessageByteArray, derivedKey, ivNonce, Modes.DECRYPT);
const receivedHmac = Buffer.from(saleToPoiSecureMessage.SecurityTrailer.Hmac, "base64");
const receivedHmac = Buffer.from(saleToPoiSecureMessage.securityTrailer.hmac, "base64");
this.validateHmac(receivedHmac, decryptedSaleToPoiMessageByteArray, derivedKey);
return decryptedSaleToPoiMessageByteArray.toString("utf-8");
return decryptedSaleToPoiMessageByteArray.toString("ascii");
}
private static validateSecurityKey(securityKey: SecurityKey): void {
const isValid = securityKey
&& securityKey.Passphrase
&& securityKey.KeyIdentifier
&& !isNaN(securityKey.KeyVersion)
&& !isNaN(securityKey.AdyenCryptoVersion);
&& securityKey.passphrase
&& securityKey.keyIdentifier
&& !isNaN(securityKey.keyVersion)
&& !isNaN(securityKey.adyenCryptoVersion);
if (!isValid) {
throw new InvalidSecurityKeyException("Invalid Security Key");
}
@@ -115,7 +115,9 @@ class NexoCrypto {
private validateHmac(receivedHmac: Buffer, decryptedMessage: Buffer, derivedKey: NexoDerivedKey): void {
const hmac = NexoCrypto.hmac(decryptedMessage, derivedKey);
if (!timingSafeEqual(hmac, receivedHmac)) {
const isValid = hmac.every((item, index): boolean => item === receivedHmac[index]);
if (!isValid) {
throw new NexoCryptoException("Hmac validation failed");
}
}

View File

@@ -17,9 +17,9 @@
* See the LICENSE file for more info.
*/
import { pbkdf2Sync } from "crypto";
import {pbkdf2Sync} from "crypto";
import { NexoDerivedKey } from "../typings/terminal/models";
import { NexoEnum } from "../constants/nexoConstants";
import {NexoEnum} from "../constants/nexoConstants";
class NexoDerivedKeyGenerator {
public static deriveKeyMaterial(passphrase: string): NexoDerivedKey {

View File

@@ -1,52 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { AccountHolder, AccountHolderInfo, ObjectSerializer, PaginatedBalanceAccountsResponse } from "../../typings/balancePlatform/models";
import { IRequest } from "../../typings/requestOptions";
import BalancePlatformResource from "../resource/balancePlaftformResource";
// @TODO PW-7013: make this change at the spec level?
export type AccountHolderUpdate = Omit<AccountHolder, "id">;
class AccountHolders extends Service {
public async create(request: AccountHolderInfo): Promise<AccountHolder> {
const resource = new BalancePlatformResource(this, "/accountHolders");
const response = await getJsonResponse<AccountHolderInfo, AccountHolder>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "AccountHolder");
}
public async retrieve(id: string): Promise<AccountHolder> {
const resource = new BalancePlatformResource(this, `/accountHolders/${id}`);
const response = await getJsonResponse<string, AccountHolder>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "AccountHolder");
}
public async update(id: string, request: AccountHolderUpdate): Promise<AccountHolder> {
const resource = new BalancePlatformResource(this, `/accountHolders/${id}`);
const response = await getJsonResponse<AccountHolderUpdate, AccountHolder>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "AccountHolder");
}
public async listBalanceAccounts(id: string, requestOptions?: IRequest.Options): Promise<PaginatedBalanceAccountsResponse> {
const resource = new BalancePlatformResource(this, `/accountHolders/${id}/balanceAccounts`);
const response = await getJsonResponse<string, PaginatedBalanceAccountsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "PaginatedBalanceAccountsResponse");
}
}
export default AccountHolders;

View File

@@ -1,103 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { BalanceAccount, BalanceAccountInfo, BalanceAccountUpdateRequest, BalanceSweepConfigurationsResponse, ObjectSerializer, PaginatedPaymentInstrumentsResponse, SweepConfigurationV2 } from "../../typings/balancePlatform/models";
import { IRequest } from "../../typings/requestOptions";
import BalancePlatformResource from "../resource/balancePlaftformResource";
// @TODO PW-7013: make this change at the spec level?
export type SweepConfigurationV2Create = Omit<SweepConfigurationV2, "id">;
export type SweepConfigurationV2Update = Partial<SweepConfigurationV2>;
class BalanceAccounts extends Service {
public async create(request: BalanceAccountInfo): Promise<BalanceAccount> {
const resource = new BalancePlatformResource(this, "/balanceAccounts");
const response = await getJsonResponse<BalanceAccountInfo, BalanceAccount>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "BalanceAccount");
}
public async listSweeps(balanceAccountId: string, requestOptions?: IRequest.Options): Promise<BalanceSweepConfigurationsResponse> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${balanceAccountId}/sweeps`);
const response = await getJsonResponse<string, BalanceSweepConfigurationsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "BalanceSweepConfigurationsResponse");
}
public async createSweep(balanceAccountId: string, request: SweepConfigurationV2Create): Promise<SweepConfigurationV2> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${balanceAccountId}/sweeps`);
const response = await getJsonResponse<SweepConfigurationV2Create, SweepConfigurationV2>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "SweepConfigurationV2");
}
public async deleteSweep(balanceAccountId: string, sweepId: string): Promise<void> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${balanceAccountId}/sweeps/${sweepId}`);
await getJsonResponse<string, string>(
resource,
"",
{ method: "DELETE" }
);
}
public async retrieveSweep(balanceAccountId: string, sweepId: string): Promise<SweepConfigurationV2> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${balanceAccountId}/sweeps/${sweepId}`);
const response = await getJsonResponse<string, SweepConfigurationV2>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "SweepConfigurationV2");
}
public async updateSweep(balanceAccountId: string, sweepId: string, request: SweepConfigurationV2Update): Promise<SweepConfigurationV2> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${balanceAccountId}/sweeps/${sweepId}`);
const response = await getJsonResponse<SweepConfigurationV2Update, SweepConfigurationV2>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "SweepConfigurationV2");
}
public async retrieve(id: string): Promise<BalanceAccount> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${id}`);
const response = await getJsonResponse<string, BalanceAccount>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "BalanceAccount");
}
public async update(id: string, request: BalanceAccountUpdateRequest): Promise<BalanceAccount> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${id}`);
const response = await getJsonResponse<BalanceAccountUpdateRequest, BalanceAccount>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "BalanceAccount");
}
public async listPaymentInstruments(id: string, requestOptions?: IRequest.Options): Promise<PaginatedPaymentInstrumentsResponse> {
const resource = new BalancePlatformResource(this, `/balanceAccounts/${id}/paymentInstruments`);
const response = await getJsonResponse<string, PaginatedPaymentInstrumentsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "PaginatedPaymentInstrumentsResponse");
}
}
export default BalanceAccounts;

View File

@@ -1,29 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { BalancePlatform, ObjectSerializer, PaginatedAccountHoldersResponse } from "../../typings/balancePlatform/models";
import { IRequest } from "../../typings/requestOptions";
import BalancePlatformResource from "../resource/balancePlaftformResource";
class General extends Service {
public async retrieve(id: string): Promise<BalancePlatform> {
const resource = new BalancePlatformResource(this, `/balancePlatforms/${id}`);
const response = await getJsonResponse<string, BalancePlatform>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "BalancePlatform");
}
public async listAccountHolders(id: string, requestOptions?: IRequest.Options): Promise<PaginatedAccountHoldersResponse> {
const resource = new BalancePlatformResource(this, `/balancePlatforms/${id}/accountHolders`);
const response = await getJsonResponse<string, PaginatedAccountHoldersResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "PaginatedAccountHoldersResponse");
}
}
export default General;

View File

@@ -1,39 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { ObjectSerializer, PaymentInstrumentGroup, PaymentInstrumentGroupInfo, TransactionRulesResponse } from "../../typings/balancePlatform/models";
import BalancePlatformResource from "../resource/balancePlaftformResource";
class PaymentInstrumentGroups extends Service {
public async create(request: PaymentInstrumentGroupInfo): Promise<PaymentInstrumentGroup> {
const resource = new BalancePlatformResource(this, "/paymentInstrumentGroups");
const response = await getJsonResponse<PaymentInstrumentGroupInfo, PaymentInstrumentGroup>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "PaymentInstrumentGroup");
}
public async retrieve(id: string): Promise<PaymentInstrumentGroup> {
const resource = new BalancePlatformResource(this, `/paymentInstrumentGroups/${id}`);
const response = await getJsonResponse<string, PaymentInstrumentGroup>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "PaymentInstrumentGroup");
}
public async listTransactionRules(id: string): Promise<TransactionRulesResponse> {
const resource = new BalancePlatformResource(this, `/paymentInstrumentGroups/${id}/transactionRules`);
const response = await getJsonResponse<string, TransactionRulesResponse>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "TransactionRulesResponse");
}
}
export default PaymentInstrumentGroups;

View File

@@ -1,48 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { ObjectSerializer, PaymentInstrument, PaymentInstrumentInfo, PaymentInstrumentUpdateRequest, TransactionRulesResponse } from "../../typings/balancePlatform/models";
import BalancePlatformResource from "../resource/balancePlaftformResource";
class PaymentInstruments extends Service {
public async create(request: PaymentInstrumentInfo): Promise<PaymentInstrument> {
const resource = new BalancePlatformResource(this, "/paymentInstruments");
const response = await getJsonResponse<PaymentInstrumentInfo, PaymentInstrument>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "PaymentInstrument");
}
public async retrieve(id: string): Promise<PaymentInstrument> {
const resource = new BalancePlatformResource(this, `/paymentInstruments/${id}`);
const response = await getJsonResponse<string, PaymentInstrument>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "PaymentInstrument");
}
public async update(id: string, request: PaymentInstrumentUpdateRequest): Promise<PaymentInstrument> {
const resource = new BalancePlatformResource(this, `/paymentInstruments/${id}`);
const response = await getJsonResponse<PaymentInstrumentUpdateRequest, PaymentInstrument>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "PaymentInstrument");
}
public async listTransactionRules(id: string): Promise<TransactionRulesResponse> {
const resource = new BalancePlatformResource(this, `/paymentInstruments/${id}/transactionRules`);
const response = await getJsonResponse<string, TransactionRulesResponse>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "TransactionRulesResponse");
}
}
export default PaymentInstruments;

View File

@@ -1,50 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { ObjectSerializer, TransactionRule, TransactionRuleInfo, TransactionRuleResponse } from "../../typings/balancePlatform/models";
import BalancePlatformResource from "../resource/balancePlaftformResource";
// @TODO PW-7013: make this change at the spec level?
export type TransactionRuleInfoUpdate = Partial<TransactionRuleInfo>;
class TransactionRules extends Service {
public async create(request: TransactionRuleInfo): Promise<TransactionRule> {
const resource = new BalancePlatformResource(this, "/transactionRules");
const response = await getJsonResponse<TransactionRuleInfo, TransactionRule>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "TransactionRule");
}
public async retrieve(transactionRuleId: string): Promise<TransactionRuleResponse> {
const resource = new BalancePlatformResource(this, `/transactionRules/${transactionRuleId}`);
const response = await getJsonResponse<string, TransactionRuleResponse>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "TransactionRuleResponse");
}
public async update(transactionRuleId: string, request: TransactionRuleInfoUpdate): Promise<TransactionRule> {
const resource = new BalancePlatformResource(this, `/transactionRules/${transactionRuleId}`);
const response = await getJsonResponse<TransactionRuleInfoUpdate, TransactionRule>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "TransactionRule");
}
public async delete(transactionRuleId: string): Promise<TransactionRule> {
const resource = new BalancePlatformResource(this, `/transactionRules/${transactionRuleId}`);
const response = await getJsonResponse<string, TransactionRule>(
resource,
"",
{ method: "DELETE" }
);
return ObjectSerializer.deserialize(response, "TransactionRule");
}
}
export default TransactionRules;

View File

@@ -1,40 +0,0 @@
import Service from "../service";
import Client from "../client";
import AccountHolders from "./balancePlaftform/accountHolders";
import BalanceAccounts from "./balancePlaftform/balanceAccounts";
import General from "./balancePlaftform/general";
import PaymentInstruments from "./balancePlaftform/paymentInstruments";
import PaymentInstrumentGroups from "./balancePlaftform/paymentInstrumentGroups";
import TransactionRules from "./balancePlaftform/transactionRules";
class BalancePlatform extends Service {
public constructor(client: Client) {
super(client);
}
public get General() {
return new General(this.client);
}
public get AccountHolders() {
return new AccountHolders(this.client);
}
public get BalanceAccounts() {
return new BalanceAccounts(this.client);
}
public get PaymentInstruments() {
return new PaymentInstruments(this.client);
}
public get PaymentInstrumentGroups() {
return new PaymentInstrumentGroups(this.client);
}
public get TransactionRules() {
return new TransactionRules(this.client);
}
}
export default BalancePlatform;

View File

@@ -1,14 +1,26 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import ApiKeyAuthenticatedService from "../apiKeyAuthenticatedService";
import Client from "../client";
import GetCostEstimate from "./resource/binLookup/getCostEstimate";
import Get3dsAvailability from "./resource/binLookup/get3dsAvailability";
import getJsonResponse from "../helpers/getJsonResponse";
import {
ThreeDSAvailabilityRequest,
ThreeDSAvailabilityResponse,
CostEstimateRequest,
CostEstimateResponse,
} from "../typings/binlookup/models";
class BinLookup extends ApiKeyAuthenticatedService {
private readonly _get3dsAvailability: Get3dsAvailability;
@@ -20,15 +32,15 @@ class BinLookup extends ApiKeyAuthenticatedService {
this._getCostEstimate = new GetCostEstimate(this);
}
public get3dsAvailability(request: ThreeDSAvailabilityRequest): Promise<ThreeDSAvailabilityResponse> {
return getJsonResponse<ThreeDSAvailabilityRequest, ThreeDSAvailabilityResponse>(
public get3dsAvailability(request: IBinLookup.ThreeDSAvailabilityRequest): Promise<IBinLookup.ThreeDSAvailabilityResponse> {
return getJsonResponse<IBinLookup.ThreeDSAvailabilityRequest, IBinLookup.ThreeDSAvailabilityResponse>(
this._get3dsAvailability,
request
);
}
public getCostEstimate(request: CostEstimateRequest): Promise<CostEstimateResponse> {
return getJsonResponse<CostEstimateRequest, CostEstimateResponse>(
public getCostEstimate(request: IBinLookup.CostEstimateRequest): Promise<IBinLookup.CostEstimateResponse> {
return getJsonResponse<IBinLookup.CostEstimateRequest, IBinLookup.CostEstimateResponse>(
this._getCostEstimate,
request
);

View File

@@ -1,3 +1,22 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import ApiKeyAuthenticatedService from "../apiKeyAuthenticatedService";
import Client from "../client";
import getJsonResponse from "../helpers/getJsonResponse";
@@ -7,63 +26,8 @@ import PaymentsDetails from "./resource/checkout/paymentsDetails";
import PaymentSession from "./resource/checkout/paymentSession";
import PaymentsResult from "./resource/checkout/paymentsResult";
import PaymentLinks from "./resource/checkout/paymentLinks";
import OriginKeys from "./resource/checkout/originKeys";
import setApplicationInfo from "../helpers/setApplicationInfo";
import AmountUpdates from "./resource/checkout/amountUpdates";
import Cancels from "./resource/checkout/cancels";
import Captures from "./resource/checkout/captures";
import Refunds from "./resource/checkout/refunds";
import Reversals from "./resource/checkout/reversals";
import CancelsStandalone from "./resource/checkout/cancelsStandalone";
import { IRequest } from "../typings/requestOptions";
import {
PaymentRequest,
PaymentResponse,
PaymentMethodsRequest,
PaymentMethodsResponse,
PaymentLinkResponse,
CreatePaymentLinkRequest,
DetailsRequest,
PaymentSetupRequest,
PaymentSetupResponse,
PaymentVerificationRequest,
PaymentVerificationResponse,
CheckoutUtilityRequest,
CheckoutUtilityResponse,
CheckoutBalanceCheckRequest,
CheckoutBalanceCheckResponse,
CheckoutCreateOrderRequest,
CheckoutCreateOrderResponse,
CheckoutCancelOrderRequest,
CheckoutCancelOrderResponse,
CreateCheckoutSessionRequest,
CreateCheckoutSessionResponse,
PaymentDonationRequest,
DonationResponse,
CardDetailsRequest,
CardDetailsResponse,
CreatePaymentAmountUpdateRequest,
CreatePaymentCancelRequest,
CreatePaymentCaptureRequest,
CreatePaymentRefundRequest,
CreatePaymentReversalRequest,
CreateStandalonePaymentCancelRequest,
PaymentAmountUpdateResource,
PaymentCancelResource,
PaymentCaptureResource,
PaymentRefundResource,
PaymentReversalResource,
StandalonePaymentCancelResource,
ObjectSerializer
} from "../typings/checkout/models";
import PaymentLinksId from "./resource/checkout/paymentLinksId";
import PaymentMethodsBalance from "./resource/checkout/paymentMethodsBalance";
import Orders from "./resource/checkout/orders";
import OrdersCancel from "./resource/checkout/ordersCancel";
import Sessions from "./resource/checkout/sessions";
import Donations from "./resource/checkout/donations";
import CardDetails from "./resource/checkout/cardDetails";
import {IRequest} from "../typings/requestOptions";
class Checkout extends ApiKeyAuthenticatedService {
private readonly _payments: Payments;
@@ -72,13 +36,6 @@ class Checkout extends ApiKeyAuthenticatedService {
private readonly _paymentSession: PaymentSession;
private readonly _paymentsResult: PaymentsResult;
private readonly _paymentLinks: PaymentLinks;
private readonly _originKeys: OriginKeys;
private readonly _paymentMethodsBalance: PaymentMethodsBalance;
private readonly _orders: Orders;
private readonly _ordersCancel: OrdersCancel;
private readonly _sessions: Sessions;
private readonly _donations: Donations;
private readonly _cardDetails: CardDetails;
public constructor(client: Client) {
super(client);
@@ -88,248 +45,54 @@ class Checkout extends ApiKeyAuthenticatedService {
this._paymentSession = new PaymentSession(this);
this._paymentsResult = new PaymentsResult(this);
this._paymentLinks = new PaymentLinks(this);
this._originKeys = new OriginKeys(this);
this._paymentMethodsBalance = new PaymentMethodsBalance(this);
this._orders = new Orders(this);
this._ordersCancel = new OrdersCancel(this);
this._sessions = new Sessions(this);
this._donations = new Donations(this);
this._cardDetails = new CardDetails(this);
}
// Payments
public async sessions(checkoutSessionRequest: CreateCheckoutSessionRequest, requestOptions?: IRequest.Options): Promise<CreateCheckoutSessionResponse> {
const response = await getJsonResponse<CreateCheckoutSessionRequest, CreateCheckoutSessionResponse>(
this._sessions,
checkoutSessionRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "CreateCheckoutSessionResponse");
}
public async paymentMethods(paymentMethodsRequest: PaymentMethodsRequest, requestOptions?: IRequest.Options): Promise<PaymentMethodsResponse> {
const response = await getJsonResponse<PaymentMethodsRequest, PaymentMethodsResponse>(
this._paymentMethods,
paymentMethodsRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "PaymentMethodsResponse");
}
public async payments(paymentsRequest: PaymentRequest, requestOptions?: IRequest.Options): Promise<PaymentResponse> {
const response = await getJsonResponse<PaymentRequest, PaymentResponse>(
public payments(paymentsRequest: ICheckout.PaymentRequest, requestOptions?: IRequest.Options): Promise<ICheckout.PaymentResponse> {
return getJsonResponse<ICheckout.PaymentRequest, ICheckout.PaymentResponse>(
this._payments,
setApplicationInfo(paymentsRequest),
requestOptions,
);
return ObjectSerializer.deserialize(response, "PaymentResponse");
}
public async paymentsDetails(paymentsDetailsRequest: DetailsRequest, requestOptions?: IRequest.Options): Promise<PaymentResponse> {
const response = await getJsonResponse<DetailsRequest, PaymentResponse>(
public paymentMethods(paymentMethodsRequest: ICheckout.PaymentMethodsRequest): Promise<ICheckout.PaymentMethodsResponse> {
return getJsonResponse<ICheckout.PaymentMethodsRequest, ICheckout.PaymentMethodsResponse>(
this._paymentMethods,
paymentMethodsRequest,
);
}
public paymentLinks(paymentLinkRequest: ICheckout.CreatePaymentLinkRequest): Promise<ICheckout.CreatePaymentLinkResponse> {
return getJsonResponse<ICheckout.CreatePaymentLinkRequest, ICheckout.CreatePaymentLinkResponse>(
this._paymentLinks,
paymentLinkRequest
);
}
public paymentsDetails(paymentsDetailsRequest: ICheckout.DetailsRequest, requestOptions?: IRequest.Options): Promise<ICheckout.PaymentResponse> {
return getJsonResponse<ICheckout.DetailsRequest, ICheckout.PaymentResponse>(
this._paymentsDetails,
paymentsDetailsRequest,
requestOptions,
requestOptions
);
return ObjectSerializer.deserialize(response, "PaymentResponse");
}
public async donations(donationRequest: PaymentDonationRequest, requestOptions?: IRequest.Options): Promise<DonationResponse> {
const response = await getJsonResponse<PaymentDonationRequest, DonationResponse>(
this._donations,
donationRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "DonationResponse");
}
public async cardDetails(cardDetailsRequest: CardDetailsRequest, requestOptions?: IRequest.Options): Promise<CardDetailsResponse> {
const response = await getJsonResponse<CardDetailsRequest, CardDetailsResponse>(
this._cardDetails,
cardDetailsRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "CardDetailsResponse");
}
// Payment Links
public async paymentLinks(paymentLinkRequest: CreatePaymentLinkRequest, requestOptions?: IRequest.Options): Promise<PaymentLinkResponse> {
const response = await getJsonResponse<CreatePaymentLinkRequest, PaymentLinkResponse>(
this._paymentLinks,
paymentLinkRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "PaymentLinkResponse");
}
public async getPaymentLinks(linkId: string, requestOptions?: IRequest.Options): Promise<PaymentLinkResponse> {
const paymentLinksId = new PaymentLinksId(this, linkId);
const response = await getJsonResponse<Record<string, never>, PaymentLinkResponse>(
paymentLinksId,
{},
{...{ method: "GET" }, ...requestOptions},
);
return ObjectSerializer.deserialize(response, "PaymentLinkResponse");
}
public async updatePaymentLinks(linkId: string, status: "expired", requestOptions?: IRequest.Options): Promise<PaymentLinkResponse> {
const paymentLinksId = new PaymentLinksId(this, linkId);
const response = await getJsonResponse<Record<string, unknown>, PaymentLinkResponse>(
paymentLinksId,
{ status },
{...{ method: "PATCH" }, ...requestOptions},
);
return ObjectSerializer.deserialize(response, "PaymentLinkResponse");
}
// Modifications
public async amountUpdates(
paymentPspReference: string,
amountUpdatesRequest: CreatePaymentAmountUpdateRequest,
public paymentSession(
paymentSessionRequest: ICheckout.PaymentSetupRequest,
requestOptions?: IRequest.Options,
): Promise<PaymentAmountUpdateResource> {
const amountUpdates = new AmountUpdates(this, paymentPspReference);
const response = await getJsonResponse<CreatePaymentAmountUpdateRequest, PaymentAmountUpdateResource>(
amountUpdates,
amountUpdatesRequest,
requestOptions
);
return ObjectSerializer.deserialize(response, "PaymentAmountUpdateResource");
}
public async cancelsStandalone(
cancelsStandaloneRequest: CreateStandalonePaymentCancelRequest,
requestOptions?: IRequest.Options
): Promise<StandalonePaymentCancelResource> {
const cancelsStandalone = new CancelsStandalone(this);
const response = await getJsonResponse<CreateStandalonePaymentCancelRequest, StandalonePaymentCancelResource>(
cancelsStandalone,
cancelsStandaloneRequest,
requestOptions
);
return ObjectSerializer.deserialize(response, "StandalonePaymentCancelResource");
}
public async cancels(
paymentPspReference: string,
cancelsRequest: CreatePaymentCancelRequest,
requestOptions?: IRequest.Options,
): Promise<PaymentCancelResource> {
const cancels = new Cancels(this, paymentPspReference);
const response = await getJsonResponse<CreatePaymentCancelRequest, PaymentCancelResource>(
cancels,
cancelsRequest,
requestOptions
);
return ObjectSerializer.deserialize(response, "PaymentCancelResource");
}
public async captures(
paymentPspReference: string,
capturesRequest: CreatePaymentCaptureRequest,
requestOptions?: IRequest.Options
): Promise<PaymentCaptureResource> {
const captures = new Captures(this, paymentPspReference);
const response = await getJsonResponse<CreatePaymentCaptureRequest, PaymentCaptureResource>(
captures,
capturesRequest,
requestOptions
);
return ObjectSerializer.deserialize(response, "PaymentCaptureResource");
}
public async refunds(
paymentPspReference: string,
refundsRequest: CreatePaymentRefundRequest,
requestOptions?: IRequest.Options
): Promise<PaymentRefundResource> {
const refunds = new Refunds(this, paymentPspReference);
const response = await getJsonResponse<CreatePaymentRefundRequest, PaymentRefundResource>(
refunds,
refundsRequest,
requestOptions
);
return ObjectSerializer.deserialize(response, "PaymentRefundResource");
}
public async reversals(
paymentPspReference: string,
reversalsRequest: CreatePaymentReversalRequest,
requestOptions?: IRequest.Options
): Promise<PaymentReversalResource> {
const refunds = new Reversals(this, paymentPspReference);
const response = await getJsonResponse<CreatePaymentReversalRequest, PaymentReversalResource>(
refunds,
reversalsRequest,
requestOptions
);
return ObjectSerializer.deserialize(response, "PaymentReversalResource");
}
// Orders
public async paymentMethodsBalance(paymentMethodsBalanceRequest: CheckoutBalanceCheckRequest, requestOptions?: IRequest.Options): Promise<CheckoutBalanceCheckResponse> {
const response = await getJsonResponse<CheckoutBalanceCheckRequest, CheckoutBalanceCheckResponse>(
this._paymentMethodsBalance,
paymentMethodsBalanceRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "CheckoutBalanceCheckResponse");
}
public async orders(ordersRequest: CheckoutCreateOrderRequest, requestOptions?: IRequest.Options): Promise<CheckoutCreateOrderResponse> {
const response = await getJsonResponse<CheckoutCreateOrderRequest, CheckoutCreateOrderResponse>(
this._orders,
ordersRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "CheckoutCreateOrderResponse");
}
public async ordersCancel(ordersCancelRequest: CheckoutCancelOrderRequest, requestOptions?: IRequest.Options): Promise<CheckoutCancelOrderResponse> {
const response = await getJsonResponse<CheckoutCancelOrderRequest, CheckoutCancelOrderResponse>(
this._ordersCancel,
ordersCancelRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "CheckoutCancelOrderResponse");
}
// Classic Checkout SDK
public async paymentSession(
paymentSessionRequest: PaymentSetupRequest,
requestOptions?: IRequest.Options,
): Promise<PaymentSetupResponse> {
const response = await getJsonResponse<PaymentSetupRequest, PaymentSetupResponse>(
): Promise<ICheckout.PaymentSetupResponse> {
return getJsonResponse<ICheckout.PaymentSetupRequest, ICheckout.PaymentSetupResponse>(
this._paymentSession,
paymentSessionRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "PaymentSetupResponse");
}
public async paymentResult(paymentResultRequest: PaymentVerificationRequest, requestOptions?: IRequest.Options): Promise<PaymentVerificationResponse> {
const response = await getJsonResponse<PaymentVerificationRequest, PaymentVerificationResponse>(
public paymentResult(paymentResultRequest: ICheckout.PaymentVerificationRequest): Promise<ICheckout.PaymentVerificationResponse> {
return getJsonResponse<ICheckout.PaymentVerificationRequest, ICheckout.PaymentVerificationResponse>(
this._paymentsResult,
paymentResultRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "PaymentVerificationResponse");
}
//Utility
public async originKeys(originKeysRequest: CheckoutUtilityRequest, requestOptions?: IRequest.Options): Promise<CheckoutUtilityResponse> {
const response = await getJsonResponse<CheckoutUtilityRequest, CheckoutUtilityResponse>(
this._originKeys,
originKeysRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "CheckoutUtilityResponse");
}
}

View File

@@ -0,0 +1,41 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
import ApiKeyAuthenticatedService from "../apiKeyAuthenticatedService";
import Client from "../client";
import getJsonResponse from "../helpers/getJsonResponse";
import OriginKeys from "./resource/checkoutUtility/originKeys";
class CheckoutUtility extends ApiKeyAuthenticatedService {
private readonly _originKeys: OriginKeys;
public constructor(client: Client) {
super(client);
this._originKeys = new OriginKeys(this);
}
public originKeys(originKeysRequest: ICheckoutUtility.CheckoutUtilityRequest): Promise<ICheckoutUtility.CheckoutUtilityResponse> {
return getJsonResponse<ICheckoutUtility.CheckoutUtilityRequest, ICheckoutUtility.CheckoutUtilityResponse>(
this._originKeys,
originKeysRequest,
);
}
}
export default CheckoutUtility;

View File

@@ -1,171 +0,0 @@
import ApiKeyAuthenticatedService from "../apiKeyAuthenticatedService";
import Client from "../client";
import getJsonResponse from "../helpers/getJsonResponse";
import Authorise from "./resource/payment/authorise";
import Authorise3d from "./resource/payment/authorise3d";
import Authorise3ds2 from "./resource/payment/authorise3ds2";
import GetAuthenticationResult from "./resource/payment/getAuthenticationResult";
import Retrieve3ds2Result from "./resource/payment/retrieve3ds2Result";
import Capture from "./resource/payment/capture";
import Cancel from "./resource/payment/cancel";
import Refund from "./resource/payment/refund";
import CancelOrRefund from "./resource/payment/cancelOrRefund";
import TechnicalCancel from "./resource/payment/technicalCancel";
import AdjustAuthorisation from "./resource/payment/adjustAuthorisation";
import Donate from "./resource/payment/donate";
import VoidPendingRefund from "./resource/payment/voidPendingRefund";
import {
AdjustAuthorisationRequest,
AuthenticationResultRequest,
AuthenticationResultResponse,
CancelOrRefundRequest,
CancelRequest,
CaptureRequest,
DonationRequest,
ModificationResult,
PaymentRequest,
PaymentRequest3d,
PaymentRequest3ds2,
PaymentResult,
RefundRequest,
TechnicalCancelRequest,
ThreeDS2ResultRequest,
ThreeDS2ResultResponse,
VoidPendingRefundRequest,
} from "../typings/payments/models";
class ClassicIntegration extends ApiKeyAuthenticatedService {
private readonly _authorise;
private readonly _authorise3d;
private readonly _authorise3ds2;
private readonly _getAuthenticationResult;
private readonly _retrieve3ds2Result;
private readonly _capture;
private readonly _cancel;
private readonly _refund;
private readonly _cancelOrRefund;
private readonly _technicalCancel;
private readonly _adjustAuthorisation;
private readonly _donate;
private readonly _voidPendingRefund;
public constructor(client: Client) {
super(client);
this._authorise = new Authorise(this);
this._authorise3d = new Authorise3d(this);
this._authorise3ds2 = new Authorise3ds2(this);
this._getAuthenticationResult = new GetAuthenticationResult(this);
this._retrieve3ds2Result = new Retrieve3ds2Result(this);
this._capture = new Capture(this);
this._cancel = new Cancel(this);
this._refund = new Refund(this);
this._cancelOrRefund = new CancelOrRefund(this);
this._technicalCancel = new TechnicalCancel(this);
this._adjustAuthorisation = new AdjustAuthorisation(this);
this._donate = new Donate(this);
this._voidPendingRefund = new VoidPendingRefund(this);
}
// General
public authorise(paymentRequest: PaymentRequest): Promise<PaymentResult> {
return getJsonResponse<PaymentRequest, PaymentResult>(
this._authorise,
paymentRequest,
);
}
public authorise3d(paymentRequest3d: PaymentRequest3d): Promise<PaymentResult> {
return getJsonResponse<PaymentRequest3d, PaymentResult>(
this._authorise3d,
paymentRequest3d,
);
}
public authorise3ds2(paymentRequest3ds2: PaymentRequest3ds2): Promise<PaymentResult> {
return getJsonResponse<PaymentRequest3ds2, PaymentResult>(
this._authorise3ds2,
paymentRequest3ds2,
);
}
public getAuthenticationResult(authenticationResultRequest: AuthenticationResultRequest): Promise<AuthenticationResultResponse> {
return getJsonResponse<AuthenticationResultRequest, AuthenticationResultResponse>(
this._getAuthenticationResult,
authenticationResultRequest,
);
}
public retrieve3ds2Result(threeDs2ResultRequest: ThreeDS2ResultRequest): Promise<ThreeDS2ResultResponse> {
return getJsonResponse<ThreeDS2ResultRequest, ThreeDS2ResultResponse>(
this._retrieve3ds2Result,
threeDs2ResultRequest,
);
}
// Modifications
public capture(captureRequest: CaptureRequest): Promise<ModificationResult> {
return getJsonResponse<CaptureRequest, ModificationResult>(
this._capture,
captureRequest,
);
}
public cancel(cancelRequest: CancelRequest): Promise<ModificationResult> {
return getJsonResponse<CancelRequest, ModificationResult>(
this._cancel,
cancelRequest,
);
}
public refund(refundRequest: RefundRequest): Promise<ModificationResult> {
return getJsonResponse<RefundRequest, ModificationResult>(
this._refund,
refundRequest,
);
}
public cancelOrRefund(cancelOrRefundRequest: CancelOrRefundRequest): Promise<ModificationResult> {
return getJsonResponse<CancelOrRefundRequest, ModificationResult>(
this._cancelOrRefund,
cancelOrRefundRequest,
);
}
public technicalCancel(technicalCancelRequest: TechnicalCancelRequest): Promise<ModificationResult> {
return getJsonResponse<TechnicalCancelRequest, ModificationResult>(
this._technicalCancel,
technicalCancelRequest,
);
}
public adjustAuthorisation(adjustAuthorisationRequest: AdjustAuthorisationRequest): Promise<ModificationResult> {
return getJsonResponse<AdjustAuthorisationRequest, ModificationResult>(
this._adjustAuthorisation,
adjustAuthorisationRequest,
);
}
public donate(donationRequest: DonationRequest): Promise<ModificationResult> {
return getJsonResponse<DonationRequest, ModificationResult>(
this._donate,
donationRequest,
);
}
public voidPendingRefund(voidPendingRefundRequest: VoidPendingRefundRequest): Promise<ModificationResult> {
return getJsonResponse<VoidPendingRefundRequest, ModificationResult>(
this._voidPendingRefund,
voidPendingRefundRequest,
);
}
}
export default ClassicIntegration;

View File

@@ -1,25 +0,0 @@
import Client from "../client";
import getJsonResponse from "../helpers/getJsonResponse";
import Service from "../service";
import { SubjectErasureByPspReferenceRequest, SubjectErasureResponse, ObjectSerializer } from "../typings/dataProtection/models";
import DataProtectionResource from "./resource/dataProtectionresource";
import { IRequest } from "../typings/requestOptions";
class DataProtection extends Service {
private readonly _dataProtectionResource: DataProtectionResource;
public constructor(client: Client) {
super(client);
this._dataProtectionResource = new DataProtectionResource(this, "/requestSubjectErasure");
}
public async requestSubjectErasure(subjectErasureByPspReferenceRequest: SubjectErasureByPspReferenceRequest, requestOptions?: IRequest.Options): Promise<SubjectErasureResponse> {
const response = await getJsonResponse<SubjectErasureByPspReferenceRequest, SubjectErasureResponse>(
this._dataProtectionResource,
subjectErasureByPspReferenceRequest,
requestOptions,
);
return ObjectSerializer.deserialize(response, "SubjectErasureResponse");
}
}
export default DataProtection;

View File

@@ -1,15 +1,28 @@
/*
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
* Adyen NodeJS API Library
* Copyright (c) 2020 Adyen B.V.
* This file is open source and available under the MIT license.
* See the LICENSE file for more info.
*/
export { default as TerminalLocalAPI } from "./terminalLocalAPI";
export { default as TerminalCloudAPI } from "./terminalCloudAPI";
export { default as CheckoutAPI } from "./checkout";
export { default as ClassicIntegrationAPI } from "./classicIntegration";
export { default as CheckoutUtility } from "./checkoutUtility";
export { default as Recurring } from "./recurring";
export { default as Modification } from "./modification";
export { default as BinLookup } from "./binLookup";
export { default as Payout } from "./payout";
export { default as Platforms } from "./platforms";
export { default as StoredValue} from "./storedValue";
export { default as TerminalManagement} from "./terminalManagement";
export { default as Management } from "./management";
export { default as LegalEntityManagement } from "./legalEntityManagement";
export { default as Transfers } from "./transfers";
export { default as BalancePlatform } from "./balancePlatform";
export { default as DataProtection } from "./dataProtection";

View File

@@ -1,36 +0,0 @@
import Service from "../service";
import Client from "../client";
import LegalEntities from "./legalEntityManagement/legalEntities";
import OnboardingPage from "./legalEntityManagement/hostedOnboardingPage";
import TransferInstruments from "./legalEntityManagement/transferInstruments";
import BusinessLineService from "./legalEntityManagement/businessLineService";
import Documents from "./legalEntityManagement/documents";
class LegalEntityManagement extends Service {
public constructor(client: Client) {
super(client);
}
public get LegalEntities() {
return new LegalEntities(this.client);
}
public get TransferInstruments() {
return new TransferInstruments(this.client);
}
public get BusinessLineService() {
return new BusinessLineService(this.client);
}
public get Documents() {
return new Documents(this.client);
}
public get HostedOnboardingPage() {
return new OnboardingPage(this.client);
}
}
export default LegalEntityManagement;

View File

@@ -1,42 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import LegalEntityManagementResource from "../resource/legalEntityManagementResource";
import {
BusinessLine,
BusinessLineInfo, BusinessLineInfoUpdate,
ObjectSerializer
} from "../../typings/legalEntityManagement/models";
class BusinessLineService extends Service {
public async create(request: BusinessLineInfo): Promise<BusinessLine> {
const resource = new LegalEntityManagementResource(this, "/businessLines");
const response = await getJsonResponse<BusinessLineInfo, BusinessLine>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "BusinessLine");
}
public async retrieve(id: string): Promise<BusinessLine> {
const resource = new LegalEntityManagementResource(this, `/businessLines/${id}`);
const response = await getJsonResponse<string, BusinessLine>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "BusinessLine");
}
public async update(id: string, request: BusinessLineInfoUpdate): Promise<BusinessLine> {
const resource = new LegalEntityManagementResource(this, `/businessLines/${id}`);
const response = await getJsonResponse<BusinessLineInfoUpdate, BusinessLine>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "BusinessLine");
}
}
export default BusinessLineService;

View File

@@ -1,49 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import LegalEntityManagementResource from "../resource/legalEntityManagementResource";
import {Document, ObjectSerializer} from "../../typings/legalEntityManagement/models";
export type DocumentUpdate = Omit<Document, "id">
class Documents extends Service {
public async create(request: DocumentUpdate): Promise<Document> {
const resource = new LegalEntityManagementResource(this, "/documents");
const response = await getJsonResponse<DocumentUpdate, Document>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "Document");
}
public async retrieve(id: string): Promise<Document> {
const resource = new LegalEntityManagementResource(this, `/documents/${id}`);
const response = await getJsonResponse<string, Document>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "Document");
}
public async update(id: string, request: DocumentUpdate): Promise<Document> {
const resource = new LegalEntityManagementResource(this, `/documents/${id}`);
const response = await getJsonResponse<DocumentUpdate, Document>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "Document");
}
public async delete(id: string): Promise<void> {
const resource = new LegalEntityManagementResource(this, `/documents/${id}`);
await getJsonResponse<string, string>(
resource,
"",
{method: "DELETE" }
);
}
}
export default Documents;

View File

@@ -1,40 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import LegalEntityManagementResource from "../resource/legalEntityManagementResource";
import {OnboardingLinkInfo} from "../../typings/legalEntityManagement/onboardingLinkInfo";
import {OnboardingLink} from "../../typings/legalEntityManagement/onboardingLink";
import {ObjectSerializer, OnboardingTheme, OnboardingThemes} from "../../typings/legalEntityManagement/models";
class HostedOnboardingPage extends Service {
public async create(id: string, request: OnboardingLinkInfo): Promise<OnboardingLink> {
const resource = new LegalEntityManagementResource(this, `/legalEntities/${id}/onboardingLinks`);
const response = await getJsonResponse<OnboardingLinkInfo, OnboardingLink>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "OnboardingLink");
}
public async listThemes(): Promise<OnboardingThemes> {
const resource = new LegalEntityManagementResource(this, "/themes");
const response = await getJsonResponse<string, OnboardingThemes>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "OnboardingThemes");
}
public async retrieveTheme(id: string): Promise<OnboardingTheme> {
const resource = new LegalEntityManagementResource(this, `/themes/${id}`);
const response = await getJsonResponse<string, OnboardingTheme>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "OnboardingTheme");
}
}
export default HostedOnboardingPage;

View File

@@ -1,50 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import LegalEntityManagementResource from "../resource/legalEntityManagementResource";
import {LegalEntity} from "../../typings/legalEntityManagement/legalEntity";
import {LegalEntityInfo} from "../../typings/legalEntityManagement/legalEntityInfo";
import {BusinessLines, ObjectSerializer} from "../../typings/legalEntityManagement/models";
class LegalEntities extends Service {
public async create(request: LegalEntityInfo): Promise<LegalEntity> {
const resource = new LegalEntityManagementResource(this, "/legalEntities");
const response = await getJsonResponse<LegalEntityInfo, LegalEntity>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "LegalEntity");
}
public async retrieve(id: string): Promise<LegalEntity> {
const resource = new LegalEntityManagementResource(this, `/legalEntities/${id}`);
const response = await getJsonResponse<string, LegalEntity>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "LegalEntity");
}
public async update(id: string, request: LegalEntityInfo): Promise<LegalEntity> {
const resource = new LegalEntityManagementResource(this, `/legalEntities/${id}`);
const response = await getJsonResponse<LegalEntityInfo, LegalEntity>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "LegalEntity");
}
public async listBusinessLines(id: string): Promise<BusinessLines> {
const resource = new LegalEntityManagementResource(this, `/legalEntities/${id}/businessLines`);
const response = await getJsonResponse<string, BusinessLines>(
resource,
"",
{method: "GET" }
);
return ObjectSerializer.deserialize(response, "BusinessLines");
}
}
export default LegalEntities;

View File

@@ -1,49 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import LegalEntityManagementResource from "../resource/legalEntityManagementResource";
import {TransferInstrumentInfo} from "../../typings/legalEntityManagement/transferInstrumentInfo";
import {TransferInstrument} from "../../typings/legalEntityManagement/transferInstrument";
import {ObjectSerializer} from "../../typings/legalEntityManagement/models";
class TransferInstruments extends Service {
public async create(request: TransferInstrumentInfo): Promise<TransferInstrument> {
const resource = new LegalEntityManagementResource(this, "/transferInstruments");
const response = await getJsonResponse<TransferInstrumentInfo, TransferInstrument>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "TransferInstrument");
}
public async retrieve(id: string): Promise<TransferInstrument> {
const resource = new LegalEntityManagementResource(this, `/transferInstruments/${id}`);
const response = await getJsonResponse<string, TransferInstrument>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "TransferInstrument");
}
public async update(id: string, request: TransferInstrumentInfo): Promise<TransferInstrument> {
const resource = new LegalEntityManagementResource(this, `/transferInstruments/${id}`);
const response = await getJsonResponse<TransferInstrumentInfo, TransferInstrument>(
resource,
request,
{ method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "TransferInstrument");
}
public async delete(id: string): Promise<void> {
const resource = new LegalEntityManagementResource(this, `/transferInstruments/${id}`);
await getJsonResponse<string, string>(
resource,
"",
{method: "DELETE" }
);
}
}
export default TransferInstruments;

View File

@@ -1,222 +0,0 @@
import Service from "../service";
import Client from "../client";
// Deprecated classes
import MeApi from "./management/meApi";
import MerchantAccount from "./management/merchantAccount";
import MerchantAllowedOrigins from "./management/merchantAllowedOrigins";
import MerchantApiCredentials from "./management/merchantApiCredentials";
import MerchantApiKey from "./management/merchantApiKey";
import MerchantClientKey from "./management/merchantClientKey";
import MerchantPaymentMethods from "./management/merchantPaymentMethods";
import MerchantPayoutSettings from "./management/merchantPayoutSettings";
import MerchantTerminalOrders from "./management/merchantTerminalOrders";
import MerchantTerminalSettings from "./management/merchantTerminalSettings";
import MerchantUsers from "./management/merchantUsers";
import MerchantWebhooks from "./management/merchantWebhooks";
// Recommended classes
import APICredentialsCompanyLevelApi from './management/aPICredentialsCompanyLevelApi';
import APICredentialsMerchantLevelApi from './management/aPICredentialsMerchantLevelApi';
import APIKeyCompanyLevelApi from './management/aPIKeyCompanyLevelApi';
import APIKeyMerchantLevelApi from './management/aPIKeyMerchantLevelApi';
import AccountCompanyLevelApi from './management/accountCompanyLevelApi';
import AccountMerchantLevelApi from './management/accountMerchantLevelApi';
import AccountStoreLevelApi from './management/accountStoreLevelApi';
import AllowedOriginsCompanyLevelApi from './management/allowedOriginsCompanyLevelApi';
import AllowedOriginsMerchantLevelApi from './management/allowedOriginsMerchantLevelApi';
import ClientKeyCompanyLevelApi from './management/clientKeyCompanyLevelApi';
import ClientKeyMerchantLevelApi from './management/clientKeyMerchantLevelApi';
import MyAPICredentialApi from './management/myAPICredentialApi';
import PaymentMethodsMerchantLevelApi from './management/paymentMethodsMerchantLevelApi';
import PayoutSettingsMerchantLevelApi from './management/payoutSettingsMerchantLevelApi';
import TerminalActionsCompanyLevelApi from './management/terminalActionsCompanyLevelApi';
import TerminalActionsTerminalLevelApi from './management/terminalActionsTerminalLevelApi';
import TerminalOrdersCompanyLevelApi from './management/terminalOrdersCompanyLevelApi';
import TerminalOrdersMerchantLevelApi from './management/terminalOrdersMerchantLevelApi';
import TerminalSettingsCompanyLevelApi from './management/terminalSettingsCompanyLevelApi';
import TerminalSettingsMerchantLevelApi from './management/terminalSettingsMerchantLevelApi';
import TerminalSettingsStoreLevelApi from './management/terminalSettingsStoreLevelApi';
import TerminalSettingsTerminalLevelApi from './management/terminalSettingsTerminalLevelApi';
import TerminalsTerminalLevelApi from './management/terminalsTerminalLevelApi';
import UsersCompanyLevelApi from './management/usersCompanyLevelApi';
import UsersMerchantLevelApi from './management/usersMerchantLevelApi';
import WebhooksCompanyLevelApi from './management/webhooksCompanyLevelApi';
import WebhooksMerchantLevelApi from './management/webhooksMerchantLevelApi';
class Management extends Service {
public constructor(client: Client) {
super(client);
}
/**
* @deprecated
*/
public get Me() {
const meApi = new MeApi(this.client);
return meApi.Me;
}
/**
* @deprecated
*/
public get MerchantAccount() {
return new MerchantAccount(this.client);
}
/**
* @deprecated
*/
public get MerchantAllowedOrigins() {
return new MerchantAllowedOrigins(this.client);
}
/**
* @deprecated
*/
public get MerchantApiCredentials() {
return new MerchantApiCredentials(this.client);
}
/**
* @deprecated
*/
public get MerchantApiKey() {
return new MerchantApiKey(this.client);
}
/**
* @deprecated
*/
public get MerchantClientKey() {
return new MerchantClientKey(this.client);
}
/**
* @deprecated
*/
public get MerchantPaymentMethods() {
return new MerchantPaymentMethods(this.client);
}
/**
* @deprecated
*/
public get MerchantPayoutSettings() {
return new MerchantPayoutSettings(this.client);
}
/**
* @deprecated
*/
public get MerchantTerminalOrders() {
return new MerchantTerminalOrders(this.client);
}
/**
* @deprecated
*/
public get MerchantTerminalSettings() {
return new MerchantTerminalSettings(this.client);
}
/**
* @deprecated
*/
public get MerchantUsers() {
return new MerchantUsers(this.client);
}
/**
* @deprecated
*/
public get MerchantWebhooks() {
return new MerchantWebhooks(this.client);
}
// ## Recommended classes
public get APICredentialsCompanyLevelApi() {
return new APICredentialsCompanyLevelApi(this.client);
}
public get APICredentialsMerchantLevelApi() {
return new APICredentialsMerchantLevelApi(this.client);
}
public get APIKeyCompanyLevelApi() {
return new APIKeyCompanyLevelApi(this.client);
}
public get APIKeyMerchantLevelApi() {
return new APIKeyMerchantLevelApi(this.client);
}
public get AccountCompanyLevelApi() {
return new AccountCompanyLevelApi(this.client);
}
public get AccountMerchantLevelApi() {
return new AccountMerchantLevelApi(this.client);
}
public get AccountStoreLevelApi() {
return new AccountStoreLevelApi(this.client);
}
public get AllowedOriginsCompanyLevelApi() {
return new AllowedOriginsCompanyLevelApi(this.client);
}
public get AllowedOriginsMerchantLevelApi() {
return new AllowedOriginsMerchantLevelApi(this.client);
}
public get ClientKeyCompanyLevelApi() {
return new ClientKeyCompanyLevelApi(this.client);
}
public get ClientKeyMerchantLevelApi() {
return new ClientKeyMerchantLevelApi(this.client);
}
public get MyAPICredentialApi() {
return new MyAPICredentialApi(this.client);
}
public get PaymentMethodsMerchantLevelApi() {
return new PaymentMethodsMerchantLevelApi(this.client);
}
public get PayoutSettingsMerchantLevelApi() {
return new PayoutSettingsMerchantLevelApi(this.client);
}
public get TerminalActionsCompanyLevelApi() {
return new TerminalActionsCompanyLevelApi(this.client);
}
public get TerminalActionsTerminalLevelApi() {
return new TerminalActionsTerminalLevelApi(this.client);
}
public get TerminalOrdersCompanyLevelApi() {
return new TerminalOrdersCompanyLevelApi(this.client);
}
public get TerminalOrdersMerchantLevelApi() {
return new TerminalOrdersMerchantLevelApi(this.client);
}
public get TerminalSettingsCompanyLevelApi() {
return new TerminalSettingsCompanyLevelApi(this.client);
}
public get TerminalSettingsMerchantLevelApi() {
return new TerminalSettingsMerchantLevelApi(this.client);
}
public get TerminalSettingsStoreLevelApi() {
return new TerminalSettingsStoreLevelApi(this.client);
}
public get TerminalSettingsTerminalLevelApi() {
return new TerminalSettingsTerminalLevelApi(this.client);
}
public get TerminalsTerminalLevelApi() {
return new TerminalsTerminalLevelApi(this.client);
}
public get UsersCompanyLevelApi() {
return new UsersCompanyLevelApi(this.client);
}
public get UsersMerchantLevelApi() {
return new UsersMerchantLevelApi(this.client);
}
public get WebhooksCompanyLevelApi() {
return new WebhooksCompanyLevelApi(this.client);
}
public get WebhooksMerchantLevelApi() {
return new WebhooksMerchantLevelApi(this.client);
}
}
export default Management;

View File

@@ -1,95 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { CompanyApiCredential } from '../../typings/management/models';
import { CreateCompanyApiCredentialRequest } from '../../typings/management/models';
import { CreateCompanyApiCredentialResponse } from '../../typings/management/models';
import { ListCompanyApiCredentialsResponse } from '../../typings/management/models';
import { UpdateCompanyApiCredentialRequest } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class APICredentialsCompanyLevelApi extends Service {
/**
* @summary Get a list of API credentials
* @param companyId The unique identifier of the company account.
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
*/
public async listApiCredentials(companyId: string, requestOptions?: IRequest.Options): Promise<ListCompanyApiCredentialsResponse> {
const localVarPath = "/companies/{companyId}/apiCredentials"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListCompanyApiCredentialsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListCompanyApiCredentialsResponse");
}
/**
* @summary Get an API credential
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async getApiCredential(companyId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<CompanyApiCredential> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, CompanyApiCredential>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "CompanyApiCredential");
}
/**
* @summary Update an API credential.
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
* @param updateCompanyApiCredentialRequest
*/
public async updateApiCredential(companyId: string, apiCredentialId: string, updateCompanyApiCredentialRequest: UpdateCompanyApiCredentialRequest, requestOptions?: IRequest.Options): Promise<CompanyApiCredential> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const request: UpdateCompanyApiCredentialRequest = ObjectSerializer.serialize(updateCompanyApiCredentialRequest, "UpdateCompanyApiCredentialRequest");
const response = await getJsonResponse<UpdateCompanyApiCredentialRequest, CompanyApiCredential>(
resource,
request,
{ ...requestOptions, method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "CompanyApiCredential");
}
/**
* @summary Create an API credential.
* @param companyId The unique identifier of the company account.
* @param createCompanyApiCredentialRequest
*/
public async createApiCredential(companyId: string, createCompanyApiCredentialRequest: CreateCompanyApiCredentialRequest, requestOptions?: IRequest.Options): Promise<CreateCompanyApiCredentialResponse> {
const localVarPath = "/companies/{companyId}/apiCredentials"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)));
const resource = new ManagementResource(this, localVarPath);
const request: CreateCompanyApiCredentialRequest = ObjectSerializer.serialize(createCompanyApiCredentialRequest, "CreateCompanyApiCredentialRequest");
const response = await getJsonResponse<CreateCompanyApiCredentialRequest, CreateCompanyApiCredentialResponse>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "CreateCompanyApiCredentialResponse");
}
}

View File

@@ -1,95 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { ApiCredential } from '../../typings/management/models';
import { CreateApiCredentialResponse } from '../../typings/management/models';
import { CreateMerchantApiCredentialRequest } from '../../typings/management/models';
import { ListMerchantApiCredentialsResponse } from '../../typings/management/models';
import { UpdateMerchantApiCredentialRequest } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class APICredentialsMerchantLevelApi extends Service {
/**
* @summary Get a list of API credentials
* @param merchantId The unique identifier of the merchant account.
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
*/
public async listApiCredentials(merchantId: string, requestOptions?: IRequest.Options): Promise<ListMerchantApiCredentialsResponse> {
const localVarPath = "/merchants/{merchantId}/apiCredentials"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListMerchantApiCredentialsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListMerchantApiCredentialsResponse");
}
/**
* @summary Get an API credential
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async getApiCredential(merchantId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<ApiCredential> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ApiCredential>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ApiCredential");
}
/**
* @summary Update an API credential
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
* @param updateMerchantApiCredentialRequest
*/
public async updateApiCredential(merchantId: string, apiCredentialId: string, updateMerchantApiCredentialRequest: UpdateMerchantApiCredentialRequest, requestOptions?: IRequest.Options): Promise<ApiCredential> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const request: UpdateMerchantApiCredentialRequest = ObjectSerializer.serialize(updateMerchantApiCredentialRequest, "UpdateMerchantApiCredentialRequest");
const response = await getJsonResponse<UpdateMerchantApiCredentialRequest, ApiCredential>(
resource,
request,
{ ...requestOptions, method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "ApiCredential");
}
/**
* @summary Create an API credential
* @param merchantId The unique identifier of the merchant account.
* @param createMerchantApiCredentialRequest
*/
public async createApiCredential(merchantId: string, createMerchantApiCredentialRequest: CreateMerchantApiCredentialRequest, requestOptions?: IRequest.Options): Promise<CreateApiCredentialResponse> {
const localVarPath = "/merchants/{merchantId}/apiCredentials"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)));
const resource = new ManagementResource(this, localVarPath);
const request: CreateMerchantApiCredentialRequest = ObjectSerializer.serialize(createMerchantApiCredentialRequest, "CreateMerchantApiCredentialRequest");
const response = await getJsonResponse<CreateMerchantApiCredentialRequest, CreateApiCredentialResponse>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "CreateApiCredentialResponse");
}
}

View File

@@ -1,38 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { GenerateApiKeyResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class APIKeyCompanyLevelApi extends Service {
/**
* @summary Generate new API key
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async generateNewApiKey(companyId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<GenerateApiKeyResponse> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}/generateApiKey"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, GenerateApiKeyResponse>(
resource,
"",
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "GenerateApiKeyResponse");
}
}

View File

@@ -1,38 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { GenerateApiKeyResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class APIKeyMerchantLevelApi extends Service {
/**
* @summary Generate new API key
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async generateNewApiKey(merchantId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<GenerateApiKeyResponse> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}/generateApiKey"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, GenerateApiKeyResponse>(
resource,
"",
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "GenerateApiKeyResponse");
}
}

View File

@@ -1,70 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { Company } from '../../typings/management/models';
import { ListCompanyResponse } from '../../typings/management/models';
import { ListMerchantResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class AccountCompanyLevelApi extends Service {
/**
* @summary Get a list of company accounts
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
*/
public async listCompanyAccounts(requestOptions?: IRequest.Options): Promise<ListCompanyResponse> {
const localVarPath = "/companies";
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListCompanyResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListCompanyResponse");
}
/**
* @summary Get a company account
* @param companyId The unique identifier of the company account.
*/
public async getCompanyAccount(companyId: string, requestOptions?: IRequest.Options): Promise<Company> {
const localVarPath = "/companies/{companyId}"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, Company>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "Company");
}
/**
* @summary Get a list of merchant accounts
* @param companyId The unique identifier of the company account.
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
*/
public async listMerchantAccounts(companyId: string, requestOptions?: IRequest.Options): Promise<ListMerchantResponse> {
const localVarPath = "/companies/{companyId}/merchants"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListMerchantResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListMerchantResponse");
}
}

View File

@@ -1,85 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { CreateMerchantRequest } from '../../typings/management/models';
import { CreateMerchantResponse } from '../../typings/management/models';
import { ListMerchantResponse } from '../../typings/management/models';
import { Merchant } from '../../typings/management/models';
import { RequestActivationResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class AccountMerchantLevelApi extends Service {
/**
* @summary Get a list of merchant accounts
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
*/
public async listMerchantAccounts(requestOptions?: IRequest.Options): Promise<ListMerchantResponse> {
const localVarPath = "/merchants";
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListMerchantResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListMerchantResponse");
}
/**
* @summary Get a merchant account
* @param merchantId The unique identifier of the merchant account.
*/
public async getMerchantAccount(merchantId: string, requestOptions?: IRequest.Options): Promise<Merchant> {
const localVarPath = "/merchants/{merchantId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, Merchant>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "Merchant");
}
/**
* @summary Create a merchant account
* @param createMerchantRequest
*/
public async createMerchantAccount(createMerchantRequest: CreateMerchantRequest, requestOptions?: IRequest.Options): Promise<CreateMerchantResponse> {
const localVarPath = "/merchants";
const resource = new ManagementResource(this, localVarPath);
const request: CreateMerchantRequest = ObjectSerializer.serialize(createMerchantRequest, "CreateMerchantRequest");
const response = await getJsonResponse<CreateMerchantRequest, CreateMerchantResponse>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "CreateMerchantResponse");
}
/**
* @summary Request to activate a merchant account
* @param merchantId The unique identifier of the merchant account.
*/
public async requestToActivateMerchantAccount(merchantId: string, requestOptions?: IRequest.Options): Promise<RequestActivationResponse> {
const localVarPath = "/merchants/{merchantId}/activate"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, RequestActivationResponse>(
resource,
"",
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "RequestActivationResponse");
}
}

View File

@@ -1,160 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { ListStoresResponse } from '../../typings/management/models';
import { Store } from '../../typings/management/models';
import { StoreCreationRequest } from '../../typings/management/models';
import { StoreCreationWithMerchantCodeRequest } from '../../typings/management/models';
import { UpdateStoreRequest } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class AccountStoreLevelApi extends Service {
/**
* @summary Get a list of stores
* @param merchantId The unique identifier of the merchant account.
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
* @param reference The reference of the store.
*/
public async listStoresByMerchantId(merchantId: string, requestOptions?: IRequest.Options): Promise<ListStoresResponse> {
const localVarPath = "/merchants/{merchantId}/stores"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListStoresResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListStoresResponse");
}
/**
* @summary Get a store
* @param merchantId The unique identifier of the merchant account.
* @param storeId The unique identifier of the store.
*/
public async getStore(merchantId: string, storeId: string, requestOptions?: IRequest.Options): Promise<Store> {
const localVarPath = "/merchants/{merchantId}/stores/{storeId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'storeId' + '}', encodeURIComponent(String(storeId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, Store>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "Store");
}
/**
* @summary Get a list of stores
* @param pageNumber The number of the page to fetch.
* @param pageSize The number of items to have on a page, maximum 100. The default is 10 items on a page.
* @param reference The reference of the store.
* @param merchantId The unique identifier of the merchant account.
*/
public async listStores(requestOptions?: IRequest.Options): Promise<ListStoresResponse> {
const localVarPath = "/stores";
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, ListStoresResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListStoresResponse");
}
/**
* @summary Get a store
* @param storeId The unique identifier of the store.
*/
public async getStoreById(storeId: string, requestOptions?: IRequest.Options): Promise<Store> {
const localVarPath = "/stores/{storeId}"
.replace('{' + 'storeId' + '}', encodeURIComponent(String(storeId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, Store>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "Store");
}
/**
* @summary Update a store
* @param merchantId The unique identifier of the merchant account.
* @param storeId The unique identifier of the store.
* @param updateStoreRequest
*/
public async updateStore(merchantId: string, storeId: string, updateStoreRequest: UpdateStoreRequest, requestOptions?: IRequest.Options): Promise<Store> {
const localVarPath = "/merchants/{merchantId}/stores/{storeId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'storeId' + '}', encodeURIComponent(String(storeId)));
const resource = new ManagementResource(this, localVarPath);
const request: UpdateStoreRequest = ObjectSerializer.serialize(updateStoreRequest, "UpdateStoreRequest");
const response = await getJsonResponse<UpdateStoreRequest, Store>(
resource,
request,
{ ...requestOptions, method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "Store");
}
/**
* @summary Update a store
* @param storeId The unique identifier of the store.
* @param updateStoreRequest
*/
public async updateStoreById(storeId: string, updateStoreRequest: UpdateStoreRequest, requestOptions?: IRequest.Options): Promise<Store> {
const localVarPath = "/stores/{storeId}"
.replace('{' + 'storeId' + '}', encodeURIComponent(String(storeId)));
const resource = new ManagementResource(this, localVarPath);
const request: UpdateStoreRequest = ObjectSerializer.serialize(updateStoreRequest, "UpdateStoreRequest");
const response = await getJsonResponse<UpdateStoreRequest, Store>(
resource,
request,
{ ...requestOptions, method: "PATCH" }
);
return ObjectSerializer.deserialize(response, "Store");
}
/**
* @summary Create a store
* @param merchantId The unique identifier of the merchant account.
* @param storeCreationRequest
*/
public async createStoreByMerchantId(merchantId: string, storeCreationRequest: StoreCreationRequest, requestOptions?: IRequest.Options): Promise<Store> {
const localVarPath = "/merchants/{merchantId}/stores"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)));
const resource = new ManagementResource(this, localVarPath);
const request: StoreCreationRequest = ObjectSerializer.serialize(storeCreationRequest, "StoreCreationRequest");
const response = await getJsonResponse<StoreCreationRequest, Store>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "Store");
}
/**
* @summary Create a store
* @param storeCreationWithMerchantCodeRequest
*/
public async createStore(storeCreationWithMerchantCodeRequest: StoreCreationWithMerchantCodeRequest, requestOptions?: IRequest.Options): Promise<Store> {
const localVarPath = "/stores";
const resource = new ManagementResource(this, localVarPath);
const request: StoreCreationWithMerchantCodeRequest = ObjectSerializer.serialize(storeCreationWithMerchantCodeRequest, "StoreCreationWithMerchantCodeRequest");
const response = await getJsonResponse<StoreCreationWithMerchantCodeRequest, Store>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "Store");
}
}

View File

@@ -1,95 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { AllowedOrigin } from '../../typings/management/models';
import { AllowedOriginsResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class AllowedOriginsCompanyLevelApi extends Service {
/**
* @summary Delete an allowed origin
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
* @param originId Unique identifier of the allowed origin.
*/
public async deleteAllowedOrigin(companyId: string, apiCredentialId: string, originId: string, requestOptions?: IRequest.Options): Promise<void> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}/allowedOrigins/{originId}"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)))
.replace('{' + 'originId' + '}', encodeURIComponent(String(originId)));
const resource = new ManagementResource(this, localVarPath);
await getJsonResponse<string, void>(
resource,
"",
{ ...requestOptions, method: "DELETE" }
);
}
/**
* @summary Get a list of allowed origins
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async listAllowedOrigins(companyId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<AllowedOriginsResponse> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}/allowedOrigins"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, AllowedOriginsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "AllowedOriginsResponse");
}
/**
* @summary Get an allowed origin
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
* @param originId Unique identifier of the allowed origin.
*/
public async getAllowedOrigin(companyId: string, apiCredentialId: string, originId: string, requestOptions?: IRequest.Options): Promise<AllowedOrigin> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}/allowedOrigins/{originId}"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)))
.replace('{' + 'originId' + '}', encodeURIComponent(String(originId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, AllowedOrigin>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "AllowedOrigin");
}
/**
* @summary Create an allowed origin
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
* @param allowedOrigin
*/
public async createAllowedOrigin(companyId: string, apiCredentialId: string, allowedOrigin: AllowedOrigin, requestOptions?: IRequest.Options): Promise<AllowedOriginsResponse> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}/allowedOrigins"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const request: AllowedOrigin = ObjectSerializer.serialize(allowedOrigin, "AllowedOrigin");
const response = await getJsonResponse<AllowedOrigin, AllowedOriginsResponse>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "AllowedOriginsResponse");
}
}

View File

@@ -1,95 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { AllowedOrigin } from '../../typings/management/models';
import { AllowedOriginsResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class AllowedOriginsMerchantLevelApi extends Service {
/**
* @summary Delete an allowed origin
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
* @param originId Unique identifier of the allowed origin.
*/
public async deleteAllowedOrigin(merchantId: string, apiCredentialId: string, originId: string, requestOptions?: IRequest.Options): Promise<void> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins/{originId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)))
.replace('{' + 'originId' + '}', encodeURIComponent(String(originId)));
const resource = new ManagementResource(this, localVarPath);
await getJsonResponse<string, void>(
resource,
"",
{ ...requestOptions, method: "DELETE" }
);
}
/**
* @summary Get a list of allowed origins
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async listAllowedOrigins(merchantId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<AllowedOriginsResponse> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, AllowedOriginsResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "AllowedOriginsResponse");
}
/**
* @summary Get an allowed origin
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
* @param originId Unique identifier of the allowed origin.
*/
public async getAllowedOrigin(merchantId: string, apiCredentialId: string, originId: string, requestOptions?: IRequest.Options): Promise<AllowedOrigin> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins/{originId}"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)))
.replace('{' + 'originId' + '}', encodeURIComponent(String(originId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, AllowedOrigin>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "AllowedOrigin");
}
/**
* @summary Create an allowed origin
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
* @param allowedOrigin
*/
public async createAllowedOrigin(merchantId: string, apiCredentialId: string, allowedOrigin: AllowedOrigin, requestOptions?: IRequest.Options): Promise<AllowedOriginsResponse> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}/allowedOrigins"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const request: AllowedOrigin = ObjectSerializer.serialize(allowedOrigin, "AllowedOrigin");
const response = await getJsonResponse<AllowedOrigin, AllowedOriginsResponse>(
resource,
request,
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "AllowedOriginsResponse");
}
}

View File

@@ -1,38 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { GenerateClientKeyResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class ClientKeyCompanyLevelApi extends Service {
/**
* @summary Generate new client key
* @param companyId The unique identifier of the company account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async generateNewClientKey(companyId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<GenerateClientKeyResponse> {
const localVarPath = "/companies/{companyId}/apiCredentials/{apiCredentialId}/generateClientKey"
.replace('{' + 'companyId' + '}', encodeURIComponent(String(companyId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, GenerateClientKeyResponse>(
resource,
"",
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "GenerateClientKeyResponse");
}
}

View File

@@ -1,38 +0,0 @@
/*
* The version of the OpenAPI document: v1
* Contact: developer-experience@adyen.com
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit this class manually.
*/
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
/* tslint:disable:no-unused-locals */
import { GenerateClientKeyResponse } from '../../typings/management/models';
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
import { ObjectSerializer } from "../../typings/management/models";
export default class ClientKeyMerchantLevelApi extends Service {
/**
* @summary Generate new client key
* @param merchantId The unique identifier of the merchant account.
* @param apiCredentialId Unique identifier of the API credential.
*/
public async generateNewClientKey(merchantId: string, apiCredentialId: string, requestOptions?: IRequest.Options): Promise<GenerateClientKeyResponse> {
const localVarPath = "/merchants/{merchantId}/apiCredentials/{apiCredentialId}/generateClientKey"
.replace('{' + 'merchantId' + '}', encodeURIComponent(String(merchantId)))
.replace('{' + 'apiCredentialId' + '}', encodeURIComponent(String(apiCredentialId)));
const resource = new ManagementResource(this, localVarPath);
const response = await getJsonResponse<string, GenerateClientKeyResponse>(
resource,
"",
{ ...requestOptions, method: "POST" }
);
return ObjectSerializer.deserialize(response, "GenerateClientKeyResponse");
}
}

View File

@@ -1,71 +0,0 @@
import Client from "../../client";
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import {
AllowedOrigin,
AllowedOriginsResponse,
CreateAllowedOriginRequest,
MeApiCredential
} from "../../typings/management/models";
import Me from "../resource/management/me";
class MeApi extends Service {
//Me
private readonly _retrieveMe: Me;
private readonly _allowedOrigins: Me;
public constructor(client: Client) {
super(client);
this._retrieveMe = new Me(this, "");
this._allowedOrigins = new Me(this, "/allowedOrigins");
}
public get Me(): {
retrieve:() => Promise<MeApiCredential>;
createAllowedOrigin: (allowedOriginRequest: CreateAllowedOriginRequest) => Promise<AllowedOrigin>;
retrieveAllowedOrigins: () => Promise<AllowedOriginsResponse>;
retrieveAllowedOrigin: (originId: string) => Promise<AllowedOrigin>;
deleteAllowerdOrigin: (originId: string) => Promise<Record<string, unknown>>;
} {
const retrieve = () => getJsonResponse<Record<string, never>, MeApiCredential>(
this._retrieveMe,
{},
{ method: "GET"}
);
const createAllowedOrigin = (allowedOriginRequest: CreateAllowedOriginRequest) => getJsonResponse<CreateAllowedOriginRequest, AllowedOrigin>(
this._allowedOrigins,
allowedOriginRequest,
);
const retrieveAllowedOrigins = () => getJsonResponse<Record<string, never>, AllowedOriginsResponse>(
this._allowedOrigins,
{},
{ method: "GET"}
);
const retrieveAllowedOrigin = (originId: string) => {
const allowedOrigin = new Me(this, `/allowedOrigins/${originId}`);
return getJsonResponse<Record<string, never>, AllowedOrigin>(
allowedOrigin,
{},
{ method: "GET"}
);
};
const deleteAllowerdOrigin = (originId: string) => {
const allowedOrigin = new Me(this, `/allowedOrigins/${originId}`);
return getJsonResponse<Record<string, never>, Record<string, unknown>>(
allowedOrigin,
{},
{ method: "DELETE"}
);
};
return { retrieve, createAllowedOrigin, retrieveAllowedOrigins, retrieveAllowedOrigin, deleteAllowerdOrigin };
}
}
export default MeApi;

View File

@@ -1,61 +0,0 @@
import getJsonResponse from "../../helpers/getJsonResponse";
import Service from "../../service";
import { CreateMerchantRequest, CreateMerchantResponse, ListMerchantResponse, Merchant, ObjectSerializer, RequestActivationResponse } from "../../typings/management/models";
import { IRequest } from "../../typings/requestOptions";
import ManagementResource from "../resource/management/managementResource";
class MerchantAccount extends Service {
/**
* Get a list of merchant accounts
*/
public async list(requestOptions?: IRequest.Options): Promise<ListMerchantResponse> {
const resource = new ManagementResource(this, `/merchants`);
const response = await getJsonResponse<string, ListMerchantResponse>(
resource,
"",
{ ...requestOptions, method: "GET" }
);
return ObjectSerializer.deserialize(response, "ListMerchantResponse");
}
/**
* Create a merchant account
*/
public async create(request: CreateMerchantRequest): Promise<CreateMerchantResponse> {
const resource = new ManagementResource(this, `/merchants`);
const response = await getJsonResponse<CreateMerchantRequest, CreateMerchantResponse>(
resource,
request,
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "CreateMerchantResponse");
}
/**
* Get a merchant account
*/
public async retrieve(merchantId: string): Promise<Merchant> {
const resource = new ManagementResource(this, `/merchants/${merchantId}`);
const response = await getJsonResponse<string, Merchant>(
resource,
"",
{ method: "GET" }
);
return ObjectSerializer.deserialize(response, "Merchant");
}
/**
* Request to activate a merchant account
*/
public async activate(merchantId: string): Promise<RequestActivationResponse> {
const resource = new ManagementResource(this, `/merchants/${merchantId}/activate`);
const response = await getJsonResponse<string, RequestActivationResponse>(
resource,
"",
{ method: "POST" }
);
return ObjectSerializer.deserialize(response, "RequestActivationResponse");
}
}
export default MerchantAccount;

Some files were not shown because too many files have changed in this diff Show More