diff --git a/tests/conftest.py b/tests/conftest.py index cee06ba..4075a82 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -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', diff --git a/tests/test_modifiedtransaction.py b/tests/test_modifiedtransaction.py index ccc4527..dbd309c 100644 --- a/tests/test_modifiedtransaction.py +++ b/tests/test_modifiedtransaction.py @@ -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) @@ -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) diff --git a/ynabtransactionadjuster/models/modifiedtransaction.py b/ynabtransactionadjuster/models/modifiedtransaction.py index d4a731f..f0b2d6e 100644 --- a/ynabtransactionadjuster/models/modifiedtransaction.py +++ b/ynabtransactionadjuster/models/modifiedtransaction.py @@ -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: