diff --git a/duniterpy/documents/identity.py b/duniterpy/documents/identity.py index a526d9bd0595ac44b0e4f0d3fbffb290b5a9f61a..493183cf79eb92f0c46c9580d7aea0fcddbf386b 100644 --- a/duniterpy/documents/identity.py +++ b/duniterpy/documents/identity.py @@ -14,7 +14,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import re -from typing import Type, TypeVar +from typing import Any, Type, TypeVar from ..constants import ( BLOCK_ID_REGEX, @@ -96,6 +96,31 @@ class Identity(Document): if signing_key is not None: self.sign(signing_key) + def __eq__(self, other: Any) -> bool: + """ + Check Identity instances equality + """ + if not isinstance(other, Identity): + return NotImplemented + return ( + super().__eq__(other) + and self.pubkey == other.pubkey + and self.uid == other.uid + and self.block_id == other.block_id + ) + + def __hash__(self) -> int: + return hash( + ( + self.pubkey, + self.uid, + self.block_id, + self.version, + self.currency, + self.signature, + ) + ) + @classmethod def from_inline( cls: Type[IdentityType], diff --git a/tests/documents/test_identity.py b/tests/documents/test_identity.py new file mode 100644 index 0000000000000000000000000000000000000000..46bb9145901903da1c02167afb65580cf60b1d0a --- /dev/null +++ b/tests/documents/test_identity.py @@ -0,0 +1,47 @@ +# Copyright 2014-2021 Vincent Texier <vit@free.fr> +# +# DuniterPy is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# DuniterPy is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import pytest + +from duniterpy.constants import G1_TEST_CURRENCY_CODENAME +from duniterpy.documents import Identity + +PUBKEY = "A" +UID = "test" +BLOCK_ID = "0-NRSATU" +IDENTITY_KWARGS = [PUBKEY, UID, BLOCK_ID] + + +def test_identity_equality(): + idty1 = Identity(*IDENTITY_KWARGS) + idty2 = Identity(*IDENTITY_KWARGS) + assert idty1 == idty2 + + +@pytest.mark.parametrize( + "pubkey, uid, block_id, currency", + [ + ("pubkey", UID, BLOCK_ID, None), + (PUBKEY, "uid", BLOCK_ID, None), + (PUBKEY, UID, "1-TEST", None), + IDENTITY_KWARGS + [G1_TEST_CURRENCY_CODENAME], + ], +) +def test_identity_inequality(pubkey, uid, block_id, currency): + idty1 = Identity(*IDENTITY_KWARGS) + idty2 = Identity(pubkey, uid, block_id) + if currency: + idty2.currency = currency + assert not idty1 == idty2