위치 선택 지도를 구글 지도로 · Figma 구성 맞춤
This commit is contained in:
@@ -112,7 +112,7 @@ final shots = <Shot>[
|
||||
),
|
||||
),
|
||||
Shot('F4-04', build: (r) async => QuestCreateScreen(repository: _F4Quests.all())),
|
||||
Shot('F4-05', build: (r) async => const PlacePickerScreen()),
|
||||
Shot('F4-05', build: (r) async => PlacePickerScreen(mapBuilder: (_) => const SizedBox.expand())),
|
||||
Shot(
|
||||
'F4-06',
|
||||
build: (r) async => QuestListScreen(repository: _F4Quests.all(), myPop: 12540),
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:fancake/core/data/backend.dart';
|
||||
import 'package:fancake/core/monetization/rewarded_ad.dart';
|
||||
import 'package:fancake/features/quest/place_picker_screen.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart' show LatLng;
|
||||
import 'package:fancake/features/quest/quest_ad_screens.dart';
|
||||
import 'package:fancake/features/quest/quest_create_screen.dart';
|
||||
import 'package:fancake/features/quest/quest_data.dart';
|
||||
@@ -20,6 +21,14 @@ import 'package:flutter_test/flutter_test.dart';
|
||||
/// 몫이고, 화면은 주입받은 것을 그린다.
|
||||
const _sample = SampleQuestRepository();
|
||||
|
||||
/// 지도 플랫폼 뷰 대신 — 콜백만 붙잡아 테스트가 지도 이동을 흉내 낸다.
|
||||
Future<LatLng?> _noLastKnown() async => null;
|
||||
PickerMapArgs? _map;
|
||||
Widget _fakeMap(PickerMapArgs a) {
|
||||
_map = a;
|
||||
return const SizedBox.expand();
|
||||
}
|
||||
|
||||
Future<void> pumpWide(WidgetTester tester, Widget child) async {
|
||||
tester.view.physicalSize = const Size(1080, 2400);
|
||||
tester.view.devicePixelRatio = 3.0;
|
||||
@@ -406,7 +415,7 @@ void main() {
|
||||
expect(find.textContaining('목표 위치'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('위치 분류에서는 장소를 고르기 전까지 완료가 열리지 않는다', (tester) async {
|
||||
testWidgets('위치 분류에서는 장소를 고르기 전까지 완료가 열리지 않는다(위치 선택 화면 열림 · 닫아도 잠김)', (tester) async {
|
||||
await pumpWide(tester, const QuestCreateScreen(repository: _sample));
|
||||
await tester.pump();
|
||||
await tester.tap(find.text('특정 위치'));
|
||||
@@ -424,13 +433,11 @@ void main() {
|
||||
await tester.tap(find.textContaining('목표 위치'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(PlacePickerScreen), findsOneWidget);
|
||||
await tester.tap(find.text('홍대 팝업스토어'));
|
||||
// 위치를 정하지 않고 닫으면 장소가 비어 완료는 그대로 잠겨 있다(선택 값은 아래 위치 선택 테스트).
|
||||
await tester.tap(find.byType(CloseButton));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('선택 완료'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
done = tester.widget<TextButton>(find.widgetWithText(TextButton, '완료'));
|
||||
expect(done.onPressed, isNotNull);
|
||||
expect(done.onPressed, isNull);
|
||||
});
|
||||
|
||||
testWidgets('완료를 누르면 만들기 전에 되묻는다', (tester) async {
|
||||
@@ -494,26 +501,71 @@ void main() {
|
||||
|
||||
group('위치 선택 (F4 · 371:356705)', () {
|
||||
testWidgets('고르기 전에는 확정 버튼이 비활성이다', (tester) async {
|
||||
await pumpWide(tester, const PlacePickerScreen());
|
||||
await pumpWide(tester, PlacePickerScreen(mapBuilder: _fakeMap, lastKnown: _noLastKnown));
|
||||
final button = tester.widget<FilledButton>(
|
||||
find.widgetWithText(FilledButton, '선택 완료'),
|
||||
);
|
||||
expect(button.onPressed, isNull);
|
||||
});
|
||||
|
||||
testWidgets('검색으로 목록이 줄어든다', (tester) async {
|
||||
await pumpWide(tester, const PlacePickerScreen());
|
||||
await tester.enterText(find.byType(TextField), '홍대');
|
||||
testWidgets('지도를 움직이면 주소 조회 중에는 잠기고 끝나면 가운데 좌표를 돌려준다', (tester) async {
|
||||
QuestPlace? result;
|
||||
await pumpWide(
|
||||
tester,
|
||||
Builder(
|
||||
builder: (context) => TextButton(
|
||||
onPressed: () async => result = await Navigator.of(context).push(
|
||||
MaterialPageRoute<QuestPlace>(
|
||||
builder: (_) => PlacePickerScreen(mapBuilder: _fakeMap, lastKnown: _noLastKnown),
|
||||
),
|
||||
),
|
||||
child: const Text('열기'),
|
||||
),
|
||||
),
|
||||
);
|
||||
await tester.tap(find.text('열기'));
|
||||
await tester.pumpAndSettle();
|
||||
FilledButton done() => tester.widget<FilledButton>(
|
||||
find.widgetWithText(FilledButton, '선택 완료'),
|
||||
);
|
||||
_map!.onMoveStarted();
|
||||
await tester.pump();
|
||||
expect(find.text('홍대 팝업스토어'), findsOneWidget);
|
||||
expect(find.text('고척 스카이돔'), findsNothing);
|
||||
expect(done().onPressed, isNull);
|
||||
_map!.onMove(const LatLng(37.55, 126.92));
|
||||
_map!.onIdle();
|
||||
await tester.pump();
|
||||
await tester.pump();
|
||||
expect(done().onPressed, isNotNull);
|
||||
await tester.tap(find.widgetWithText(FilledButton, '선택 완료'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(result?.lat, 37.55);
|
||||
expect(result?.lng, 126.92);
|
||||
});
|
||||
|
||||
testWidgets('없는 장소를 찾으면 빈 상태를 알린다', (tester) async {
|
||||
await pumpWide(tester, const PlacePickerScreen());
|
||||
await tester.enterText(find.byType(TextField), '없는장소');
|
||||
await tester.pump();
|
||||
expect(find.text('검색 결과가 없습니다.'), findsOneWidget);
|
||||
testWidgets('Figma 에 없는 장소 검색 · 등록 장소 목록은 두지 않는다', (tester) async {
|
||||
await pumpWide(tester, PlacePickerScreen(mapBuilder: _fakeMap, lastKnown: _noLastKnown));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(TextField), findsNothing);
|
||||
expect(find.byType(RadioListTile<String>), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('현재 위치 확정 전에는 등록 장소가 아니라 마지막 위치(없으면 기본 위치)로 시작한다', (tester) async {
|
||||
_map = null;
|
||||
await pumpWide(tester, PlacePickerScreen(mapBuilder: _fakeMap, lastKnown: _noLastKnown));
|
||||
await tester.pumpAndSettle();
|
||||
expect(_map!.initial, PlacePickerScreen.fallbackCenter);
|
||||
|
||||
_map = null;
|
||||
await pumpWide(
|
||||
tester,
|
||||
PlacePickerScreen(
|
||||
key: UniqueKey(),
|
||||
mapBuilder: _fakeMap,
|
||||
lastKnown: () async => const LatLng(35.1, 129.0),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
expect(_map!.initial, const LatLng(35.1, 129.0));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -566,7 +618,7 @@ void main() {
|
||||
const QuestListScreen(repository: _sample),
|
||||
const QuestDetailScreen(questId: 'q1', repository: _sample),
|
||||
const QuestCreateScreen(repository: _sample),
|
||||
const PlacePickerScreen(),
|
||||
PlacePickerScreen(mapBuilder: _fakeMap, lastKnown: _noLastKnown),
|
||||
]) {
|
||||
await pumpWide(tester, screen);
|
||||
await tester.pump();
|
||||
|
||||
Reference in New Issue
Block a user