diff --git a/src/apiServices/assetApi.ts b/src/apiServices/assetApi.ts new file mode 100644 index 0000000..cd98f87 --- /dev/null +++ b/src/apiServices/assetApi.ts @@ -0,0 +1,158 @@ +import log from '../lib/log'; +import { + showFiatAssets, + showCryptoAssets, + getPurchaseDetailByPurchaseId, + submitPurchase, + getPurchaseHistory, + getPurchaseDetails, + getPurchaseDetailsSelectedAsset, + createPurchase, + getPurchaseStatus, + getProviders +} from '../services/assetService'; + +async function getFiatAssets(req, res) { + try { + const value = await showFiatAssets(); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getCryptoAssets(req, res) { + try { + const value = await showCryptoAssets(); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getAssetProviders(req, res) { + try { + const value = await getProviders(); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getPurchaseDetailsByPurchaseId(req, res) { + try { + let { purchaseid } = req.params; + purchaseid = purchaseid ?? req.query.purchaseid; + const value = await getPurchaseDetailByPurchaseId(purchaseid); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function sendPurchase(req, res) { + try { + let { purchaseid } = req.params; + purchaseid = purchaseid ?? req.query.purchaseid; + + let { providerid } = req.params; + providerid = providerid ?? req.query.providerid; + + const value = await submitPurchase(purchaseid, providerid); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getAllPurchase(req, res) { + try { + let { zelid } = req.params; + zelid = zelid ?? req.query.zelid; + + const value = await getPurchaseHistory(zelid); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getAllPurchaseDetails(req, res) { + try { + let body = ''; + await req.on('data', (data) => { + body += data; + }); + const value = await getPurchaseDetails(body); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getPurchaseDetailsOnSelectedAsset(req, res) { + try { + let body = ''; + await req.on('data', (data) => { + body += data; + }); + const value = await getPurchaseDetailsSelectedAsset(body); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function createPurchaseDetails(req, res) { + try { + let body = ''; + await req.on('data', (data) => { + body += data; + }); + + let { zelid } = req.params; + zelid = zelid ?? req.query.zelid; + + const value = await createPurchase(body, zelid); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + +async function getAllPurchaseStatus(req, res) { + try { + let body = ''; + await req.on('data', (data) => { + body += data; + }); + const value = await getPurchaseStatus(body); + res.json(value); + } catch (error) { + log.error(error); + res.sendStatus(404); + } +} + + +export default { + getFiatAssets, + getCryptoAssets, + getPurchaseDetailsByPurchaseId, + sendPurchase, + getAllPurchase, + getAllPurchaseDetails, + getPurchaseDetailsOnSelectedAsset, + createPurchaseDetails, + getAllPurchaseStatus, + getAssetProviders +} \ No newline at end of file diff --git a/src/routes.ts b/src/routes.ts index 8fa7244..d7b20ef 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -4,6 +4,7 @@ import ratesApi from './apiServices/ratesApi'; import ticketsApi from './apiServices/ticketsApi'; import feeService from './services/networkFeesService'; import tokenApi from './apiServices/tokenApi'; +import assetApi from './apiServices/assetApi'; export default (app) => { // return sync data @@ -40,4 +41,43 @@ export default (app) => { app.get('/v1/tokeninfo/:network?/:address?', (req, res) => { tokenApi.getTokenInfo(req, res); }); + // get fiat assets + app.get('/v1/assetinfo/assets/fiat', (req, res) => { + assetApi.getFiatAssets(req, res); + }); + // get crypto assets + app.get('/v1/assetinfo/assets/crypto', (req, res) => { + assetApi.getCryptoAssets(req, res); + }); + // get asset providers + app.get('/v1/assetinfo/assets/providers', (req, res) => { + assetApi.getAssetProviders(req, res); + }); + // get purchase by id + app.get('/v1/assetinfo/purchase/id/:purchaseid?', (req, res) => { + assetApi.getPurchaseDetailsByPurchaseId(req, res); + }); + // send purchase + app.get('/v1/assetinfo/purchase/send/:purchaseid?/:providerid?', (req, res) => { + assetApi.sendPurchase(req, res); + }); + // get purchase history + app.get('/v1/assetinfo/purchase/history/:zelid?', (req, res) => { + assetApi.getAllPurchase(req, res); + }); + app.post('/v1/assetinfo/purchase/details', (req, res) => { + assetApi.getAllPurchaseDetails(req, res); + }); + // send purchase + app.post('/v1/assetinfo/purchase/details/assets', (req, res) => { + assetApi.getPurchaseDetailsOnSelectedAsset(req, res); + }); + // get purchase history + app.post('/v1/assetinfo/purchase/create/:zelid?', (req, res) => { + assetApi.createPurchaseDetails(req, res); + }); + // get purchase history + app.post('/v1/assetinfo/purchase/status', (req, res) => { + assetApi.getAllPurchaseStatus(req, res); + }); }; diff --git a/src/services/assetService.ts b/src/services/assetService.ts new file mode 100644 index 0000000..24ae69a --- /dev/null +++ b/src/services/assetService.ts @@ -0,0 +1,123 @@ +import axios from 'axios'; + +export async function showFiatAssets () { + try { + const response = await axios.get('https://abe.zelcore.io/v1/purchase/sellassets'); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function showCryptoAssets () { + try { + const response = await axios.get('https://abe.zelcore.io/v1/purchase/buyassets'); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function getPurchaseDetailByPurchaseId (purchaseid: string) { + try { + const response = await axios.get(`https://abe.zelcore.io/v1/purchase/detail?purchaseid=${purchaseid}`); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function submitPurchase (purchaseid: string, providerid: string) { + try { + const response = await axios.get(`https://abe.zelcore.io/v1/purchase/submit?purchaseid=${purchaseid}&providerid=${providerid}`); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function getPurchaseHistory (zelid: string) { + try { + const response = await axios.get(`https://abe.zelcore.io/v1/offramp/user/history?zelid=${zelid}`); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function getPurchaseDetails (data: any) { + try { + const response = await axios.post(`https://abe.zelcore.io/v1/purchase/pairdetails`, data, { + headers: { + 'Content-Type' : 'application/json' + } + }); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function getPurchaseDetailsSelectedAsset (data: any) { + try { + const response = await axios.post(`https://abe.zelcore.io/v1/purchase/pairdetailssellamount`, data, { + headers: { + 'Content-Type' : 'application/json' + } + }); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function createPurchase (data: any, zelid: string) { + try { + const response = await axios.post(`https://abe.zelcore.io/v1/purchase/createpurchase`, data, { + headers: { + 'Content-Type' : 'application/json', + 'zedid': zelid + } + }); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + +export async function getPurchaseStatus (data: any) { + try { + const response = await axios.post(`https://abe.zelcore.io/v1/purchase/status`, data, { + headers: { + 'Content-Type' : 'application/json' + } + }); + return response.data; + } catch(error) { + console.log(error); + return {}; + }; +} + +export async function getProviders () { + try { + const response = await axios.get('https://abe.zelcore.io/v1/purchases'); + return response.data; + } catch(error) { + console.log(error); + return {message: "Error occured in processing"}; + }; +} + + + + + diff --git a/tests/unit/assetApi.spec.ts b/tests/unit/assetApi.spec.ts new file mode 100644 index 0000000..9bbe926 --- /dev/null +++ b/tests/unit/assetApi.spec.ts @@ -0,0 +1,525 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck test suite +import chai from 'chai'; +import assetApi from '../../src/apiServices/assetApi'; +import sinon from 'sinon'; +import httpMocks from 'node-mocks-http'; + +const { expect } = chai; + +describe('Asset API', function () { + describe('Asset API: Correctly verifies asset data', function () { + afterEach(function () { + sinon.restore(); + }); + + it('should return getFiatAssets successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + }); + const res = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getFiatAssets(request, res); + expect(JSON.parse(res._getData())).to.have.property('status'); + expect(JSON.parse(res._getData())).to.have.property('data'); + }); + + it('should return getCryptoAssets successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + }); + const res = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getCryptoAssets(request, res); + expect(JSON.parse(res._getData())).to.have.property('status'); + expect(JSON.parse(res._getData())).to.have.property('data'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('idzelcore'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('ticker'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('name'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('contract'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('chain'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('idguardarian'); + expect(JSON.parse(res._getData()).data[0]).to.have.property('idguardarianlimit'); + }); + + it('should return getPurchaseDetailsByPurchaseId successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4" + } + }); + const res = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getPurchaseDetailsByPurchaseId(request, res); + expect(JSON.parse(res._getData())).to.have.property('status'); + expect(JSON.parse(res._getData())).to.have.property('data'); + expect(JSON.parse(res._getData()).data).to.have.property('purchaseId'); + expect(JSON.parse(res._getData()).data).to.have.property('buyAddress'); + expect(JSON.parse(res._getData()).data).to.have.property('buyAmount'); + expect(JSON.parse(res._getData()).data).to.have.property('buyAsset'); + expect(JSON.parse(res._getData()).data).to.have.property('buyTxid'); + expect(JSON.parse(res._getData()).data).to.have.property('cardId'); + expect(JSON.parse(res._getData()).data).to.have.property('country'); + + expect(JSON.parse(res._getData()).data).to.have.property('createdAt'); + expect(JSON.parse(res._getData()).data).to.have.property('networkFee'); + expect(JSON.parse(res._getData()).data).to.have.property('providerBuyAssetId'); + expect(JSON.parse(res._getData()).data).to.have.property('providerCustomerId'); + expect(JSON.parse(res._getData()).data).to.have.property('providerId'); + expect(JSON.parse(res._getData()).data).to.have.property('providerSellAssetId'); + expect(JSON.parse(res._getData()).data).to.have.property('rate'); + + expect(JSON.parse(res._getData()).data).to.have.property('sellAmount'); + expect(JSON.parse(res._getData()).data).to.have.property('sellAsset'); + expect(JSON.parse(res._getData()).data).to.have.property('status'); + expect(JSON.parse(res._getData()).data).to.have.property('transactionFee'); + expect(JSON.parse(res._getData()).data).to.have.property('zelid'); + expect(JSON.parse(res._getData()).data).to.have.property('providerCardId'); + }); + + it('should return sendPurchase successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await sinon + .stub(assetApi, 'sendPurchase') + .returns({ + "status": "success", + "data": { + "purchaseId": "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + "buyAddress": "0x88ede65cb154660a84d996467bdef80e17de1576", + "buyAmount": "0.15800000", + "buyAsset": "ethereum", + "buyTxid": "0x978458e5dc7d3f449051da2e6be702df754370e4fd29f526d6a8eb0b206dd18b", + "cardId": "d7b631c8-0ffe-499f-a661-93869e4d3454", + "country": "CZE", + "createdAt": 1670426311349, + "networkFee": "9.89000000", + "providerBuyAssetId": "eth", + "providerCustomerId": "271170dd-8db6-472c-9828-67e0df5b609a", + "providerId": "idmoonpay", + "providerSellAssetId": "czk", + "rate": "30224.43037975", + "sellAmount": "5000.25000000", + "sellAsset": "CZK", + "status": "finished", + "transactionFee": "214.90000000", + "zelid": "1CbErtneaX2QVyUfwU7JGB7VzvPgrgc3uC", + "providerCardId": "d7b631c8-0ffe-499f-a661-93869e4d3454" + } + }); + const res = await assetApi.sendPurchase(request, response); + expect(res).to.have.property('status'); + expect(res).to.have.property('data'); + expect(res.data).to.have.property('purchaseId'); + expect(res.data).to.have.property('buyAddress'); + expect(res.data).to.have.property('buyAmount'); + expect(res.data).to.have.property('buyAsset'); + expect(res.data).to.have.property('buyTxid'); + expect(res.data).to.have.property('cardId'); + expect(res.data).to.have.property('country'); + + expect(res.data).to.have.property('createdAt'); + expect(res.data).to.have.property('networkFee'); + expect(res.data).to.have.property('providerBuyAssetId'); + expect(res.data).to.have.property('providerCustomerId'); + expect(res.data).to.have.property('providerId'); + expect(res.data).to.have.property('providerSellAssetId'); + expect(res.data).to.have.property('rate'); + + expect(res.data).to.have.property('sellAmount'); + expect(res.data).to.have.property('sellAsset'); + expect(res.data).to.have.property('status'); + expect(res.data).to.have.property('transactionFee'); + expect(res.data).to.have.property('zelid'); + expect(res.data).to.have.property('providerCardId'); + }); + + it('should return sendPurchase unsuccessful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.sendPurchase(request, response); + expect(JSON.parse(response._getData())).to.have.property('status'); + expect(JSON.parse(response._getData())).to.have.property('data'); + expect(JSON.parse(response._getData()).data).to.have.property('name'); + expect(JSON.parse(response._getData()).data).to.have.property('message'); + }); + + it('should return getAllPurchase successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + zelid: "1BoatSLRHtKNngkdXEeobR76b53LETtpyT" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await sinon + .stub(assetApi, 'getAllPurchase') + .returns({ + "status": "success", + "data": [{ + "purchaseId": "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + "buyAddress": "0x88ede65cb154660a84d996467bdef80e17de1576", + "buyAmount": "0.15800000", + "buyAsset": "ethereum", + "buyTxid": "0x978458e5dc7d3f449051da2e6be702df754370e4fd29f526d6a8eb0b206dd18b", + "cardId": "d7b631c8-0ffe-499f-a661-93869e4d3454", + "country": "CZE", + "createdAt": 1670426311349, + "networkFee": "9.89000000", + "providerBuyAssetId": "eth", + "providerCustomerId": "271170dd-8db6-472c-9828-67e0df5b609a", + "providerId": "idmoonpay", + "providerSellAssetId": "czk", + "rate": "30224.43037975", + "sellAmount": "5000.25000000", + "sellAsset": "CZK", + "status": "finished", + "transactionFee": "214.90000000", + "zelid": "1CbErtneaX2QVyUfwU7JGB7VzvPgrgc3uC", + "providerCardId": "d7b631c8-0ffe-499f-a661-93869e4d3454" + }] + }); + const res = await assetApi.getAllPurchase(request, response); + expect(res).to.have.property('status'); + expect(res).to.have.property('data'); + expect(res.data[0]).to.have.property('purchaseId'); + expect(res.data[0]).to.have.property('buyAddress'); + expect(res.data[0]).to.have.property('buyAmount'); + expect(res.data[0]).to.have.property('buyAsset'); + expect(res.data[0]).to.have.property('buyTxid'); + expect(res.data[0]).to.have.property('cardId'); + expect(res.data[0]).to.have.property('country'); + + expect(res.data[0]).to.have.property('createdAt'); + expect(res.data[0]).to.have.property('networkFee'); + expect(res.data[0]).to.have.property('providerBuyAssetId'); + expect(res.data[0]).to.have.property('providerCustomerId'); + expect(res.data[0]).to.have.property('providerId'); + expect(res.data[0]).to.have.property('providerSellAssetId'); + expect(res.data[0]).to.have.property('rate'); + + expect(res.data[0]).to.have.property('sellAmount'); + expect(res.data[0]).to.have.property('sellAsset'); + expect(res.data[0]).to.have.property('status'); + expect(res.data[0]).to.have.property('transactionFee'); + expect(res.data[0]).to.have.property('zelid'); + expect(res.data[0]).to.have.property('providerCardId'); + }); + + it('should return getAllPurchase unsuccessful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getAllPurchase(request, response); + expect(JSON.parse(response._getData())).to.have.property('status'); + expect(JSON.parse(response._getData())).to.have.property('data'); + expect(JSON.parse(response._getData()).data).to.have.property('name'); + expect(JSON.parse(response._getData()).data).to.have.property('message'); + }); + + it('should return getAllPurchaseDetails successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'POST', + url: 'test', + data: { + sellAsset: "EUR", + buyAsset: "litecoin" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await sinon + .stub(assetApi, 'getAllPurchaseDetails') + .returns({ + "status": "success", + "data": { + "buyAsset": "litecoin", + "sellAsset": "EUR", + "providers": [ + { + "providerId": "idmoonpay", + "minSellAmount": "30.00000000", + "maxSellAmount": "10000.00000000", + "rate": "62.27019339", + "precision": "2", + "networkFee": "0.06000000", + "transactionFee": "3.99000000" + } + ] + } + }); + const res = await assetApi.getAllPurchaseDetails(request, response); + expect(res).to.have.property('status'); + expect(res).to.have.property('data'); + expect(res.data).to.have.property('buyAsset'); + expect(res.data).to.have.property('sellAsset'); + expect(res.data.providers[0]).to.have.property('providerId'); + expect(res.data.providers[0]).to.have.property('minSellAmount'); + expect(res.data.providers[0]).to.have.property('maxSellAmount'); + expect(res.data.providers[0]).to.have.property('rate'); + expect(res.data.providers[0]).to.have.property('precision'); + expect(res.data.providers[0]).to.have.property('networkFee'); + expect(res.data.providers[0]).to.have.property('transactionFee'); + }); + + it('should return getAllPurchaseDetails unsuccessful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getAllPurchaseDetails(request, response); + expect(JSON.parse(response._getData())).to.have.property('status'); + expect(JSON.parse(response._getData())).to.have.property('data'); + expect(JSON.parse(response._getData()).data).to.have.property('name'); + expect(JSON.parse(response._getData()).data).to.have.property('message'); + }); + + it('should return getPurchaseDetailsOnSelectedAsset successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'POST', + url: 'test', + data: { + sellAsset: "EUR", + buyAsset: "litecoin", + sellAmount: "450.00" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await sinon + .stub(assetApi, 'getPurchaseDetailsOnSelectedAsset') + .returns({ + "status": "success", + "data": { + "buyAsset": "litecoin", + "sellAsset": "EUR", + "providers": [ + { + "providerId": "idmoonpay", + "minSellAmount": "30.00000000", + "maxSellAmount": "10000.00000000", + "sellAmount": "450.00", + "buyAmount": "6.901", + "rate": "62.38709614", + "precision": "2", + "networkFee": "0.06000000", + "transactionFee": "19.38000000" + } + ] + } + }); + const res = await assetApi.getPurchaseDetailsOnSelectedAsset(request, response); + expect(res).to.have.property('status'); + expect(res).to.have.property('data'); + expect(res.data).to.have.property('buyAsset'); + expect(res.data).to.have.property('sellAsset'); + expect(res.data.providers[0]).to.have.property('providerId'); + expect(res.data.providers[0]).to.have.property('minSellAmount'); + expect(res.data.providers[0]).to.have.property('maxSellAmount'); + expect(res.data.providers[0]).to.have.property('sellAmount'); + expect(res.data.providers[0]).to.have.property('buyAmount'); + expect(res.data.providers[0]).to.have.property('rate'); + expect(res.data.providers[0]).to.have.property('precision'); + expect(res.data.providers[0]).to.have.property('networkFee'); + expect(res.data.providers[0]).to.have.property('transactionFee'); + }); + + it('should return getPurchaseDetailsOnSelectedAsset unsuccessful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getPurchaseDetailsOnSelectedAsset(request, response); + expect(JSON.parse(response._getData())).to.have.property('status'); + expect(JSON.parse(response._getData())).to.have.property('data'); + expect(JSON.parse(response._getData()).data).to.have.property('name'); + expect(JSON.parse(response._getData()).data).to.have.property('message'); + }); + + it('should return createPurchaseDetails successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'POST', + url: 'test', + params: { + zelid: "1BoatSLRHtKNngkdXEeobR76b53LETtpyT" + }, + data: { + providerId: "idmoonpay", + sellAsset: "USD", + buyAsset: "bitcoin", + sellAmount: "300", + buyAddress: "1CbErtneaX2QVyUfwU7JGB7VzvPgrgc3uC" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await sinon + .stub(assetApi, 'createPurchaseDetails') + .returns({ + "status": "success", + "data": { + "providerId": "idmoonpay", + "zelid": "1BoatSLRHtKNngkdXEeobR76b53LETtpyT", + "createdAt": 1671365683080, + "status": "new", + "sellAsset": "USD", + "providerSellAssetId": "usd", + "buyAsset": "bitcoin", + "providerBuyAssetId": "btc", + "buyAddress": "1CbErtneaX2QVyUfwU7JGB7VzvPgrgc3uC", + "buyAddressExtraId": null, + "sellAmount": "300.00", + "buyAmount": "0.01657", + "rate": "17313.08623661", + "widget": "https://buy-sandbox.moonpay.com?apiKey=pk_test_1LCSMjhCP0H5FSywT0MJSPPNjLmJvv&theme=dark¤cyCode=btc&baseCurrencyCode=usd&walletAddress=1CbErtneaX2QVyUfwU7JGB7VzvPgrgc3uC&baseCurrencyAmount=300.00&walletAddressTag=1BoatSLRHtKNngkdXEeobR76b53LETtpyT&redirectURL=zel%3A&colorCode=#C556E2&signature=38770a45323a97a63aef2f0c0875af2a95d49305971078882cebec986491517e" + } + }); + const res = await assetApi.createPurchaseDetails(request, response); + expect(res).to.have.property('status'); + expect(res).to.have.property('data'); + expect(res.data).to.have.property('providerId'); + expect(res.data).to.have.property('zelid'); + expect(res.data).to.have.property('status'); + expect(res.data).to.have.property('sellAsset'); + expect(res.data).to.have.property('providerSellAssetId'); + expect(res.data).to.have.property('buyAsset'); + expect(res.data).to.have.property('providerBuyAssetId'); + expect(res.data).to.have.property('buyAddress'); + expect(res.data).to.have.property('buyAddressExtraId'); + expect(res.data).to.have.property('sellAmount'); + expect(res.data).to.have.property('buyAmount'); + expect(res.data).to.have.property('rate'); + expect(res.data).to.have.property('widget'); + }); + + it('should return createPurchaseDetails unsuccessful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.createPurchaseDetails(request, response); + expect(JSON.parse(response._getData())).to.have.property('status'); + expect(JSON.parse(response._getData())).to.have.property('data'); + expect(JSON.parse(response._getData()).data).to.have.property('name'); + expect(JSON.parse(response._getData()).data).to.have.property('message'); + }); + + it('should return getAllPurchaseStatus successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'POST', + url: 'test', + data: { + providerId: "idmoonpay", + purchaseId: "58f9cce7-abcb-4468-96f1-d0bc75000ec4" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await sinon + .stub(assetApi, 'getAllPurchaseStatus') + .returns({ + "status": "success", + "data": "finished" + }); + const res = await assetApi.getAllPurchaseStatus(request, response); + expect(res).to.have.property('status'); + expect(res).to.have.property('data'); + }); + + it('should return getAllPurchaseStatus unsuccessful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + purchaseid: "58f9cce7-abcb-4468-96f1-d0bc75000ec4", + providerid: "idmoonpay" + } + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + await assetApi.getAllPurchaseStatus(request, response); + expect(JSON.parse(response._getData())).to.have.property('status'); + expect(JSON.parse(response._getData())).to.have.property('data'); + expect(JSON.parse(response._getData()).data).to.have.property('name'); + expect(JSON.parse(response._getData()).data).to.have.property('message'); + }); + }); +}); diff --git a/tests/unit/tokenApi.spec.ts b/tests/unit/tokenApi.spec.ts new file mode 100644 index 0000000..76e87b6 --- /dev/null +++ b/tests/unit/tokenApi.spec.ts @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck test suite +import chai from 'chai'; +import tokenApi from '../../src/apiServices/tokenApi'; +import sinon from 'sinon'; +import httpMocks from 'node-mocks-http'; + +const { expect } = chai; + +describe('Token API', function () { + describe('Token API: Correctly verifies asset data', function () { + afterEach(function () { + sinon.restore(); + }); + + it('should return getTokenInfo successful result if value is valid', async function () { + const request = httpMocks.createRequest({ + method: 'GET', + url: 'test', + params: { + network: "eth", + address: "0x455e53cbb86018ac2b8092fdcd39d8444affc3f6" + } + }); + await sinon + .stub(tokenApi, 'getTokenInfo') + .returns({ + decimal: "18", + logo: "http://eth.svg", + name: "Ethereum", + symbol: "eth" + }); + const response = httpMocks.createResponse({ + eventEmiiter: require('events').EventEmitter, + req: request, + }); + const res = await tokenApi.getTokenInfo(request, response); + expect(res).to.have.property('decimal'); + expect(res).to.have.property('logo'); + expect(res).to.have.property('name'); + expect(res).to.have.property('symbol'); + }); + }); +});