|
2 | 2 | Reusable test helpers |
3 | 3 | """ |
4 | 4 |
|
| 5 | +import importlib |
5 | 6 | import os |
6 | 7 |
|
| 8 | +from channels.db import database_sync_to_async |
| 9 | +from channels.testing import WebsocketCommunicator |
7 | 10 | from django.conf import settings |
| 11 | +from django.contrib.auth import login |
8 | 12 | from django.core.files.uploadedfile import SimpleUploadedFile |
| 13 | +from django.http.request import HttpRequest |
9 | 14 |
|
10 | 15 |
|
11 | 16 | class TestLociMixin(object): |
@@ -137,3 +142,75 @@ def add_url(self): |
137 | 142 | @property |
138 | 143 | def change_url(self): |
139 | 144 | return "{0}_change".format(self._get_url_prefix()) |
| 145 | + |
| 146 | + |
| 147 | +class TestChannelsMixin(object): |
| 148 | + |
| 149 | + async def _force_login(self, user, backend=None): |
| 150 | + engine = importlib.import_module(settings.SESSION_ENGINE) |
| 151 | + request = HttpRequest() |
| 152 | + request.session = engine.SessionStore() |
| 153 | + await database_sync_to_async(login)(request, user, backend) |
| 154 | + await database_sync_to_async(request.session.save)() |
| 155 | + return request.session |
| 156 | + |
| 157 | + async def _get_location_request_dict(self, path, pk=None, user=None): |
| 158 | + if not pk: |
| 159 | + location = await database_sync_to_async(self._create_location)( |
| 160 | + is_mobile=True |
| 161 | + ) |
| 162 | + await database_sync_to_async(self._create_object_location)( |
| 163 | + location=location |
| 164 | + ) |
| 165 | + pk = location.pk |
| 166 | + session = None |
| 167 | + if user: |
| 168 | + session = await self._force_login(user) |
| 169 | + return {"pk": pk, "path": path, "session": session} |
| 170 | + |
| 171 | + async def _get_specific_location_request_dict(self, pk=None, user=None): |
| 172 | + result = await self._get_location_request_dict( |
| 173 | + path="/ws/loci/location/{0}/", pk=pk, user=user |
| 174 | + ) |
| 175 | + result["path"] = result["path"].format(result["pk"]) |
| 176 | + return result |
| 177 | + |
| 178 | + async def _get_common_location_request_dict(self, pk=None, user=None): |
| 179 | + return await self._get_location_request_dict( |
| 180 | + path="/ws/loci/location/", pk=pk, user=user |
| 181 | + ) |
| 182 | + |
| 183 | + def _get_location_communicator( |
| 184 | + self, consumer, request_vars, user=None, include_pk=False |
| 185 | + ): |
| 186 | + communicator = WebsocketCommunicator(consumer.as_asgi(), request_vars["path"]) |
| 187 | + if user: |
| 188 | + scope = { |
| 189 | + "user": user, |
| 190 | + "session": request_vars["session"], |
| 191 | + } |
| 192 | + if include_pk: |
| 193 | + scope["url_route"] = {"kwargs": {"pk": request_vars["pk"]}} |
| 194 | + communicator.scope.update(scope) |
| 195 | + return communicator |
| 196 | + |
| 197 | + def _get_specific_location_communicator(self, request_vars, user=None): |
| 198 | + return self._get_location_communicator( |
| 199 | + consumer=self.location_consumer, |
| 200 | + request_vars=request_vars, |
| 201 | + user=user, |
| 202 | + include_pk=True, |
| 203 | + ) |
| 204 | + |
| 205 | + def _get_common_location_communicator(self, request_vars, user=None): |
| 206 | + return self._get_location_communicator( |
| 207 | + consumer=self.common_location_consumer, |
| 208 | + request_vars=request_vars, |
| 209 | + user=user, |
| 210 | + include_pk=False, |
| 211 | + ) |
| 212 | + |
| 213 | + async def _save_location(self, pk): |
| 214 | + loc = await self.location_model.objects.aget(pk=pk) |
| 215 | + loc.geometry = "POINT (12.513124 41.897903)" |
| 216 | + await loc.asave() |
0 commit comments