"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bitcore_client_1 = require("@bitpay-labs/bitcore-client");
const chai_1 = require("chai");
const config_1 = __importDefault(require("../../../src/config"));
const wallet_1 = require("../../../src/models/wallet");
const walletAddress_1 = require("../../../src/models/walletAddress");
const rpc_1 = require("../../../src/rpc");
const api_1 = require("../../../src/services/api");
const event_1 = require("../../../src/services/event");
const integration_1 = require("../../helpers/integration");
describe('Wallet Model', function () {
    // eslint-disable-next-line @typescript-eslint/no-this-alias
    const suite = this;
    this.timeout(50000);
    let lockedWallet;
    const walletName = 'Test Wallet';
    const password = 'iamsatoshi';
    const chain = 'BTC';
    const network = 'regtest';
    let chainConfig;
    let creds;
    let rpc;
    before(async function () {
        chainConfig = config_1.default.chains[chain][network];
        creds = chainConfig.rpc;
        rpc = new rpc_1.AsyncRPC(creds.username, creds.password, creds.host, creds.port);
        await (0, integration_1.intBeforeHelper)();
    });
    after(async () => (0, integration_1.intAfterHelper)(suite));
    before(async () => {
        await event_1.Event.start();
        await api_1.Api.start();
    });
    after(async () => {
        await event_1.Event.stop();
        await api_1.Api.stop();
    });
    describe('Wallet Create', () => {
        it('should return a locked wallet on create', async () => {
            const baseUrl = 'http://localhost:3000/api';
            lockedWallet = await bitcore_client_1.Wallet.create({
                name: walletName,
                chain,
                network,
                baseUrl,
                password
            });
            (0, chai_1.expect)(lockedWallet).to.have.includes({
                name: walletName,
                chain,
                network,
                baseUrl: 'http://localhost:3000/api'
            });
            (0, chai_1.expect)(lockedWallet).to.have.property('pubKey');
            (0, chai_1.expect)(lockedWallet).to.have.property('password');
            (0, chai_1.expect)(lockedWallet).to.have.property('authKey');
            (0, chai_1.expect)(lockedWallet).to.have.property('encryptionKey');
            const findCreatedWallet = await wallet_1.WalletStorage.collection
                .find({
                name: walletName,
                chain,
                network
            })
                .toArray();
            (0, chai_1.expect)(findCreatedWallet[0]).to.includes({
                name: walletName,
                chain,
                network,
                path: null,
                singleAddress: null
            });
            (0, chai_1.expect)(findCreatedWallet[0]).to.have.property('pubKey');
            (0, chai_1.expect)(findCreatedWallet[0]).to.have.property('path');
            (0, chai_1.expect)(findCreatedWallet[0]).to.have.property('singleAddress');
        });
    });
    describe('Wallet functions', () => {
        let address1;
        it('should generate addresses using rpc then import to wallet', async () => {
            address1 = await rpc.getnewaddress('');
            const importAddressJSON = {
                keys: [{ address: address1 }]
            };
            const unlockedWallet = await lockedWallet.unlock(password);
            await unlockedWallet.importKeys(importAddressJSON);
            const findWalletResult = await wallet_1.WalletStorage.collection.findOne({
                name: walletName,
                chain,
                network
            }, { sort: { _id: -1 } });
            (0, chai_1.expect)(findWalletResult?._id).to.exist;
            const findAddressResult = await walletAddress_1.WalletAddressStorage.collection
                .find({
                wallet: findWalletResult?._id,
                chain,
                network,
                address: address1
            })
                .toArray();
            (0, chai_1.expect)(findAddressResult[0]).to.exist;
            (0, chai_1.expect)(findAddressResult[0]).to.have.deep.property('chain', chain);
            (0, chai_1.expect)(findAddressResult[0]).to.have.deep.property('network', network);
            (0, chai_1.expect)(findAddressResult[0]).to.have.deep.property('wallet', findWalletResult?._id);
            (0, chai_1.expect)(findAddressResult[0]).to.have.deep.property('address', address1);
            (0, chai_1.expect)(findAddressResult[0]).to.have.deep.property('processed', true);
        });
    });
});
//# sourceMappingURL=wallet.test.js.map