44import pytest
55
66from localstack .aws .api .route53resolver import (
7+ Action ,
78 ListResolverEndpointsResponse ,
89 ListResolverQueryLogConfigsResponse ,
910 ListResolverRuleAssociationsResponse ,
@@ -23,6 +24,27 @@ def route53resolver_api_snapshot_transformer(snapshot):
2324 snapshot .add_transformer (snapshot .transform .route53resolver_api ())
2425
2526
27+ @pytest .fixture
28+ def create_firewall_rule (aws_client : ServiceLevelClientFactory ):
29+ rules = []
30+
31+ def inner (** kwargs ):
32+ kwargs .setdefault ("Name" , f"rule-name-{ short_uid ()} " )
33+ rule_group_id = kwargs ["FirewallRuleGroupId" ]
34+ domain_list_id = kwargs ["FirewallDomainListId" ]
35+ response = aws_client .route53resolver .create_firewall_rule (** kwargs )
36+ rules .append ((rule_group_id , domain_list_id ))
37+ return response
38+
39+ yield inner
40+
41+ for rule_group_id , domain_list_id in rules [::- 1 ]:
42+ aws_client .route53resolver .delete_firewall_rule (
43+ FirewallRuleGroupId = rule_group_id ,
44+ FirewallDomainListId = domain_list_id ,
45+ )
46+
47+
2648# TODO: extract this somewhere so that we can reuse it in other places
2749def _cleanup_vpc (aws_client : ServiceLevelClientFactory , vpc_id : str ):
2850 """
@@ -721,3 +743,125 @@ def test_list_firewall_domain_lists(self, cleanups, snapshot, aws_client):
721743
722744 tag_result = aws_client .route53resolver .list_tags_for_resource (ResourceArn = arn )
723745 snapshot .match ("list-tags-for-resource" , tag_result )
746+
747+ @markers .aws .validated
748+ @markers .snapshot .skip_snapshot_verify (paths = ["$..Message" ])
749+ def test_list_firewall_rules_for_missing_rule_group (self , snapshot , aws_client ):
750+ """Test listing firewall rules for a non-existing rule-group."""
751+ with pytest .raises (
752+ aws_client .route53resolver .exceptions .ResourceNotFoundException
753+ ) as resource_not_found :
754+ aws_client .route53resolver .list_firewall_rules (FirewallRuleGroupId = "missing-id" )
755+
756+ snapshot .add_transformer (
757+ snapshot .transform .regex (r"\d{1}-[a-f0-9]{8}-[a-f0-9]{24}" , "trace-id" )
758+ )
759+ snapshot .match ("missing-firewall-rule-group-id" , resource_not_found .value .response )
760+
761+ @markers .aws .validated
762+ def test_list_firewall_rules_for_empty_rule_group (self , cleanups , snapshot , aws_client ):
763+ snapshot .add_transformer (snapshot .transform .key_value ("Name" ))
764+
765+ rule_group_response = aws_client .route53resolver .create_firewall_rule_group (
766+ Name = f"empty-{ short_uid ()} "
767+ )
768+ cleanups .append (
769+ lambda : aws_client .route53resolver .delete_firewall_rule_group (
770+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ]
771+ )
772+ )
773+ snapshot .match ("create-firewall-rule-group" , rule_group_response )
774+
775+ response = aws_client .route53resolver .list_firewall_rules (
776+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ]
777+ )
778+ snapshot .match ("empty-firewall-rule-group" , response )
779+
780+ @markers .aws .validated
781+ @markers .snapshot .skip_snapshot_verify (paths = ["$..FirewallDomainRedirectionAction" ])
782+ def test_list_firewall_rules (
783+ self ,
784+ cleanups ,
785+ snapshot ,
786+ aws_client ,
787+ create_firewall_rule ,
788+ ):
789+ """Test listing firewall rules.
790+
791+ We test listing:
792+ - all rules in the rule-group
793+ - rules filtered by priority
794+ - rules filtered by action
795+ - rules filtered by priority and action
796+ """
797+
798+ snapshot .add_transformer (
799+ [
800+ snapshot .transform .key_value ("Name" ),
801+ snapshot .transform .key_value ("FirewallRuleGroupId" ),
802+ snapshot .transform .key_value ("FirewallDomainListId" ),
803+ ]
804+ )
805+
806+ firewall_rule_group_name = f"fw-rule-group-{ short_uid ()} "
807+ rule_group_response = aws_client .route53resolver .create_firewall_rule_group (
808+ Name = firewall_rule_group_name
809+ )
810+ cleanups .append (
811+ lambda rule_group_id = rule_group_response ["FirewallRuleGroup" ][
812+ "Id"
813+ ]: aws_client .route53resolver .delete_firewall_rule_group (
814+ FirewallRuleGroupId = rule_group_id
815+ )
816+ )
817+ # Parameters for creating resources
818+ priorities = [1 , 2 , 3 , 4 ]
819+ actions = [Action .ALLOW , Action .ALERT , Action .ALERT , Action .ALLOW ]
820+
821+ for action , priority in zip (actions , priorities ):
822+ domain_list_response = aws_client .route53resolver .create_firewall_domain_list (
823+ Name = f"fw-domain-list-{ short_uid ()} "
824+ )
825+ cleanups .append (
826+ lambda domain_list_id = domain_list_response ["FirewallDomainList" ][
827+ "Id"
828+ ]: aws_client .route53resolver .delete_firewall_domain_list (
829+ FirewallDomainListId = domain_list_id
830+ )
831+ )
832+ create_firewall_rule (
833+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ],
834+ FirewallDomainListId = domain_list_response ["FirewallDomainList" ]["Id" ],
835+ Priority = priority ,
836+ Action = action ,
837+ )
838+
839+ # Check list filtering
840+ list_all_response = aws_client .route53resolver .list_firewall_rules (
841+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ]
842+ )
843+ snapshot .match ("firewall-rules-list-all" , list_all_response )
844+
845+ filter_by_priority_response = aws_client .route53resolver .list_firewall_rules (
846+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ], Priority = 1
847+ )
848+ snapshot .match ("firewall-rules-list-by-priority" , filter_by_priority_response )
849+
850+ filter_by_action_response = aws_client .route53resolver .list_firewall_rules (
851+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ], Action = Action .ALLOW
852+ )
853+ snapshot .match ("firewall-rules-list-by-action" , filter_by_action_response )
854+
855+ action_and_priority_response = aws_client .route53resolver .list_firewall_rules (
856+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ],
857+ Action = Action .ALLOW ,
858+ Priority = 4 ,
859+ )
860+ snapshot .match ("firewall-rules-list-by-action-and-priority" , action_and_priority_response )
861+
862+ filter_empty_response = aws_client .route53resolver .list_firewall_rules (
863+ FirewallRuleGroupId = rule_group_response ["FirewallRuleGroup" ]["Id" ],
864+ Action = Action .ALLOW ,
865+ Priority = 0 , # 0 catches cases when integers pose as booleans
866+ )
867+ snapshot .match ("firewall-rules-list-no-match" , filter_empty_response )
0 commit comments