|
3 | 3 | import subprocess # nosec |
4 | 4 | import time |
5 | 5 | from collections import abc |
| 6 | +from operator import attrgetter |
6 | 7 | from pathlib import Path |
7 | 8 | from threading import Lock |
8 | | -from typing import Iterable, Iterator, List, MutableSequence, Optional, Sequence, Set, Union |
| 9 | +from typing import Iterable, List, MutableSequence, Optional, Sequence, Set, Union |
9 | 10 |
|
10 | 11 | import requests |
11 | 12 | from _pytest.fixtures import FixtureRequest # type: ignore |
@@ -138,39 +139,59 @@ def add_imposters(self, definition: Union[Imposter, Iterable[Imposter]]) -> None |
138 | 139 | """Add imposters to Mountebank server. |
139 | 140 |
|
140 | 141 | :param definition: One or more Imposters. |
141 | | - :type definition: Imposter or list(Imposter) |
142 | 142 | """ |
143 | 143 | if isinstance(definition, abc.Iterable): |
144 | 144 | for imposter in definition: |
145 | 145 | self.add_imposters(imposter) |
146 | 146 | else: |
147 | | - json = definition.as_structure() |
148 | | - post = requests.post(self.server_url, json=json, timeout=10) |
149 | | - post.raise_for_status() |
150 | | - definition.attach(self.host, post.json()["port"], self.server_url) |
151 | | - self._running_imposters.append(definition) |
| 147 | + self.add_impostor(definition) |
| 148 | + |
| 149 | + def add_impostor(self, definition): |
| 150 | + """Add single imposter to Mountebank server. |
| 151 | +
|
| 152 | + :param definition: One or more Imposters.""" |
| 153 | + json = definition.as_structure() |
| 154 | + post = requests.post(self.server_url, json=json, timeout=10) |
| 155 | + post.raise_for_status() |
| 156 | + definition.attach(self.host, post.json()["port"], self.server_url) |
| 157 | + self._running_imposters.append(definition) |
152 | 158 |
|
153 | 159 | def delete_imposters(self) -> None: |
| 160 | + """Delete all impostors from server.""" |
154 | 161 | while self._running_imposters: |
155 | | - imposter = self._running_imposters.pop() |
156 | | - requests.delete(imposter.configuration_url).raise_for_status() |
| 162 | + self.delete_impostor(self._running_imposters[0]) |
| 163 | + |
| 164 | + def delete_impostor(self, imposter): |
| 165 | + """Delete impostor from server.""" |
| 166 | + requests.delete(imposter.configuration_url).raise_for_status() |
| 167 | + self._running_imposters = [ |
| 168 | + i for i in self._running_imposters if i.configuration_url != imposter.configuration_url |
| 169 | + ] |
157 | 170 |
|
158 | | - def get_actual_requests(self) -> Iterable[Request]: |
| 171 | + def get_actual_requests(self) -> Sequence[Request]: |
| 172 | + actual_requests: MutableSequence[Request] = [] |
159 | 173 | for imposter in self._running_imposters: |
160 | | - yield from imposter.get_actual_requests() |
| 174 | + actual_requests += imposter.get_actual_requests() |
| 175 | + return actual_requests |
161 | 176 |
|
162 | 177 | @property |
163 | 178 | def server_url(self) -> furl: |
164 | 179 | return furl().set( |
165 | 180 | scheme=self.scheme, host=self.host, port=self.server_port, path=self.imposters_path |
166 | 181 | ) |
167 | 182 |
|
168 | | - def query_all_imposters(self) -> Iterator[Imposter]: |
| 183 | + def query_all_imposters(self) -> Sequence[Imposter]: |
169 | 184 | """Yield all imposters running on the server, including those defined elsewhere.""" |
170 | 185 | server_info = requests.get(self.server_url) |
171 | | - imposters = server_info.json()["imposters"] |
172 | | - for imposter in imposters: |
173 | | - yield Imposter.from_structure(requests.get(imposter["_links"]["self"]["href"]).json()) |
| 186 | + imposters_structure = server_info.json()["imposters"] |
| 187 | + all_imposters: MutableSequence[Imposter] = [] |
| 188 | + for imposter_structure in imposters_structure: |
| 189 | + impostor_url = imposter_structure["_links"]["self"]["href"] |
| 190 | + imposter = Imposter.from_structure(requests.get(impostor_url).json()) |
| 191 | + imposter.host = self.host |
| 192 | + imposter.server_url = self.server_url |
| 193 | + all_imposters.append(imposter) |
| 194 | + return sorted(all_imposters, key=attrgetter("port")) |
174 | 195 |
|
175 | 196 |
|
176 | 197 | class ExecutingMountebankServer(MountebankServer): |
|
0 commit comments