164 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import boto3
 | |
| import pytest
 | |
| 
 | |
| from botocore.exceptions import ClientError
 | |
| from moto import mock_iot
 | |
| 
 | |
| name = "my-rule"
 | |
| payload = {
 | |
|     "sql": "SELECT * FROM 'topic/*' WHERE something > 0",
 | |
|     "actions": [
 | |
|         {"dynamoDBv2": {"putItem": {"tableName": "my-table"}, "roleArn": "my-role"}}
 | |
|     ],
 | |
|     "errorAction": {
 | |
|         "republish": {"qos": 0, "roleArn": "my-role", "topic": "other-topic"}
 | |
|     },
 | |
|     "description": "my-description",
 | |
|     "ruleDisabled": False,
 | |
|     "awsIotSqlVersion": "2016-03-23",
 | |
| }
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_create():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
| 
 | |
|     # duplicated rule name
 | |
|     with pytest.raises(ClientError) as ex:
 | |
|         client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
|     error_code = ex.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceAlreadyExistsException")
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_list():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     # empty response
 | |
|     res = client.list_topic_rules()
 | |
|     res.should.have.key("rules").which.should.have.length_of(0)
 | |
| 
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
|     client.create_topic_rule(ruleName="my-rule-2", topicRulePayload=payload)
 | |
| 
 | |
|     res = client.list_topic_rules()
 | |
|     res.should.have.key("rules").which.should.have.length_of(2)
 | |
|     for rule, rule_name in zip(res["rules"], [name, "my-rule-2"]):
 | |
|         rule.should.have.key("ruleName").which.should.equal(rule_name)
 | |
|         rule.should.have.key("createdAt").which.should_not.be.none
 | |
|         rule.should.have.key("ruleArn").which.should_not.be.none
 | |
|         rule.should.have.key("ruleDisabled").which.should.equal(payload["ruleDisabled"])
 | |
|         rule.should.have.key("topicPattern").which.should.equal("topic/*")
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_get():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     # no such rule
 | |
|     with pytest.raises(ClientError) as ex:
 | |
|         client.get_topic_rule(ruleName=name)
 | |
|     error_code = ex.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
| 
 | |
|     rule = client.get_topic_rule(ruleName=name)
 | |
| 
 | |
|     rule.should.have.key("ruleArn").which.should_not.be.none
 | |
|     rule.should.have.key("rule")
 | |
|     rrule = rule["rule"]
 | |
|     rrule.should.have.key("actions").which.should.equal(payload["actions"])
 | |
|     rrule.should.have.key("awsIotSqlVersion").which.should.equal(
 | |
|         payload["awsIotSqlVersion"]
 | |
|     )
 | |
|     rrule.should.have.key("createdAt").which.should_not.be.none
 | |
|     rrule.should.have.key("description").which.should.equal(payload["description"])
 | |
|     rrule.should.have.key("errorAction").which.should.equal(payload["errorAction"])
 | |
|     rrule.should.have.key("ruleDisabled").which.should.equal(payload["ruleDisabled"])
 | |
|     rrule.should.have.key("ruleName").which.should.equal(name)
 | |
|     rrule.should.have.key("sql").which.should.equal(payload["sql"])
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_replace():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     # no such rule
 | |
|     with pytest.raises(ClientError) as ex:
 | |
|         client.replace_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
|     error_code = ex.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
| 
 | |
|     my_payload = payload.copy()
 | |
|     my_payload["description"] = "new-description"
 | |
|     client.replace_topic_rule(ruleName=name, topicRulePayload=my_payload)
 | |
| 
 | |
|     rule = client.get_topic_rule(ruleName=name)
 | |
|     rule["rule"]["ruleName"].should.equal(name)
 | |
|     rule["rule"]["description"].should.equal(my_payload["description"])
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_disable():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     # no such rule
 | |
|     with pytest.raises(ClientError) as ex:
 | |
|         client.disable_topic_rule(ruleName=name)
 | |
|     error_code = ex.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
| 
 | |
|     client.disable_topic_rule(ruleName=name)
 | |
| 
 | |
|     rule = client.get_topic_rule(ruleName=name)
 | |
|     rule["rule"]["ruleName"].should.equal(name)
 | |
|     rule["rule"]["ruleDisabled"].should.equal(True)
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_enable():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     # no such rule
 | |
|     with pytest.raises(ClientError) as ex:
 | |
|         client.enable_topic_rule(ruleName=name)
 | |
|     error_code = ex.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
|     my_payload = payload.copy()
 | |
|     my_payload["ruleDisabled"] = True
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=my_payload)
 | |
| 
 | |
|     client.enable_topic_rule(ruleName=name)
 | |
| 
 | |
|     rule = client.get_topic_rule(ruleName=name)
 | |
|     rule["rule"]["ruleName"].should.equal(name)
 | |
|     rule["rule"]["ruleDisabled"].should.equal(False)
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_topic_rule_delete():
 | |
|     client = boto3.client("iot", region_name="ap-northeast-1")
 | |
| 
 | |
|     # no such rule
 | |
|     with pytest.raises(ClientError) as ex:
 | |
|         client.delete_topic_rule(ruleName=name)
 | |
|     error_code = ex.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
|     client.create_topic_rule(ruleName=name, topicRulePayload=payload)
 | |
| 
 | |
|     client.enable_topic_rule(ruleName=name)
 | |
| 
 | |
|     client.delete_topic_rule(ruleName=name)
 | |
| 
 | |
|     res = client.list_topic_rules()
 | |
|     res.should.have.key("rules").which.should.have.length_of(0)
 |