From bcc3cf4568827fe629526868a9ff528d4f660054 Mon Sep 17 00:00:00 2001 From: Moul <moul@moul.re> Date: Wed, 10 Nov 2021 18:11:28 +0100 Subject: [PATCH] =?UTF-8?q?[enh]=20#187:=20Implement=20=5F=5Feq=5F=5F=20an?= =?UTF-8?q?d=20=5F=5Fhash=5F=5F=20Revocation=E2=80=99s=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- duniterpy/documents/revocation.py | 20 ++++++++++++- tests/documents/test_revocation.py | 47 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/documents/test_revocation.py diff --git a/duniterpy/documents/revocation.py b/duniterpy/documents/revocation.py index aaab229..7664a70 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 0000000..b17398a --- /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 -- GitLab