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'])
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')
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, )
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'))
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)
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}))
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])
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), )
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), )
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]))
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')
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()
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)
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']] )
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'))
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])