Files
lunchpick/test/integration/naver_integration_test.dart
JiWoong Sul 2a01fa50c6 feat(app): finalize ad gated flows and weather
- add AppLogger and replace scattered print logging\n- implement ad-gated recommendation flow with reminder handling and calendar link\n- complete Bluetooth share pipeline with ad gate and merge\n- integrate KMA weather API with caching and dart-define decoding\n- add NaverUrlProcessor refactor and restore restaurant repository tests
2025-11-22 00:10:51 +09:00

153 lines
4.6 KiB
Dart

// ignore_for_file: unnecessary_library_name
@Skip('Requires live Naver API responses')
library naver_integration_test;
import 'package:flutter_test/flutter_test.dart';
import 'package:lunchpick/data/api/naver_api_client.dart';
import 'package:lunchpick/data/datasources/remote/naver_map_parser.dart';
import 'package:lunchpick/data/datasources/remote/naver_html_extractor.dart';
void main() {
late NaverApiClient apiClient;
late NaverMapParser parser;
setUp(() {
apiClient = NaverApiClient();
parser = NaverMapParser(apiClient: apiClient);
});
tearDown(() {
apiClient.dispose();
parser.dispose();
});
group('네이버 통합 테스트', () {
test('단축 URL 자동 처리 테스트', () async {
// 실제 단축 URL로 테스트
const shortUrl = 'https://naver.me/example'; // 실제 URL로 교체 필요
try {
print('========== 단축 URL 자동 처리 테스트 ==========');
print('입력 URL: $shortUrl');
// NaverMapParser를 통한 자동 처리
final restaurant = await parser.parseRestaurantFromUrl(shortUrl);
print('\n【파싱 결과】');
print('상호명: ${restaurant.name}');
print('카테고리: ${restaurant.category} > ${restaurant.subCategory}');
print('주소: ${restaurant.roadAddress}');
print('전화: ${restaurant.phoneNumber ?? "없음"}');
print('설명: ${restaurant.description ?? "없음"}');
print('좌표: ${restaurant.latitude}, ${restaurant.longitude}');
print('Place ID: ${restaurant.naverPlaceId}');
print('URL: ${restaurant.naverUrl}');
// 검증
expect(restaurant.name, isNotEmpty);
expect(restaurant.category, isNotEmpty);
expect(restaurant.roadAddress, isNotEmpty);
expect(restaurant.naverPlaceId, isNotEmpty);
expect(restaurant.source.name, equals('NAVER'));
print('\n✓ 테스트 성공');
} catch (e) {
print('\n❌ 테스트 실패: $e');
rethrow;
}
});
test('HTML 추출기 테스트', () async {
const testHtml = '''
<html>
<head>
<script type="application/ld+json">
{
"@type": "Restaurant",
"name": "테스트 식당"
}
</script>
</head>
<body>
<h1>테스트 식당</h1>
<p>서울특별시 강남구 테헤란로 123</p>
<span>한식</span>
</body>
</html>
''';
print('\n========== HTML 추출기 테스트 ==========');
// 한글 텍스트 추출
final koreanTexts = NaverHtmlExtractor.extractAllValidKoreanTexts(
testHtml,
);
print('추출된 한글 텍스트: $koreanTexts');
expect(koreanTexts, isNotEmpty);
// JSON-LD 추출
final jsonLdName = NaverHtmlExtractor.extractPlaceNameFromJsonLd(
testHtml,
);
print('JSON-LD 상호명: $jsonLdName');
expect(jsonLdName, equals('테스트 식당'));
print('\n✓ 테스트 성공');
});
test('로컬 검색 API 테스트', () async {
print('\n========== 로컬 검색 API 테스트 ==========');
const query = '스타벅스 강남역점';
try {
final results = await apiClient.searchLocal(query: query, display: 5);
print('검색어: "$query"');
print('결과 수: ${results.length}\n');
for (int i = 0; i < results.length; i++) {
final result = results[i];
print('${i + 1}. ${result.title}');
print(' 카테고리: ${result.category}');
print(' 주소: ${result.roadAddress}');
print(' 좌표: ${result.mapx}, ${result.mapy}');
}
expect(results, isNotEmpty);
print('\n✓ 테스트 성공');
} catch (e) {
print('\n❌ 테스트 실패: $e');
rethrow;
}
});
test('성능 테스트 - 단축 URL 처리 시간', () async {
const shortUrl = 'https://naver.me/example'; // 실제 URL로 교체 필요
print('\n========== 성능 테스트 ==========');
final stopwatch = Stopwatch()..start();
try {
final restaurant = await parser.parseRestaurantFromUrl(shortUrl);
stopwatch.stop();
print('처리 완료: ${restaurant.name}');
print('소요 시간: ${stopwatch.elapsedMilliseconds}ms');
// 5초 이내 처리 확인
expect(stopwatch.elapsedMilliseconds, lessThan(5000));
print('\n✓ 테스트 성공');
} catch (e) {
stopwatch.stop();
print('처리 실패 (${stopwatch.elapsedMilliseconds}ms)');
print('오류: $e');
rethrow;
}
});
});
}