def test_extra(self):

        user = UserFactory(user_permissions='admin')
        bankaccount = BankAccountFactory(owners=[user])
        BankAccountFactory()

        response = self.client.get(reverse('home'), follow=True)
        self.assertNotIn('user_bankaccounts', response.context[0])

        self.client.force_login(user)
        response = self.client.get(reverse('home'), follow=True)
        self.assertListEqual(
            [ba.pk for ba in response.context[0]['user_bankaccounts']],
            [bankaccount.pk],
        )

        mymoney_settings = settings.MYMONEY.copy()
        mymoney_settings['USE_L10N_DIST'] = False
        with self.settings(MYMONEY=mymoney_settings, LANGUAGE_CODE='en-us'):
            response = self.client.get(reverse('home'), follow=True)
            self.assertNotIn('.min.en-US.js',
                             response.context[0]['dist_js_src'])

        mymoney_settings = settings.MYMONEY.copy()
        mymoney_settings['USE_L10N_DIST'] = True
        with self.settings(MYMONEY=mymoney_settings, LANGUAGE_CODE='en-us'):
            response = self.client.get(reverse('home'), follow=True)
            self.assertIn('.min.en-US.js', response.context[0]['dist_js_src'])

        mymoney_settings = settings.MYMONEY.copy()
        mymoney_settings['USE_L10N_DIST'] = True
        with self.settings(MYMONEY=mymoney_settings, LANGUAGE_CODE='fr-fr'):
            response = self.client.get(reverse('home'), follow=True)
            self.assertIn('.min.fr-FR.js', response.context[0]['dist_js_src'])
Exemple #2
0
    def test_redirect_authenticated_multiple_bankaccounts(self):

        user = UserFactory()
        BankAccountFactory(owners=[user])
        BankAccountFactory(owners=[user])

        self.client.force_login(user)
        response = self.client.get(self.url, follow=True)
        self.assertEqual(response.resolver_match.view_name, 'bankaccounts:list')
Exemple #3
0
    def test_clone_queryset_update_failed(self, update_mock):
        update_mock.side_effect = Exception('Click-click Booom!')

        bankaccount = BankAccountFactory(balance=0)
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            recurrence=None,
            state=BankTransactionScheduler.STATE_WAITING,
            last_action=None,
        )

        with patch.object(BankTransactionScheduler,
                          'save',
                          side_effect=Exception('Click-click Booom!')):
            with self.assertLogs(
                    logger='mymoney.apps.banktransactionschedulers.models',
                    level='ERROR'):
                bts.clone()

        bts.refresh_from_db()
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_WAITING)
        self.assertEqual(
            BankTransaction.objects.filter(bankaccount=bankaccount).count(),
            0,
        )
Exemple #4
0
    def test_action_unreconcile(self):

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

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

        bt1 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='5.59',
            reconciled=True,
        )
        bt2 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount='-15.59',
            reconciled=True,
        )

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

        for bt in [bt1, bt2]:
            bt.refresh_from_db()
            self.assertFalse(bt.reconciled)

        storage = messages.get_messages(response.context[0].request)
        self.assertIn(
            'Undo bank transaction reconciled.',
            [message.message for message in storage],
        )
    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'))
Exemple #6
0
    def test_purge(self):

        user = UserFactory()
        bankaccount = BankAccountFactory()
        tag = BankTransactionTagFactory()
        banktransaction = BankTransactionFactory()
        scheduler = BankTransactionSchedulerFactory()

        out = StringIO()
        call_command('demo', purge=True, interactive=False, stdout=out)
        self.assertEqual(
            out.getvalue(),
            'All data have been deleted.\n',
        )

        user_model = get_user_model()
        with self.assertRaises(user_model.DoesNotExist):
            user_model.objects.get(pk=user.pk)

        with self.assertRaises(BankAccount.DoesNotExist):
            BankAccount.objects.get(pk=bankaccount.pk)

        with self.assertRaises(BankTransactionTag.DoesNotExist):
            BankTransactionTag.objects.get(pk=tag.pk)

        with self.assertRaises(BankTransaction.DoesNotExist):
            BankTransaction.objects.get(pk=banktransaction.pk)

        with self.assertRaises(BankTransactionScheduler.DoesNotExist):
            BankTransactionScheduler.objects.get(pk=scheduler.pk)
Exemple #7
0
    def test_context_data(self):

        bankaccount = BankAccountFactory(owners=[self.owner, self.superowner])
        banktransaction = BankTransactionFactory(bankaccount=bankaccount)
        url = reverse('banktransactions:calendar_ajax_event',
                      kwargs={
                          'pk': banktransaction.pk,
                      })

        response = self.app.get(url, user='******')
        self.assertEqual(
            response.context['banktransaction'].pk,
            banktransaction.pk,
        )
        self.assertNotIn('edit_url', response.context)
        self.assertNotIn('delete_url', response.context)

        response = self.app.get(url, user='******')
        self.assertEqual(
            response.context['banktransaction'].pk,
            banktransaction.pk,
        )
        self.assertEqual(
            response.context['url_edit'],
            reverse('banktransactions:update',
                    kwargs={'pk': banktransaction.pk}))
        self.assertEqual(
            response.context['url_delete'],
            reverse('banktransactions:delete',
                    kwargs={'pk': banktransaction.pk}))
Exemple #8
0
    def test_default_value_localize(self):

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

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

        bt1 = BankTransactionFactory(
            bankaccount=bankaccount,
            date=datetime.date(2015, 5, 11),
            amount="15.59",
        )
        bt2 = BankTransactionFactory(  # noqa
            bankaccount=bankaccount,
            date=datetime.date(2015, 5, 12),
            amount="-25.59",
        )

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

        fields = {
            'date_start': '11/05/2015',
            'date_end': '11/05/2015',
        }
        for name, value in fields.items():
            form[name] = value
        response = form.submit('filter').maybe_follow()
        form = response.form

        self.assertEqual(
            fields['date_start'],
            form['date_start'].value,
        )
        self.assertEqual(
            fields['date_end'],
            form['date_end'].value,
        )
        self.assertListEqual(
            response.context[0].get('object_list', []),
            [bt1],
        )
        response = form.submit('reset').maybe_follow()
        form = response.form

        fields = {
            'amount_min': '10,26',
            'amount_max': '20,5',
        }
        for name, value in fields.items():
            form[name] = value
        response = form.submit('filter').maybe_follow()
        form = response.form

        self.assertEqual(fields['amount_min'], form['amount_min'].value)
        self.assertEqual(fields['amount_max'], form['amount_max'].value)
        self.assertListEqual(
            response.context[0].get('object_list', []),
            [bt1],
        )
 def setUpTestData(cls):
     cls.owner = UserFactory(username='******')
     cls.bankaccount = BankAccountFactory(owners=[cls.owner])
     cls.banktransactiontags = [
         BankTransactionTagFactory(owner=cls.owner),
         BankTransactionTagFactory(owner=cls.owner),
         BankTransactionTagFactory(owner=cls.owner),
     ]
 def setUpTestData(cls):
     cls.owner = UserFactory(username='******')
     cls.not_owner = UserFactory(username='******',
                                 user_permissions='staff')
     cls.superowner = UserFactory(username='******',
                                  user_permissions='admin')
     cls.bankaccount = BankAccountFactory(
         owners=[cls.owner, cls.superowner])
Exemple #11
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],
        )
    def test_reconciled_balance(self):

        bankaccount = BankAccountFactory(balance=0)

        self.assertEqual(
            BankTransaction.objects.get_reconciled_balance(bankaccount),
            0,
        )

        # Not reconciled by default.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=-15,
        )
        self.assertEqual(
            BankTransaction.objects.get_reconciled_balance(bankaccount),
            0,
        )

        # Should work.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=40,
            reconciled=True,
        )
        self.assertEqual(
            BankTransaction.objects.get_reconciled_balance(bankaccount),
            Decimal(40),
        )

        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=-30,
            reconciled=True,
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=55,
        )
        # Inactive, don't use it.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=-150,
            reconciled=True,
            status=BankTransaction.STATUS_INACTIVE,
        )
        # Ignored is not inactive, so use it.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=-5,
            reconciled=True,
            status=BankTransaction.STATUS_IGNORED,
        )
        self.assertEqual(
            BankTransaction.objects.get_reconciled_balance(bankaccount),
            Decimal(5),
        )
Exemple #13
0
 def setUpTestData(cls):
     cls.owner = UserFactory(username='******')
     cls.superowner = UserFactory(username='******',
                                  user_permissions='admin')
     cls.bankaccount = BankAccountFactory(
         owners=[cls.owner, cls.superowner],
         balance_initial=Decimal('10.15'),
     )
     cls.banktransaction = BankTransactionFactory(
         bankaccount=cls.bankaccount)
    def test_current_balance(self):

        bankaccount = BankAccountFactory(balance=0)

        self.assertEqual(
            BankTransaction.objects.get_current_balance(bankaccount),
            0,
        )

        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=-15,
            date=datetime.date.today() - datetime.timedelta(5),
        )
        # Ignored for stat only, so used here.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=10,
            date=datetime.date.today() - datetime.timedelta(7),
            status=BankTransaction.STATUS_IGNORED,
        )
        # Next, so not used.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=40,
            date=datetime.date.today() + datetime.timedelta(5),
        )
        # Inactive, don't use it.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=40,
            date=datetime.date.today() - datetime.timedelta(5),
            status=BankTransaction.STATUS_INACTIVE,
        )
        self.assertEqual(
            BankTransaction.objects.get_current_balance(bankaccount),
            Decimal(-5),
        )

        # Try it again with new records.
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=-30,
            date=datetime.date.today() - datetime.timedelta(5),
        )
        BankTransactionFactory(
            bankaccount=bankaccount,
            amount=55,
            date=datetime.date.today() + datetime.timedelta(5),
        )
        self.assertEqual(
            BankTransaction.objects.get_current_balance(bankaccount),
            Decimal(-35),
        )
Exemple #15
0
    def test_redirect_authenticated_one_bankaccount(self):

        user = UserFactory()
        bankaccount = BankAccountFactory(owners=[user])

        self.client.force_login(user)
        response = self.client.get(self.url, follow=True)

        self.assertEqual(response.resolver_match.view_name, 'banktransactions:list')
        self.assertDictEqual(response.resolver_match.kwargs, {
            'bankaccount_pk': str(bankaccount.pk),
        })
    def test_get_user_tags_with_bankaccount(self):

        superowner = UserFactory(username='******',
                                 user_permissions='admin')
        banktransactiontag = BankTransactionTagFactory(owner=superowner)
        BankAccountFactory(owners=[self.owner, superowner])

        tags = BankTransactionTag.objects.get_user_tags_queryset(self.owner)
        self.assertListEqual([
            self.banktransactiontags[0].pk,
            banktransactiontag.pk,
        ], sorted([tag.pk for tag in tags]))
Exemple #17
0
    def test_delete_bankaccount(self):

        bankaccount = BankAccountFactory()
        BankTransactionSchedulerFactory.create_batch(5)

        bankaccount_pk = bankaccount.pk
        bankaccount.delete()

        self.assertEqual(
            BankTransactionScheduler.objects.filter(
                bankaccount__pk=bankaccount_pk).count(),
            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)
    def test_force_currency(self):

        bankaccount = BankAccountFactory(currency='EUR')

        banktransaction = BankTransactionFactory(
            bankaccount=bankaccount,
            currency='USD',
        )
        self.assertEqual(banktransaction.currency, 'EUR')

        banktransaction.currency = 'USD'
        banktransaction.save()
        self.assertEqual(banktransaction.currency, 'EUR')
Exemple #20
0
 def setUpTestData(cls):
     cls.owner = UserFactory(username='******')
     cls.superowner = UserFactory(username='******',
                                  user_permissions='admin')
     cls.bankaccount = BankAccountFactory(
         owners=[cls.owner, cls.superowner])
     cls.banktransactiontags = [
         BankTransactionTagFactory(owner=cls.owner),
         BankTransactionTagFactory(owner=cls.owner),
         BankTransactionTagFactory(owner=cls.superowner),
         BankTransactionTagFactory(),
     ]
     cls.url = reverse('banktransactions:list',
                       kwargs={'bankaccount_pk': cls.bankaccount.pk})
    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))
    def test_delete_bankaccount(self):

        bankaccount = BankAccountFactory()
        tag = BankTransactionTagFactory()
        BankTransactionFactory(bankaccount=bankaccount, tag=tag)

        pk = bankaccount.pk
        bankaccount.delete()

        self.assertEqual(
            BankTransaction.objects.filter(bankaccount__pk=pk).count(),
            0,
        )
        # Should not be deleted.
        tag.refresh_from_db()
Exemple #23
0
    def test_clone_delete_failed(self, delete_mock):
        delete_mock.side_effect = Exception('Click-click boom!')

        bankaccount = BankAccountFactory(balance=0)
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            recurrence=1,
        )

        with self.assertLogs(
                logger='mymoney.apps.banktransactionschedulers.models',
                level='ERROR'):
            bts.clone()

        bts.refresh_from_db()
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_FAILED)
Exemple #24
0
    def test_breadcrumb(self):

        bankaccount = BankAccountFactory()
        kwargs = {
            "bankaccount_pk": bankaccount.pk,
        }

        request = mock.Mock(path=reverse('banktransactions:create', kwargs=kwargs))
        context = breadcrumb(request)
        self.assertListEqual(
            [reverse('banktransactions:list', kwargs=kwargs)],
            [link['href'] for link in context['links']]
        )

        banktransaction = BankTransactionFactory(bankaccount=bankaccount)
        request = mock.Mock(path=reverse('banktransactions:update', kwargs={
            'pk': banktransaction.pk,
        }))
        context = breadcrumb(request, banktransaction.bankaccount.pk)
        self.assertListEqual(
            [reverse('banktransactions:list', kwargs=kwargs)],
            [link['href'] for link in context['links']]
        )

        request = mock.Mock(path=reverse('banktransactionschedulers:create', kwargs=kwargs))
        context = breadcrumb(request)
        self.assertListEqual(
            [
                reverse('banktransactions:list', kwargs=kwargs),
                reverse('banktransactionschedulers:list', kwargs=kwargs),
            ],
            [link['href'] for link in context['links']]
        )

        banktransaction = BankTransactionFactory(bankaccount=bankaccount)
        request = mock.Mock(path=reverse('banktransactionschedulers:update', kwargs={
            'pk': banktransaction.pk,
        }))
        context = breadcrumb(request, banktransaction.bankaccount.pk)
        self.assertListEqual(
            [
                reverse('banktransactions:list', kwargs=kwargs),
                reverse('banktransactionschedulers:list', kwargs=kwargs),
            ],
            [link['href'] for link in context['links']]
        )
Exemple #25
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))
    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'))
Exemple #27
0
    def test_clone_insert_failed(self, save_mock):
        save_mock.side_effect = Exception('Click-click boom!')

        bankaccount = BankAccountFactory(balance=0)
        bts = BankTransactionSchedulerFactory(
            bankaccount=bankaccount,
            recurrence=5,
            date=datetime.date(2015, 7, 10),
            last_action=None,
            state=BankTransactionScheduler.STATE_WAITING,
        )

        with self.assertLogs(
                logger='mymoney.apps.banktransactionschedulers.models',
                level='ERROR'):
            bts.clone()

        bts.refresh_from_db()
        self.assertEqual(bts.state, BankTransactionScheduler.STATE_FAILED)
        self.assertEqual(bts.date, datetime.date(2015, 7, 10))
        self.assertEqual(bts.recurrence, 5)
        self.assertIsNone(bts.last_action)
 def setUpTestData(cls):
     cls.owner = UserFactory(username='******')
     cls.bankaccount = BankAccountFactory(owners=[cls.owner])
    def test_total_unscheduled_period(self):

        bankaccount = BankAccountFactory(balance=0)

        bt1 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount=Decimal('-152.23'),
            date=datetime.date(2015, 8, 9),
        )
        bt2 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount=Decimal('2347.78'),
            date=datetime.date(2015, 8, 13),
        )
        bt3 = BankTransactionFactory(
            bankaccount=bankaccount,
            amount=Decimal('-561.78'),
            date=datetime.date(2015, 8, 16),
        )

        # Out-of-date.
        bt4 = BankTransactionFactory(  # noqa
            bankaccount=bankaccount,
            date=datetime.date(2015, 9, 15),
            amount=Decimal('-10000'),
        )
        # Scheduled.
        bt5 = BankTransactionFactory(  # noqa
            bankaccount=bankaccount,
            scheduled=True,
            amount=Decimal('-10000'),
            date=datetime.date(2015, 8, 16),
        )
        # Inactive.
        bt6 = BankTransactionFactory(  # noqa
            bankaccount=bankaccount,
            status=BankTransaction.STATUS_INACTIVE,
            amount=Decimal('-10000'),
            date=datetime.date(2015, 8, 16),
        )
        # An another bank account.
        bt7 = BankTransactionFactory(  # noqa
            bankaccount=BankAccountFactory(),
            amount=Decimal('-10000'),
            date=datetime.date(2015, 8, 16),
        )

        with patch('mymoney.apps.banktransactions.models.get_date_ranges',
                   return_value=(
                       datetime.date(2015, 8, 1),
                       datetime.date(2015, 8, 30),
                   )):

            total = BankTransaction.objects.get_total_unscheduled_period(
                bankaccount, GRANULARITY_MONTH)
            self.assertEqual(
                total,
                bt1.amount + bt2.amount + bt3.amount,
            )

        with patch('mymoney.apps.banktransactions.models.get_date_ranges',
                   return_value=(
                       datetime.date(2015, 8, 9),
                       datetime.date(2015, 8, 15),
                   )):

            total = BankTransaction.objects.get_total_unscheduled_period(
                bankaccount,
                GRANULARITY_WEEK,
            )
            self.assertEqual(
                total,
                bt1.amount + bt2.amount,
            )
 def setUp(self):
     self.bankaccount = BankAccountFactory(
         owners=[self.owner, self.superowner])