feat: 초기 프로젝트 설정 및 LunchPick 앱 구현
LunchPick(오늘 뭐 먹Z?) Flutter 앱의 초기 구현입니다. 주요 기능: - 네이버 지도 연동 맛집 추가 - 랜덤 메뉴 추천 시스템 - 날씨 기반 거리 조정 - 방문 기록 관리 - Bluetooth 맛집 공유 - 다크모드 지원 기술 스택: - Flutter 3.8.1+ - Riverpod 상태 관리 - Hive 로컬 DB - Clean Architecture 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
146
test/integration/naver_integration_test.dart
Normal file
146
test/integration/naver_integration_test.dart
Normal file
@@ -0,0 +1,146 @@
|
||||
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;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user