Skip to content

Commit 2aa58da

Browse files
committed
오늘 몫을 이미 쓴 사람에게 일기를 다시 쓰라고 하던 것을 고침
편성 화면에서 `마음 공명 탐험 시작`이 잠겨 있을 때 이유를 한 줄로만 말했다 - `마음 공명 보상은 오늘 50자 이상의 마음 일기를 쓴 뒤 열려요`. 그런데 잠기는 이유는 둘이다. 아직 일기를 안 썼거나, 오늘 몫을 이미 받았거나. 일기를 쓰고 한 번 다녀온 뒤 다시 들어가면 방금 한 일을 또 하라고 시킨다. 걸어 보다 만났다 - 허브는 `오늘의 마음 공명 보상은 이미 받았어요`라고 제대로 말하는데 편성만 다른 말을 했다. 서버는 `diary_ready`를 `heart_resonance_available`과 따로 내려준다. 지도 화면은 이미 그 둘을 갈라서 읽고 있었고 편성만 하나로 묶어 놨다. 지도가 쓰던 문장을 그대로 가져와 맞췄다. 테스트 fixture가 `diary_ready`를 `heart_resonance_available`에 묶어 두고 있어서 문제의 조합(일기는 썼고 오늘 몫은 다 씀)이 아예 만들어지지 않았다. 그래서 이 화면은 검사를 받고도 멀쩡해 보였다. 둘을 떼어 놓고 두 경우를 각각 확인한다. 편성 화면도 이제 48dp 검사를 함께 받는다.
1 parent fb093f3 commit 2aa58da

2 files changed

Lines changed: 70 additions & 5 deletions

File tree

app/lib/features/expedition/presentation/expedition_preparation.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,11 @@ class _StartActions extends ConsumerWidget {
483483
Text(
484484
state.catalog!.heartResonanceAvailable
485485
? '오늘 1회, 목표를 확보하고 귀환하면 성장과 씨앗을 받아요.'
486-
: '마음 공명 보상은 오늘 50자 이상의 마음 일기를 쓴 뒤 열려요.',
486+
// 못 쓴 것과 이미 받은 것은 다른 상황이다. 하나로 묶으면 오늘 일기를
487+
// 쓰고 다녀온 사람에게 일기를 쓰라고 다시 시킨다.
488+
: state.catalog!.diaryReady
489+
? '오늘의 마음 공명 보상은 이미 받았어요. 지금부터는 자유 탐험이에요.'
490+
: '마음 공명 보상은 오늘 50자 이상의 마음 일기를 쓴 뒤 열려요.',
487491
style: Theme.of(context).textTheme.bodySmall?.copyWith(
488492
color: Theme.of(context).colorScheme.onSurfaceVariant,
489493
),

app/test/expedition_stage_map_test.dart

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,16 @@ ExpeditionStageMap _stageMap({
120120
],
121121
});
122122

123-
ExpeditionCatalog _catalog({bool heartResonance = true, bool deep = false}) =>
123+
ExpeditionCatalog _catalog({
124+
bool heartResonance = true,
125+
bool deep = false,
126+
bool? diaryReady,
127+
}) =>
124128
ExpeditionCatalog.fromJson({
125129
'content_version': '2026.08.4',
126130
'active_run_id': null,
127131
'entry': {
128-
'diary_ready': heartResonance,
132+
'diary_ready': diaryReady ?? heartResonance,
129133
'heart_resonance_available': heartResonance,
130134
'free_explore_available': true,
131135
'deep_available': deep,
@@ -194,6 +198,9 @@ Future<_FakeStageController> _pumpShell(
194198
bool heartResonance = true,
195199
bool deep = false,
196200
bool echoWellUnlocked = false,
201+
bool? diaryReady,
202+
ExpeditionShellView shellView = ExpeditionShellView.hub,
203+
int? selectedStageNo,
197204
}) async {
198205
late _FakeStageController controller;
199206
await tester.pumpWidget(
@@ -203,7 +210,13 @@ Future<_FakeStageController> _pumpShell(
203210
controller = _FakeStageController(
204211
ExpeditionUiState(
205212
loading: false,
206-
catalog: _catalog(heartResonance: heartResonance, deep: deep),
213+
catalog: _catalog(
214+
heartResonance: heartResonance,
215+
deep: deep,
216+
diaryReady: diaryReady,
217+
),
218+
shellView: shellView,
219+
selectedStageNo: selectedStageNo,
207220
roster: _roster(),
208221
stageMap: _stageMap(
209222
clearedCount: clearedCount,
@@ -222,7 +235,10 @@ Future<_FakeStageController> _pumpShell(
222235
),
223236
);
224237
await tester.pump();
225-
expectTapTargets(tester, screen: '스테이지 지도');
238+
expectTapTargets(
239+
tester,
240+
screen: shellView == ExpeditionShellView.preparation ? '탐험대 편성' : '스테이지 지도',
241+
);
226242
return controller;
227243
}
228244

@@ -257,6 +273,51 @@ void main() {
257273
expect(tester.takeException(), isNull);
258274
});
259275

276+
// 편성 화면은 오래 `마음 공명 = 일기 안 씀`으로만 읽었다. 서버는 `diary_ready`를
277+
// 따로 주는데 화면이 둘을 하나로 묶어, 오늘 일기를 쓰고 한 번 다녀온 사람에게
278+
// 일기를 쓰라고 다시 시켰다. 두 사유를 갈라 놓는다.
279+
testWidgets('오늘 몫을 이미 받았으면 일기를 다시 쓰라고 하지 않는다', (tester) async {
280+
await tester.binding.setSurfaceSize(const Size(390, 844));
281+
addTearDown(() => tester.binding.setSurfaceSize(null));
282+
283+
await _pumpShell(
284+
tester,
285+
heartResonance: false,
286+
diaryReady: true,
287+
shellView: ExpeditionShellView.preparation,
288+
selectedStageNo: 2,
289+
);
290+
291+
expect(
292+
find.text('오늘의 마음 공명 보상은 이미 받았어요. 지금부터는 자유 탐험이에요.'),
293+
findsOneWidget,
294+
);
295+
expect(
296+
find.text('마음 공명 보상은 오늘 50자 이상의 마음 일기를 쓴 뒤 열려요.'),
297+
findsNothing,
298+
);
299+
expect(tester.takeException(), isNull);
300+
});
301+
302+
testWidgets('아직 일기를 쓰지 않았으면 일기부터 안내한다', (tester) async {
303+
await tester.binding.setSurfaceSize(const Size(390, 844));
304+
addTearDown(() => tester.binding.setSurfaceSize(null));
305+
306+
await _pumpShell(
307+
tester,
308+
heartResonance: false,
309+
diaryReady: false,
310+
shellView: ExpeditionShellView.preparation,
311+
selectedStageNo: 2,
312+
);
313+
314+
expect(
315+
find.text('마음 공명 보상은 오늘 50자 이상의 마음 일기를 쓴 뒤 열려요.'),
316+
findsOneWidget,
317+
);
318+
expect(tester.takeException(), isNull);
319+
});
320+
260321
testWidgets('지도는 8개 점과 진행도를 보여 주고 잠긴 곳은 사유를 읽어 준다', (tester) async {
261322
await tester.binding.setSurfaceSize(const Size(390, 844));
262323
addTearDown(() => tester.binding.setSurfaceSize(null));

0 commit comments

Comments
 (0)