diff --git a/.gitignore b/.gitignore index 117ed569..e0efedb4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ docs/.buildinfo docs/.doctrees/ __pycache__/ *.egg-info +build/* diff --git a/awsiot/iotshadow.py b/awsiot/iotshadow.py index 60c6ff9b..a6c28ef7 100644 --- a/awsiot/iotshadow.py +++ b/awsiot/iotshadow.py @@ -1327,16 +1327,14 @@ def __init__(self, *args, **kwargs): def from_payload(cls, payload): # type: (typing.Dict[str, typing.Any]) -> ShadowState new = cls() - val = payload.get('desired') - if val is not None: - new.desired = val - val = payload.get('reported') - if val is not None: - new.reported = val - if new.desired == None: - new.desired_is_nullable = True - if new.reported == None: - new.reported_is_nullable = True + if 'desired' in payload: + new.desired = payload['desired'] + new.desired_is_nullable = new.desired is None + + if 'reported' in payload: + new.reported = payload['reported'] + new.reported_is_nullable = new.reported is None + return new def to_payload(self): diff --git a/test/test_shadow_state.py b/test/test_shadow_state.py new file mode 100644 index 00000000..a54598ed --- /dev/null +++ b/test/test_shadow_state.py @@ -0,0 +1,41 @@ +from pydoc import describe +from unittest import TestCase + +from awsiot.iotshadow import ShadowState + + +class ShadowTest(TestCase): + + def test_shadow_state_payload_filled(self): + test_state = ShadowState.from_payload({ + "reported": {"Color": "Red"}, + "desired": {"Color": "Blue"} + }) + compareState = ShadowState( + reported={"Color": "Red"}, + desired={"Color": "Blue"} + ) + self.assertTrue(test_state.to_payload() == compareState.to_payload()) + + def test_shadow_state_payload_partial_filled(self): + test_state = ShadowState.from_payload({ + "reported": {"Color": "Red"} + }) + self.assertEqual(test_state.to_payload(), {"reported": {"Color": "Red"}}) + + def test_shadow_state_payload_can_send_null(self): + test_state = ShadowState( + reported={"Color": "Red"}, + desired=None, + desired_is_nullable=True + ) + self.assertEqual(test_state.to_payload(), {"reported": {"Color": "Red"}, "desired": None}) + + def test_shadow_state_payload_with_none(self): + test_state = ShadowState.from_payload({"reported": {"Color": "Red"}, "desired": None}) + self.assertTrue(test_state.desired_is_nullable) + self.assertEqual(test_state.to_payload(), {"reported": {"Color": "Red"}, "desired": None}) + + def test_shadow_state_payload_without_none(self): + test_state = ShadowState.from_payload({"reported": {"deviceAgent": {"rebootRequired": True}}}) + self.assertEqual(test_state.to_payload(), {"reported": {"deviceAgent": {"rebootRequired": True}}})