summary refs log tree commit diff
path: root/tests/http/test_webclient.py
blob: e5e2c490055d2e044594a1714ae770b627e92668 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Copyright 2022 The Matrix.org Foundation C.I.C.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Dict

from twisted.web.resource import Resource

from synapse.app.homeserver import SynapseHomeServer
from synapse.config.server import HttpListenerConfig, HttpResourceConfig, ListenerConfig
from synapse.http.site import SynapseSite

from tests.server import make_request
from tests.unittest import HomeserverTestCase, create_resource_tree, override_config


class WebClientTests(HomeserverTestCase):
    @override_config(
        {
            "web_client_location": "https://example.org",
        }
    )
    def test_webclient_resolves_with_client_resource(self):
        """
        Tests that both client and webclient resources can be accessed simultaneously.

        This is a regression test created in response to https://github.com/matrix-org/synapse/issues/11763.
        """
        for resource_name_order_list in [
            ["webclient", "client"],
            ["client", "webclient"],
        ]:
            # Create a dictionary from path regex -> resource
            resource_dict: Dict[str, Resource] = {}

            for resource_name in resource_name_order_list:
                resource_dict.update(
                    SynapseHomeServer._configure_named_resource(self.hs, resource_name)
                )

            # Create a root resource which ties the above resources together into one
            root_resource = Resource()
            create_resource_tree(resource_dict, root_resource)

            # Create a site configured with this resource to make HTTP requests against
            listener_config = ListenerConfig(
                port=8008,
                bind_addresses=["127.0.0.1"],
                type="http",
                http_options=HttpListenerConfig(
                    resources=[HttpResourceConfig(names=resource_name_order_list)]
                ),
            )
            test_site = SynapseSite(
                logger_name="synapse.access.http.fake",
                site_tag=self.hs.config.server.server_name,
                config=listener_config,
                resource=root_resource,
                server_version_string="1",
                max_request_body_size=1234,
                reactor=self.reactor,
            )

            # Attempt to make requests to endpoints on both the webclient and client resources
            # on test_site.
            self._request_client_and_webclient_resources(test_site)

    def _request_client_and_webclient_resources(self, test_site: SynapseSite) -> None:
        """Make a request to an endpoint on both the webclient and client-server resources
        of the given SynapseSite.

        Args:
            test_site: The SynapseSite object to make requests against.
        """

        # Ensure that the *webclient* resource is behaving as expected (we get redirected to
        # the configured web_client_location)
        channel = make_request(
            self.reactor,
            site=test_site,
            method="GET",
            path="/_matrix/client",
        )
        self.assertEqual(channel.code, 302)
        self.assertEqual(
            channel.headers.getRawHeaders("Location"), ["https://example.org"]
        )

        # Ensure that a request to the *client* resource works.
        channel = make_request(
            self.reactor,
            site=test_site,
            method="GET",
            path="/_matrix/client/v3/login",
        )
        self.assertEqual(channel.code, 200)
        self.assertIn("flows", channel.json_body)