Skip to content

Commit

Permalink
bugfixed and refactored attribute changed checks
Browse files Browse the repository at this point in the history
  • Loading branch information
dnbasta committed Apr 7, 2024
1 parent 1df830e commit 5ab317d
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 33 deletions.
21 changes: 13 additions & 8 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,26 @@ def mock_subtransaction(request):

@pytest.fixture
def mock_original_transaction(request):
subs = ()
try:
if request.param:
subs = tuple()
memo = 'memo'
category = Category(id='cid1', name='cname')
flag_color = 'red'
if hasattr(request, 'param'):
if request.param == 'subtransactions':
st = OriginalSubTransaction(memo='memo1', amount=500,
category=Category(name='cname', id='cid'),
payee=Payee(name='pname'))
subs = (st, st)
except AttributeError as e:
pass
if request.param == 'optional_none':
memo = None
category = None
flag_color = None
return OriginalTransaction(id='id',
memo='memo',
category=Category(id='cid1', name='cname'),
memo=memo,
category=category,
payee=Payee(id='pid', name='pname'),
subtransactions=subs,
flag_color='red',
flag_color=flag_color,
amount=1000,
import_payee_name='ipn',
import_payee_name_original='ipno',
Expand Down
19 changes: 18 additions & 1 deletion tests/test_modifiedtransaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,23 @@ def test_is_changed_true(test_attribute, test_input, mock_original_transaction):
assert r is True


@pytest.mark.parametrize('mock_original_transaction', ['optional_none'], indirect=True)
@pytest.mark.parametrize('test_attribute, test_input', [
('memo', 'memox'),
('category', Category(id='c_id1', name='c_name1')),
])
def test_is_changed_true_none_values_in_original(test_attribute, test_input, mock_original_transaction):
# Arrange
mock_modifier = TransactionModifier.from_original_transaction(mock_original_transaction)
mock_modifier.__setattr__(test_attribute, test_input)
modified = ModifiedTransaction(original_transaction=mock_original_transaction, transaction_modifier=mock_modifier)

# Act
r = modified.is_changed()
assert r is True


@pytest.mark.parametrize('mock_original_transaction', [None, 'optional_none'], indirect=True)
def test_changed_false(mock_original_transaction):
# Arrange
mock_modifier = TransactionModifier.from_original_transaction(mock_original_transaction)
Expand All @@ -36,7 +53,7 @@ def test_changed_false(mock_original_transaction):
assert r is False


@pytest.mark.parametrize('mock_original_transaction', [True], indirect=True)
@pytest.mark.parametrize('mock_original_transaction', ['subtransactions'], indirect=True)
def test_invalid_subtransactions(mock_original_transaction, mock_subtransaction):
# Arrange
mock_modifier = TransactionModifier.from_original_transaction(mock_original_transaction)
Expand Down
44 changes: 20 additions & 24 deletions ynabtransactionadjuster/models/modifiedtransaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,35 +40,31 @@ def as_dict(self) -> dict:

def changed_attributes(self) -> dict:
"""Returns a dictionary representation of the modified values and the original transaction"""
changed_attributes = {}
if self.transaction_modifier.payee != self.original_transaction.payee:
changed_attributes['payee'] = dict(original=self.original_transaction.payee,
changed=self.transaction_modifier.payee)
changed_attributes = dict()

for a in ('payee', 'category', 'flag_color', 'memo', 'approved', 'cleared'):
if self._attribute_changed(a):
changed_attributes[a] = self._create_changed_dict(a)

if (self.transaction_modifier.transaction_date.isocalendar() !=
self.original_transaction.transaction_date.isocalendar()):
changed_attributes['transaction_date'] = dict(original=self.original_transaction.transaction_date,
changed=self.transaction_modifier.transaction_date)
if (self.transaction_modifier.category and
self.transaction_modifier.category.id != self.original_transaction.category.id):
changed_attributes['category'] = dict(original=self.original_transaction.category,
changed=self.transaction_modifier.category)
if self.transaction_modifier.memo != self.original_transaction.memo:
changed_attributes['memo'] = dict(original=self.original_transaction.memo,
changed=self.transaction_modifier.memo)
if self.transaction_modifier.flag_color != self.original_transaction.flag_color:
changed_attributes['flag_color'] = dict(original=self.original_transaction.flag_color,
changed=self.transaction_modifier.flag_color)
changed_attributes['transaction_date'] = self._create_changed_dict('transaction_date')

if len(self.transaction_modifier.subtransactions) > 0:
changed_attributes['subtransactions'] = dict(original=[],
changed=self.transaction_modifier.subtransactions)
if self.transaction_modifier.approved != self.original_transaction.approved:
changed_attributes['approved'] = dict(original=self.original_transaction.approved,
changed=self.transaction_modifier.approved)
if self.transaction_modifier.cleared != self.original_transaction.cleared:
changed_attributes['cleared'] = dict(original=self.original_transaction.cleared,
changed=self.transaction_modifier.cleared)
changed_attributes['subtransactions'] = self._create_changed_dict('subtransactions')

return changed_attributes

def _attribute_changed(self, attribute: str) -> bool:
o = self.original_transaction.__getattribute__(attribute)
m = self.transaction_modifier.__getattribute__(attribute)
if o != m:
return True

def _create_changed_dict(self, attribute: str) -> dict:
return dict(original=self.original_transaction.__getattribute__(attribute),
changed=self.transaction_modifier.__getattribute__(attribute))

@model_validator(mode='after')
def check_values(self):
if len(self.transaction_modifier.subtransactions) > 1:
Expand Down

0 comments on commit 5ab317d

Please sign in to comment.