import 'package:flutter_test/flutter_test.dart'; import 'package:lunchpick/data/datasources/remote/naver_map_parser.dart'; import 'package:lunchpick/data/api/naver_api_client.dart'; import 'package:lunchpick/data/api/naver/naver_local_search_api.dart'; import '../../../../mocks/mock_naver_api_client.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('NaverMapParser 위치 기반 필터링 테스트', () { late NaverMapParser parser; late MockNaverApiClient mockApiClient; setUp(() { mockApiClient = MockNaverApiClient(); parser = NaverMapParser(apiClient: mockApiClient); }); test('사용자 위치가 제공되면 가장 가까운 식당을 선택해야 함', () async { // Given const url = 'https://naver.me/xtest1234'; const finalUrl = 'https://map.naver.com/p/restaurant/1234567890'; const placeId = '1234567890'; const placeName = '스타벅스'; const userLat = 37.5665; const userLng = 126.9780; // 단축 URL 리디렉션 설정 mockApiClient.setUrlRedirect(url, finalUrl); // pcmap에서 장소명 추출 설정 mockApiClient.setPlaceName(placeId, placeName); // 검색 결과 - 여러 개의 스타벅스 final searchResults = [ NaverLocalSearchResult( title: '스타벅스 강남역점', link: 'https://map.naver.com/p/restaurant/9999999999', category: '카페>커피전문점', description: '', telephone: '02-1234-5678', address: '서울특별시 강남구 강남대로 123', roadAddress: '서울특별시 강남구 강남대로 123', mapx: 1269780000, // 126.978 * 10000000 mapy: 375650000, // 37.565 * 10000000 (더 가까움) ), NaverLocalSearchResult( title: '스타벅스 시청점', link: 'https://map.naver.com/p/restaurant/1234567890', // Place ID 일치 category: '카페>커피전문점', description: '', telephone: '02-2345-6789', address: '서울특별시 중구 세종대로 110', roadAddress: '서울특별시 중구 세종대로 110', mapx: 1269784147, // 126.9784147 * 10000000 mapy: 375666805, // 37.5666805 * 10000000 (정확히 일치) ), NaverLocalSearchResult( title: '스타벅스 홍대입구점', link: 'https://map.naver.com/p/restaurant/8888888888', category: '카페>커피전문점', description: '', telephone: '02-3456-7890', address: '서울특별시 마포구 양화로 123', roadAddress: '서울특별시 마포구 양화로 123', mapx: 1269250000, // 126.925 * 10000000 mapy: 375560000, // 37.556 * 10000000 (더 멈) ), ]; mockApiClient.setSearchResults(placeName, searchResults); // When final result = await parser.parseRestaurantFromUrl( url, userLatitude: userLat, userLongitude: userLng, ); // Then expect(result.name, '스타벅스 시청점'); expect(result.naverPlaceId, placeId); }); test('위치 정보가 없으면 첫 번째 결과를 사용해야 함', () async { // Given const url = 'https://naver.me/xtest1234'; const finalUrl = 'https://map.naver.com/p/restaurant/1234567890'; const placeId = '1234567890'; const placeName = '스타벅스'; // 단축 URL 리디렉션 설정 mockApiClient.setUrlRedirect(url, finalUrl); // pcmap에서 장소명 추출 설정 mockApiClient.setPlaceName(placeId, placeName); // 검색 결과 final searchResults = [ NaverLocalSearchResult( title: '스타벅스 강남역점', link: 'https://map.naver.com/p/restaurant/9999999999', category: '카페>커피전문점', description: '', telephone: '02-1234-5678', address: '서울특별시 강남구 강남대로 123', roadAddress: '서울특별시 강남구 강남대로 123', mapx: 1269780000, mapy: 375650000, ), ]; mockApiClient.setSearchResults(placeName, searchResults); // When final result = await parser.parseRestaurantFromUrl(url); // Then expect(result.name, '스타벅스 강남역점'); }); test('HTML에서 첫 번째 한글 텍스트를 상호명으로 추출해야 함', () async { // Given const placeId = '1492377618'; const mockHtml = '''