コード例 #1
0
ファイル: conftest.py プロジェクト: zlataya/backend-tests
def create_portfolios():
    logger.info("Portfolios initialization. Creating test portfolios...")
    wm_api = wm_api_init()
    # create all portfolios from resources folder
    db_portfolios = p_info()
    test_portfolios = portfolios_to_test()
    for portfolio, p_data in test_portfolios.items():
        if portfolio in db_portfolios:
            logger.info("Portfolios initialization. %s already exists!" % portfolio)
        else:
            body = {"name": portfolio, "portfolioType": "CLIENT", "currencyId": p_data['ccy']}
            api_data = wm_api['portfolio'].post(json.dumps(body), url_param='.create')
            p_id = api_data['id']
            # load trades into created portfolio
            p_file = {'file': (p_data['file'], open(p_data['path'], 'rb'))}
            api_data = wm_api['common'].post(files=p_file, url_param='trades/upload?portfolioId=%s' % p_id)
            loaded_cnt = api_data

            # confirm trades for created portfolio
            body = {"portfolioId": p_id}
            api_data = wm_api['portfolio'].post(json.dumps(body), url_param='.confirm.trades')
            confirmed_cnt = api_data
            if confirmed_cnt == loaded_cnt:
                logger.info("Portfolios initialization. %s is created successfully!" % portfolio)
                time.sleep(10)
            else:
                logger.warning("Portfolios initialization. %s is not created properly! "
                               "Trades loaded: %s. Trades confirmed: %s" % (portfolio, loaded_cnt, confirmed_cnt))
コード例 #2
0
import json
import pytest

from definitions import RECENT_DATE
from tests.db_support import db_top_positions, db_get_portfolio_info as p_info


@pytest.mark.parametrize('order, limit', [('DESC', 10), ('DESC', 15),
                                          ('ASC', 10), ('ASC', 15)])
@pytest.mark.parametrize('p_name, p_id',
                         p_info(parametrized=True, ids_only=True))
def test_top_positions(wm_api, p_name, p_id, order, limit, expect):
    pos_in = db_top_positions(p_name,
                              RECENT_DATE,
                              desc=order == 'DESC',
                              limit=limit)
    # get top positions
    body = {
        'portfolioId': p_id,
        'number': limit,
        'viewType': 'MONEY',
        'order': {
            'name': 'value',
            'direction': order
        }
    }

    pos_out = wm_api['common'].post(json.dumps(body), url_param='position.top')
    for pos_db, pos_api in zip(pos_in, pos_out):
        expect(
            pos_db['instrument'] == pos_api['name'],
コード例 #3
0
from datetime import datetime
import pytest
import json

from definitions import RECENT_DATE
from tests.WM_API.totals import calculate_totals_for_period, calculate_income, calculate_nav, calculate_yield
from tests.db_support import db_get_portfolio_info as p_info


@pytest.mark.parametrize(
    'p_name, p_id, from_dt, to_dt',
    [(p_name, p_id, _from, _to)
     for p_name, p_id, start_dt in p_info(parametrized=True)
     for _from, _to in [(
         start_dt, RECENT_DATE
     ), (RECENT_DATE.replace(year=RECENT_DATE.year - 1),
         RECENT_DATE), (RECENT_DATE.replace(month=1, day=1), RECENT_DATE)]])
def test_report_income(p_name, p_id, from_dt, to_dt, wm_api, expect):
    flags = {
        'aggregated': True,
        'all': False,
        'specific': False,
        'income': True
    }
    income_in = calculate_totals_for_period(p_name, from_dt, to_dt,
                                            **flags)['income']
    # get income
    body = {
        "portfolioId": p_id,
        "period": {
            "from":
コード例 #4
0
from datetime import datetime, timedelta
import pytest
import json

from definitions import RECENT_DATE
from tests.WM_API.totals import calculate_totals_for_period
from tests.db_support import db_get_portfolio_info as p_info


@pytest.mark.parametrize(
    'p_name, p_id, tense, from_dt, to_dt',
    [(p_name, p_id, tense, _from, _to)
     for p_name, p_id, start_dt in p_info(parametrized=True) for tense, _from,
     _to in [(0, RECENT_DATE.replace(year=RECENT_DATE.year - 1, day=1),
              RECENT_DATE.replace(day=1) - timedelta(days=1)),
             (1, RECENT_DATE.replace(day=1),
              (RECENT_DATE.replace(day=1, year=RECENT_DATE.year + 1) -
               timedelta(days=1)))]])
def test_coupons(p_name, p_id, tense, from_dt, to_dt, wm_api, expect):
    # calculate only income for equity
    flags = {
        class_name.lower(): True,
        'income': True,
        'aggregated': True,
        'specific': True,
        'interval': 'Monthly'
    }
    income_in = calculate_totals_for_period(p_name, from_dt, to_dt,
                                            **flags)['income']
    # get dividends
    body = {"portfolioId": p_id}
コード例 #5
0
from datetime import datetime
import pytest
import json

from definitions import RECENT_DATE
from tests.WM_API.totals import calculate_performance
from tests.db_support import db_get_portfolio_info as p_info


@pytest.mark.parametrize('p_name, p_id, from_dt, to_dt, p_dt',
                         [(p_name, p_id, _from, _to, p_dt)
                          for p_name, p_id, p_dt in p_info(parametrized=True)
                          for _from, _to in
                          sorted({
                              ([p_dt, RECENT_DATE.replace(day=1)][p_dt < RECENT_DATE.replace(day=1)], RECENT_DATE),
                              (p_dt, RECENT_DATE),
                              ([p_dt, RECENT_DATE.replace(month=1, day=1)][p_dt < RECENT_DATE.replace(month=1, day=1)], RECENT_DATE)
                          })])
def test_credit_performance(p_name, p_id, from_dt, to_dt, p_dt, wm_api, expect):
    # correct 'start' date according to portfolio start date
    actual_start_dt = [p_dt, from_dt][p_dt < from_dt]
    periodicity = ['Monthly', 'Daily'][(to_dt - actual_start_dt).days < 31]
    flags = {class_name.lower(): True, 'aggregated': True, 'specific': True, 'interval': periodicity}
    performance_in = calculate_performance(p_name, actual_start_dt, to_dt, **flags)

    # get performance
    body = {'portfolioId': p_id, 'assetClassId': class_id, 'period': {'from': str(from_dt), 'to': str(to_dt)},
            'detalization': periodicity}
    api_data = wm_api['portfolio'].post(json.dumps(body), url_param='.performance')
    performance_out = {datetime.strptime(v[0], '%Y-%m-%d').date(): round(v[1], 3) for v in api_data['data']}
    for dt in performance_in:
コード例 #6
0
import json
import pytest

from definitions import RECENT_DATE
from tests.WM_API.totals import calculate_pnl
from tests.db_support import db_portfolio_snapshot, db_get_portfolio_info as p_info


@pytest.mark.parametrize('p_name, p_id, p_dt', p_info(parametrized=True))
def test_portfolio_snapshot(wm_api, p_name, p_id, p_dt, expect):
    snap_in = db_portfolio_snapshot(p_name)
    pnl_in = calculate_pnl(p_name, start_date=p_dt, end_date=RECENT_DATE, **{'all': False, 'detailed': True})
    # get portfolio snapshot
    body = {'portfolioId': p_id, 'page': 0, 'size':  1000,
            'order': {'name': 'name', 'direction': 'ASC'}, 'confirmed': True}

    api_data = wm_api['portfolio'].post(json.dumps(body), url_param='.snapshot')
    snap_out = api_data['content']
    for pos_db, pos_api in zip(snap_in, snap_out):
        if pos_db['instrument'] == pos_api['name']:
            expect(pos_db['quantity'] == pos_api['quantity'],
                   'Fail: Instrument %s quantity: api %s != %s db' % (pos_db['instrument'], pos_api['quantity'], pos_db['quantity']))
            expect(round(pos_db['price'], 2) == round(pos_api['currentPriceNative'], 2),
                   'Fail: Instrument %s price: api %s != %s db' % (pos_db['instrument'], round(pos_api['currentPriceNative'], 2), round(pos_db['price'], 2)))
            expect(pos_db['currency'] == pos_api['currencyNative'],
                   'Fail: Instrument %s currency: api %s != %s db' % (pos_db['instrument'], pos_api['currencyNative'], pos_db['currency']))
            expect(round(pos_db['exd_value']) == round(pos_api['amount']),
                   'Fail: Instrument %s value: api %s != %s db' % (pos_db['instrument'], round(pos_api['amount']), round(pos_db['exd_value'])))
            expect(pytest.approx(round(pnl_in[pos_db['code']], 2), abs=0.1) == round(pos_api['profitAndLoss'], 2),
                   'Fail: Instrument %s PnL: api %s != %s db' % (pos_db['instrument'], round(pos_api['profitAndLoss'], 2), round(pnl_in[pos_db['code']], 2)))
        else:
コード例 #7
0
import json
import pytest

from definitions import RECENT_DATE
from tests.db_support import db_principal_pay, db_get_portfolio_info as p_info


@pytest.mark.parametrize('p_name, p_id', p_info(parametrized=True, ids_only=True))
def test_credit_principal(wm_api, p_name, p_id, expect):
    pr_in = db_principal_pay(p_name, RECENT_DATE)
    # get total wealth
    body = {"portfolioId": p_id}

    api_data = wm_api['credit'].post(json.dumps(body), url_param='.principal.repayments')
    pr_out = {v[0]: v[1] for v in api_data['data']}
    for dt in pr_in:
        p_in, p_out = round(pr_in[dt], 2), round(pr_out[str(dt)], 2)
        expect(p_in == p_out, 'Fail: Principal repayment: %s: api %s != %s db' % (dt, p_out, p_in))

コード例 #8
0
import json
import pytest
from datetime import timedelta

from definitions import RECENT_DATE
from tests.db_support import db_wealth_per_asset, db_get_portfolio_info as p_info
from tests.WM_API.totals import calculate_income, calculate_yield


@pytest.mark.parametrize('p_name, p_id',
                         p_info(parametrized=True, ids_only=True))
def test_private_equity_tw(wm_api, p_name, p_id):
    tw_in = db_wealth_per_asset(p_name, RECENT_DATE)[class_name]
    # get total wealth
    body = {
        "portfolioId": p_id,
        "asset": {
            "id": class_id,
            "type": "AssetSubClass"
        }
    }

    api_data = wm_api['common'].post(json.dumps(body),
                                     url_param='dashboard.info')
    tw_out = api_data['total']['value']
    assert round(tw_in, 2) == round(
        tw_out, 2), 'Fail: Total wealth: api %s != %s db' % (tw_out, tw_in)


@pytest.mark.skip('No requirements')
@pytest.mark.parametrize(