@@ -37,6 +37,7 @@ void main() {
3737 WidgetTester tester, {
3838 ScheduleEntity ? customSchedule,
3939 Duration ? preparationTime,
40+ bool isEarlyStarted = false ,
4041 }) async {
4142 final targetSchedule = customSchedule ?? schedule;
4243 await tester.pumpWidget (
@@ -50,6 +51,7 @@ void main() {
5051 body: ScheduleDetail (
5152 schedule: targetSchedule,
5253 preparationTime: preparationTime,
54+ isEarlyStarted: isEarlyStarted,
5355 ),
5456 ),
5557 ),
@@ -87,6 +89,25 @@ void main() {
8789 .reduce ((a, b) => a > b ? a : b);
8890 }
8991
92+ int getActionButtonCount (WidgetTester tester) {
93+ final actionContainers = find.byWidgetPredicate ((widget) {
94+ if (widget is ! Container ) {
95+ return false ;
96+ }
97+ final decoration = widget.decoration;
98+ if (decoration is ! BoxDecoration ) {
99+ return false ;
100+ }
101+ final radius = decoration.borderRadius;
102+ if (radius is ! BorderRadius ) {
103+ return false ;
104+ }
105+ return radius.topLeft.x == 12 && decoration.color != null ;
106+ });
107+
108+ return actionContainers.evaluate ().length;
109+ }
110+
90111 testWidgets ('expanded tile shows travel, preparation, spare in order' ,
91112 (tester) async {
92113 await pumpScheduleDetail (tester,
@@ -175,4 +196,80 @@ void main() {
175196 expect (find.text ('Office' ), findsNothing);
176197 expect (find.text ('09:00' ), findsNothing);
177198 });
199+
200+ testWidgets ('edit action is available before preparation starts' ,
201+ (tester) async {
202+ final futureSchedule = ScheduleEntity (
203+ id: 'schedule-2' ,
204+ place: PlaceEntity (id: 'place-1' , placeName: 'Office' ),
205+ scheduleName: 'Planning' ,
206+ scheduleTime: DateTime .now ().add (const Duration (hours: 3 )),
207+ moveTime: const Duration (minutes: 30 ),
208+ isChanged: false ,
209+ isStarted: false ,
210+ scheduleSpareTime: const Duration (minutes: 10 ),
211+ scheduleNote: '' ,
212+ );
213+
214+ await pumpScheduleDetail (
215+ tester,
216+ customSchedule: futureSchedule,
217+ preparationTime: const Duration (minutes: 20 ),
218+ );
219+
220+ await openTrailingActions (tester);
221+
222+ expect (getActionButtonCount (tester), 2 );
223+ });
224+
225+ testWidgets ('edit action is hidden after preparation start time' ,
226+ (tester) async {
227+ final scheduleInPreparation = ScheduleEntity (
228+ id: 'schedule-3' ,
229+ place: PlaceEntity (id: 'place-1' , placeName: 'Office' ),
230+ scheduleName: 'Planning' ,
231+ scheduleTime: DateTime .now ().add (const Duration (minutes: 30 )),
232+ moveTime: const Duration (minutes: 30 ),
233+ isChanged: false ,
234+ isStarted: false ,
235+ scheduleSpareTime: const Duration (minutes: 10 ),
236+ scheduleNote: '' ,
237+ );
238+
239+ await pumpScheduleDetail (
240+ tester,
241+ customSchedule: scheduleInPreparation,
242+ preparationTime: const Duration (minutes: 20 ),
243+ );
244+
245+ await openTrailingActions (tester);
246+
247+ expect (getActionButtonCount (tester), 1 );
248+ });
249+
250+ testWidgets ('edit action is hidden for early-started schedule' ,
251+ (tester) async {
252+ final futureSchedule = ScheduleEntity (
253+ id: 'schedule-4' ,
254+ place: PlaceEntity (id: 'place-1' , placeName: 'Office' ),
255+ scheduleName: 'Planning' ,
256+ scheduleTime: DateTime .now ().add (const Duration (hours: 3 )),
257+ moveTime: const Duration (minutes: 30 ),
258+ isChanged: false ,
259+ isStarted: false ,
260+ scheduleSpareTime: const Duration (minutes: 10 ),
261+ scheduleNote: '' ,
262+ );
263+
264+ await pumpScheduleDetail (
265+ tester,
266+ customSchedule: futureSchedule,
267+ preparationTime: const Duration (minutes: 20 ),
268+ isEarlyStarted: true ,
269+ );
270+
271+ await openTrailingActions (tester);
272+
273+ expect (getActionButtonCount (tester), 1 );
274+ });
178275}
0 commit comments