def test_generate_citizens(): # Между двумя жителями может быть родственная связь generate_citizens(citizens_num=2, relations_num=1) # Между двумя жителями не может быть двух родственных связей with pytest.raises(ValueError): generate_citizens(citizens_num=2, relations_num=2)
async def test_race_condition(api_client, url, final_relatives_number): # Создаем трех жителей, не родственников с citizen_id #1, #2 и #3. data = generate_citizens(citizens_num=3, start_citizen_id=1) import_id = await import_data(api_client, data) # Житель, которому мы будем добавлять родственников citizen_id = data[0]['citizen_id'] # Мы хотим отправить два конкурентных запроса с добавлением новой # родственной связи seeds = [{ 'relatives': [data[1]['citizen_id']] }, { 'relatives': [data[2]['citizen_id']] }] await asyncio.gather(*[ patch_citizen( api_client, import_id, citizen_id, data=seed, str_or_url=url) for seed in seeds ]) # Проверяем кол-во родственников у изменяемого жителя # (должно быть равно 1). citizens = { citizen['citizen_id']: citizen for citizen in await get_citizens(api_client, import_id) } assert len(citizens[citizen_id]['relatives']) == final_relatives_number
async def test_patch_citizen_add_nonexistent_relative(api_client): """ Сервис должен запрещать добавлять жителю несуществующего родственника. """ dataset = generate_citizens(citizens_num=1) import_id = await import_data(api_client, dataset) await patch_citizen(api_client, import_id, dataset[0]['citizen_id'], data={'relatives': [999]}, expected_status=HTTPStatus.BAD_REQUEST)
async def test_patch_citizen_birthday_in_future(api_client): """ Сервис должен запрещать устанавливать дату рождения в будущем. """ dataset = generate_citizens(citizens_num=1) import_id = await import_data(api_client, dataset) birth_date = (date.today() + timedelta(days=1)).strftime(BIRTH_DATE_FORMAT) await patch_citizen(api_client, import_id, dataset[0]['citizen_id'], data={'birth_date': birth_date}, expected_status=HTTPStatus.BAD_REQUEST)
def make_dataset(self): citizens = [ # Первого жителя создаем с родственником. В запросе к # PATCH-обработчику список relatives будет содержать только другого # жителя, что потребует выполнения максимального кол-ва запросов # (как на добавление новой родственной связи, так и на удаление # существующей). generate_citizen(citizen_id=1, relatives=[2]), generate_citizen(citizen_id=2, relatives=[1]), *generate_citizens( citizens_num=9998, relations_num=1000, start_citizen_id=3) ] return {citizen['citizen_id']: citizen for citizen in citizens}
generate_citizen(citizen_id=1, name='Джейн', gender='male', birth_date='13.09.1945', town='Нью-Йорк', relatives=[1]), ], HTTPStatus.CREATED), # Выгрузка с максимально длинными/большими значениями. # aiohttp должен разрешать запросы такого размера, а обработчик не должен # на них падать. (generate_citizens(citizens_num=10000, relations_num=1000, start_citizen_id=MAX_INTEGER - 10000, gender='female', name=LONGEST_STR, town=LONGEST_STR, street=LONGEST_STR, building=LONGEST_STR, apartment=MAX_INTEGER), HTTPStatus.CREATED), # Пустая выгрузка # Обработчик не должен падать на таких данных. ([], HTTPStatus.CREATED), # Дата рождения - текущая дата ([generate_citizen(birth_date=(date.today()).strftime(BIRTH_DATE_FORMAT))], HTTPStatus.CREATED), # Дата рождения некорректная (в будущем) ([