futoin-xferengine
Version:
Neutral clustered multi-currency transaction engine with limits
622 lines (577 loc) • 26.8 kB
JavaScript
;
const expect = require( 'chai' ).expect;
const moment = require( 'moment' );
const Executor = require( 'futoin-executor/Executor' );
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( 'Limits', function() {
const LimitsFace = require( '../LimitsFace' );
const LimitsService = require( '../LimitsService' );
beforeEach( 'currency', function() {
as.add(
( as ) => {
ccm.registerCurrencyServices( as, executor );
LimitsService.register( as, executor );
LimitsFace.register( as, ccm, 'xfer.limits', executor );
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
console.log( as.state.last_exception );
}
);
} );
it ( 'should add groups', function( done ) {
as.add(
( as ) => {
const xferlim = ccm.iface( 'xfer.limits' );
//--
xferlim.getLimitGroups( as );
as.add( ( as, res ) => {
expect( res ).to.eql( [] );
} );
//--
xferlim.addLimitGroup( as, 'default' );
xferlim.addLimitGroup( as, 'other' );
xferlim.addLimitGroup( as, 'aaa' );
xferlim.getLimitGroups( as );
as.add( ( as, res ) => {
expect( res ).to.eql( [ 'default', 'other', 'aaa' ] );
} );
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
done( as.state.last_exception || 'Fail' );
}
);
as.add( ( as ) => done() );
as.execute();
} );
it ( 'should detect add group errors', function( done ) {
as.add(
( as ) => {
const xferlim = ccm.iface( 'xfer.limits' );
//--
as.add(
( as ) => {
xferlim.addLimitGroup( as, 'Duplicate123_-' );
xferlim.addLimitGroup( as, 'Duplicate123_-' );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'AlreadyExists' ) {
as.success();
}
}
);
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
done( as.state.last_exception || 'Fail' );
}
);
as.add( ( as ) => done() );
as.execute();
} );
it ( 'should set limits', function( done ) {
as.add(
( as ) => {
const xferlim = ccm.iface( 'xfer.limits' );
xferlim.setLimits( as, 'default', 'Retail', 'I:EUR', {
retail_daily_amt : "1.00",
retail_daily_cnt : 1,
retail_weekly_amt : "1.00",
retail_weekly_cnt : 1,
retail_monthly_amt : "1.00",
retail_monthly_cnt : 1,
retail_min_amt : "1.00",
preauth_daily_amt : "1.00",
preauth_daily_cnt : 1,
preauth_weekly_amt : "1.00",
preauth_weekly_cnt : 1,
preauth_monthly_amt : "1.00",
preauth_monthly_cnt : 1,
preauth_min_amt : "1.00",
}, false, false );
xferlim.setLimits( as, 'default', 'Deposits', 'I:USD', {
deposit_daily_amt : "1.00",
deposit_daily_cnt : 1,
withdrawal_daily_amt : "1.00",
withdrawal_daily_cnt : 1,
deposit_weekly_amt : "1.00",
deposit_weekly_cnt : 1,
withdrawal_weekly_amt : "1.00",
withdrawal_weekly_cnt : 1,
deposit_monthly_amt : "1.00",
deposit_monthly_cnt : 1,
withdrawal_monthly_amt : "1.00",
withdrawal_monthly_cnt : 1,
deposit_min_amt : "1.00",
withdrawal_min_amt : "1.00",
}, {
deposit_daily_amt : "2.00",
deposit_daily_cnt : 2,
withdrawal_daily_amt : "2.00",
withdrawal_daily_cnt : 2,
deposit_weekly_amt : "2.00",
deposit_weekly_cnt : 2,
withdrawal_weekly_amt : "2.00",
withdrawal_weekly_cnt : 2,
deposit_monthly_amt : "2.00",
deposit_monthly_cnt : 2,
withdrawal_monthly_amt : "2.00",
withdrawal_monthly_cnt : 2,
deposit_min_amt : "2.00",
withdrawal_min_amt : "2.00",
}, false );
xferlim.setLimits( as, 'default', 'Payments', 'I:EUR', {
outbound_daily_amt : "1.00",
outbound_daily_cnt : 1,
inbound_daily_amt : "1.00",
inbound_daily_cnt : 1,
outbound_weekly_amt : "1.00",
outbound_weekly_cnt : 1,
inbound_weekly_amt : "1.00",
inbound_weekly_cnt : 1,
outbound_monthly_amt : "1.00",
outbound_monthly_cnt : 1,
inbound_monthly_amt : "1.00",
inbound_monthly_cnt : 1,
outbound_min_amt : "1.00",
}, false, false );
xferlim.setLimits( as, 'default', 'Gaming', 'I:EUR', {
bet_daily_amt : "1.00",
bet_daily_cnt : 1,
win_daily_amt : "1.00",
win_daily_cnt : 1,
profit_daily_amt : "1.00",
bet_weekly_amt : "1.00",
bet_weekly_cnt : 1,
win_weekly_amt : "1.00",
win_weekly_cnt : 1,
profit_weekly_amt : "1.00",
bet_monthly_amt : "1.00",
bet_monthly_cnt : 1,
win_monthly_amt : "1.00",
win_monthly_cnt : 1,
profit_monthly_amt : "1.00",
bet_min_amt : "1.00",
}, false, false );
xferlim.setLimits( as, 'default', 'Misc', 'I:EUR', {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
limithit_monthly_cnt : 1,
}, false, false );
xferlim.setLimits( as, 'default', 'Personnel', 'I:EUR', {
message_daily_cnt : 1,
manual_daily_amt : "1.00",
manual_daily_cnt : 1,
message_weekly_cnt : 1,
manual_weekly_amt : "1.00",
manual_weekly_cnt : 1,
message_monthly_cnt : 1,
manual_monthly_amt : "1.00",
manual_monthly_cnt : 1,
}, false, {
message_daily_cnt : 3,
manual_daily_amt : "3.00",
manual_daily_cnt : 3,
message_weekly_cnt : 3,
manual_weekly_amt : "3.00",
manual_weekly_cnt : 3,
message_monthly_cnt : 3,
manual_monthly_amt : "3.00",
manual_monthly_cnt : 3,
} );
//----------
xferlim.getLimits( as, 'default', 'Retail' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:EUR',
hard: {
retail_daily_amt : "1.00",
retail_daily_cnt : 1,
retail_weekly_amt : "1.00",
retail_weekly_cnt : 1,
retail_monthly_amt : "1.00",
retail_monthly_cnt : 1,
retail_min_amt : "1.00",
preauth_daily_amt : "1.00",
preauth_daily_cnt : 1,
preauth_weekly_amt : "1.00",
preauth_weekly_cnt : 1,
preauth_monthly_amt : "1.00",
preauth_monthly_cnt : 1,
preauth_min_amt : "1.00",
},
check: false,
risk: false,
} ) );
xferlim.getLimits( as, 'default', 'Deposits' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:USD',
hard: {
deposit_daily_amt : "1.00",
deposit_daily_cnt : 1,
withdrawal_daily_amt : "1.00",
withdrawal_daily_cnt : 1,
deposit_weekly_amt : "1.00",
deposit_weekly_cnt : 1,
withdrawal_weekly_amt : "1.00",
withdrawal_weekly_cnt : 1,
deposit_monthly_amt : "1.00",
deposit_monthly_cnt : 1,
withdrawal_monthly_amt : "1.00",
withdrawal_monthly_cnt : 1,
deposit_min_amt : "1.00",
withdrawal_min_amt : "1.00",
},
check: {
deposit_daily_amt : "2.00",
deposit_daily_cnt : 2,
withdrawal_daily_amt : "2.00",
withdrawal_daily_cnt : 2,
deposit_weekly_amt : "2.00",
deposit_weekly_cnt : 2,
withdrawal_weekly_amt : "2.00",
withdrawal_weekly_cnt : 2,
deposit_monthly_amt : "2.00",
deposit_monthly_cnt : 2,
withdrawal_monthly_amt : "2.00",
withdrawal_monthly_cnt : 2,
deposit_min_amt : "2.00",
withdrawal_min_amt : "2.00",
},
risk: false,
} ) );
xferlim.getLimits( as, 'default', 'Payments' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:EUR',
hard: {
outbound_daily_amt : "1.00",
outbound_daily_cnt : 1,
inbound_daily_amt : "1.00",
inbound_daily_cnt : 1,
outbound_weekly_amt : "1.00",
outbound_weekly_cnt : 1,
inbound_weekly_amt : "1.00",
inbound_weekly_cnt : 1,
outbound_monthly_amt : "1.00",
outbound_monthly_cnt : 1,
inbound_monthly_amt : "1.00",
inbound_monthly_cnt : 1,
outbound_min_amt : "1.00",
},
check: false,
risk: false,
} ) );
xferlim.getLimits( as, 'default', 'Gaming' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:EUR',
hard: {
bet_daily_amt : "1.00",
bet_daily_cnt : 1,
win_daily_amt : "1.00",
win_daily_cnt : 1,
profit_daily_amt : "1.00",
bet_weekly_amt : "1.00",
bet_weekly_cnt : 1,
win_weekly_amt : "1.00",
win_weekly_cnt : 1,
profit_weekly_amt : "1.00",
bet_monthly_amt : "1.00",
bet_monthly_cnt : 1,
win_monthly_amt : "1.00",
win_monthly_cnt : 1,
profit_monthly_amt : "1.00",
bet_min_amt : "1.00",
},
check: false,
risk: false,
} ) );
xferlim.getLimits( as, 'default', 'Misc' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:EUR',
hard: {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
limithit_monthly_cnt : 1,
},
check: false,
risk: false,
} ) );
xferlim.getLimits( as, 'default', 'Personnel' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:EUR',
hard: {
message_daily_cnt : 1,
manual_daily_amt : "1.00",
manual_daily_cnt : 1,
message_weekly_cnt : 1,
manual_weekly_amt : "1.00",
manual_weekly_cnt : 1,
message_monthly_cnt : 1,
manual_monthly_amt : "1.00",
manual_monthly_cnt : 1,
},
check: false,
risk: {
message_daily_cnt : 3,
manual_daily_amt : "3.00",
manual_daily_cnt : 3,
message_weekly_cnt : 3,
manual_weekly_amt : "3.00",
manual_weekly_cnt : 3,
message_monthly_cnt : 3,
manual_monthly_amt : "3.00",
manual_monthly_cnt : 3,
},
} ) );
//--------
xferlim.setLimits( as, 'default', 'Personnel', 'I:EUR', {
message_daily_cnt : 4,
manual_daily_amt : "5.00",
manual_daily_cnt : 6,
message_weekly_cnt : 7,
manual_weekly_amt : "8.00",
manual_weekly_cnt : 9,
message_monthly_cnt : 10,
manual_monthly_amt : "11.00",
manual_monthly_cnt : 12,
}, false, false );
xferlim.getLimits( as, 'default', 'Personnel' );
as.add( ( as, res ) => expect( res ).to.eql( {
currency: 'I:EUR',
hard: {
message_daily_cnt : 4,
manual_daily_amt : "5.00",
manual_daily_cnt : 6,
message_weekly_cnt : 7,
manual_weekly_amt : "8.00",
manual_weekly_cnt : 9,
message_monthly_cnt : 10,
manual_monthly_amt : "11.00",
manual_monthly_cnt : 12,
},
check: false,
risk: false,
} ) );
xferlim.addLimitGroup( as, 'DefaultPeer' );
xferlim.setLimits( as, 'DefaultPeer', 'Payments', 'I:EUR', {
outbound_daily_amt : "0.00",
outbound_daily_cnt : 0,
inbound_daily_amt : "0.00",
inbound_daily_cnt : 0,
outbound_weekly_amt : "0.00",
outbound_weekly_cnt : 0,
inbound_weekly_amt : "0.00",
inbound_weekly_cnt : 0,
outbound_monthly_amt : "0.00",
outbound_monthly_cnt : 0,
inbound_monthly_amt : "0.00",
inbound_monthly_cnt : 0,
outbound_min_amt : "0.00",
}, false, false );
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
done( as.state.last_exception || 'Fail' );
}
);
as.add( ( as ) => done() );
as.execute();
} );
it ( 'should detect sett limits errors', function( done ) {
as.add(
( as ) => {
const xferlim = ccm.iface( 'xfer.limits' );
//--
as.add(
( as ) => {
xferlim.setLimits( as, 'UnknowGroup', 'Misc', 'L:EUREKA', {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
limithit_monthly_cnt : 1,
}, false, false );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'UnknownGroup' ) {
as.success();
}
}
);
//--
as.add(
( as ) => {
xferlim.setLimits( as, 'default', 'Misc', 'L:EUREKA', {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
limithit_monthly_cnt : 1,
}, false, false );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'UnknownCurrency' ) {
as.success();
}
}
);
//--
as.add(
( as ) => {
xferlim.setLimits( as, 'default', 'Misc', 'I:EUR', {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
}, false, {} );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'InvalidRequest' ) {
expect( as.state.error_info ).to.equal(
'Hard limits do not match MiscLimitValues'
);
as.success();
}
}
);
//--
as.add(
( as ) => {
xferlim.setLimits( as, 'default', 'Misc', 'I:EUR', {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
limithit_monthly_cnt : 1,
}, {}, false );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'InvalidRequest' ) {
expect( as.state.error_info ).to.equal(
'Check limits do not match MiscLimitValues'
);
as.success();
}
}
);
//--
as.add(
( as ) => {
xferlim.setLimits( as, 'default', 'Misc', 'I:EUR', {
message_daily_cnt : 1,
failure_daily_cnt : 1,
limithit_daily_cnt : 1,
message_weekly_cnt : 1,
failure_weekly_cnt : 1,
limithit_weekly_cnt : 1,
message_monthly_cnt : 1,
failure_monthly_cnt : 1,
limithit_monthly_cnt : 1,
}, false, {} );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'InvalidRequest' ) {
expect( as.state.error_info ).to.equal(
'Risk limits do not match MiscLimitValues'
);
as.success();
}
}
);
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
done( as.state.last_exception || 'Fail' );
}
);
as.add( ( as ) => done() );
as.execute();
} );
it ( 'should detect get limits errors', function( done ) {
as.add(
( as ) => {
const xferlim = ccm.iface( 'xfer.limits' );
//--
as.add(
( as ) => {
xferlim.addLimitGroup( as, 'KnowGroup' );
xferlim.getLimits( as, 'KnowGroup', 'Retail' );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'LimitsNotSet' ) {
as.success();
}
}
);
//--
as.add(
( as ) => {
xferlim.getLimits( as, 'UnknowGroup', 'Retail' );
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'LimitsNotSet' ) {
as.success();
}
}
);
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
done( as.state.last_exception || 'Fail' );
}
);
as.add( ( as ) => done() );
as.execute();
} );
} );
};