1import 'package:coves_flutter/utils/date_time_utils.dart'; 2import 'package:flutter_test/flutter_test.dart'; 3 4void main() { 5 group('DateTimeUtils.formatTimeAgo', () { 6 // Fixed reference time for deterministic testing 7 final referenceTime = DateTime(2024, 1, 15, 12); 8 9 test('formats minutes correctly', () { 10 final pastTime = referenceTime.subtract(const Duration(minutes: 5)); 11 expect( 12 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 13 '5m', 14 ); 15 }); 16 17 test('formats 0 minutes as 0m', () { 18 final pastTime = referenceTime.subtract(const Duration(seconds: 30)); 19 expect( 20 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 21 '0m', 22 ); 23 }); 24 25 test('formats 59 minutes as minutes', () { 26 final pastTime = referenceTime.subtract(const Duration(minutes: 59)); 27 expect( 28 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 29 '59m', 30 ); 31 }); 32 33 test('formats hours correctly', () { 34 final pastTime = referenceTime.subtract(const Duration(hours: 3)); 35 expect( 36 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 37 '3h', 38 ); 39 }); 40 41 test('formats 23 hours as hours', () { 42 final pastTime = referenceTime.subtract(const Duration(hours: 23)); 43 expect( 44 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 45 '23h', 46 ); 47 }); 48 49 test('formats days correctly', () { 50 final pastTime = referenceTime.subtract(const Duration(days: 7)); 51 expect( 52 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 53 '7d', 54 ); 55 }); 56 57 test('formats 364 days as days', () { 58 final pastTime = referenceTime.subtract(const Duration(days: 364)); 59 expect( 60 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 61 '364d', 62 ); 63 }); 64 65 test('formats years correctly', () { 66 final pastTime = referenceTime.subtract(const Duration(days: 365)); 67 expect( 68 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 69 '1yr', 70 ); 71 }); 72 73 test('formats multiple years correctly', () { 74 final pastTime = referenceTime.subtract(const Duration(days: 730)); 75 expect( 76 DateTimeUtils.formatTimeAgo(pastTime, currentTime: referenceTime), 77 '2yr', 78 ); 79 }); 80 81 test('uses DateTime.now() when currentTime not provided', () { 82 final pastTime = DateTime.now().subtract(const Duration(minutes: 5)); 83 final result = DateTimeUtils.formatTimeAgo(pastTime); 84 85 // Should be "5m" or "4m" depending on timing 86 expect(result, matches(r'^\d+m$')); 87 }); 88 }); 89 90 group('DateTimeUtils.formatCount', () { 91 test('formats numbers less than 1000 as-is', () { 92 expect(DateTimeUtils.formatCount(0), '0'); 93 expect(DateTimeUtils.formatCount(1), '1'); 94 expect(DateTimeUtils.formatCount(42), '42'); 95 expect(DateTimeUtils.formatCount(999), '999'); 96 }); 97 98 test('formats 1000 as 1.0k', () { 99 expect(DateTimeUtils.formatCount(1000), '1.0k'); 100 }); 101 102 test('formats thousands with one decimal place', () { 103 expect(DateTimeUtils.formatCount(1500), '1.5k'); 104 expect(DateTimeUtils.formatCount(2300), '2.3k'); 105 expect(DateTimeUtils.formatCount(5678), '5.7k'); 106 }); 107 108 test('formats large numbers correctly', () { 109 expect(DateTimeUtils.formatCount(10000), '10.0k'); 110 expect(DateTimeUtils.formatCount(42500), '42.5k'); 111 expect(DateTimeUtils.formatCount(999999), '1000.0k'); 112 }); 113 114 test('rounds to one decimal place', () { 115 expect(DateTimeUtils.formatCount(1234), '1.2k'); 116 expect(DateTimeUtils.formatCount(1567), '1.6k'); 117 }); 118 }); 119}