@algodex/algodex-sdk-patch
Version:
API calls for interacting with the Algorand blockchain
369 lines (272 loc) • 13.2 kB
JavaScript
const algodex = require('../algodex_internal_api.js')
const testWallet = 'DFV2MR2ILEZT5IVM6ZKJO34FTRROICPSRQYIRFK4DHEBDK7SQSA4NEVC2Q';
const indexerHost = 'algoindexer.testnet.algoexplorerapi.io';
const algodHost = 'node.testnet.algoexplorerapi.io';
const protocol = 'https:';
const transactionGenerator = require('../generate_transaction_types.js');
const algodexApi = require('../algodex_api.js');
const testHelper = require('../test_helper.js')
const algosdk = require('algosdk');
const CONSTANTS = require('../constants.js')
const orderBookEntry = require('./fixtures/allOrderBooks.js')
let emptyWallet = 'KDGKRDPA7KQBBJWF2JPQGKAM6JDO43JWZAK3SJOW25DAXNQBLRB3SKRULA'
const JEST_MINUTE_TIMEOUT = 60 * 1000
const internalTests = require('./integration_tests/AlgodexInternal.js')
const axios = require('axios').default;
const ALGO_ESCROW_ORDER_BOOK_ID = 18988007;
const ASA_ESCROW_ORDER_BOOK_ID = 18988134;
const config = {
appId: -1,
creatorAccount: testHelper.getRandomAccount(),
executorAccount: testHelper.getRandomAccount(),
openAccount: testHelper.getOpenAccount(),
maliciousAccount: testHelper.getRandomAccount(),
client: testHelper.getLocalClient(),
assetId: 15322902,
};
test('generateOrder function', () => {
let params = [testWallet, 1000, 54, 0, 15322902]
let incldMakerorder = algodex.generateOrder(...params)
expect(incldMakerorder).toEqual(`${testWallet}-1000-54-0-15322902`)
params.push(false);
let noMakerOrder = algodex.generateOrder(...params)
expect(noMakerOrder).toEqual(`1000-54-0-15322902`)
});
test('getAccountInfo function', async () => {
let emptyAccountVal = {
"address": emptyWallet,
"amount": 0, "amount-without-pending-rewards": 0, "apps-local-state": [],
"apps-total-schema": { "num-byte-slice": 0, "num-uint": 0 }, "assets": [],
"created-apps": [], "created-assets": [], "pending-rewards": 0,
"reward-base": 0, "rewards": 0, "round": -1, "status": "Offline"
}
let accountInfo = await algodex.getAccountInfo(testWallet);
expect(typeof accountInfo).toBe('object');
expect(accountInfo.amount > 0).toBe(true)
let emptyAccount = await algodex.getAccountInfo(emptyWallet)
expect(emptyAccount).toStrictEqual(emptyAccountVal)
let nullAccount = await algodex.getAccountInfo(emptyWallet, false)
expect(nullAccount).toBe(null)
});
test('getQueuedTakerOrders function', async () => {
let allOrderBookOrders = [
{ escrowOrderType: 'sell', price: 2.33 },
{ escrowOrderType: 'buy', price: 2.03 },
{ escrowOrderType: 'sell', price: 2.80 },
{ escrowOrderType: 'sell', price: 2.64 },
{ escrowOrderType: 'buy', price: 1.97 },
{ escrowOrderType: 'sell', price: 2.63 },
{ escrowOrderType: 'sell', price: 2.22 },
{ escrowOrderType: 'buy', price: 1.89 }
]
let undefinedTakerOrders = algodex.getQueuedTakerOrders(testWallet, true, null)
expect(undefinedTakerOrders).toEqual(undefined)
let emptyTakerOrders = algodex.getQueuedTakerOrders(testWallet, true, [])
expect(emptyTakerOrders).toEqual(undefined)
let queuedBuyOrders = algodex.getQueuedTakerOrders(testWallet, false, allOrderBookOrders)
expect(Array.isArray(queuedBuyOrders)).toBe(true)
expect(queuedBuyOrders[0].escrowOrderType).toEqual('sell')
expect(queuedBuyOrders[0].price).toEqual(2.22)
let queuedSellOrders = algodex.getQueuedTakerOrders(testWallet, true, allOrderBookOrders)
expect(queuedSellOrders[0].escrowOrderType).toEqual('buy')
expect(queuedSellOrders[0].price).toEqual(2.03)
})
// test('initSmartContract', () => {
// jest.spyOn(algodexApi, "initSmartContracts").mockReturnValue('d')
// expect(algodexApi.initSmartContracts(-1, -1)).toBe('d')
// });
test('initAlgodClient properly sets', () => {
let algodServer = CONSTANTS.LOCAL_ALGOD_SERVER;
let port = CONSTANTS.LOCAL_ALGOD_PORT;
let token = CONSTANTS.LOCAL_ALGOD_TOKEN;
jest.spyOn(algodexApi, "initAlgodClient").mockReturnValue(new algosdk.Algodv2(token, algodServer, port))
});
test('createTransactionFromLsig', async () => {
let optIn = await internalTests.createTransactionFromLsig(config, 2000, false, true)
expect(optIn).toBeTruthy()
let noOptIn = await internalTests.createTransactionFromLsig(config, 2000, false, false)
expect(noOptIn).toBeTruthy()
}, JEST_MINUTE_TIMEOUT)
// test(' getLsigFromProgramSource', async () => {
// })
test('waitForConfirmation', async() => {
algodexApi.initSmartContracts('test')
const successCase = jest.spyOn(axios, 'get').mockImplementation((url ) => {
if (url) {
return Promise.resolve({
data: {
txId: 'fakeId',
status: "confirmed",
statusMsg: `Transaction confirmed in round fakeRound`,
transaction: { "amount": 'fake', "wallet": 'fake', "confirmed-round": 2 }
}
});
} else {
throw new Error("Url was not passed into Axios request in waitForConfirmation fn()")
}
})
expect(await algodex.waitForConfirmation('fakeTxId')).toBeTruthy()
successCase.mockRestore();
const poolErrorCase = jest.spyOn(axios, 'get').mockImplementation((url ) => {
if (url) {
return Promise.resolve({
data: {
txId: 'fakeId',
status: "confirmed",
statusMsg: `Transaction confirmed in round fakeRound`,
transaction: { "amount": 'fake', "wallet": 'fake', "pool-error": [1,2] }
}
});
}else {
throw new Error("Url was not passed into Axios request in waitForConfirmation fn()")
}
})
expect(await algodex.waitForConfirmation('fakeTxId')).toBeTruthy()
poolErrorCase.mockRestore()
}, JEST_MINUTE_TIMEOUT)
test('printTransactionDebug', async() => {
algodexApi.initSmartContracts('test')
const mockedBuffer = jest.spyOn(Buffer, 'concat').mockImplementation((signedTxns ) => {
if(signedTxns) {
return "fakeBufferCalled"
} else {
throw new Error("Url was not passed into Axios request in printTransactionDebug fn()")
}
})
const mockedAxios = jest.spyOn(axios, 'post').mockImplementation((url ) => {
if (url) {
return Promise.resolve({
data: {
name: 'fakedPost response for transaction debug',
transaction: { "amount": 'fake', "wallet": 'fake', "pool-error": [1,2] }
}
});
}else {
throw new Error("Url was not passed into Axios post request in printTransactionDebug fn()")
}
})
process.env.NEXT_PUBLIC_DEBUG_SMART_CONTRACT_SOURCE = '1'
process.env.ALGODEX_INFO_HOST = "notempty"
// const constantDebugMock = jest.spyOn(CONSTANTS, "DEBUG_SMART_CONTRACT_SOURCE").mockImplementation(() => 1)
expect(algodex.printTransactionDebug(['signedTxns', 'faked'])).toBe(undefined)
process.env.DEBUG_SMART_CONTRACT_SOURCE = undefined
process.env.ALGODEX_INFO_HOST = undefined
// above mock isn't working. I may have to mock entire constants module.
mockedBuffer.mockRestore();
mockedAxios.mockRestore();
// constantDebugMock.mockRestore();
}, JEST_MINUTE_TIMEOUT)
test(' formatTransactionWithMetaData', async () => {
let result = await internalTests.formatMetaData(config, 'close', 'asa')
expect(result).toBeTruthy()
console.log(result)
// console.log(await internalTests.formatMetaData(config, 'error', 'asa'))
expect(result[0]["note"]).toBeTruthy()
})
test('getExecuteOrderTransactionsAsTakerFromOrderEntry', async () => {
let asaResult = await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, true)
expect(asaResult).toBeTruthy()
let algoResult = await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, false)
expect(algoResult).toBeTruthy()
let walletConnector={connector: {connected: true}}
let walletConnectorAsaResult = await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, true, false, walletConnector )
expect(walletConnectorAsaResult).toBeTruthy()
let walletConnectorAlgoResult = await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, false, false, walletConnector )
expect(walletConnectorAlgoResult).toBeTruthy()
try {
await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, false, true)
// error for algoOrders
} catch (e) {
expect(e.message).toBe("client.compile is not a function");
}
try {
await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, true, true)
// error for AsaOrders
} catch (e) {
expect(e.message).toBe("client.compile is not a function");
}
}, JEST_MINUTE_TIMEOUT);
// expect(await internalTests.getExecuteOrderTransactionsAsTakerFromOrderEntry(config, true, true)).toThrow("client.compile is not a function")
test('doAlertInternal', () => {
const jsdomAlert = global.alert;
global.alert = () => { };
expect(algodex.doAlertInternal()).toBe(undefined)
global.alert = jsdomAlert;
})
test('getExecuteASAOrderTakerTxnAmounts', () => {
let takerOrderBalance = {
"asaBalance": 995.9999999999999,
"algoBalance": 11030,
"walletAlgoBalance": 11030,
"walletASABalance": 8755,
"limitPrice": 2000,
"takerAddr": "4Z5ZYJXBT5OJH3HKHLBD3O7QNKG5T5YQL7CXIEN6XHDJPXYJMTHBKRU6EE",
"walletMinBalance": 1500000,
"takerIsOptedIn": true
}
let asaAmountLargerResult = algodex.getExecuteASAOrderTakerTxnAmounts(takerOrderBalance, orderBookEntry[0])
expect(asaAmountLargerResult).toBeTruthy()
let orderBookEntryWithZero= {...orderBookEntry[0], asaBalance:.001}
let escrowAsaAmountZero = algodex.getExecuteASAOrderTakerTxnAmounts(takerOrderBalance, orderBookEntryWithZero)
expect(escrowAsaAmountZero).toBeTruthy()
})
test('buildDelegateTemplateFromArgs', () => {
let {n, d, isAsaEscrow, orderCreatorAddr, assetId } = orderBookEntry[0]
let asaV6= algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, true, 6)
expect(asaV6).toBeTruthy();
let asaV5 = algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, true, 5)
expect(asaV5).toBeTruthy();
let asaV4 = algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, true, 4)
expect(asaV4).toBeTruthy();
let asaV3 = algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, true, 3)
expect(asaV3).toBeTruthy();
let algoV6= algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, false, 6)
expect(algoV6).toBeTruthy();
let algoV5 = algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, false, 5)
expect(algoV5).toBeTruthy();
let algoV4 = algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, false, 4)
expect(algoV4).toBeTruthy();
let algoV3 = algodex.buildDelegateTemplateFromArgs(0, assetId, n, d, orderCreatorAddr, false, 3)
expect(algoV3).toBeTruthy();
try {
expect(algodex.buildDelegateTemplateFromArgs('error', assetId, n, d, orderCreatorAddr, isAsaEscrow, 2)).toBe(null)
// error for AsaOrders
} catch (e) {
expect(e).toBe("one or more null arguments in buildDelegateTemplateFromArgs!");
}
});
test('closeOrder', async () => {
let client = config.client
let mockRawTransactions= new function(signed) {
this.do = () => {return {txId :signed}}
}()
client.sendRawTransaction = jest.fn(() => mockRawTransactions)
algodex.waitForConfirmation= jest.fn((txId) => true)
algodex.printTransactionDebug = jest.fn(() => console.debug('mockedTransactionDebug'))
expect(await internalTests.closeOrder(client, config)).toBeTruthy()
}, JEST_MINUTE_TIMEOUT)
test('closeASAOrder', async () => {
let client = config.client
let mockRawTransactions= new function(signed) {
this.do = () => {return {txId :signed}}
}()
client.sendRawTransaction = jest.fn(() => mockRawTransactions)
algodex.waitForConfirmation= jest.fn((txId) => true)
algodex.printTransactionDebug = jest.fn(() => console.debug('mockedTransactionDebug'))
expect(await internalTests.closeASAOrder(client, config)).toBeTruthy()
}, JEST_MINUTE_TIMEOUT)
test('imported algodex is an object', () => {
expect(typeof algodex).toBe('object');
});
test('setAlgodServer properly sets', () => {
let response = algodex.setAlgodServer('test')
});
test('setAlgodToken properly sets', () => {
let response = algodex.setAlgodToken('test')
});
test('setAlgodIndexer properly sets', () => {
let response = algodex.setAlgodIndexer('test')
});
test('setAlgodPort properly sets', () => {
let response = algodex.setAlgodPort('test')
});