diff --git a/duniterpy/documents/revocation.py b/duniterpy/documents/revocation.py index aaab2297f058d574d483707862bb2459ab27d08d..7664a7082859efc470fd305d3dc3be17df80ffff 100644 --- a/duniterpy/documents/revocation.py +++ b/duniterpy/documents/revocation.py @@ -14,7 +14,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import re -from typing import Type, TypeVar, Union +from typing import Any, Type, TypeVar, Union from ..constants import ( BLOCK_ID_REGEX, @@ -79,6 +79,24 @@ class Revocation(Document): if signing_key is not None: self.sign(signing_key) + def __eq__(self, other: Any) -> bool: + """ + Check Revocation instances equality + """ + if not isinstance(other, Revocation): + return NotImplemented + return super().__eq__(other) and self.identity == other.identity + + def __hash__(self) -> int: + return hash( + ( + self.identity, + self.version, + self.currency, + self.signature, + ) + ) + @classmethod def from_inline( cls: Type[RevocationType], diff --git a/tests/documents/test_revocation.py b/tests/documents/test_revocation.py new file mode 100644 index 0000000000000000000000000000000000000000..b17398abd55b7508648924d7f1c5459ca7d11542 --- /dev/null +++ b/tests/documents/test_revocation.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, Revocation + +PUBKEY = "A" +UID = "test" +BLOCK_ID = "0-NRSATU" +IDENTITY_KWARGS = [PUBKEY, UID, BLOCK_ID] + + +def test_revocation_equality(): + rev1 = Revocation(Identity(*IDENTITY_KWARGS)) + rev2 = Revocation(Identity(*IDENTITY_KWARGS)) + assert rev1 == rev2 + + +@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_revocation_inequality(pubkey, uid, block_id, currency): + rev1 = Revocation(Identity(*IDENTITY_KWARGS)) + rev2 = Revocation(Identity(pubkey, uid, block_id)) + if currency: + rev2.currency = currency + assert not rev1 == rev2