| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | import boto3 | 
					
						
							|  |  |  | import sure  # noqa | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							|  |  |  | from moto import mock_iotdata, mock_iot | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_iot | 
					
						
							|  |  |  | @mock_iotdata | 
					
						
							|  |  |  | def test_basic(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     iot_client = boto3.client("iot", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     client = boto3.client("iot-data", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     name = "my-thing" | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     raw_payload = b'{"state": {"desired": {"led": "on"}}}' | 
					
						
							|  |  |  |     iot_client.create_thing(thingName=name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError): | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |         client.get_thing_shadow(thingName=name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     res = client.update_thing_shadow(thingName=name, payload=raw_payload) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload = json.loads(res["payload"].read()) | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     expected_state = '{"desired": {"led": "on"}}' | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload.should.have.key("state").which.should.equal(json.loads(expected_state)) | 
					
						
							|  |  |  |     payload.should.have.key("metadata").which.should.have.key( | 
					
						
							|  |  |  |         "desired" | 
					
						
							|  |  |  |     ).which.should.have.key("led") | 
					
						
							|  |  |  |     payload.should.have.key("version").which.should.equal(1) | 
					
						
							|  |  |  |     payload.should.have.key("timestamp") | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     res = client.get_thing_shadow(thingName=name) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload = json.loads(res["payload"].read()) | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     expected_state = b'{"desired": {"led": "on"}, "delta": {"led": "on"}}' | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload.should.have.key("state").which.should.equal(json.loads(expected_state)) | 
					
						
							|  |  |  |     payload.should.have.key("metadata").which.should.have.key( | 
					
						
							|  |  |  |         "desired" | 
					
						
							|  |  |  |     ).which.should.have.key("led") | 
					
						
							|  |  |  |     payload.should.have.key("version").which.should.equal(1) | 
					
						
							|  |  |  |     payload.should.have.key("timestamp") | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     client.delete_thing_shadow(thingName=name) | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError): | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |         client.get_thing_shadow(thingName=name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_iot | 
					
						
							|  |  |  | @mock_iotdata | 
					
						
							|  |  |  | def test_update(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     iot_client = boto3.client("iot", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     client = boto3.client("iot-data", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     name = "my-thing" | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     raw_payload = b'{"state": {"desired": {"led": "on"}}}' | 
					
						
							|  |  |  |     iot_client.create_thing(thingName=name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # first update | 
					
						
							|  |  |  |     res = client.update_thing_shadow(thingName=name, payload=raw_payload) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload = json.loads(res["payload"].read()) | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     expected_state = '{"desired": {"led": "on"}}' | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload.should.have.key("state").which.should.equal(json.loads(expected_state)) | 
					
						
							|  |  |  |     payload.should.have.key("metadata").which.should.have.key( | 
					
						
							|  |  |  |         "desired" | 
					
						
							|  |  |  |     ).which.should.have.key("led") | 
					
						
							|  |  |  |     payload.should.have.key("version").which.should.equal(1) | 
					
						
							|  |  |  |     payload.should.have.key("timestamp") | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     res = client.get_thing_shadow(thingName=name) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload = json.loads(res["payload"].read()) | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     expected_state = b'{"desired": {"led": "on"}, "delta": {"led": "on"}}' | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload.should.have.key("state").which.should.equal(json.loads(expected_state)) | 
					
						
							|  |  |  |     payload.should.have.key("metadata").which.should.have.key( | 
					
						
							|  |  |  |         "desired" | 
					
						
							|  |  |  |     ).which.should.have.key("led") | 
					
						
							|  |  |  |     payload.should.have.key("version").which.should.equal(1) | 
					
						
							|  |  |  |     payload.should.have.key("timestamp") | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # reporting new state | 
					
						
							|  |  |  |     new_payload = b'{"state": {"reported": {"led": "on"}}}' | 
					
						
							|  |  |  |     res = client.update_thing_shadow(thingName=name, payload=new_payload) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload = json.loads(res["payload"].read()) | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     expected_state = '{"reported": {"led": "on"}}' | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload.should.have.key("state").which.should.equal(json.loads(expected_state)) | 
					
						
							|  |  |  |     payload.should.have.key("metadata").which.should.have.key( | 
					
						
							|  |  |  |         "reported" | 
					
						
							|  |  |  |     ).which.should.have.key("led") | 
					
						
							|  |  |  |     payload.should.have.key("version").which.should.equal(2) | 
					
						
							|  |  |  |     payload.should.have.key("timestamp") | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     res = client.get_thing_shadow(thingName=name) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload = json.loads(res["payload"].read()) | 
					
						
							| 
									
										
										
										
											2017-11-10 18:44:02 +09:00
										 |  |  |     expected_state = b'{"desired": {"led": "on"}, "reported": {"led": "on"}}' | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     payload.should.have.key("state").which.should.equal(json.loads(expected_state)) | 
					
						
							|  |  |  |     payload.should.have.key("metadata").which.should.have.key( | 
					
						
							|  |  |  |         "desired" | 
					
						
							|  |  |  |     ).which.should.have.key("led") | 
					
						
							|  |  |  |     payload.should.have.key("version").which.should.equal(2) | 
					
						
							|  |  |  |     payload.should.have.key("timestamp") | 
					
						
							| 
									
										
										
										
											2017-11-25 02:22:53 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-26 13:28:56 +09:00
										 |  |  |     raw_payload = b'{"state": {"desired": {"led": "on"}}, "version": 1}' | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2019-08-26 13:28:56 +09:00
										 |  |  |         client.update_thing_shadow(thingName=name, payload=raw_payload) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(409) | 
					
						
							|  |  |  |     ex.value.response["Error"]["Message"].should.equal("Version conflict") | 
					
						
							| 
									
										
										
										
											2019-08-26 13:28:56 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-25 02:22:53 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_iotdata | 
					
						
							|  |  |  | def test_publish(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("iot-data", region_name="ap-northeast-1") | 
					
						
							|  |  |  |     client.publish(topic="test/topic", qos=1, payload=b"") |