Skip to content

Commit b203900

Browse files
committed
поведенческое тестирование и поиск магазинов
1 parent 7abf178 commit b203900

13 files changed

Lines changed: 51637 additions & 551 deletions

chizhik_api/endpoints/geolocation.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,50 @@
33
from __future__ import annotations
44

55
from typing import TYPE_CHECKING
6+
from dataclasses import dataclass
67

7-
from human_requests import ApiChild, autotest
8+
from human_requests import ApiChild, ApiParent, api_child_field, autotest
89
from human_requests.abstraction import FetchResponse, HttpMethod
910

1011
if TYPE_CHECKING:
1112
from ..manager import ChizhikAPI # noqa: F401
1213

1314

15+
@dataclass(init=False)
1416
class ClassGeolocation(ApiChild["ChizhikAPI"]):
1517
"""Методы для работы с геолокацией и выбором магазинов.
1618
1719
Включает получение информации о городах, адресах, поиск магазинов
1820
и управление настройками доставки.
1921
"""
2022

23+
Shop: ShopService = api_child_field(lambda parent: ShopService(parent.parent))
24+
"""Сервис для работы с информацией о магазинах."""
25+
26+
27+
def __init__(self, parent: "ChizhikAPI"):
28+
super().__init__(parent)
29+
ApiParent.__post_init__(self)
30+
2131
@autotest
2232
async def cities_list(self, search_name: str, page: int = 1) -> FetchResponse:
2333
"""Получить список городов по частичному совпадению имени."""
2434
return await self._parent._request(
2535
HttpMethod.GET,
2636
f"{self._parent.CATALOG_URL}/geo/cities/?name={search_name}&page={page}",
2737
)
38+
39+
class ShopService(ApiChild["ChizhikAPI"]):
40+
"""Сервис для работы с информацией о магазинах."""
41+
42+
@autotest
43+
async def all(self) -> FetchResponse:
44+
"""Получить список всех точек магазинов."""
45+
url = f"{self._parent.CATALOG_URL}/shops"
46+
return await self._parent._request(HttpMethod.GET, url)
47+
48+
@autotest
49+
async def search(self, query: str) -> FetchResponse:
50+
"""Получить список всех точек магазинов."""
51+
url = f"{self._parent.CATALOG_URL}/shops?term={query}"
52+
return await self._parent._request(HttpMethod.GET, url)

chizhik_api/manager.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections import defaultdict
44
from dataclasses import dataclass, field
55
from typing import Any
6+
import asyncio
67

78
from camoufox.async_api import AsyncCamoufox
89
from human_requests import (
@@ -44,6 +45,7 @@ class ChizhikAPI(ApiParent):
4445
browser_opts: dict[str, Any] = field(default_factory=dict)
4546
"""Дополнительные опции для браузера (см. https://camoufox.com/python/installation/)"""
4647
CATALOG_URL: str = "https://app.chizhik.club/api/v1"
48+
API_URL: str = "https://app.chizhik.club/api"
4749
"""URL для работы с каталогом."""
4850
MAIN_SITE_URL: str = "https://chizhik.club/catalog/"
4951
"""URL главной страницы сайта."""
@@ -101,9 +103,22 @@ async def _warmup(self) -> None:
101103
)
102104
await sniffer.start(self.ctx)
103105

106+
collected = {}
107+
def on_request(request):
108+
if request.url.startswith(self.API_URL):
109+
collected[request.url] = request.headers
110+
111+
self.ctx.on("request", on_request)
112+
104113
await self.page.goto(self.MAIN_SITE_URL, wait_until="networkidle")
105114
await self.page.wait_for_selector("next-route-announcer", state="attached")
115+
await asyncio.sleep(1)
116+
await self.page.locator('main a[data-qa^="sidebar-sub-category-"][data-qa$="-link"]').first.click()
117+
await self.page.locator('main div[itemtype="https://schema.org/Product"]').first.click()
118+
await asyncio.sleep(1)
119+
await self.page.wait_for_load_state("load")
106120

121+
await self.ctx.unroute("**/api/**", on_request)
107122
result_sniffer = await sniffer.complete()
108123

109124
# Результат: {заголовок: [уникальные значения]}
@@ -116,7 +131,7 @@ async def _warmup(self) -> None:
116131

117132
# Преобразуем set обратно в list
118133
self.unstandard_headers = {k: list(v)[0] for k, v in result.items()}
119-
self.unstandard_urls = result_sniffer["request"]
134+
self.unstandard_urls = collected
120135

121136
await self.page.goto(self.CATALOG_URL, wait_until="networkidle")
122137

0 commit comments

Comments
 (0)