11import 'dart:convert' ;
22
33import 'package:flutter/material.dart' ;
4- import 'package:flutter/rendering.dart' ;
54import 'package:flutter/services.dart' ;
65import 'package:flutter_test/flutter_test.dart' ;
76import 'package:flutter_swipe_action_cell/core/cell.dart' ;
@@ -38,6 +37,7 @@ void main() {
3837 WidgetTester tester, {
3938 ScheduleEntity ? customSchedule,
4039 Duration ? preparationTime,
40+ bool isEarlyStarted = false ,
4141 }) async {
4242 final targetSchedule = customSchedule ?? schedule;
4343 await tester.pumpWidget (
@@ -51,6 +51,7 @@ void main() {
5151 body: ScheduleDetail (
5252 schedule: targetSchedule,
5353 preparationTime: preparationTime,
54+ isEarlyStarted: isEarlyStarted,
5455 ),
5556 ),
5657 ),
@@ -88,6 +89,25 @@ void main() {
8889 .reduce ((a, b) => a > b ? a : b);
8990 }
9091
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+
91111 testWidgets ('expanded tile shows travel, preparation, spare in order' ,
92112 (tester) async {
93113 await pumpScheduleDetail (tester,
@@ -176,4 +196,80 @@ void main() {
176196 expect (find.text ('Office' ), findsNothing);
177197 expect (find.text ('09:00' ), findsNothing);
178198 });
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+ });
179275}
0 commit comments