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_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)
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_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_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_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_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_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_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_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"))
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)
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)
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, )
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_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'), ], )
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))
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, )
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'), ], )
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))