UNPKG

futoin-xferengine

Version:

Neutral clustered multi-currency transaction engine with limits

1,175 lines (1,025 loc) 49.4 kB
'use strict'; const expect = require( 'chai' ).expect; const moment = require( 'moment' ); const Executor = require( 'futoin-executor/Executor' ); const SpecTools = require( 'futoin-invoker/SpecTools' ); // SpecTools.on('error', function() { console.log(arguments); } ); module.exports = function( describe, it, vars ) { let as; let ccm; let executor; beforeEach( 'common', function() { ccm = vars.ccm; as = vars.as; executor = vars.executor; } ); describe( 'Gaming', function() { const LimitsFace = require( '../LimitsFace' ); const LimitsService = require( '../LimitsService' ); const InfoFace = require( '../Currency/InfoFace' ); const InfoService = require( '../Currency/InfoService' ); const AccountsFace = require( '../AccountsFace' ); const AccountsService = require( '../AccountsService' ); const PeerFace = require( '../PeerFace' ); const PeerService = require( '../PeerService' ); const XferTools = require( '../XferTools' ); const PaymentFace = require( '../PaymentFace' ); const PaymentService = require( '../PaymentService' ); const GamingFace = require( '../GamingFace' ); const GamingService = require( '../GamingService' ); const BonusFace = require( '../BonusFace' ); const BonusService = require( '../BonusService' ); let system_account; let account_holder; let user_account; let game_account; let user_transit; let game_transit; let peer1_external; let peer2_external; let bonus_source; const user_ext_id = 'GamingUser'; const user_transit_ext_id = 'GamingTransitUser'; const checkBalance = ( as, account, balance ) => { ccm.iface( 'xfer.accounts' ).getAccount( as, account ); if ( typeof balance === 'string' ) { as.add( ( as, info ) => expect( info.balance ).to.equal( balance ) ); } else { as.add( ( as, info ) => expect( info.balance ).to.oneOf( balance ) ); } }; beforeEach( 'payments', function() { as.add( ( as ) => { InfoService.register( as, executor ); InfoFace.register( as, ccm, 'currency.info', executor ); LimitsService.register( as, executor ); LimitsFace.register( as, ccm, 'xfer.limits', executor ); AccountsService.register( as, executor ); AccountsFace.register( as, ccm, 'xfer.accounts', executor ); PaymentService.register( as, executor ); PaymentFace.register( as, ccm, 'xfer.payments', executor ); GamingService.register( as, executor ); GamingFace.register( as, ccm, 'xfer.gaming', executor ); BonusService.register( as, executor ); BonusFace.register( as, ccm, 'xfer.bonus', executor ); PeerService.register( as, executor ); // const secprov = vars.secprov; const inner_executor = new Executor( ccm, { securityProvider: secprov } ); inner_executor.on( 'notExpected', function() { console.log( arguments ); } ); const basvc = secprov._auth_svc; basvc.addUser( 'game_peer1', 'pwd', null, true ); basvc._user_ids[ 1 ].info.global_id = 'game_peer1'; basvc.addUser( 'game_peer2', 'pwd', null, true ); basvc._user_ids[ 2 ].info.global_id = 'game_peer2'; // mock class FakeGamingService extends GamingService { _mockParams( reqinfo ) { const p = reqinfo.params(); expect( p.user ).to.equal( user_transit_ext_id ); p.user = user_ext_id; } bet( as, reqinfo ) { this._mockParams( reqinfo ); super.bet( as, reqinfo ); } cancelBet( as, reqinfo ) { this._mockParams( reqinfo ); super.cancelBet( as, reqinfo ); } win( as, reqinfo ) { this._mockParams( reqinfo ); super.win( as, reqinfo ); } gameBalance( as, reqinfo ) { this._mockParams( reqinfo ); super.gameBalance( as, reqinfo ); } } FakeGamingService.register( as, inner_executor ); ccm.registerOnDemand( GamingFace.IFACE_NAME, 'mock', ( as, ccm, alias, api ) => { GamingFace.register( as, ccm, alias, inner_executor ); } ); ccm.registerOnDemand( PeerFace.IFACE_NAME, 'mock', ( as, ccm, alias, api ) => { PeerFace.register( as, ccm, alias, executor, api.credentials ); } ); }, ( as, err ) => { console.log( err ); console.log( as.state.error_info ); console.log( as.state.last_exception ); } ); as.add( ( as ) => { if ( system_account ) { return; } const xferlim = ccm.iface( 'xfer.limits' ); xferlim.addLimitGroup( as, 'GamingUserTest' ); xferlim.setLimits( as, 'GamingUserTest', 'Payments', 'I:EUR', { outbound_daily_amt : "0.00", outbound_daily_cnt : 100, inbound_daily_amt : "100.00", inbound_daily_cnt : 100, outbound_weekly_amt : "500.00", outbound_weekly_cnt : 100, inbound_weekly_amt : "500.00", inbound_weekly_cnt : 100, outbound_monthly_amt : "10000.00", outbound_monthly_cnt : 1000, inbound_monthly_amt :"10000.00", inbound_monthly_cnt : 1000, outbound_min_amt : "0.01", }, false, false ); xferlim.setLimits( as, 'GamingUserTest', 'Gaming', 'I:EUR', { bet_daily_amt : "100", bet_daily_cnt : 100, win_daily_amt : "100", win_daily_cnt : 100, profit_daily_amt : "100", bet_weekly_amt : "100", bet_weekly_cnt : 100, win_weekly_amt : "100", win_weekly_cnt : 100, profit_weekly_amt : "100", bet_monthly_amt : "100", bet_monthly_cnt : 100, win_monthly_amt : "100", win_monthly_cnt : 100, profit_monthly_amt : "100", bet_min_amt : "0.10", }, false, false ); xferlim.setLimits( as, 'GamingUserTest', 'Misc', 'I:EUR', { message_daily_cnt : 1000, failure_daily_cnt : 1000, limithit_daily_cnt : 1000, message_weekly_cnt : 1000, failure_weekly_cnt : 1000, limithit_weekly_cnt : 1000, message_monthly_cnt : 1000, failure_monthly_cnt : 1000, limithit_monthly_cnt : 1000, }, false, false ); xferlim.addLimitGroup( as, 'GamingSystemTest' ); xferlim.setLimits( as, 'GamingSystemTest', 'Payments', 'I:EUR', { outbound_daily_amt : "1000.00", outbound_daily_cnt : 1000, inbound_daily_amt : "1000.00", inbound_daily_cnt : 1000, outbound_weekly_amt : "5000.00", outbound_weekly_cnt : 1000, inbound_weekly_amt : "5000.00", inbound_weekly_cnt : 1000, outbound_monthly_amt : "100000.00", outbound_monthly_cnt : 1000, inbound_monthly_amt :"100000.00", inbound_monthly_cnt : 1000, outbound_min_amt : "0.01", }, false, false ); xferlim.setLimits( as, 'GamingSystemTest', 'Misc', 'I:EUR', { message_daily_cnt : 1000, failure_daily_cnt : 1000, limithit_daily_cnt : 1000, message_weekly_cnt : 1000, failure_weekly_cnt : 1000, limithit_weekly_cnt : 1000, message_monthly_cnt : 1000, failure_monthly_cnt : 1000, limithit_monthly_cnt : 1000, }, false, false ); //-- const xferacct = ccm.iface( 'xfer.accounts' ); xferacct.addAccountHolder( as, 'game_peer1', 'GamingSystemTest', true, true, {}, { api: { 'futoin.xfer.gaming': { flavour: 'mock', }, 'futoin.xfer.peer': { flavour: 'mock', credentials: 'game_peer2:pwd', }, }, } ); as.add( ( as, holder ) => { const xt = new XferTools( ccm, 'Payments' ); xt.pairPeer( as, holder, 'I:EUR' ); as.add( ( as, id ) => peer1_external = id ); xferacct.getAccountHolderExt( as, 'game_peer2' ); as.add( ( as, info ) => { xferacct.updateAccountHolder( as, info.id, 'GamingSystemTest' ); xferacct.setOverdraft( as, peer1_external, 'I:EUR', '100.00' ); xferacct.getAccount( as, peer1_external ); as.add( ( as, info ) => { peer2_external = info.ext_id; //xferacct.setOverdraft( as, info.ext_id, 'I:EUR', '100.00' ); } ); } ); } ); xferacct.addAccountHolder( as, 'GamingSystem', 'GamingSystemTest', true, true, {}, {} ); as.add( ( as, holder ) => { xferacct.addAccount( as, holder, 'System', 'I:EUR', 'Source' ); as.add( ( as, id ) => system_account = id ); xferacct.addAccount( as, holder, 'System', 'I:EUR', 'Bonus Source' ); as.add( ( as, id ) => bonus_source = id ); xferacct.addAccount( as, holder, 'External', 'I:EUR', 'Game' ); as.add( ( as, id ) => game_account = id ); as.add( ( as ) => xferacct.addAccount( as, holder, 'Transit', 'I:EUR', 'Game Transit', true, game_account, peer1_external ) ); as.add( ( as, id ) => game_transit = id ); } ); xferacct.addAccountHolder( as, user_ext_id, 'GamingUserTest', true, true, {}, {} ); as.add( ( as, holder ) => { account_holder = holder; xferacct.addAccount( as, holder, 'Regular', 'I:EUR', 'Main' ); as.add( ( as, id ) => user_account = id ); } ); xferacct.addAccountHolder( as, user_transit_ext_id, 'GamingUserTest', true, true, {}, {} ); as.add( ( as, holder ) => { xferacct.addAccount( as, holder, 'Transit', 'I:EUR', 'Main', true, user_account, peer1_external ); as.add( ( as, id ) => user_transit = id ); } ); }, ( as, err ) => { console.log( err ); console.log( as.state.error_info ); } ); } ); it ( 'should process bonus operations', function( done ) { this.timeout( 5e3 ); as.add( ( as ) => { const payments = ccm.iface( 'xfer.payments' ); const gaming = ccm.iface( 'xfer.gaming' ); const bonus = ccm.iface( 'xfer.bonus' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '0.00' ) ); //--- for ( let i = 0; i < 2; ++i ) { as.add( ( as ) => as.state.test_name = `Claim #1 ${i}` ); bonus.claimBonus( as, user_ext_id, bonus_source, 'Bonus 1', 'I:EUR', '10.00', 'B1', {}, moment.utc().format() ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '10.00' ) ); } //--- for ( let i = 0; i < 2; ++i ) { as.add( ( as ) => as.state.test_name = `Claim #2 ${i}` ); bonus.claimBonus( as, user_ext_id, bonus_source, 'Bonus 2', 'I:EUR', '5.00', 'B2', {}, moment.utc().format() ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '15.00' ) ); } //--- for ( let i = 0; i < 2; ++i ) { as.add( ( as ) => as.state.test_name = `Clear #1 ${i}` ); bonus.clearBonus( as, user_ext_id, bonus_source, 'B1' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '5.00' ) ); } //--- for ( let i = 0; i < 2; ++i ) { as.add( ( as ) => as.state.test_name = `Release #2 ${i}` ); bonus.releaseBonus( as, user_ext_id, bonus_source, 'B2' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '5.00' ) ); } checkBalance( as, user_account, '5.00' ); as.add( ( as ) => as.state.test_name = `OriginalMismatch` ); as.add( ( as ) => { bonus.claimBonus( as, user_ext_id, bonus_source, 'Bonus 1', 'I:USD', '10.00', 'B1', {}, moment.utc().format() ); as.add( ( as ) => as.error( 'Fail' ) ); }, ( as, err ) => { if ( err === 'OriginalMismatch' ) { as.success(); } } ); as.add( ( as ) => as.state.test_name = `AlreadyCanceled` ); as.add( ( as ) => { bonus.releaseBonus( as, user_ext_id, bonus_source, 'B1' ); as.add( ( as ) => as.error( 'Fail' ) ); }, ( as, err ) => { if ( err === 'AlreadyCanceled' ) { as.success(); } } ); as.add( ( as ) => as.state.test_name = `AlreadyReleased` ); as.add( ( as ) => { bonus.clearBonus( as, user_ext_id, bonus_source, 'B2' ); as.add( ( as ) => as.error( 'Fail' ) ); }, ( as, err ) => { if ( err === 'AlreadyReleased' ) { as.success(); } } ); }, ( as, err ) => { console.log( as.state.test_name ); console.log( err ); console.log( as.state.error_info ); done( as.state.last_exception || 'Fail' ); } ); as.add( ( as ) => done() ); as.execute(); } ); it ( 'should process games', function( done ) { this.timeout( 5e3 ); as.add( ( as ) => { const payments = ccm.iface( 'xfer.payments' ); const gaming = ccm.iface( 'xfer.gaming' ); for ( let i = 0; i < 2; ++i ) { as.add( ( as ) => as.state.test_name = `On inbound ${i}` ); payments.onInbound( as, bonus_source, system_account, 'I:EUR', '5.00', 'TB', {}, moment.utc().format() ); payments.onInbound( as, user_account, system_account, 'I:EUR', '45.00', 'T1', {}, moment.utc().format() ); payments.onInbound( as, game_account, system_account, 'I:EUR', '10.00', 'T2', {}, moment.utc().format() ); if ( i === 0 ) { checkBalance( as, user_account, '50.00' ); checkBalance( as, game_account, '10.00' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `On bet #1 ${i}` ); as.add( ( as ) => { gaming.bet( as, user_ext_id, game_account, 'I:EUR', '0.40', 'G1', 'B1', {}, moment.utc().format() ); if ( i ) { as.add( ( as ) => as.error( 'Fail' ) ); } else { as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( '49.60' ); expect( bonus_part ) .to.equal( '0.00' ); } ); } }, ( as, err ) => { if ( i && err === 'AlreadyCanceled' ) { as.success(); } } ); if ( i === 0 ) { checkBalance( as, user_account, '49.60' ); checkBalance( as, game_account, '10.40' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `On bet #2 ${i}` ); gaming.bet( as, user_ext_id, game_account, 'I:EUR', '1.60', 'G1', 'B2', {}, moment.utc().format() ); as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( i ? '53.40' : '48.00' ); expect( bonus_part ) .to.equal( '0.00' ); } ); if ( i === 0 ) { checkBalance( as, user_account, '48.00' ); checkBalance( as, game_account, '12.00' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `Cancel bet #1 ${i}` ); gaming.cancelBet( as, user_ext_id, game_account, 'I:EUR', '0.40', 'G1', 'B1', {}, moment.utc().format(), "Some reason" ); as.add( ( as, { balance } ) => { expect( balance ) .to.equal( i ? '53.40' : '48.40' ); } ); if ( i === 0 ) { checkBalance( as, user_account, '48.40' ); checkBalance( as, game_account, '11.60' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `On win #1 ${i}` ); gaming.win( as, user_ext_id, game_account, 'I:EUR', '5.00', 'G1', 'W1', {}, moment.utc().format() ); as.add( ( as, { balance } ) => { expect( balance ) .to.equal( '53.40' ); } ); } checkBalance( as, user_account, '53.40' ); checkBalance( as, game_account, '6.60' ); checkBalance( as, system_account, '-60.00' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '53.40' ) ); gaming.bet( as, user_ext_id, game_account, 'I:EUR', '3.40', 'G2', 'B3', {}, moment.utc().format() ); checkBalance( as, user_account, '50.00' ); checkBalance( as, game_account, '10.00' ); checkBalance( as, system_account, '-60.00' ); }, ( as, err ) => { console.log( as.state.test_name ); console.log( err ); console.log( as.state.error_info ); done( as.state.last_exception || 'Fail' ); } ); as.add( ( as ) => done() ); as.execute(); } ); it ( 'should process games with peers', function( done ) { this.timeout( 10e3 ); as.add( ( as ) => { const payments = ccm.iface( 'xfer.payments' ); const gaming = ccm.iface( 'xfer.gaming' ); for ( let i = 0; i < 2; ++i ) { if ( i === 0 ) { checkBalance( as, peer1_external, '0.00' ); checkBalance( as, peer2_external, '0.00' ); checkBalance( as, user_account, '50.00' ); checkBalance( as, game_account, '10.00' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `On bet #1 ${i}` ); as.add( ( as ) => { gaming.bet( as, user_transit_ext_id, game_transit, 'I:EUR', '0.40', 'G1', 'B1', {}, moment.utc().format() ); if ( i ) { as.add( ( as ) => as.error( 'Fail' ) ); } else { as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( '49.60' ); expect( bonus_part ) .to.equal( '0.00' ); } ); } }, ( as, err ) => { if ( i && err === 'AlreadyCanceled' ) { as.success(); } } ); checkBalance( as, user_transit, '0.00' ); checkBalance( as, game_transit, '0.00' ); if ( i === 0 ) { checkBalance( as, peer1_external, '0.00' ); checkBalance( as, peer2_external, '0.00' ); checkBalance( as, user_account, '49.60' ); checkBalance( as, game_account, '10.40' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `On bet #2 ${i}` ); gaming.bet( as, user_transit_ext_id, game_transit, 'I:EUR', '1.60', 'G1', 'B2', {}, moment.utc().format() ); as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( i ? '53.40' : '48.00' ); expect( bonus_part ) .to.equal( '0.00' ); } ); checkBalance( as, user_transit, '0.00' ); checkBalance( as, game_transit, '0.00' ); if ( i === 0 ) { checkBalance( as, peer1_external, '0.00' ); checkBalance( as, peer2_external, '0.00' ); checkBalance( as, user_account, '48.00' ); checkBalance( as, game_account, '12.00' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `Cancel bet #1 ${i}` ); gaming.cancelBet( as, user_transit_ext_id, game_transit, 'I:EUR', '0.40', 'G1', 'B1', {}, moment.utc().format(), "Some reason" ); as.add( ( as, { balance } ) => { expect( balance ) .to.equal( i ? '53.40' : '48.40' ); } ); checkBalance( as, user_transit, '0.00' ); checkBalance( as, game_transit, '0.00' ); if ( i === 0 ) { checkBalance( as, peer1_external, '0.00' ); checkBalance( as, peer2_external, '0.00' ); checkBalance( as, user_account, '48.40' ); checkBalance( as, game_account, '11.60' ); checkBalance( as, system_account, '-60.00' ); } as.add( ( as ) => as.state.test_name = `On win #1 ${i}` ); gaming.win( as, user_transit_ext_id, game_transit, 'I:EUR', '5.00', 'G1', 'W1', {}, moment.utc().format() ); as.add( ( as, { balance } ) => { expect( balance ) .to.equal( '53.40' ); } ); } checkBalance( as, user_transit, '0.00' ); checkBalance( as, game_transit, '0.00' ); checkBalance( as, peer1_external, '0.00' ); checkBalance( as, peer2_external, '0.00' ); checkBalance( as, user_account, '53.40' ); checkBalance( as, game_account, '6.60' ); checkBalance( as, system_account, '-60.00' ); gaming.gameBalance( as, user_transit_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '53.40' ) ); gaming.bet( as, user_transit_ext_id, game_transit, 'I:EUR', '3.40', 'G2', 'B3', {}, moment.utc().format() ); checkBalance( as, user_transit, '0.00' ); checkBalance( as, game_transit, '0.00' ); checkBalance( as, peer1_external, '0.00' ); checkBalance( as, peer2_external, '0.00' ); checkBalance( as, user_account, '50.00' ); checkBalance( as, game_account, '10.00' ); checkBalance( as, system_account, '-60.00' ); }, ( as, err ) => { console.log( as.state.test_name ); console.log( err ); console.log( as.state.error_info ); done( as.state.last_exception || 'Fail' ); } ); as.add( ( as ) => done() ); as.execute(); } ); it ( 'should process games with bonus', function( done ) { this.timeout( 5e3 ); as.add( ( as ) => { const payments = ccm.iface( 'xfer.payments' ); const gaming = ccm.iface( 'xfer.gaming' ); const bonus = ccm.iface( 'xfer.bonus' ); checkBalance( as, user_account, '50.00' ); checkBalance( as, game_account, '10.00' ); checkBalance( as, system_account, '-60.00' ); const xt = new XferTools( ccm, 'Deposits' ); xt.processXfer( as, { type: 'Withdrawal', src_account: user_account, dst_account: system_account, amount: '49.80', currency: 'I:EUR', src_limit_prefix: false, dst_limit_prefix: false, } ); checkBalance( as, user_account, '0.20' ); checkBalance( as, game_account, '10.00' ); checkBalance( as, system_account, '-10.20' ); bonus.claimBonus( as, user_ext_id, bonus_source, 'Bonus B1', 'I:EUR', '1.00', 'BB1', {}, moment.utc().format() ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '1.20' ) ); bonus.claimBonus( as, user_ext_id, bonus_source, 'Bonus B2', 'I:EUR', '3.00', 'BB2', {}, moment.utc().format() ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '4.20' ) ); //----------- //----------------------------- // Test with Bonus accounts in place //----------------------------- for ( let i = 0; i < 2; ++i ) { as.add( ( as ) => as.state.test_name = `On bet #1 ${i}` ); as.add( ( as ) => { gaming.bet( as, user_ext_id, game_account, 'I:EUR', '0.50', 'BG1', 'BB1', {}, moment.utc().format() ); if ( i ) { as.add( ( as ) => as.error( 'Fail' ) ); } else { as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( '3.70' ); expect( bonus_part ) .to.equal( '0.30' ); } ); } }, ( as, err ) => { if ( i && err === 'AlreadyCanceled' ) { as.success(); } } ); if ( i === 0 ) { checkBalance( as, user_account, '0.00' ); checkBalance( as, game_account, '10.50' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '3.70' ) ); } as.add( ( as ) => as.state.test_name = `On bet #2 ${i}` ); gaming.bet( as, user_ext_id, game_account, 'I:EUR', '1.60', 'BG1', 'BB2', {}, moment.utc().format() ); as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( i ? '7.60' : '2.10' ); expect( bonus_part ) .to.equal( '1.60' ); } ); if ( i === 0 ) { checkBalance( as, user_account, '0.00' ); checkBalance( as, game_account, '12.10' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '2.10' ) ); } as.add( ( as ) => as.state.test_name = `Cancel bet #1 ${i}` ); gaming.cancelBet( as, user_ext_id, game_account, 'I:EUR', '0.50', 'BG1', 'BB1', {}, moment.utc().format(), "Some reason" ); as.add( ( as, { balance } ) => { expect( balance ) .to.equal( i ? '7.60' : '2.60' ); } ); if ( i === 0 ) { checkBalance( as, user_account, '0.20' ); checkBalance( as, game_account, '11.60' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '2.60' ) ); } as.add( ( as ) => as.state.test_name = `On win #1 ${i}` ); gaming.win( as, user_ext_id, game_account, 'I:EUR', '5.00', 'BG1', 'BW1', {}, moment.utc().format() ); as.add( ( as, { balance } ) => { expect( balance ).to.equal( '7.60' ); } ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '7.60' ) ); checkBalance( as, user_account, '0.20' ); checkBalance( as, game_account, '6.60' ); } //----------------------------- // Test with bonus accounts released/cleared //----------------------------- for ( let i = 0; i < 2; ++i ) { const post_clear_balance = [ '4.91', '4.92' ]; const post_bet2_balance = [ '3.31', '3.32' ]; const post_cancel_balance = [ '3.51', '3.52' ]; const end_user_balance = [ '4.51', '4.52' ]; as.add( ( as ) => as.state.test_name = `On bet #2-1 ${i}` ); as.add( ( as ) => { gaming.bet( as, user_ext_id, game_account, 'I:EUR', '0.50', 'BG2', 'BB21', {}, moment.utc().format() ); if ( i ) { as.add( ( as ) => as.error( 'Fail' ) ); } else { as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.equal( '7.10' ); expect( bonus_part ) .to.equal( '0.30' ); } ); } }, ( as, err ) => { if ( i && err === 'AlreadyCanceled' ) { as.success(); } } ); if ( i === 0 ) { checkBalance( as, user_account, '0.00' ); checkBalance( as, game_account, '7.10' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.equal( '7.10' ) ); } as.add( ( as ) => as.state.test_name = `Clear bonus #2-1 #{i}` ); bonus.clearBonus( as, user_ext_id, bonus_source, 'BB1' ); if ( i === 0 ) { checkBalance( as, user_account, '0.00' ); checkBalance( as, game_account, '7.10' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.oneOf( post_clear_balance ) ); } as.add( ( as ) => as.state.test_name = `On bet #2-2 ${i}` ); gaming.bet( as, user_ext_id, game_account, 'I:EUR', '1.60', 'BG2', 'BB22', {}, moment.utc().format() ); as.add( ( as, { balance, bonus_part } ) => { expect( balance ) .to.oneOf( i ? end_user_balance : post_bet2_balance ); expect( bonus_part ) .to.equal( '1.60' ); } ); if ( i === 0 ) { checkBalance( as, user_account, '0.00' ); checkBalance( as, game_account, '8.70' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.oneOf( post_bet2_balance ) ); } as.add( ( as ) => as.state.test_name = `Release bonus #2-1 #{i}` ); bonus.releaseBonus( as, user_ext_id, bonus_source, 'BB2' ); if ( i === 0 ) { checkBalance( as, user_account, post_bet2_balance ); checkBalance( as, game_account, '8.70' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.oneOf( post_bet2_balance ) ); } as.add( ( as ) => as.state.test_name = `Cancel bet #2-1 ${i}` ); gaming.cancelBet( as, user_ext_id, game_account, 'I:EUR', '0.50', 'BG2', 'BB21', {}, moment.utc().format(), "Some reason" ); as.add( ( as, { balance } ) => { expect( balance ) .to.oneOf( i ? end_user_balance : post_cancel_balance ); } ); if ( i === 0 ) { checkBalance( as, user_account, post_cancel_balance ); checkBalance( as, game_account, '8.20' ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.oneOf( post_cancel_balance ) ); } as.add( ( as ) => as.state.test_name = `On win #1 ${i}` ); gaming.win( as, user_ext_id, game_account, 'I:EUR', '1.00', 'BG2', 'BW2', {}, moment.utc().format() ); as.add( ( as, { balance } ) => { expect( balance ).to.oneOf( end_user_balance ); } ); gaming.gameBalance( as, user_ext_id, 'I:EUR', {} ); as.add( ( as, { balance } ) => expect( balance ).to.oneOf( end_user_balance ) ); checkBalance( as, user_account, end_user_balance ); checkBalance( as, game_account, '7.20' ); } }, ( as, err ) => { console.log( as.state.test_name ); console.log( err ); console.log( as.state.error_info ); done( as.state.last_exception || 'Fail' ); } ); as.add( ( as ) => done() ); as.execute(); } ); } ); };