Coverage for tests/conftest.py: 51%
130 statements
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
1import uuid
2from asyncio import get_running_loop, new_event_loop
3from unittest import mock
4from unittest.mock import PropertyMock, patch
5from uuid import UUID
7import bson
8import pytest
9import pytest_asyncio
10import pytest_cases
11from bson import UUID_SUBTYPE, Binary, UuidRepresentation
12from dbcc import MongoTableEngine
13from mongodb import clients_col, orgs_col, subsidiaries_col, users_col
14from sotrans_models.models.admin.ads import AdvertisingBlockDBModel
15from sotrans_models.models.admin.settings import AdminSettings
16from sotrans_models.models.misc.client import ClientDBModel
17from sotrans_models.models.misc.document import DocumentDBModel
18from sotrans_models.models.organizations import (
19 CreateSubsidiaryModel,
20 OrganizationDBModel,
21 SubsidiaryDBModel,
22)
23from sotrans_models.models.resources.drivers import DriverDBModel
24from sotrans_models.models.resources.trailers import TrailerDBModel
25from sotrans_models.models.resources.trucks import TruckDBModel
26from sotrans_models.models.roles import SotransRole
27from sotrans_models.models.users import (
28 SotransOIDCUserModel,
29 SotransUserDBModel,
30)
31from utils.data_grabber import BaseGetListQueryParams, BaseGetOneQueryParams
33from .random_model import generate_models_json, generate_random_model_dict
36class APIDataStorage:
37 org: OrganizationDBModel | None = None
38 driver: DriverDBModel | None = None
39 truck: TruckDBModel | None = None
40 trailer: TrailerDBModel | None = None
41 ads: AdvertisingBlockDBModel | None = None
42 admins_settings: AdminSettings | None = None
43 document: DocumentDBModel | None = None
44 subsidiary: SubsidiaryDBModel | None = None
45 client: ClientDBModel | None = None
48@pytest.fixture(scope="function")
49def event_loop():
50 """Default for all async tests."""
51 try:
52 loop = get_running_loop()
53 except RuntimeError:
54 loop = new_event_loop()
55 yield loop
56 loop.close()
59@pytest_asyncio.fixture(scope="function")
60async def mongo_table_engine():
61 mongo_db_table_engine = MongoTableEngine(
62 "mongodb://localhost:27017",
63 "sotrans_test",
64 "test",
65 mock_db_in_mem=True,
66 )
67 yield mongo_db_table_engine
68 await mongo_db_table_engine.db.client.drop_database("sotrans_test")
71def side_effect_mongo_mock_from_uuid(
72 uuid: UUID, uuid_representation=UuidRepresentation.STANDARD
73):
74 """Override (Mock) the bson.binary.Binary.from_uuid function to work for mongomock
76 Code is copy pasted from the original function,
77 but `uuid_representation` is ignored and only code parts as if
78 uuid_representation == UuidRepresentation.STANDARD are used
79 """
80 if not isinstance(uuid, UUID):
81 raise TypeError("uuid must be an instance of uuid.UUID")
83 subtype = UUID_SUBTYPE
84 payload = uuid.bytes
86 return Binary(payload, subtype)
89@pytest.fixture(autouse=True)
90def mongo_uuid(monkeypatch):
91 with mock.patch.object(
92 Binary, "from_uuid", side_effect=side_effect_mongo_mock_from_uuid
93 ):
94 yield
97@pytest_cases.fixture
98def mock_get_list_params():
99 kwargs = {
100 "where": None,
101 "sort": None,
102 "projection": None,
103 "skip": 0,
104 "limit": 20,
105 "search": None,
106 }
107 return BaseGetListQueryParams(**kwargs)
110@pytest.fixture
111def mock_get_one_params():
112 kwargs = {"projection": None}
113 return BaseGetOneQueryParams(**kwargs)
116@pytest.fixture
117def sotrans_user_roles(request):
118 user_params = request.param
119 with patch.object(
120 SotransOIDCUserModel, "roles", return_value=user_params["roles"]
121 ):
122 random_data = generate_random_model_dict(SotransOIDCUserModel)
123 print(random_data)
124 print("9" * 999)
125 random_data.update(user_params)
126 print(random_data)
127 sotrans_user_model = SotransOIDCUserModel(**random_data)
128 yield sotrans_user_model
131@pytest.fixture(scope="package")
132def shared_uuid():
133 return uuid.uuid4()
136@pytest.fixture(scope="package")
137def shared_oid():
138 return bson.ObjectId()
141@pytest.fixture(scope="package")
142def shared_org_id():
143 return bson.ObjectId()
146@pytest.fixture
147def sotrans_company_dir(shared_uuid):
148 with patch.object(
149 SotransOIDCUserModel, "roles", new_callable=PropertyMock
150 ) as mock_roles:
151 mock_roles.return_value = [SotransRole.company_director]
152 random_data = generate_random_model_dict(SotransOIDCUserModel)
153 random_data.update(sub=shared_uuid)
154 sotrans_user_model = SotransOIDCUserModel(**random_data)
155 yield sotrans_user_model
158@pytest.fixture
159def sotrans_company_logisitician(shared_uuid, shared_org_id):
160 with patch.object(
161 SotransOIDCUserModel, "roles", new_callable=PropertyMock
162 ) as mock_roles:
163 mock_roles.return_value = [SotransRole.company_logistician]
164 random_data = generate_random_model_dict(SotransOIDCUserModel)
165 random_data.update(sub=shared_uuid, organization_id=str(shared_org_id))
166 sotrans_user_model = SotransOIDCUserModel(**random_data)
167 yield sotrans_user_model
170@pytest_asyncio.fixture
171async def tmp_user():
172 model_dump = generate_models_json(
173 SotransUserDBModel,
174 {
175 "id": uuid.uuid4(),
176 # "subsidiary_id": str(tmp_subsidiary.id)
177 },
178 )
179 await users_col.collection.insert_one(model_dump)
180 user = SotransUserDBModel(**model_dump)
181 yield user
182 await users_col.collection.delete_one({"id": user.id})
185@pytest_asyncio.fixture
186async def tmp_org(tmp_user):
187 model_dump = generate_models_json(
188 OrganizationDBModel, specific={"employees": [tmp_user.model_dump()]}
189 )
190 del model_dump["id"]
191 created = await orgs_col.create(model_dump)
192 org = OrganizationDBModel(**created)
193 yield org
194 await orgs_col.delete_by_id(org.id)
197@pytest_asyncio.fixture
198async def tmp_subsidiary(tmp_user):
199 sub = generate_models_json(
200 CreateSubsidiaryModel, {"employees": [tmp_user.model_dump()]}
201 )
202 created = await subsidiaries_col.create(sub)
203 sm = SubsidiaryDBModel(**created)
204 yield sm
205 await subsidiaries_col.delete_by_id(sm.id)
208@pytest_asyncio.fixture
209async def tmp_client():
210 cl = generate_models_json(ClientDBModel, {"inn": "1231231234"})
211 created = await clients_col.create(cl)
212 clm = ClientDBModel(**created)
213 yield clm
214 await clients_col.delete_by_id(clm.id)