11import 'package:flutter_test/flutter_test.dart' ;
22
3+ // Validation functions to test real logic instead of constants
4+ bool isValidTimestamp (int ? timestamp) {
5+ return timestamp != null && timestamp > 0 ;
6+ }
7+
8+ bool isValidExpirationHours (int hours) {
9+ return hours > 0 && hours <= 168 ; // Between 1 hour and 1 week
10+ }
11+
12+ bool isTimestampInFuture (DateTime timestamp, DateTime threshold) {
13+ return timestamp.isAfter (threshold);
14+ }
15+
16+ bool isExpirationTooFarInPast (DateTime expiration, DateTime threshold) {
17+ return expiration.isBefore (threshold);
18+ }
19+
20+ Duration calculateDurationComponents (int hours, int minutes, int seconds) {
21+ return Duration (hours: hours, minutes: minutes, seconds: seconds);
22+ }
23+
24+ int clampHours (int hours, int maxHours) {
25+ return hours.clamp (0 , maxHours);
26+ }
27+
28+ String formatTime (int hours, int minutes, int seconds) {
29+ return '${hours .toString ().padLeft (2 , '0' )}:${minutes .toString ().padLeft (2 , '0' )}:${seconds .toString ().padLeft (2 , '0' )}' ;
30+ }
31+
32+ int convertSecondsToMinutes (int seconds) {
33+ return (seconds / 60 ).round ();
34+ }
35+
336void main () {
437 group ('Countdown Validation Tests' , () {
538
639 group ('Timestamp Validation' , () {
740 test ('should reject negative timestamps' , () {
8- final timestamp = - 1000 ;
9- expect (timestamp <= 0 , isTrue);
41+ expect (isValidTimestamp (- 1000 ), isFalse);
1042 });
1143
1244 test ('should reject zero timestamps' , () {
13- final timestamp = 0 ;
14- expect (timestamp <= 0 , isTrue);
45+ expect (isValidTimestamp (0 ), isFalse);
46+ });
47+
48+ test ('should reject null timestamps' , () {
49+ expect (isValidTimestamp (null ), isFalse);
1550 });
1651
1752 test ('should accept valid timestamps' , () {
1853 final timestamp = DateTime .now ().millisecondsSinceEpoch;
19- expect (timestamp > 0 , isTrue);
54+ expect (isValidTimestamp ( timestamp) , isTrue);
2055 });
2156
2257 test ('should reject future timestamps beyond threshold' , () {
2358 final now = DateTime .now ();
2459 final futureTime = now.add (const Duration (minutes: 10 ));
2560 final threshold = now.add (const Duration (minutes: 5 ));
2661
27- expect (futureTime.isAfter (threshold), isTrue);
62+ expect (isTimestampInFuture (futureTime, threshold), isTrue);
63+ });
64+
65+ test ('should accept timestamps within threshold' , () {
66+ final now = DateTime .now ();
67+ final recentTime = now.add (const Duration (minutes: 2 ));
68+ final threshold = now.add (const Duration (minutes: 5 ));
69+
70+ expect (isTimestampInFuture (recentTime, threshold), isFalse);
2871 });
2972 });
3073
@@ -34,88 +77,80 @@ void main() {
3477 final pastExpiration = now.subtract (const Duration (hours: 2 ));
3578 final threshold = now.subtract (const Duration (hours: 1 ));
3679
37- expect (pastExpiration. isBefore ( threshold), isTrue);
80+ expect (isExpirationTooFarInPast (pastExpiration, threshold), isTrue);
3881 });
3982
4083 test ('should accept recent expiration times' , () {
4184 final now = DateTime .now ();
4285 final recentExpiration = now.subtract (const Duration (minutes: 30 ));
4386 final threshold = now.subtract (const Duration (hours: 1 ));
4487
45- expect (recentExpiration. isAfter ( threshold), isTrue );
88+ expect (isExpirationTooFarInPast (recentExpiration, threshold), isFalse );
4689 });
4790
4891 test ('should validate expiration hours range' , () {
49- expect (0 <= 0 , isTrue); // Invalid: zero hours
50- expect (24 > 0 && 24 <= 168 , isTrue); // Valid: 24 hours
51- expect (200 > 168 , isTrue); // Invalid: over 1 week
92+ expect (isValidExpirationHours (0 ), isFalse); // Invalid: zero hours
93+ expect (isValidExpirationHours (24 ), isTrue); // Valid: 24 hours
94+ expect (isValidExpirationHours (168 ), isTrue); // Valid: 1 week (max)
95+ expect (isValidExpirationHours (200 ), isFalse); // Invalid: over 1 week
96+ expect (isValidExpirationHours (- 5 ), isFalse); // Invalid: negative hours
5297 });
5398 });
5499
55100 group ('Time Calculations' , () {
56- test ('should calculate hours correctly' , () {
57- final duration = const Duration (hours: 5 , minutes: 30 , seconds: 45 );
58-
59- final hours = duration.inHours;
60- final minutes = duration.inMinutes % 60 ;
61- final seconds = duration.inSeconds % 60 ;
101+ test ('should calculate duration components correctly' , () {
102+ final duration = calculateDurationComponents (5 , 30 , 45 );
62103
63- expect (hours , equals (5 ));
64- expect (minutes , equals (30 ));
65- expect (seconds , equals (45 ));
104+ expect (duration.inHours , equals (5 ));
105+ expect (duration.inMinutes % 60 , equals (30 ));
106+ expect (duration.inSeconds % 60 , equals (45 ));
66107 });
67108
68109 test ('should clamp hours to maximum' , () {
69- final maxHours = 24 ;
70- final duration = const Duration (hours: 30 );
71-
72- final hoursLeft = duration.inHours.clamp (0 , maxHours);
73- expect (hoursLeft, equals (24 ));
110+ expect (clampHours (30 , 24 ), equals (24 ));
111+ expect (clampHours (10 , 24 ), equals (10 ));
112+ expect (clampHours (- 5 , 24 ), equals (0 ));
113+ expect (clampHours (168 , 24 ), equals (24 ));
74114 });
75115
76116 test ('should handle zero duration' , () {
77- final duration = const Duration ();
78-
79- final hours = duration.inHours;
80- final minutes = duration.inMinutes % 60 ;
81- final seconds = duration.inSeconds % 60 ;
117+ final duration = calculateDurationComponents (0 , 0 , 0 );
82118
83- expect (hours , equals (0 ));
84- expect (minutes , equals (0 ));
85- expect (seconds , equals (0 ));
119+ expect (duration.inHours , equals (0 ));
120+ expect (duration.inMinutes , equals (0 ));
121+ expect (duration.inSeconds , equals (0 ));
86122 });
87123
88124 test ('should format time correctly' , () {
89- final hours = 5 ;
90- final minutes = 7 ;
91- final seconds = 9 ;
92-
93- final formattedTime = '${hours .toString ().padLeft (2 , '0' )}:${minutes .toString ().padLeft (2 , '0' )}:${seconds .toString ().padLeft (2 , '0' )}' ;
94-
95- expect (formattedTime, equals ('05:07:09' ));
125+ expect (formatTime (5 , 7 , 9 ), equals ('05:07:09' ));
126+ expect (formatTime (0 , 0 , 0 ), equals ('00:00:00' ));
127+ expect (formatTime (23 , 59 , 59 ), equals ('23:59:59' ));
128+ expect (formatTime (100 , 5 , 3 ), equals ('100:05:03' ));
96129 });
97130 });
98131
99132 group ('Edge Cases' , () {
100133 test ('should handle null expiration timestamp' , () {
101- final int ? timestamp = null ;
102- final isValid = timestamp != null && timestamp > 0 ;
103-
104- expect (isValid, isFalse);
134+ expect (isValidTimestamp (null ), isFalse);
105135 });
106136
107137 test ('should convert seconds to minutes correctly' , () {
108- final expirationSeconds = 900 ; // 15 minutes
109- final expectedMinutes = (expirationSeconds / 60 ). round ();
110-
111- expect (expectedMinutes , equals (15 ));
138+ expect ( convertSecondsToMinutes ( 900 ), equals ( 15 )) ; // 15 minutes
139+ expect ( convertSecondsToMinutes ( 60 ), equals ( 1 )); // 1 minute
140+ expect ( convertSecondsToMinutes ( 0 ), equals ( 0 )); // 0 minutes
141+ expect (convertSecondsToMinutes ( 3600 ) , equals (60 )); // 60 minutes
112142 });
113143
114144 test ('should handle fractional minute conversions' , () {
115- final expirationSeconds = 930 ; // 15.5 minutes
116- final expectedMinutes = (expirationSeconds / 60 ).round ();
117-
118- expect (expectedMinutes, equals (16 )); // Rounded up
145+ expect (convertSecondsToMinutes (930 ), equals (16 )); // 15.5 minutes rounded up
146+ expect (convertSecondsToMinutes (870 ), equals (15 )); // 14.5 minutes rounded up
147+ expect (convertSecondsToMinutes (450 ), equals (8 )); // 7.5 minutes rounded up
148+ });
149+
150+ test ('should validate edge cases for expiration hours' , () {
151+ expect (isValidExpirationHours (1 ), isTrue); // Minimum valid
152+ expect (isValidExpirationHours (168 ), isTrue); // Maximum valid
153+ expect (isValidExpirationHours (169 ), isFalse); // Just over maximum
119154 });
120155 });
121156 });
0 commit comments