""" Performance Check Access Unit Tests 비즈니스 로직: - 성능점검표는 항상 0.1 CC 결제 필요 (배너 차량 포함) - 1 CC 차량 전체 구매 시 성능점검표 포함 - 관리자는 무조건 접근 가능 """ import pytest from unittest.mock import MagicMock, patch from sqlalchemy.orm import Session class TestPerformanceCheckAccess: """성능점검표 접근 권한 테스트""" def test_admin_has_access(self): """관리자는 성능점검표에 무조건 접근 가능""" # Given user = MagicMock() user.is_admin = True user.id = 1 # When has_access = self._check_access(user, car_id=1, has_perf_view=False, has_car_view=False) # Then assert has_access is True def test_user_with_performance_check_purchase(self): """0.1 CC 결제한 사용자는 접근 가능""" # Given user = MagicMock() user.is_admin = False user.id = 1 # When has_access = self._check_access(user, car_id=1, has_perf_view=True, has_car_view=False) # Then assert has_access is True def test_user_with_full_car_view_purchase(self): """1 CC 결제한 사용자는 접근 가능 (성능점검표 포함)""" # Given user = MagicMock() user.is_admin = False user.id = 1 # When has_access = self._check_access(user, car_id=1, has_perf_view=False, has_car_view=True) # Then assert has_access is True def test_user_without_purchase(self): """결제하지 않은 사용자는 접근 불가""" # Given user = MagicMock() user.is_admin = False user.id = 1 # When has_access = self._check_access(user, car_id=1, has_perf_view=False, has_car_view=False) # Then assert has_access is False def test_anonymous_user(self): """비로그인 사용자는 접근 불가""" # Given user = None # When has_access = self._check_access(user, car_id=1, has_perf_view=False, has_car_view=False) # Then assert has_access is False def test_banner_car_still_requires_payment(self): """배너 차량이어도 성능점검표는 결제 필요""" # Given user = MagicMock() user.is_admin = False user.id = 1 is_banner_car = True # 배너 차량 # When - 결제하지 않은 경우 has_access = self._check_access( user, car_id=1, has_perf_view=False, has_car_view=False, is_banner_car=is_banner_car ) # Then - 배너 차량이어도 접근 불가 assert has_access is False def test_banner_car_with_payment(self): """배너 차량 + 0.1 CC 결제 시 접근 가능""" # Given user = MagicMock() user.is_admin = False user.id = 1 is_banner_car = True # When has_access = self._check_access( user, car_id=1, has_perf_view=True, has_car_view=False, is_banner_car=is_banner_car ) # Then assert has_access is True def _check_access( self, user, car_id: int, has_perf_view: bool, has_car_view: bool, is_banner_car: bool = False ) -> bool: """ 성능점검표 접근 권한 확인 로직 Note: 이 로직은 backend/app/api/carmodoo.py의 get_car_performance_check 함수와 동일해야 함 """ has_access = False # 배너 차량 여부는 성능점검표 접근에 영향 없음 # (이미지와 연락처만 무료, 성능점검표는 유료) if user: if user.is_admin: has_access = True else: # 0.1 CC 결제 또는 1 CC 결제 has_access = has_perf_view or has_car_view return has_access class TestPerformanceCheckPreview: """성능점검표 미리보기 테스트""" def test_preview_available_without_payment(self): """결제 전에도 미리보기 정보 제공""" # 미리보기에 포함되는 정보 preview_fields = ['check_number', 'check_date', 'mileage'] # 미리보기에 포함되지 않는 정보 full_access_fields = [ 'is_flood_damaged', 'is_fire_damaged', 'device_status', 'body_parts', 'frame_parts', 'pdf_path' ] # 미리보기 응답 구조 확인 preview_response = { "car_id": 1, "found": True, "has_access": False, "preview": { "check_number": "A123456", "check_date": "2024-01-01", "mileage": 50000 }, "data": None # 결제 전에는 null } assert preview_response["has_access"] is False assert preview_response["data"] is None for field in preview_fields: assert field in preview_response["preview"] class TestBannerCarImageAccess: """배너 차량 이미지 접근 테스트 (참고용 - 성능점검표와 별개)""" def test_banner_car_images_are_free(self): """배너 차량 이미지는 무료""" is_banner_car = True user = None # 비로그인 # 배너 차량 이미지 접근 가능 여부 can_view_images = is_banner_car # 배너면 무조건 가능 assert can_view_images is True def test_banner_car_contact_is_free(self): """배너 차량 연락처는 무료""" is_banner_car = True user = None # 비로그인 # 배너 차량 연락처 접근 가능 여부 can_view_contact = is_banner_car # 배너면 무조건 가능 assert can_view_contact is True def test_non_banner_car_images_require_payment(self): """비배너 차량 이미지는 유료""" is_banner_car = False has_paid = False # 비배너 차량 이미지 접근 can_view_images = has_paid assert can_view_images is False