Example #1
0
    def test_action_delete(self):

        bankaccount = BankAccountFactory(owners=[self.superowner])

        url = reverse('banktransactions:list',
                      kwargs={'bankaccount_pk': bankaccount.pk})

        bt1 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.59',
        )
        bt2 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-15.59',
        )
        bt3 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='75',
        )
        balance = bankaccount.balance

        form = self.app.get(url, user='******').form
        for bt in [bt1, bt2, bt3]:
            form['banktransaction_' + str(bt.pk)] = True
        form['operation'] = 'delete'
        response = form.submit('action').maybe_follow()

        # Test cancel link
        response = response.click(description=_("Cancel"))
        self.assertEqual(
            response.request.path,
            reverse('banktransactions:list',
                    kwargs={
                        'bankaccount_pk': bankaccount.pk,
                    }))

        # Is delete somewhere else.
        bt3.delete()
        balance -= Decimal(75)

        # Direct access on multiple delete page. Session is not up-to-date.
        form = self.app.get(
            reverse('banktransactions:delete_multiple',
                    kwargs={'bankaccount_pk': bankaccount.pk})).form
        response = form.submit().maybe_follow()

        self.assertFalse(
            list(BankTransaction.objects.filter(pk__in=[bt1.pk, bt2.pk])))
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance,
                         balance - Decimal('5.59') - Decimal('-15.59'))

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Bank transactions deleted successfully.',
            [message.message for message in storage],
        )
Example #2
0
    def test_banktransaction_insert_fail(self):

        bankaccount = BankAccountFactory(balance=0)

        with patch.object(BankTransaction, "save", side_effect=Exception("Bang")):
            with self.assertRaises(Exception):
                BankTransactionFactory(bankaccount=bankaccount, amount="15.59")

        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, 0)
Example #3
0
    def test_delete(self):

        bankaccount = BankAccountFactory(balance=50)

        banktransaction = BankTransactionFactory(bankaccount=bankaccount, amount="-25")
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(25))

        banktransaction.delete()
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(50))
Example #4
0
    def test_bankaccount_update_fail(self):

        bankaccount = BankAccountFactory(balance=0)

        with patch.object(BankAccount, 'save', side_effect=Exception('Bang')):
            with self.assertRaises(Exception):
                BankTransactionFactory(
                    bankaccount=bankaccount,
                    amount='15.59',
                )

        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, 0)
Example #5
0
    def test_status_disabled(self):

        # Test with create op.
        bankaccount = BankAccountFactory(balance=100)

        BankTransactionFactory(bankaccount=bankaccount,
                               amount=Decimal('150'),
                               status=BankTransaction.STATUS_INACTIVE)
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(100))

        # Then test with update.
        banktransaction = BankTransactionFactory(
            bankaccount=bankaccount,
            amount=Decimal('150'),
        )
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('250'))

        banktransaction.status = BankTransaction.STATUS_INACTIVE
        banktransaction.amount = Decimal('180')
        banktransaction.save()
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('250'))

        # Then test with delete op.
        banktransaction.delete()
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('250'))
Example #6
0
    def test_banktransaction_update_fail(self):

        bankaccount = BankAccountFactory(balance=0)
        banktransaction = BankTransactionFactory(bankaccount=bankaccount, amount="-10")
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(-10))

        with patch.object(BankTransaction, "save", side_effect=Exception("Bang")):
            with self.assertRaises(Exception):
                banktransaction.amount = -50
                banktransaction.save()

        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(-10))
Example #7
0
    def test_delete(self):

        bankaccount = BankAccountFactory(balance=50)

        banktransaction = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-25',
        )
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(25))

        banktransaction.delete()
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(50))
Example #8
0
    def test_save_success(self):

        bankaccount = BankAccountFactory(balance=-10)

        # Test insert.
        banktransaction = BankTransactionFactory(bankaccount=bankaccount, amount="15.59")
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal("5.59"))

        # Then test update.
        banktransaction.refresh_from_db()
        banktransaction.amount += Decimal("14.41")
        banktransaction.save()
        bankaccount.refresh_from_db()

        self.assertEqual(bankaccount.balance, Decimal("20"))
Example #9
0
    def test_banktransaction_update_fail(self):

        bankaccount = BankAccountFactory(balance=0)
        banktransaction = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-10',
        )
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(-10))

        with patch.object(BankTransaction, 'save', side_effect=Exception('Bang')):
            with self.assertRaises(Exception):
                banktransaction.amount = -50
                banktransaction.save()

        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(-10))
Example #10
0
    def test_save_success(self):

        bankaccount = BankAccountFactory(balance=-10)

        # Test insert.
        banktransaction = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='15.59',
        )
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('5.59'))

        # Then test update.
        banktransaction.refresh_from_db()
        banktransaction.amount += Decimal('14.41')
        banktransaction.save()
        bankaccount.refresh_from_db()

        self.assertEqual(bankaccount.balance, Decimal('20'))
Example #11
0
    def test_status_disabled(self):

        # Test with create op.
        bankaccount = BankAccountFactory(balance=100)

        BankTransactionFactory(bankaccount=bankaccount, amount=Decimal("150"), status=BankTransaction.STATUS_INACTIVE)
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(100))

        # Then test with update.
        banktransaction = BankTransactionFactory(bankaccount=bankaccount, amount=Decimal("150"))
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal("250"))

        banktransaction.status = BankTransaction.STATUS_INACTIVE
        banktransaction.amount = Decimal("180")
        banktransaction.save()
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal("250"))

        # Then test with delete op.
        banktransaction.delete()
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal("250"))
Example #12
0
class FormTestCase(WebTest):

    @classmethod
    def setUpTestData(cls):
        cls.superowner = UserFactory(username='******', user_permissions='admin')

    def setUp(self):
        self.bankaccount = BankAccountFactory(balance=0, owners=[self.superowner])

    def test_default_bankaccount(self):

        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })

        form = self.app.get(url, user='******').form
        self.assertNotIn('bankaccount', form.fields)

        edit = {
            'label': 'test implicit bank account',
            'amount': '0.00',
        }
        for name, value in edit.items():
            form[name] = value
        form.submit().maybe_follow()

        banktransaction = BankTransaction.objects.get(label=edit['label'])
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)

        url = reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk
        })

        form = self.app.get(url, user='******').form
        self.assertNotIn('bankaccount', form.fields)

        edit = {
            'label': 'new label',
            'amount': '-10.00',
        }
        for name, value in edit.items():
            form[name] = value
        form.submit().maybe_follow()

        banktransaction.refresh_from_db()
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)

    @override_settings(LANGUAGE_CODE='en-us')
    def test_field_tag(self):

        tag1 = BankTransactionTagFactory(owner=self.superowner)
        tag2 = BankTransactionTagFactory(owner=self.superowner)
        tag3 = BankTransactionTagFactory(owner=self.superowner)
        tag4 = BankTransactionTagFactory()

        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })

        form = self.app.get(url, user='******').form

        # Check available options.
        self.assertListEqual(
            [''] + sorted([int(option[0]) for option in form['tag'].options[1:]]),
            ['', tag1.pk, tag2.pk, tag3.pk]
        )

        # Test with a fake tag.
        edit = {
            'label': 'test fake tags',
            'amount': '-154.12',
        }
        for name, value in edit.items():
            form[name] = value
        form['tag'].force_value(['-1'])

        response = form.submit().maybe_follow()
        self.assertFormError(
            response,
            'form',
            'tag',
            [
                'Select a valid choice. That choice is not one of the '
                'available choices.'
            ]
        )
        with self.assertRaises(BankTransaction.DoesNotExist):
            BankTransaction.objects.get(label=edit['label'])

        # Test with with a non-owner tag.
        banktransaction = BankTransactionFactory(bankaccount=self.bankaccount)
        form = self.app.get(
            reverse('banktransactions:update', kwargs={
                'pk': banktransaction.pk
            }),
            user='******'
        ).form

        edit = {
            'label': 'test wrong tags',
            'amount': '-45.21',
        }
        for name, value in edit.items():
            form[name] = value
        form['tag'].force_value([str(tag4.pk)])
        response = form.submit().maybe_follow()
        self.assertFormError(
            response,
            'form',
            'tag',
            [
                'Select a valid choice. That choice is not one of the '
                'available choices.'
            ]
        )
        with self.assertRaises(BankTransaction.DoesNotExist):
            BankTransaction.objects.get(label=edit['label'])

        # Finally test adding tag.
        form = self.app.get(url, user='******').form
        edit = {
            'label': 'test tags',
            'amount': '-154.12',
            'tag': str(tag1.pk),
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit().maybe_follow()

        banktransaction = BankTransaction.objects.get(label=edit['label'])
        self.assertEqual(
            str(banktransaction.tag.pk),
            edit['tag']
        )

    @override_settings(LANGUAGE_CODE='en-us')
    def test_create_form(self):

        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })
        form = self.app.get(url, user='******').form
        self.assertNotIn('currency', form.fields)
        self.assertNotIn('scheduled', form.fields)

        edit = {
            'label': 'test create',
            'amount': '-187.41',
            'memo': "OMG, I didn't remember!",
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit().maybe_follow()

        banktransaction = BankTransaction.objects.get(label=edit['label'])
        self.assertEqual(banktransaction.amount, Decimal(edit['amount']))
        self.assertEqual(banktransaction.currency, self.bankaccount.currency)
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)
        self.assertTrue(banktransaction.date)
        self.assertFalse(banktransaction.reconciled)
        self.assertEqual(banktransaction.payment_method, BankTransaction.PAYMENT_METHOD_CREDIT_CARD)
        self.assertEqual(banktransaction.memo, edit['memo'])
        self.assertFalse(banktransaction.scheduled)

        self.bankaccount.refresh_from_db()
        self.assertEqual(self.bankaccount.balance, Decimal('-187.41'))

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Bank transaction %(label)s was created successfully.' % {
                'label': banktransaction.label
            },
            [message.message for message in storage],
        )

    @override_settings(LANGUAGE_CODE='en-us')
    def test_update_form(self):

        tag = BankTransactionTagFactory(owner=self.superowner)

        banktransaction = BankTransactionFactory(
            bankaccount=self.bankaccount,
            amount='-78.26',
            date='2015-07-10',
            reconciled=False,
            payment_method=BankTransaction.PAYMENT_METHOD_CREDIT_CARD,
            memo="",
            tag=BankTransactionTagFactory(),
        )

        url = reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk
        })

        form = self.app.get(url, user='******').form
        self.assertNotIn('currency', form.fields)
        self.assertNotIn('scheduled', form.fields)

        edit = {
            'label': 'test update',
            'amount': '15.69',
            'date': '2015-01-01',
            'reconciled': True,
            'payment_method': BankTransaction.PAYMENT_METHOD_CASH,
            'memo': "Ooops, typo errors!",
            'tag': str(tag.pk),
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit().maybe_follow()

        banktransaction.refresh_from_db()
        self.assertEqual(banktransaction.label, edit['label'])
        self.assertEqual(banktransaction.amount, Decimal(edit['amount']))
        self.assertEqual(banktransaction.currency, self.bankaccount.currency)
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)
        self.assertEqual(
            str(banktransaction.date),
            edit['date'],
        )
        self.assertTrue(banktransaction.reconciled)
        self.assertEqual(banktransaction.payment_method, BankTransaction.PAYMENT_METHOD_CASH)
        self.assertEqual(banktransaction.memo, edit['memo'])
        self.assertFalse(banktransaction.scheduled)
        self.assertEqual(
            str(banktransaction.tag.pk),
            edit['tag'],
        )

        banktransaction.bankaccount.refresh_from_db()
        self.assertEqual(banktransaction.bankaccount.balance, Decimal('15.69'))

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Bank transaction %(label)s was updated successfully.' % {
                'label': banktransaction.label
            },
            [message.message for message in storage],
        )

    def test_delete_form(self):

        banktransaction = BankTransactionFactory(bankaccount=self.bankaccount)

        url = reverse('banktransactions:delete', kwargs={
            'pk': banktransaction.pk
        })

        response = self.app.get(url, user='******')
        response = response.click(description=_('Cancel'))
        self.assertEqual(
            response.request.path,
            reverse('banktransactions:list', kwargs={
                'bankaccount_pk': self.bankaccount.pk,
            })
        )
        banktransaction.refresh_from_db()

        response = (
            self.app.get(url, user='******')
            .form.submit()
            .maybe_follow()
        )
        self.assertEqual(
            response.request.path,
            reverse('banktransactions:list', kwargs={
                'bankaccount_pk': self.bankaccount.pk
            })
        )
        with self.assertRaises(BankTransaction.DoesNotExist):
            banktransaction.refresh_from_db()

    def test_redirect_form(self):

        # Check on create form.
        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })
        form = self.app.get(url, user='******').form
        self.assertFalse(form['redirect'].checked)
        edit = {
            'label': 'test redirect',
            'amount': '-50',
            'redirect': True,
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit()
        self.assertRedirects(response, url + '?self-redirect=1')
        response = response.maybe_follow()
        self.assertTrue(response.form['redirect'].checked)

        # Not on update form.
        banktransaction = BankTransactionFactory(bankaccount=self.bankaccount)
        url = reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk
        })
        form = self.app.get(url, user='******').form
        self.assertNotIn('redirect', form.fields)
Example #13
0
class FormTestCase(WebTest):

    @classmethod
    def setUpTestData(cls):
        cls.superowner = UserFactory(username='******', user_permissions='admin')

    def setUp(self):
        self.bankaccount = BankAccountFactory(balance=0, owners=[self.superowner])

    def test_default_bankaccount(self):

        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })

        form = self.app.get(url, user='******').form
        self.assertNotIn('bankaccount', form.fields)

        edit = {
            'label': 'test implicit bank account',
            'amount': '0.00',
        }
        for name, value in edit.items():
            form[name] = value
        form.submit().maybe_follow()

        banktransaction = BankTransaction.objects.get(label=edit['label'])
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)

        url = reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk
        })

        form = self.app.get(url, user='******').form
        self.assertNotIn('bankaccount', form.fields)

        edit = {
            'label': 'new label',
            'amount': '-10.00',
        }
        for name, value in edit.items():
            form[name] = value
        form.submit().maybe_follow()

        banktransaction.refresh_from_db()
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)

    @override_settings(LANGUAGE_CODE='en-us')
    def test_field_tag(self):

        tag1 = BankTransactionTagFactory(owner=self.superowner)
        tag2 = BankTransactionTagFactory(owner=self.superowner)
        tag3 = BankTransactionTagFactory(owner=self.superowner)
        tag4 = BankTransactionTagFactory()

        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })

        form = self.app.get(url, user='******').form

        # Check available options.
        self.assertListEqual(
            [''] + sorted([int(option[0]) for option in form['tag'].options[1:]]),
            ['', tag1.pk, tag2.pk, tag3.pk]
        )

        # Test with a fake tag.
        edit = {
            'label': 'test fake tags',
            'amount': '-154.12',
        }
        for name, value in edit.items():
            form[name] = value
        form['tag'].force_value(['-1'])

        response = form.submit().maybe_follow()
        self.assertFormError(
            response,
            'form',
            'tag',
            [
                'Select a valid choice. That choice is not one of the '
                'available choices.'
            ]
        )
        with self.assertRaises(BankTransaction.DoesNotExist):
            BankTransaction.objects.get(label=edit['label'])

        # Test with with a non-owner tag.
        banktransaction = BankTransactionFactory(bankaccount=self.bankaccount)
        form = self.app.get(
            reverse('banktransactions:update', kwargs={
                'pk': banktransaction.pk
            }),
            user='******'
        ).form

        edit = {
            'label': 'test wrong tags',
            'amount': '-45.21',
        }
        for name, value in edit.items():
            form[name] = value
        form['tag'].force_value([str(tag4.pk)])
        response = form.submit().maybe_follow()
        self.assertFormError(
            response,
            'form',
            'tag',
            [
                'Select a valid choice. That choice is not one of the '
                'available choices.'
            ]
        )
        with self.assertRaises(BankTransaction.DoesNotExist):
            BankTransaction.objects.get(label=edit['label'])

        # Finally test adding tag.
        form = self.app.get(url, user='******').form
        edit = {
            'label': 'test tags',
            'amount': '-154.12',
            'tag': str(tag1.pk),
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit().maybe_follow()

        banktransaction = BankTransaction.objects.get(label=edit['label'])
        self.assertEqual(
            str(banktransaction.tag.pk),
            edit['tag']
        )

    @override_settings(LANGUAGE_CODE='en-us')
    def test_create_form(self):

        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })
        form = self.app.get(url, user='******').form
        self.assertNotIn('currency', form.fields)
        self.assertNotIn('scheduled', form.fields)

        edit = {
            'label': 'test create',
            'amount': '-187.41',
            'memo': "OMG, I didn't remember!",
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit().maybe_follow()

        banktransaction = BankTransaction.objects.get(label=edit['label'])
        self.assertEqual(banktransaction.amount, Decimal(edit['amount']))
        self.assertEqual(banktransaction.currency, self.bankaccount.currency)
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)
        self.assertTrue(banktransaction.date)
        self.assertFalse(banktransaction.reconciled)
        self.assertEqual(banktransaction.payment_method, BankTransaction.PAYMENT_METHOD_CREDIT_CARD)
        self.assertEqual(banktransaction.memo, edit['memo'])
        self.assertFalse(banktransaction.scheduled)

        self.bankaccount.refresh_from_db()
        self.assertEqual(self.bankaccount.balance, Decimal('-187.41'))

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Bank transaction %(label)s was created successfully.' % {
                'label': banktransaction.label
            },
            [message.message for message in storage],
        )

    @override_settings(LANGUAGE_CODE='en-us')
    def test_update_form(self):

        tag = BankTransactionTagFactory(owner=self.superowner)

        banktransaction = BankTransactionFactory(
            bankaccount=self.bankaccount,
            amount='-78.26',
            date='2015-07-10',
            reconciled=False,
            payment_method=BankTransaction.PAYMENT_METHOD_CREDIT_CARD,
            memo="",
            tag=BankTransactionTagFactory(),
        )

        url = reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk
        })

        form = self.app.get(url, user='******').form
        self.assertNotIn('currency', form.fields)
        self.assertNotIn('scheduled', form.fields)

        edit = {
            'label': 'test update',
            'amount': '15.69',
            'date': '2015-01-01',
            'reconciled': True,
            'payment_method': BankTransaction.PAYMENT_METHOD_CASH,
            'memo': "Ooops, typo errors!",
            'tag': str(tag.pk),
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit().maybe_follow()

        banktransaction.refresh_from_db()
        self.assertEqual(banktransaction.label, edit['label'])
        self.assertEqual(banktransaction.amount, Decimal(edit['amount']))
        self.assertEqual(banktransaction.currency, self.bankaccount.currency)
        self.assertEqual(banktransaction.bankaccount.pk, self.bankaccount.pk)
        self.assertEqual(
            str(banktransaction.date),
            edit['date'],
        )
        self.assertTrue(banktransaction.reconciled)
        self.assertEqual(banktransaction.payment_method, BankTransaction.PAYMENT_METHOD_CASH)
        self.assertEqual(banktransaction.memo, edit['memo'])
        self.assertFalse(banktransaction.scheduled)
        self.assertEqual(
            str(banktransaction.tag.pk),
            edit['tag'],
        )

        banktransaction.bankaccount.refresh_from_db()
        self.assertEqual(banktransaction.bankaccount.balance, Decimal('15.69'))

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Bank transaction %(label)s was updated successfully.' % {
                'label': banktransaction.label
            },
            [message.message for message in storage],
        )

    def test_delete_form(self):

        banktransaction = BankTransactionFactory(bankaccount=self.bankaccount)

        url = reverse('banktransactions:delete', kwargs={
            'pk': banktransaction.pk
        })

        response = self.app.get(url, user='******')
        response = response.click(description=_('Cancel'))
        self.assertEqual(
            response.request.path,
            reverse('banktransactions:list', kwargs={
                'bankaccount_pk': self.bankaccount.pk,
            })
        )
        banktransaction.refresh_from_db()

        response = (
            self.app.get(url, user='******')
            .form.submit()
            .maybe_follow()
        )
        self.assertEqual(
            response.request.path,
            reverse('banktransactions:list', kwargs={
                'bankaccount_pk': self.bankaccount.pk
            })
        )
        with self.assertRaises(BankTransaction.DoesNotExist):
            banktransaction.refresh_from_db()

    def test_redirect_form(self):

        # Check on create form.
        url = reverse('banktransactions:create', kwargs={
            'bankaccount_pk': self.bankaccount.pk
        })
        form = self.app.get(url, user='******').form
        self.assertFalse(form['redirect'].checked)
        edit = {
            'label': 'test redirect',
            'amount': '-50',
            'redirect': True,
        }
        for name, value in edit.items():
            form[name] = value
        response = form.submit()
        self.assertRedirects(response, url + '?self-redirect=1')
        response = response.maybe_follow()
        self.assertTrue(response.form['redirect'].checked)

        # Not on update form.
        banktransaction = BankTransactionFactory(bankaccount=self.bankaccount)
        url = reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk
        })
        form = self.app.get(url, user='******').form
        self.assertNotIn('redirect', form.fields)
Example #14
0
    def test_scheduler(self):

        bankaccount = BankAccountFactory(balance=0)

        BankTransactionSchedulerFactory(
            amount=Decimal(10),
            bankaccount=bankaccount,
            date="2015-01-31",
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
        )
        BankTransactionSchedulerFactory(
            amount=Decimal(20),
            bankaccount=bankaccount,
            date="2015-01-31",
            type="monthly",
            recurrence="2",
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
        )
        BankTransactionSchedulerFactory(
            amount=Decimal(-5),
            bankaccount=bankaccount,
            date="2015-03-26",
            status=BankTransactionScheduler.STATUS_INACTIVE,
            type=BankTransactionScheduler.TYPE_WEEKLY,
            recurrence=None,
            last_action=timezone.make_aware(datetime.datetime(2015, 1, 31, 10)),
            state=BankTransactionScheduler.STATE_FINISHED,
        )
        BankTransactionSchedulerFactory(
            amount=Decimal(10),
            bankaccount=bankaccount,
            date="2015-01-31",
            last_action=timezone.now() + datetime.timedelta(days=100),
            state=BankTransactionScheduler.STATE_FINISHED,
        )

        # Clone two first scheduled.
        out = StringIO()
        call_command('clonescheduled', limit=2, stdout=out)
        self.assertIn('Scheduled bank transaction have been cloned.', out.getvalue())
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(30))
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            2,
        )

        # Clone latest.
        call_command('clonescheduled', stdout=StringIO())
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(30))
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            3,
        )

        # Nothing happen.
        call_command('clonescheduled', stdout=StringIO())
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(30))
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            3,
        )
Example #15
0
    def test_action_delete(self):

        bankaccount = BankAccountFactory(owners=[self.superowner])

        url = reverse('banktransactions:list', kwargs={
            'bankaccount_pk': bankaccount.pk
        })

        bt1 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.59',
        )
        bt2 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-15.59',
        )
        bt3 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='75',
        )
        balance = bankaccount.balance

        form = self.app.get(url, user='******').form
        for bt in [bt1, bt2, bt3]:
            form['banktransaction_' + str(bt.pk)] = True
        form['operation'] = 'delete'
        response = form.submit('action').maybe_follow()

        # Test cancel link
        response = response.click(description=_("Cancel"))
        self.assertEqual(
            response.request.path,
            reverse('banktransactions:list', kwargs={
                'bankaccount_pk': bankaccount.pk,
            })
        )

        # Is delete somewhere else.
        bt3.delete()
        balance -= Decimal(75)

        # Direct access on multiple delete page. Session is not up-to-date.
        form = self.app.get(
            reverse('banktransactions:delete_multiple', kwargs={
                'bankaccount_pk': bankaccount.pk
            })
        ).form
        response = form.submit().maybe_follow()

        self.assertFalse(
            list(BankTransaction.objects.filter(pk__in=[bt1.pk, bt2.pk]))
        )
        bankaccount.refresh_from_db()
        self.assertEqual(
            bankaccount.balance,
            balance - Decimal('5.59') - Decimal('-15.59')
        )

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Bank transactions deleted successfully.',
            [message.message for message in storage],
        )
Example #16
0
    def test_total_balance(self):

        bankaccount = BankAccountFactory(balance=0, owners=[self.superowner])

        url = reverse('banktransactions:list',
                      kwargs={'bankaccount_pk': bankaccount.pk})

        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-15.59',
            date=datetime.date(2015, 6, 3),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-4.41',
            date=datetime.date(2015, 6, 3),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.00',
            date=datetime.date(2015, 6, 3),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.59',
            date=datetime.date(2015, 6, 4),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='6.59',
            date=datetime.date(2015, 6, 4),
        )
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('-2.82'))

        response = self.app.get(url, user='******')
        object_list = list(reversed(response.context[0].get('object_list')))
        self.assertListEqual(
            [obj.total_balance for obj in object_list],
            [
                Decimal('-15.59'),
                Decimal('-20'),
                Decimal('-15'),
                Decimal('-9.41'),
                Decimal('-2.82'),
            ],
        )

        bankaccount.balance_initial = Decimal('150')
        bankaccount.save()

        response = self.app.get(url, user='******')
        object_list = list(reversed(response.context[0].get('object_list')))
        self.assertListEqual(
            [obj.total_balance for obj in object_list],
            [
                Decimal('150') + Decimal('-15.59'),
                Decimal('150') + Decimal('-20'),
                Decimal('150') + Decimal('-15'),
                Decimal('150') + Decimal('-9.41'),
                Decimal('150') + Decimal('-2.82'),
            ],
        )
Example #17
0
    def test_clone_succeed(self):

        bankaccount = BankAccountFactory(balance=0)

        # Test monthly, with recurrence.
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            amount=Decimal('10.23'),
            date=datetime.date(2015, 1, 31),
            memo="Test",
            reconciled=True,
            status=BankTransaction.STATUS_ACTIVE,
            tag=BankTransactionTagFactory(),
            type=BankTransactionScheduler.TYPE_MONTHLY,
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
            recurrence=2,
        )

        bts.clone()
        bt_clone = BankTransaction.objects.order_by('pk').last()
        self.assertEqual(bt_clone.label, bts.label)
        self.assertEqual(bt_clone.amount, bts.amount)
        self.assertEqual(bt_clone.payment_method, bts.payment_method)
        self.assertEqual(bt_clone.memo, bts.memo)
        self.assertEqual(bt_clone.tag.pk, bts.tag.pk)
        self.assertFalse(bt_clone.reconciled)
        self.assertTrue(bt_clone.scheduled)
        self.assertEqual(bt_clone.status, bts.status)
        self.assertEqual(
            bt_clone.date,
            datetime.date(2015, 2, 28),
        )

        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('10.23'))

        self.assertEqual(bts.date, bt_clone.date)
        self.assertIsNotNone(bts    .last_action)
        self.assertEqual(bts.recurrence, 1)
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_FINISHED)

        # Clone it again to delete it.
        bts.clone()
        with self.assertRaises(BankTransactionScheduler.DoesNotExist):
            bts.refresh_from_db()

        # Test weekly, infinity
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            amount=Decimal(-45.74),
            date=datetime.date(2015, 3, 26),
            status=BankTransactionScheduler.STATUS_INACTIVE,
            type=BankTransactionScheduler.TYPE_WEEKLY,
            recurrence=None,
            last_action=timezone.make_aware(datetime.datetime(2015, 1, 31, 10)),
            state=BankTransactionScheduler.STATE_FINISHED,
        )
        bts.clone()

        bt_clone = BankTransaction.objects.order_by('pk').last()
        self.assertEqual(
            bt_clone.date,
            datetime.date(2015, 4, 2),
        )

        # Clone inactive doesn't alter bank account balance.
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('20.46'))

        self.assertEqual(bts.date, datetime.date(2015, 4, 2))
        self.assertNotEqual(
            bts.last_action,
            timezone.make_aware(
                datetime.datetime.strptime(
                    '2015-03-26 03:50:00',
                    '%Y-%m-%d %H:%M:%S',
                )
            )
        )
        self.assertIsNone(bts.recurrence)
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_FINISHED)

        # Clone it again
        bts.clone()
        bts.refresh_from_db()
        self.assertEqual(bts.date, datetime.date(2015, 4, 9))
Example #18
0
    def test_scheduler(self):

        bankaccount = BankAccountFactory(balance=0)

        BankTransactionSchedulerFactory(
            amount=Decimal(10),
            bankaccount=bankaccount,
            date="2015-01-31",
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
        )
        BankTransactionSchedulerFactory(
            amount=Decimal(20),
            bankaccount=bankaccount,
            date="2015-01-31",
            type="monthly",
            recurrence="2",
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
        )
        BankTransactionSchedulerFactory(
            amount=Decimal(-5),
            bankaccount=bankaccount,
            date="2015-03-26",
            status=BankTransactionScheduler.STATUS_INACTIVE,
            type=BankTransactionScheduler.TYPE_WEEKLY,
            recurrence=None,
            last_action=timezone.make_aware(datetime.datetime(2015, 1, 31,
                                                              10)),
            state=BankTransactionScheduler.STATE_FINISHED,
        )
        BankTransactionSchedulerFactory(
            amount=Decimal(10),
            bankaccount=bankaccount,
            date="2015-01-31",
            last_action=timezone.now() + datetime.timedelta(days=100),
            state=BankTransactionScheduler.STATE_FINISHED,
        )

        # Clone two first scheduled.
        out = StringIO()
        call_command('clonescheduled', limit=2, stdout=out)
        self.assertIn('Scheduled bank transaction have been cloned.',
                      out.getvalue())
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(30))
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            2,
        )

        # Clone latest.
        call_command('clonescheduled', stdout=StringIO())
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(30))
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            3,
        )

        # Nothing happen.
        call_command('clonescheduled', stdout=StringIO())
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal(30))
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            3,
        )
Example #19
0
    def test_total_balance(self):

        bankaccount = BankAccountFactory(balance=0, owners=[self.superowner])

        url = reverse('banktransactions:list', kwargs={
            'bankaccount_pk': bankaccount.pk
        })

        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-15.59',
            date=datetime.date(2015, 6, 3),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-4.41',
            date=datetime.date(2015, 6, 3),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.00',
            date=datetime.date(2015, 6, 3),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.59',
            date=datetime.date(2015, 6, 4),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount='6.59',
            date=datetime.date(2015, 6, 4),
        )
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('-2.82'))

        response = self.app.get(url, user='******')
        object_list = list(reversed(response.context[0].get('object_list')))
        self.assertListEqual(
            [obj.total_balance for obj in object_list],
            [
                Decimal('-15.59'),
                Decimal('-20'),
                Decimal('-15'),
                Decimal('-9.41'),
                Decimal('-2.82'),
            ],
        )

        bankaccount.balance_initial = Decimal('150')
        bankaccount.save()

        response = self.app.get(url, user='******')
        object_list = list(reversed(response.context[0].get('object_list')))
        self.assertListEqual(
            [obj.total_balance for obj in object_list],
            [
                Decimal('150') + Decimal('-15.59'),
                Decimal('150') + Decimal('-20'),
                Decimal('150') + Decimal('-15'),
                Decimal('150') + Decimal('-9.41'),
                Decimal('150') + Decimal('-2.82'),
            ],
        )
Example #20
0
    def test_clone_succeed(self):

        bankaccount = BankAccountFactory(balance=0)

        # Test monthly, with recurrence.
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            amount=Decimal('10.23'),
            date=datetime.date(2015, 1, 31),
            memo="Test",
            reconciled=True,
            status=BankTransaction.STATUS_ACTIVE,
            tag=BankTransactionTagFactory(),
            type=BankTransactionScheduler.TYPE_MONTHLY,
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
            recurrence=2,
        )

        bts.clone()
        bt_clone = BankTransaction.objects.order_by('pk').last()
        self.assertEqual(bt_clone.label, bts.label)
        self.assertEqual(bt_clone.amount, bts.amount)
        self.assertEqual(bt_clone.payment_method, bts.payment_method)
        self.assertEqual(bt_clone.memo, bts.memo)
        self.assertEqual(bt_clone.tag.pk, bts.tag.pk)
        self.assertFalse(bt_clone.reconciled)
        self.assertTrue(bt_clone.scheduled)
        self.assertEqual(bt_clone.status, bts.status)
        self.assertEqual(
            bt_clone.date,
            datetime.date(2015, 2, 28),
        )

        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('10.23'))

        self.assertEqual(bts.date, bt_clone.date)
        self.assertIsNotNone(bts.last_action)
        self.assertEqual(bts.recurrence, 1)
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_FINISHED)

        # Clone it again to delete it.
        bts.clone()
        with self.assertRaises(BankTransactionScheduler.DoesNotExist):
            bts.refresh_from_db()

        # Test weekly, infinity
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            amount=Decimal(-45.74),
            date=datetime.date(2015, 3, 26),
            status=BankTransactionScheduler.STATUS_INACTIVE,
            type=BankTransactionScheduler.TYPE_WEEKLY,
            recurrence=None,
            last_action=timezone.make_aware(datetime.datetime(2015, 1, 31,
                                                              10)),
            state=BankTransactionScheduler.STATE_FINISHED,
        )
        bts.clone()

        bt_clone = BankTransaction.objects.order_by('pk').last()
        self.assertEqual(
            bt_clone.date,
            datetime.date(2015, 4, 2),
        )

        # Clone inactive doesn't alter bank account balance.
        bankaccount.refresh_from_db()
        self.assertEqual(bankaccount.balance, Decimal('20.46'))

        self.assertEqual(bts.date, datetime.date(2015, 4, 2))
        self.assertNotEqual(
            bts.last_action,
            timezone.make_aware(
                datetime.datetime.strptime(
                    '2015-03-26 03:50:00',
                    '%Y-%m-%d %H:%M:%S',
                )))
        self.assertIsNone(bts.recurrence)
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_FINISHED)

        # Clone it again
        bts.clone()
        bts.refresh_from_db()
        self.assertEqual(bts.date, datetime.date(2015, 4, 9))