示例#1
0
    def test_forbidden_operations(self):
        r1 = fields.Money('1', 'RUB')
        u1 = fields.Money(1, 'USD')

        with pytest.raises(ValueError) as e:
            u1 + r1

        s = "Money '1.00 USD' and '1.00 RUB' must be with the same currencies"
        assert s in str(e.value)

        with pytest.raises(TypeError) as e:
            u1 * r1

        s = "unsupported operand type(s) for *: 'Money' and 'Money'"
        assert s in str(e.value)

        with pytest.raises(TypeError) as e:
            u1 + 10

        s = "unsupported operand type(s) for +: 'Money' and 'int'"
        assert s in str(e.value)

        with pytest.raises(TypeError) as e:
            10 + u1

        s = "unsupported operand type(s) for +: 'int' and 'Money'"
        assert s in str(e.value)
示例#2
0
    def test_cmp(self):
        r0 = fields.Money(0, 'RUB')
        r1 = fields.Money(1, 'RUB')
        r_1 = fields.Money(-1, 'RUB')
        r10 = fields.Money(10, 'RUB')
        u1 = fields.Money(1, 'USD')

        assert r10 > r1
        assert not r10 < r1
        assert r1 < r10
        assert not r1 > r10
        assert r10 >= r1
        assert not r10 <= r1
        assert r1 <= r10
        assert not r1 >= r10

        assert r1 > 0
        assert not r1 < 0
        assert r_1 < 0
        assert not r_1 > 0

        assert not bool(r0)
        assert bool(r1)

        assert r0 == 0
        assert not r0 != 0

        with pytest.raises(ValueError) as e:
            r10 > u1

        with pytest.raises(TypeError) as e:
            r0 > 1
示例#3
0
    def test_is_methods(self):
        r0 = fields.Money(0, 'RUB')
        r1 = fields.Money(1, 'RUB')
        r_1 = fields.Money(-1, 'RUB')

        assert r0.is_zero()
        assert r1.is_positive()
        assert r_1.is_negative()
    def test_from_string(self):
        assert fields.Money.from_string('1.00 USD') == fields.Money(1, 'USD')
        assert fields.Money.from_string('  1.2345  USD') == fields.Money('1.2345', 'USD')
        assert fields.Money.from_string('1\tUSD\n') == fields.Money(1, 'USD')
        assert fields.Money.from_string('1 840') == fields.Money(1, 'USD')

        with pytest.raises(decimal.InvalidOperation):
            fields.Money.from_string('one USD')

        with pytest.raises(ValueError):
            fields.Money.from_string('1 A01')
示例#5
0
    def test_serialize_cycle(self, db):
        doc = self.Doc()
        doc.money = fields.Money(1, 'RUB')
        db.save(doc)

        data = db(self.Doc).find_one()

        data_tm = to_mongo(data)
        assert data_tm['money'][0] == 100
        assert data_tm['money'][1] == 643

        data_fm = from_mongo(self.Doc, data_tm)
        assert data_fm.money == fields.Money(1, 'RUB')
示例#6
0
def test_load_and_save(db):
    db.db.testdocs.insert({'money': 314})

    doc = db.get_queryset(Doc).find_one()
    doc.money = fields.Money('42.00')
    db.save(doc)

    assert hasattr(doc, 'money')
    assert isinstance(doc.money, fields.Money)
    assert doc.money == fields.Money('42.00')

    data = db.db.testdocs.find_one()

    assert 'money' in data
    assert isinstance(data['money'], int)
    assert data['money'] == 4200
示例#7
0
    def test_load_and_save(self, db):
        db.db.testdocs.insert_one({'money': [840, 999]})

        doc = db(self.Doc).find_one()
        doc.money = fields.Money('10.5', 'RUB')
        db.save(doc)

        assert hasattr(doc, 'money')
        assert isinstance(doc.money, fields.Money)
        assert doc.money == fields.Money('10.5', 'RUB')

        data = db.db.testdocs.find_one()

        assert 'money' in data
        assert isinstance(data['money'], list)
        assert data['money'] == [1050, 643]
示例#8
0
    def test_load_and_save_bbc(self, db):
        db.db.testdocs.insert({'money': 1234})

        doc = db(self.Doc).find_one()

        assert hasattr(doc, 'money')
        assert isinstance(doc.money, fields.Money)
        assert doc.money == fields.Money('12.34', 'RUB')
示例#9
0
    def test_load(self, db, value, currency, v, c):
        db.db.testdocs.insert_one({'money': [v, c]})

        doc = db(self.Doc).find_one()

        assert hasattr(doc, 'money')
        assert isinstance(doc.money, fields.Money)
        assert doc.money == fields.Money(value, currency)
示例#10
0
def test_load(db):
    db.db.testdocs.insert({'money': 314})

    doc = db.get_queryset(Doc).find_one()

    assert hasattr(doc, 'money')
    assert isinstance(doc.money, fields.Money)
    assert doc.money == fields.Money('3.14')
示例#11
0
    def test_general(self):
        assert str(fields.Money(1, 'USD')) == '1.00 USD'
        assert str(fields.Money('1.2345', 840)) == '1.24 USD'
        assert str(fields.Money(10, 'RUB')) == '10.00 RUB'
        assert str(fields.Money('99', 'CHF')) == '99.00 CHF'

        assert str(fields.Money(5, 840)) == '5.00 USD'
        assert str(fields.Money(7, 826)) == '7.00 GBP'

        r1 = fields.Money(10, 'RUB')
        r2 = fields.Money(r1)
        assert r1 == r2
        assert r1 is not r2

        with pytest.raises(TypeError):
            fields.Money(r1, 'RUB')

        with pytest.raises(TypeError):
            fields.Money('10')
示例#12
0
    def test_save(self, db, value, currency, v, c):
        doc = self.Doc()
        doc.money = fields.Money(value, currency)
        db.save(doc)

        data = db.db.testdocs.find_one()

        assert 'money' in data
        assert isinstance(data['money'], list)
        assert data['money'] == [v, c]
示例#13
0
def test_save(db):  # noqa
    doc = Doc()
    doc.money = fields.Money('3.14')
    db.save(doc)

    data = db.db.testdocs.find_one()

    assert 'money' in data
    assert isinstance(data['money'], int)
    assert data['money'] == 314
示例#14
0
    def test_total_cents_rounding(self):
        money = fields.Money(decimal.Decimal('1.235'), 'RUB')
        assert money._context is fields.Money._context
        assert money.total_cents == 124

        fields.Money._context.rounding = decimal.ROUND_DOWN
        assert money.total_cents == 123

        money._context.rounding = decimal.ROUND_HALF_UP
        assert money.total_cents == 124
示例#15
0
 def test_money_str(self, iv, cur, ov):
     assert str(fields.Money(iv, cur)) == '{} {}'.format(ov, cur)
示例#16
0
 def test_total_cents_rounding(self):
     money = fields.Money(decimal.Decimal('1.235'), 'RUB')
     assert money._context is fields.Money._context
     assert money.total_cents == 124
示例#17
0
def test_money_cents(func, input, output):
    assert func(fields.Money(input)) == output
示例#18
0
def test_money_str(input, output):
    assert str(fields.Money(input)) == output
示例#19
0
 def tests_abs(self):
     value = abs(fields.Money('-3.14', 'RUB'))
     assert isinstance(value, fields.Money)
     assert value.currency.string == 'RUB'
     assert value > 0
     assert value.total_cents > 0
示例#20
0
class TestMoney:
    def test_general(self):
        assert str(fields.Money(1, 'USD')) == '1.00 USD'
        assert str(fields.Money('1.2345', 840)) == '1.24 USD'
        assert str(fields.Money(10, 'RUB')) == '10.00 RUB'
        assert str(fields.Money('99', 'CHF')) == '99.00 CHF'

        assert str(fields.Money(5, 840)) == '5.00 USD'
        assert str(fields.Money(7, 826)) == '7.00 GBP'

        r1 = fields.Money(10, 'RUB')
        r2 = fields.Money(r1)
        assert r1 == r2
        assert r1 is not r2

        with pytest.raises(TypeError):
            fields.Money(r1, 'RUB')

        with pytest.raises(TypeError):
            fields.Money('10')

    def test_from_string(self):
        assert fields.Money.from_string('1.00 USD') == fields.Money(1, 'USD')
        assert fields.Money.from_string('  1.2345  USD') == fields.Money(
            '1.2345', 'USD')
        assert fields.Money.from_string('1\tUSD\n') == fields.Money(1, 'USD')
        assert fields.Money.from_string('1 840') == fields.Money(1, 'USD')

        with pytest.raises(decimal.InvalidOperation):
            fields.Money.from_string('one USD')

        with pytest.raises(ValueError):
            fields.Money.from_string('1 A01')

    def test_arithmetic_operations(self):
        r10 = fields.Money(10, 'RUB')
        r1 = fields.Money('1', 'RUB')
        u10 = fields.Money('10', 'USD')
        u1 = fields.Money(1, 'USD')

        assert r10 + r1 == fields.Money(11, 'RUB')
        assert r1 + r10 == fields.Money(11, 'RUB')
        assert r10 - r1 == fields.Money(9, 'RUB')
        assert r1 - r10 == fields.Money(-9, 'RUB')
        assert u10 + u1 == fields.Money(11, 'USD')
        assert u1 + u10 == fields.Money(11, 'USD')
        assert u10 - u1 == fields.Money(9, 'USD')
        assert u1 - u10 == fields.Money(-9, 'USD')

        assert r10 * 10 == fields.Money(100, 'RUB')
        assert 10 * r10 == fields.Money(100, 'RUB')
        assert r10 / 10 == fields.Money(1, 'RUB')
        assert u1 * 10 == fields.Money(10, 'USD')
        assert 10 * u1 == fields.Money(10, 'USD')
        assert u1 / 10 == fields.Money('0.1', 'USD')

    def test_negative_unary_operations(self):
        u1 = fields.Money('1.01', 'USD')

        assert -u1 == fields.Money('-1.01', 'USD')
        assert -(-u1) == u1

    def test_is_methods(self):
        r0 = fields.Money(0, 'RUB')
        r1 = fields.Money(1, 'RUB')
        r_1 = fields.Money(-1, 'RUB')

        assert r0.is_zero()
        assert r1.is_positive()
        assert r_1.is_negative()

    def test_cmp(self):
        r0 = fields.Money(0, 'RUB')
        r1 = fields.Money(1, 'RUB')
        r_1 = fields.Money(-1, 'RUB')
        r10 = fields.Money(10, 'RUB')
        u1 = fields.Money(1, 'USD')

        assert r10 > r1
        assert not r10 < r1
        assert r1 < r10
        assert not r1 > r10
        assert r10 >= r1
        assert not r10 <= r1
        assert r1 <= r10
        assert not r1 >= r10

        assert r1 > 0
        assert not r1 < 0
        assert r_1 < 0
        assert not r_1 > 0

        assert not bool(r0)
        assert bool(r1)

        assert r0 == 0
        assert not r0 != 0

        with pytest.raises(ValueError) as e:
            r10 > u1

        with pytest.raises(TypeError) as e:
            r0 > 1

    def test_forbidden_operations(self):
        r1 = fields.Money('1', 'RUB')
        u1 = fields.Money(1, 'USD')

        with pytest.raises(ValueError) as e:
            u1 + r1

        s = "Money '1.00 USD' and '1.00 RUB' must be with the same currencies"
        assert s in str(e.value)

        with pytest.raises(TypeError) as e:
            u1 * r1

        s = "unsupported operand type(s) for *: 'Money' and 'Money'"
        assert s in str(e.value)

        with pytest.raises(TypeError) as e:
            u1 + 10

        s = "unsupported operand type(s) for +: 'Money' and 'int'"
        assert s in str(e.value)

        with pytest.raises(TypeError) as e:
            10 + u1

        s = "unsupported operand type(s) for +: 'int' and 'Money'"
        assert s in str(e.value)

    @pytest.mark.parametrize('iv, ov', [
        ('3.14', '3.14'),
        ('0.14', '0.14'),
        ('30.14', '30.14'),
        ('3.1', '3.10'),
        ('0.1', '0.10'),
    ])
    @pytest.mark.parametrize('cur', ['RUB', 'EUR', 'USD'])
    def test_money_str(self, iv, cur, ov):
        assert str(fields.Money(iv, cur)) == '{} {}'.format(ov, cur)

    @pytest.mark.parametrize('iv, ov', [
        ('3.14', 314),
        ('0.14', 14),
        ('30.14', 3014),
        ('3.1', 310),
        ('0.1', 10),
    ])
    @pytest.mark.parametrize('cur', ['RUB', 'EUR', 'USD'])
    @pytest.mark.parametrize(
        'func',
        [
            lambda money: money.total_cents,
            lambda money: money.to_mongo()[0],  # b/c function, for coverage
        ])
    def test_total_cents(self, func, iv, cur, ov):
        assert func(fields.Money(iv, cur)) == ov

    def test_total_cents_rounding(self):
        money = fields.Money(decimal.Decimal('1.235'), 'RUB')
        assert money._context is fields.Money._context
        assert money.total_cents == 124

    @pytest.mark.parametrize('iv, ov', [
        ((1000, 'RUB'), fields.Money(10, 'RUB')),
        ((1000, 'JPY'), fields.Money(1000, 'JPY')),
        ((1000, 'MGA'), fields.Money(100, 'MGA')),
        ((1000, DEFAULT_CURRENCY_STORAGE['MRO']), fields.Money(100, 'MRO')),
    ])
    def test_from_cents(self, iv, ov):
        assert fields.Money.from_cents(iv[0], iv[1]) == ov

    def tests_abs(self):
        value = abs(fields.Money('-3.14', 'RUB'))
        assert isinstance(value, fields.Money)
        assert value.currency.string == 'RUB'
        assert value > 0
        assert value.total_cents > 0

    @pytest.mark.parametrize('first, seccond, equal', [
        (fields.Money('3.14', 'RUB'), fields.Money('3.14', 'RUB'), True),
        (fields.Money('3.14', 'RUB'), fields.Money('2.48', 'RUB'), False),
        (fields.Money('3.14', 'RUB'), fields.Money('-3.14', 'RUB'), False),
        (fields.Money('3.14', 'RUB'), fields.Money('3.14', 'EUR'), False),
    ])
    def tests_hash(self, first, seccond, equal):
        assert (hash(first) == hash(seccond)) is equal

    @pytest.mark.parametrize('first, seccond, result', [
        (fields.Money('10', 'RUB'), fields.Money(
            '2', 'RUB'), decimal.Decimal('5.00')),
        (fields.Money('10', 'RUB'), fields.Money(
            '0.5', 'RUB'), decimal.Decimal('20')),
        (fields.Money('2', 'RUB'), fields.Money(
            '10', 'RUB'), decimal.Decimal('0.20')),
        (fields.Money('2', 'RUB'), 10, fields.Money('0.20', 'RUB')),
    ])
    def test_truediv(self, first, seccond, result):
        assert first / seccond == result
        assert isinstance(first / seccond, result.__class__)

    def test_truediv__error(self):
        with pytest.raises(ValueError):
            fields.Money('10', 'RUB') / fields.Money('2', 'EUR')

    @pytest.mark.parametrize('first, seccond, result', [
        (fields.Money('5', 'RUB'), 2, fields.Money('10.00', 'RUB')),
        (fields.Money(
            '2', 'RUB'), decimal.Decimal('5.5'), fields.Money('11', 'RUB')),
        (fields.Money(
            '10', 'RUB'), decimal.Decimal('0.3'), fields.Money('3', 'RUB')),
    ])
    def test_mul(self, first, seccond, result):
        assert first * seccond == result
        assert isinstance(first / seccond, result.__class__)

    def test_mul__error(self):
        with pytest.raises(TypeError):
            fields.Money('10', 'RUB') * 1.2

    def test_rounding(self):
        money = fields.Money(decimal.Decimal('1.233'), 'RUB')
        assert money == fields.Money(decimal.Decimal('1.24'), 'RUB')
        assert money.value == decimal.Decimal('1.24')
示例#21
0
    def test_negative_unary_operations(self):
        u1 = fields.Money('1.01', 'USD')

        assert -u1 == fields.Money('-1.01', 'USD')
        assert -(-u1) == u1
示例#22
0
    def test_arithmetic_operations(self):
        r10 = fields.Money(10, 'RUB')
        r1 = fields.Money('1', 'RUB')
        u10 = fields.Money('10', 'USD')
        u1 = fields.Money(1, 'USD')

        assert r10 + r1 == fields.Money(11, 'RUB')
        assert r1 + r10 == fields.Money(11, 'RUB')
        assert r10 - r1 == fields.Money(9, 'RUB')
        assert r1 - r10 == fields.Money(-9, 'RUB')
        assert u10 + u1 == fields.Money(11, 'USD')
        assert u1 + u10 == fields.Money(11, 'USD')
        assert u10 - u1 == fields.Money(9, 'USD')
        assert u1 - u10 == fields.Money(-9, 'USD')

        assert r10 * 10 == fields.Money(100, 'RUB')
        assert 10 * r10 == fields.Money(100, 'RUB')
        assert r10 / 10 == fields.Money(1, 'RUB')
        assert u1 * 10 == fields.Money(10, 'USD')
        assert 10 * u1 == fields.Money(10, 'USD')
        assert u1 / 10 == fields.Money('0.1', 'USD')
示例#23
0
 def test_total_cents(self, func, iv, cur, ov):
     assert func(fields.Money(iv, cur)) == ov
示例#24
0
 def test_truediv__error(self):
     with pytest.raises(ValueError):
         fields.Money('10', 'RUB') / fields.Money('2', 'EUR')
示例#25
0
 def test_mul__error(self):
     with pytest.raises(TypeError):
         fields.Money('10', 'RUB') * 1.2
示例#26
0
 def test_rounding(self):
     money = fields.Money(decimal.Decimal('1.233'), 'RUB')
     assert money == fields.Money(decimal.Decimal('1.24'), 'RUB')
     assert money.value == decimal.Decimal('1.24')