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)
|