from django.contrib.auth.models import Permission from django.test import Client, TestCase from apps.locations.models.base import Location from apps.power_assets.models import PowerAsset, PowerAssetService from core.models.directories import Directory, DirectoryType from core.test_utils import login_2fa, grant_all_locations from core.tests_portal_access import make_employee class PowerAssetsTests(TestCase): def setUp(self): self.user = grant_all_locations(make_employee(is_staff=True)) perm = Permission.objects.get(codename='access_utilities') self.user.user_permissions.add(perm) self.client = Client() login_2fa(self.client, self.user) region_type, _ = DirectoryType.objects.get_or_create( code='location_region', defaults={'name': 'Регион'}, ) region, _ = Directory.objects.get_or_create( directory_type=region_type, code='pwr', defaults={'name': 'PWR'}, ) self.location = Location.objects.create( address='Аптека энерго', location_type='pharmacy', location_region=region, is_active=True, ) type_dt, _ = DirectoryType.objects.get_or_create( code='power_asset_type', defaults={'name': 'Тип'}, ) status_dt, _ = DirectoryType.objects.get_or_create( code='power_asset_status', defaults={'name': 'Статус'}, ) self.inv_type, _ = Directory.objects.get_or_create( directory_type=type_dt, code='inverter', defaults={'name': 'Инвертор', 'is_active': True}, ) self.gen_type, _ = Directory.objects.get_or_create( directory_type=type_dt, code='generator', defaults={'name': 'Генератор', 'is_active': True}, ) self.status, _ = Directory.objects.get_or_create( directory_type=status_dt, code='active', defaults={'name': 'В работе', 'is_active': True}, ) def test_power_tab_visible_with_utilities(self): r = self.client.get('/accounting/?tab=power', HTTP_HX_REQUEST='true') self.assertEqual(r.status_code, 200) self.assertEqual(r.context['accounting_active_tab'], 'power') tab_keys = [t[0] for t in r.context['accounting_tabs']] self.assertIn('power', tab_keys) self.assertContains(r, 'id="power-create-panel"') self.assertContains(r, 'role="dialog"') self.assertNotContains(r, 'id="power-create-overlay"') def test_create_inverter_on_location(self): r = self.client.post('/power-assets/create/', { 'asset_type': str(self.inv_type.pk), 'location_id': str(self.location.pk), 'status': str(self.status.pk), 'brand': 'Deye', 'model_name': 'SUN-8K', 'serial_number': 'INV-1', 'capacity_kw': '8', 'battery_capacity_kwh': '10', 'installed_at': '2026-01-15', }, HTTP_HX_REQUEST='true') self.assertEqual(r.status_code, 200) asset = PowerAsset.objects.get(serial_number='INV-1') self.assertEqual(asset.location_id, self.location.pk) self.assertEqual(asset.asset_type_id, self.inv_type.pk) self.assertEqual(str(asset.capacity_kw), '8.00') def test_create_generator(self): r = self.client.post('/power-assets/create/', { 'asset_type': str(self.gen_type.pk), 'location_id': str(self.location.pk), 'status': str(self.status.pk), 'brand': 'Honda', 'model_name': 'EU70is', 'fuel_type': 'бензин', 'capacity_kw': '7', }, HTTP_HX_REQUEST='true') self.assertEqual(r.status_code, 200) self.assertTrue(PowerAsset.objects.filter(model_name='EU70is', fuel_type='бензин').exists()) def test_service_log_updates_next_service_date(self): asset = PowerAsset.objects.create( asset_type=self.gen_type, location=self.location, status=self.status, model_name='EU22i', brand='Honda', created_by=self.user, ) r = self.client.post(f'/power-assets/{asset.pk}/service/', { 'service_date': '2026-09-01', 'kind': 'oil_change', 'description': 'Замена масла и фильтра', 'performed_by_name': 'Иванов И.', 'engine_hours': '120.5', 'next_service_at': '2026-12-01', }, HTTP_HX_REQUEST='true') self.assertEqual(r.status_code, 200) asset.refresh_from_db() self.assertEqual(asset.last_serviced_at.isoformat(), '2026-09-01') self.assertEqual(asset.next_service_at.isoformat(), '2026-12-01') log = PowerAssetService.objects.get(asset=asset) self.assertEqual(log.kind, 'oil_change') self.assertEqual(str(log.engine_hours), '120.5')