Улучшение и добавления
This commit is contained in:
@@ -164,8 +164,6 @@ class CoordinateProcessingMixinTestCase(TestCase):
|
||||
{
|
||||
"geo_longitude": "37.62",
|
||||
"geo_latitude": "55.75",
|
||||
"kupsat_longitude": "37.63",
|
||||
"kupsat_latitude": "55.76",
|
||||
},
|
||||
)
|
||||
view.request = request
|
||||
@@ -175,5 +173,250 @@ class CoordinateProcessingMixinTestCase(TestCase):
|
||||
|
||||
self.assertIsNotNone(geo_instance.coords)
|
||||
self.assertEqual(geo_instance.coords.coords, (37.62, 55.75))
|
||||
self.assertIsNotNone(geo_instance.coords_kupsat)
|
||||
self.assertEqual(geo_instance.coords_kupsat.coords, (37.63, 55.76))
|
||||
|
||||
|
||||
|
||||
class CSVImportTestCase(TestCase):
|
||||
"""Тесты для функции get_points_from_csv"""
|
||||
|
||||
def setUp(self):
|
||||
"""Подготовка тестовых данных"""
|
||||
from .models import CustomUser, Satellite, Polarization
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
# Создаем пользователя
|
||||
user = User.objects.create_user(username="testuser", password="12345")
|
||||
self.custom_user = CustomUser.objects.get(user=user)
|
||||
|
||||
# Создаем спутник
|
||||
self.satellite = Satellite.objects.create(name="Test Satellite", norad=12345)
|
||||
|
||||
# Создаем поляризации
|
||||
Polarization.objects.get_or_create(name="Вертикальная")
|
||||
Polarization.objects.get_or_create(name="Горизонтальная")
|
||||
Polarization.objects.get_or_create(name="Правая")
|
||||
Polarization.objects.get_or_create(name="Левая")
|
||||
Polarization.objects.get_or_create(name="-")
|
||||
|
||||
# Создаем спутники-зеркала для тестов
|
||||
Satellite.objects.get_or_create(name="Mirror1 Satellite", norad=11111)
|
||||
Satellite.objects.get_or_create(name="Mirror2 Satellite", norad=22222)
|
||||
Satellite.objects.get_or_create(name="Mirror3 Satellite", norad=33333)
|
||||
|
||||
def test_initial_csv_import(self):
|
||||
"""Тест первичного импорта из CSV файла"""
|
||||
from .utils import get_points_from_csv
|
||||
from .models import Source, ObjItem
|
||||
|
||||
# Тестовые данные CSV - 3 точки в разных местах
|
||||
csv_content = """1;Signal1 V;55.7558;37.6173;0;01.01.2024 12:00:00;Test Satellite;12345;11500.5;36.0;1;good;Mirror1;Mirror2;Mirror3
|
||||
2;Signal2 H;55.7560;37.6175;0;01.01.2024 12:05:00;Test Satellite;12345;11520.3;36.0;1;good;Mirror1;Mirror2;
|
||||
3;Signal3 V;56.8389;60.6057;0;01.01.2024 12:10:00;Test Satellite;12345;11540.7;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
# Выполняем импорт
|
||||
sources_created = get_points_from_csv(csv_content, self.custom_user)
|
||||
|
||||
# Проверяем результаты
|
||||
# Первые две точки близко (Москва), третья далеко (Екатеринбург)
|
||||
# Должно быть создано 2 источника
|
||||
self.assertEqual(sources_created, 2)
|
||||
self.assertEqual(Source.objects.count(), 2)
|
||||
self.assertEqual(ObjItem.objects.count(), 3)
|
||||
|
||||
# Проверяем, что первые две точки привязаны к одному источнику
|
||||
source1 = Source.objects.first()
|
||||
items_in_source1 = ObjItem.objects.filter(source=source1).count()
|
||||
self.assertEqual(items_in_source1, 2)
|
||||
|
||||
def test_csv_import_with_existing_sources(self):
|
||||
"""Тест импорта CSV с существующими источниками"""
|
||||
from .utils import get_points_from_csv
|
||||
from .models import Source, ObjItem
|
||||
|
||||
# Первый импорт - создаем начальные данные
|
||||
csv_content_1 = """1;Signal1 V;55.7558;37.6173;0;01.01.2024 12:00:00;Test Satellite;12345;11500.5;36.0;1;good;Mirror1;Mirror2;
|
||||
2;Signal2 H;55.7560;37.6175;0;01.01.2024 12:05:00;Test Satellite;12345;11520.3;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
sources_created_1 = get_points_from_csv(csv_content_1, self.custom_user)
|
||||
self.assertEqual(sources_created_1, 1)
|
||||
initial_sources_count = Source.objects.count()
|
||||
initial_objitems_count = ObjItem.objects.count()
|
||||
|
||||
# Второй импорт - добавляем новые точки
|
||||
# Точка 3 - близко к существующему источнику (Москва)
|
||||
# Точка 4 - далеко (Екатеринбург) - создаст новый источник
|
||||
csv_content_2 = """3;Signal3 V;55.7562;37.6177;0;01.01.2024 12:10:00;Test Satellite;12345;11540.7;36.0;1;good;Mirror1;Mirror2;
|
||||
4;Signal4 H;56.8389;60.6057;0;01.01.2024 12:15:00;Test Satellite;12345;11560.2;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
sources_created_2 = get_points_from_csv(csv_content_2, self.custom_user)
|
||||
|
||||
# Проверяем результаты
|
||||
# Должен быть создан 1 новый источник (для точки 4)
|
||||
self.assertEqual(sources_created_2, 1)
|
||||
self.assertEqual(Source.objects.count(), initial_sources_count + 1)
|
||||
self.assertEqual(ObjItem.objects.count(), initial_objitems_count + 2)
|
||||
|
||||
# Проверяем, что точка 3 добавлена к существующему источнику
|
||||
first_source = Source.objects.first()
|
||||
items_in_first_source = ObjItem.objects.filter(source=first_source).count()
|
||||
self.assertEqual(items_in_first_source, 3) # 2 начальных + 1 новая
|
||||
|
||||
def test_csv_import_skip_duplicates(self):
|
||||
"""Тест пропуска дубликатов при импорте CSV"""
|
||||
from .utils import get_points_from_csv
|
||||
from .models import Source, ObjItem
|
||||
|
||||
# Первый импорт
|
||||
csv_content_1 = """1;Signal1 V;55.7558;37.6173;0;01.01.2024 12:00:00;Test Satellite;12345;11500.5;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
get_points_from_csv(csv_content_1, self.custom_user)
|
||||
initial_sources_count = Source.objects.count()
|
||||
initial_objitems_count = ObjItem.objects.count()
|
||||
|
||||
# Второй импорт - та же точка (дубликат)
|
||||
csv_content_2 = """1;Signal1 V;55.7558;37.6173;0;01.01.2024 12:00:00;Test Satellite;12345;11500.5;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
sources_created = get_points_from_csv(csv_content_2, self.custom_user)
|
||||
|
||||
# Проверяем, что дубликат пропущен
|
||||
self.assertEqual(sources_created, 0)
|
||||
self.assertEqual(Source.objects.count(), initial_sources_count)
|
||||
self.assertEqual(ObjItem.objects.count(), initial_objitems_count)
|
||||
|
||||
def test_csv_import_mixed_scenario(self):
|
||||
"""Тест смешанного сценария: дубликаты + новые точки + близкие точки"""
|
||||
from .utils import get_points_from_csv
|
||||
from .models import Source, ObjItem
|
||||
|
||||
# Первый импорт - 2 точки в Москве
|
||||
csv_content_1 = """1;Signal1 V;55.7558;37.6173;0;01.01.2024 12:00:00;Test Satellite;12345;11500.5;36.0;1;good;Mirror1;Mirror2;
|
||||
2;Signal2 H;55.7560;37.6175;0;01.01.2024 12:05:00;Test Satellite;12345;11520.3;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
get_points_from_csv(csv_content_1, self.custom_user)
|
||||
|
||||
# Второй импорт:
|
||||
# - Точка 1 (дубликат) - должна быть пропущена
|
||||
# - Точка 3 (близко к Москве) - должна добавиться к существующему источнику
|
||||
# - Точка 4 (Екатеринбург) - должна создать новый источник
|
||||
# - Точка 5 (близко к Екатеринбургу) - должна добавиться к новому источнику
|
||||
csv_content_2 = """1;Signal1 V;55.7558;37.6173;0;01.01.2024 12:00:00;Test Satellite;12345;11500.5;36.0;1;good;Mirror1;Mirror2;
|
||||
3;Signal3 V;55.7562;37.6177;0;01.01.2024 12:10:00;Test Satellite;12345;11540.7;36.0;1;good;Mirror1;Mirror2;
|
||||
4;Signal4 H;56.8389;60.6057;0;01.01.2024 12:15:00;Test Satellite;12345;11560.2;36.0;1;good;Mirror1;Mirror2;
|
||||
5;Signal5 V;56.8391;60.6059;0;01.01.2024 12:20:00;Test Satellite;12345;11580.8;36.0;1;good;Mirror1;Mirror2;"""
|
||||
|
||||
sources_created = get_points_from_csv(csv_content_2, self.custom_user)
|
||||
|
||||
# Проверяем результаты
|
||||
self.assertEqual(sources_created, 1) # Только для Екатеринбурга
|
||||
self.assertEqual(Source.objects.count(), 2) # Москва + Екатеринбург
|
||||
self.assertEqual(ObjItem.objects.count(), 5) # 2 начальных + 3 новых (дубликат пропущен)
|
||||
|
||||
# Проверяем распределение по источникам
|
||||
moscow_source = Source.objects.first()
|
||||
ekb_source = Source.objects.last()
|
||||
|
||||
moscow_items = ObjItem.objects.filter(source=moscow_source).count()
|
||||
ekb_items = ObjItem.objects.filter(source=ekb_source).count()
|
||||
|
||||
self.assertEqual(moscow_items, 3) # 2 начальных + 1 новая
|
||||
self.assertEqual(ekb_items, 2) # 2 новых точки в Екатеринбурге
|
||||
|
||||
|
||||
|
||||
class FindMirrorSatellitesTestCase(TestCase):
|
||||
"""Тесты для функции find_mirror_satellites"""
|
||||
|
||||
def setUp(self):
|
||||
"""Подготовка тестовых данных"""
|
||||
from .models import Satellite
|
||||
|
||||
# Создаем спутники с разными именами
|
||||
Satellite.objects.create(name="Eutelsat 16A", norad=40874)
|
||||
Satellite.objects.create(name="Eutelsat 21B", norad=41591)
|
||||
Satellite.objects.create(name="Astra 4A", norad=41404)
|
||||
Satellite.objects.create(name="Turksat 4A", norad=40361)
|
||||
Satellite.objects.create(name="Express AM6", norad=39508)
|
||||
|
||||
def test_find_exact_match(self):
|
||||
"""Тест поиска спутника по точному совпадению"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
mirrors = find_mirror_satellites(["Eutelsat 16A"])
|
||||
self.assertEqual(len(mirrors), 1)
|
||||
self.assertEqual(mirrors[0].name, "Eutelsat 16A")
|
||||
|
||||
def test_find_partial_match(self):
|
||||
"""Тест поиска спутника по частичному совпадению"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
# Ищем по части имени "Eutelsat"
|
||||
mirrors = find_mirror_satellites(["eutelsat"])
|
||||
self.assertEqual(len(mirrors), 2)
|
||||
names = [m.name for m in mirrors]
|
||||
self.assertIn("Eutelsat 16A", names)
|
||||
self.assertIn("Eutelsat 21B", names)
|
||||
|
||||
def test_find_case_insensitive(self):
|
||||
"""Тест поиска без учета регистра"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
# Разные варианты регистра
|
||||
mirrors1 = find_mirror_satellites(["ASTRA"])
|
||||
mirrors2 = find_mirror_satellites(["astra"])
|
||||
mirrors3 = find_mirror_satellites(["AsTrA"])
|
||||
|
||||
self.assertEqual(len(mirrors1), 1)
|
||||
self.assertEqual(len(mirrors2), 1)
|
||||
self.assertEqual(len(mirrors3), 1)
|
||||
self.assertEqual(mirrors1[0].name, "Astra 4A")
|
||||
self.assertEqual(mirrors2[0].name, "Astra 4A")
|
||||
self.assertEqual(mirrors3[0].name, "Astra 4A")
|
||||
|
||||
def test_find_multiple_mirrors(self):
|
||||
"""Тест поиска нескольких зеркал"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
mirrors = find_mirror_satellites(["Eutelsat", "Turksat"])
|
||||
self.assertEqual(len(mirrors), 3) # 2 Eutelsat + 1 Turksat
|
||||
names = [m.name for m in mirrors]
|
||||
self.assertIn("Eutelsat 16A", names)
|
||||
self.assertIn("Eutelsat 21B", names)
|
||||
self.assertIn("Turksat 4A", names)
|
||||
|
||||
def test_find_with_spaces(self):
|
||||
"""Тест поиска с пробелами в начале и конце"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
mirrors = find_mirror_satellites([" Express "])
|
||||
self.assertEqual(len(mirrors), 1)
|
||||
self.assertEqual(mirrors[0].name, "Express AM6")
|
||||
|
||||
def test_find_empty_list(self):
|
||||
"""Тест с пустым списком"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
mirrors = find_mirror_satellites([])
|
||||
self.assertEqual(len(mirrors), 0)
|
||||
|
||||
def test_find_with_dash(self):
|
||||
"""Тест с дефисом (должен быть пропущен)"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
mirrors = find_mirror_satellites(["-"])
|
||||
self.assertEqual(len(mirrors), 0)
|
||||
|
||||
def test_find_no_match(self):
|
||||
"""Тест когда спутник не найден"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
mirrors = find_mirror_satellites(["NonExistentSatellite"])
|
||||
self.assertEqual(len(mirrors), 0)
|
||||
|
||||
def test_find_removes_duplicates(self):
|
||||
"""Тест удаления дубликатов"""
|
||||
from .utils import find_mirror_satellites
|
||||
|
||||
# Ищем один и тот же спутник дважды
|
||||
mirrors = find_mirror_satellites(["Astra", "Astra 4A"])
|
||||
self.assertEqual(len(mirrors), 1)
|
||||
self.assertEqual(mirrors[0].name, "Astra 4A")
|
||||
|
||||
Reference in New Issue
Block a user