Skip to content

Commit 92481ac

Browse files
committed
implement proper validation functions in countdown tests
1 parent d43c657 commit 92481ac

1 file changed

Lines changed: 87 additions & 52 deletions

File tree

test/shared/countdown_validation_test.dart

Lines changed: 87 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,73 @@
11
import '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+
336
void 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

Comments
 (0)