feat(app): add manual entry and sharing flows

This commit is contained in:
JiWoong Sul
2025-11-19 16:36:39 +09:00
parent 5ade584370
commit 947fe59486
110 changed files with 5937 additions and 3781 deletions

View File

@@ -10,7 +10,7 @@ import 'package:lunchpick/core/errors/network_exceptions.dart';
class MockNaverApiClient extends NaverApiClient {
final Map<String, dynamic> _mockResponses = {};
final Map<String, Exception> _mockExceptions = {};
// Mock 설정 메서드들
void setSearchResponse({
required String query,
@@ -21,7 +21,7 @@ class MockNaverApiClient extends NaverApiClient {
final key = _generateKey(query, latitude, longitude);
_mockResponses[key] = results;
}
void setSearchException({
required String query,
double? latitude,
@@ -31,15 +31,15 @@ class MockNaverApiClient extends NaverApiClient {
final key = _generateKey(query, latitude, longitude);
_mockExceptions[key] = exception;
}
String _generateKey(String query, double? latitude, double? longitude) {
return '$query-$latitude-$longitude';
}
// 호출 추적
final List<Map<String, dynamic>> callHistory = [];
bool disposeCalled = false;
@override
Future<List<NaverLocalSearchResult>> searchLocal({
required String query,
@@ -57,20 +57,20 @@ class MockNaverApiClient extends NaverApiClient {
'display': display,
'sort': sort,
});
final key = _generateKey(query, latitude, longitude);
if (_mockExceptions.containsKey(key)) {
throw _mockExceptions[key]!;
}
if (_mockResponses.containsKey(key)) {
return _mockResponses[key] as List<NaverLocalSearchResult>;
}
return [];
}
@override
void dispose() {
disposeCalled = true;
@@ -80,19 +80,19 @@ class MockNaverApiClient extends NaverApiClient {
class MockNaverMapParser extends NaverMapParser {
final Map<String, Restaurant> _mockResponses = {};
final Map<String, Exception> _mockExceptions = {};
void setParseResponse(String url, Restaurant restaurant) {
_mockResponses[url] = restaurant;
}
void setParseException(String url, Exception exception) {
_mockExceptions[url] = exception;
}
// 호출 추적
bool disposeCalled = false;
final List<String> parseCallHistory = [];
@override
Future<Restaurant> parseRestaurantFromUrl(
String url, {
@@ -100,18 +100,18 @@ class MockNaverMapParser extends NaverMapParser {
double? userLongitude,
}) async {
parseCallHistory.add(url);
if (_mockExceptions.containsKey(url)) {
throw _mockExceptions[url]!;
}
if (_mockResponses.containsKey(url)) {
return _mockResponses[url]!;
}
throw NaverMapParseException('No mock response set for URL: $url');
}
@override
void dispose() {
disposeCalled = true;
@@ -196,9 +196,10 @@ void main() {
throwsA(
allOf(
isA<ParseException>(),
predicate<ParseException>((e) =>
e.message.contains('식당 정보를 가져올 수 없습니다') &&
e.originalError.toString() == exception.toString()
predicate<ParseException>(
(e) =>
e.message.contains('식당 정보를 가져올 수 없습니다') &&
e.originalError.toString() == exception.toString(),
),
),
),
@@ -210,7 +211,7 @@ void main() {
const testQuery = '김치찌개';
const testLatitude = 37.123456;
const testLongitude = 127.123456;
final testSearchResults = [
NaverLocalSearchResult.fromJson({
'title': '김치찌개 맛집',
@@ -246,7 +247,7 @@ void main() {
expect(results.first.name, equals('김치찌개 맛집'));
expect(results.first.category, equals('한식'));
expect(results.first.subCategory, equals('찌개'));
// API 호출 확인
expect(mockApiClient.callHistory.length, equals(1));
expect(mockApiClient.callHistory.first['query'], equals(testQuery));
@@ -302,9 +303,10 @@ void main() {
throwsA(
allOf(
isA<ParseException>(),
predicate<ParseException>((e) =>
e.message.contains('식당 검색에 실패했습니다') &&
e.originalError.toString() == exception.toString()
predicate<ParseException>(
(e) =>
e.message.contains('식당 검색에 실패했습니다') &&
e.originalError.toString() == exception.toString(),
),
),
),
@@ -317,7 +319,7 @@ void main() {
const testAddress = '서울시 강남구 역삼동';
const testLatitude = 37.123456;
const testLongitude = 127.123456;
final testSearchResults = [
NaverLocalSearchResult.fromJson({
'title': testName,
@@ -364,9 +366,7 @@ void main() {
);
// Act
final result = await service.searchRestaurantDetails(
name: testName,
);
final result = await service.searchRestaurantDetails(name: testName);
// Assert
expect(result, isNull);
@@ -396,9 +396,7 @@ void main() {
);
// Act
final result = await service.searchRestaurantDetails(
name: testName,
);
final result = await service.searchRestaurantDetails(name: testName);
// Assert
expect(result, isNull);
@@ -573,4 +571,4 @@ void main() {
});
});
});
}
}