1+ import pytest
2+ import requests
3+ from settings import TEST_DATA
4+ from suite .fixtures .fixtures import PublicEndpoint
5+ from suite .utils .resources_utils import (
6+ create_example_app ,
7+ create_items_from_yaml ,
8+ delete_common_app ,
9+ delete_items_from_yaml ,
10+ ensure_connection_to_public_endpoint ,
11+ wait_before_test ,
12+ wait_until_all_pods_are_ready ,
13+ )
14+ from suite .utils .yaml_utils import get_first_ingress_host_from_yaml , get_name_from_yaml
15+
16+
17+ class RewriteTargetSetup :
18+ """Encapsulate Rewrite Target example details."""
19+
20+ def __init__ (
21+ self ,
22+ public_endpoint : PublicEndpoint ,
23+ ingress_src_file ,
24+ ingress_name ,
25+ ingress_host ,
26+ namespace ,
27+ request_url ,
28+ ):
29+ self .public_endpoint = public_endpoint
30+ self .ingress_name = ingress_name
31+ self .namespace = namespace
32+ self .ingress_host = ingress_host
33+ self .ingress_src_file = ingress_src_file
34+ self .request_url = request_url
35+
36+
37+ @pytest .fixture (scope = "function" )
38+ def rewrite_target_setup (
39+ request ,
40+ kube_apis ,
41+ ingress_controller_prerequisites ,
42+ ingress_controller_endpoint ,
43+ ingress_controller ,
44+ test_namespace ,
45+ ) -> RewriteTargetSetup :
46+ print ("------------------------- Deploy Ingress with rewrite-target annotations -----------------------------------" )
47+ src = f"{ TEST_DATA } /rewrite-target/{ request .param } .yaml"
48+ create_items_from_yaml (kube_apis , src , test_namespace )
49+ ingress_name = get_name_from_yaml (src )
50+ ingress_host = get_first_ingress_host_from_yaml (src )
51+ request_url = f"http://{ ingress_controller_endpoint .public_ip } :{ ingress_controller_endpoint .port } /backend1"
52+
53+ create_example_app (kube_apis , "simple" , test_namespace )
54+ wait_until_all_pods_are_ready (kube_apis .v1 , test_namespace )
55+
56+ ensure_connection_to_public_endpoint (
57+ ingress_controller_endpoint .public_ip , ingress_controller_endpoint .port , ingress_controller_endpoint .port_ssl
58+ )
59+
60+ def fin ():
61+ if request .config .getoption ("--skip-fixture-teardown" ) == "no" :
62+ print ("Clean up:" )
63+ delete_common_app (kube_apis , "simple" , test_namespace )
64+ delete_items_from_yaml (kube_apis , src , test_namespace )
65+
66+ request .addfinalizer (fin )
67+
68+ return RewriteTargetSetup (
69+ ingress_controller_endpoint ,
70+ src ,
71+ ingress_name ,
72+ ingress_host ,
73+ test_namespace ,
74+ request_url ,
75+ )
76+
77+
78+ @pytest .mark .annotations
79+ class TestRewriteTarget :
80+ @pytest .mark .parametrize ("rewrite_target_setup" , ["rewrite-static" ], indirect = True )
81+ def test_static_rewrite_target (self , rewrite_target_setup ):
82+ """
83+ Test static rewrite target functionality.
84+ Request to /app should be rewritten to /backend.
85+ """
86+ request_url = f"http://{ rewrite_target_setup .public_endpoint .public_ip } :{ rewrite_target_setup .public_endpoint .port } /app"
87+ resp = requests .get (
88+ request_url ,
89+ headers = {"host" : rewrite_target_setup .ingress_host },
90+ )
91+
92+ assert resp .status_code == 200
93+ assert "URI: /backend" in resp .text
94+
95+ @pytest .mark .parametrize ("rewrite_target_setup" , ["rewrite-regex" ], indirect = True )
96+ def test_regex_rewrite_target (self , rewrite_target_setup ):
97+ """
98+ Test regex rewrite target functionality with capture groups.
99+ Request to /v1/users/123 should be rewritten to /api/users/123.
100+ """
101+ request_url = f"http://{ rewrite_target_setup .public_endpoint .public_ip } :{ rewrite_target_setup .public_endpoint .port } /v1/users/123"
102+ resp = requests .get (
103+ request_url ,
104+ headers = {"host" : rewrite_target_setup .ingress_host },
105+ )
106+
107+ assert resp .status_code == 200
108+ assert "URI: /api/users/123" in resp .text
0 commit comments