futoin-xferengine
Version:
Neutral clustered multi-currency transaction engine with limits
320 lines (286 loc) • 11.8 kB
JavaScript
;
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( 'Generic', 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 GenericFace = require( '../GenericFace' );
const GenericService = require( '../GenericService' );
let system_account;
let fee_account;
let account_holder;
let user_account;
const xfer_ids = [];
const checkBalance = ( as, account, balance ) => {
ccm.iface( 'xfer.accounts' ).getAccount( as, account );
as.add( ( as, info ) => expect( info.balance ).to.equal( balance ) );
};
const checkBalanceAll = ( as, system_bal, fee_bal, user_bal ) => {
let base;
as.add( ( as ) => base = as.state.test_name );
as.add( ( as ) => as.state.test_name = base + ' system' );
checkBalance( as, system_account, system_bal );
as.add( ( as ) => as.state.test_name = base + ' fee' );
checkBalance( as, fee_account, fee_bal );
as.add( ( as ) => as.state.test_name = base + ' user' );
checkBalance( as, user_account, user_bal );
};
beforeEach( 'deposits', 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 );
GenericService.register( as, executor );
GenericFace.register( as, ccm, 'xfer.generic', executor );
},
( 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' );
//--
const xferacct = ccm.iface( 'xfer.accounts' );
xferacct.addAccountHolder( as, 'GenericSystem', 'default', 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',
'Fee'
);
as.add( ( as, id ) => fee_account = id );
} );
xferacct.addAccountHolder( as, 'GenericUser', 'default', true, true, {}, {} );
as.add( ( as, holder ) => {
account_holder = holder;
xferacct.addAccount(
as,
holder,
'Regular',
'I:EUR',
'Main'
);
as.add( ( as, id ) => user_account = id );
} );
},
( as, err ) => {
console.log( err );
console.log( as.state.error_info );
}
);
} );
it ( 'should process settle', function( done ) {
as.add(
( as ) => {
const generic = ccm.iface( 'xfer.generic' );
as.add( ( as ) => as.state.test_name = '#1' );
generic.settle( as,
user_account,
system_account,
'I:EUR',
'10.00',
'System settle',
'S1',
{},
moment.utc().format()
);
as.add( ( as, xfer_id ) => xfer_ids.push( xfer_id ) );
checkBalanceAll( as, '-10.00', '0.00', '10.00' );
as.add( ( as ) => as.state.test_name = '#2' );
generic.settle( as,
system_account,
user_account,
'I:EUR',
'9.00',
'System settle',
'S2',
{},
moment.utc().format()
);
as.add( ( as, xfer_id ) => xfer_ids.push( xfer_id ) );
checkBalanceAll( as, '-1.00', '0.00', '1.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 fee', function( done ) {
as.add(
( as ) => {
const generic = ccm.iface( 'xfer.generic' );
as.add( ( as ) => as.state.test_name = '#1' );
generic.fee( as,
user_account,
fee_account,
'I:EUR',
'0.70',
'System fee',
'F1',
{},
moment.utc().format(),
false
);
as.add( ( as, xfer_id ) => xfer_ids.push( xfer_id ) );
checkBalanceAll( as, '-1.00', '0.70', '0.30' );
as.add(
( as ) => {
as.add( ( as ) => as.state.test_name = '#2' );
generic.fee( as,
user_account,
fee_account,
'I:EUR',
'1.00',
'System fee',
'F2',
{},
moment.utc().format(),
false
);
as.add( ( as ) => as.error( 'Fail' ) );
},
( as, err ) => {
if ( err === 'NotEnoughFunds' ) {
as.success();
}
}
);
as.add( ( as ) => as.state.test_name = '#3' );
generic.fee( as,
user_account,
fee_account,
'I:EUR',
'1.00',
'System fee',
'F2',
{},
moment.utc().format(),
true
);
as.add( ( as, xfer_id ) => xfer_ids.push( xfer_id ) );
checkBalanceAll( as, '-1.00', '1.70', '-0.70' );
},
( 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 cancel', function( done ) {
as.add(
( as ) => {
const generic = ccm.iface( 'xfer.generic' );
as.add( ( as ) => as.state.test_name = 'Settle #1' );
generic.cancel( as,
xfer_ids[0],
'Settle',
system_account,
user_account,
'I:EUR',
'10.00',
moment.utc().format(),
null,
null,
"Some reason"
);
checkBalanceAll( as, '9.00', '1.70', '-10.70' );
as.add( ( as ) => as.state.test_name = 'Settle #2' );
generic.cancel( as,
xfer_ids[1],
'Settle',
user_account,
system_account,
'I:EUR',
'9.00',
moment.utc().format(),
null,
null,
"Some reason"
);
checkBalanceAll( as, '0.00', '1.70', '-1.70' );
as.add( ( as ) => as.state.test_name = 'Fee #1' );
generic.cancel( as,
xfer_ids[2],
'Fee',
user_account,
fee_account,
'I:EUR',
'0.70',
moment.utc().format(),
null,
null,
"Some reason"
);
checkBalanceAll( as, '0.00', '1.00', '-1.00' );
as.add( ( as ) => as.state.test_name = 'Fee #2' );
generic.cancel( as,
xfer_ids[3],
'Fee',
user_account,
fee_account,
'I:EUR',
'1.00',
moment.utc().format(),
null,
null,
"Some reason"
);
checkBalanceAll( as, '0.00', '0.00', '0.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();
} );
} );
};