Add tests and typing annotation for Credential

This commit is contained in:
Adam Goldsmith 2020-06-01 13:21:47 -04:00
parent 0528686903
commit 79fb5f1b27
3 changed files with 26 additions and 7 deletions

View File

@ -1,11 +1,14 @@
import bitstring import bitstring
from typing import Tuple, Optional
# Reference for H10301 card format: # Reference for H10301 card format:
# https://www.hidglobal.com/sites/default/files/hid-understanding_card_data_formats-wp-en.pdf # https://www.hidglobal.com/sites/default/files/hid-understanding_card_data_formats-wp-en.pdf
class Credential: class Credential:
def __init__(self, code=None, hex=None): def __init__(
self, code: Optional[Tuple[int, int]] = None, hex: Optional[str] = None
) -> None:
if code is None and hex is None: if code is None and hex is None:
raise TypeError("Must set either code or hex for a Credential") raise TypeError("Must set either code or hex for a Credential")
elif code is not None and hex is not None: elif code is not None and hex is not None:
@ -21,21 +24,24 @@ class Credential:
elif hex is not None: elif hex is not None:
self.bits = bitstring.Bits(hex=hex) self.bits = bitstring.Bits(hex=hex)
def __repr__(self): def __repr__(self) -> str:
return f"Credential({self.code})" return f"Credential({self.code})"
def __eq__(self, other): def __eq__(self, other: object) -> bool:
return self.bits == other.bits if isinstance(other, Credential):
return self.bits == other.bits
else:
return False
def __hash__(self): def __hash__(self) -> int:
return self.bits.int return self.bits.int
@property @property
def code(self): def code(self) -> Tuple[int, int]:
facility = self.bits[7:15].uint facility = self.bits[7:15].uint
code = self.bits[15:31].uint code = self.bits[15:31].uint
return (facility, code) return (facility, code)
@property @property
def hex(self): def hex(self) -> str:
return self.bits.hex.upper() return self.bits.hex.upper()

View File

View File

@ -0,0 +1,13 @@
import pytest
from ..Credential import Credential
def test_code_to_hex() -> None:
cred = Credential(code=(123, 45678))
assert cred.hex == "02F764DD"
def test_hex_to_code() -> None:
cred = Credential(hex="02F764DD")
assert cred.code == (123, 45678)