@@ -76,6 +76,10 @@ void resetTimezones() {
7676  tz.initializeDatabase ([]);
7777}
7878
79+ Subject <String > checkUserLocalTimeText (WidgetTester  tester) => 
80+   check (
81+     tester.widget <Text >(find.descendant (of:  find.byType (UserLocalTimeText ), matching:  find.byType (Text ))).data).isNotNull ();
82+ 
7983void  main () {
8084  TestZulipBinding .ensureInitialized ();
8185
@@ -328,18 +332,95 @@ void main() {
328332      check (find.textContaining (longString).evaluate ()).length.equals (7 );
329333    });
330334
331-     test ('assets; ensure the timezone database used to display users\'  local time is up-to-date' , () async  {
332-       tz.initializeTimeZones ();
333-       final  latestTimezones =  tz.tzdbSerialize (tz.timeZoneDatabase);
335+     group ('UserLocalTimeText' , () {
336+       setUp (() async  {
337+         await  UserLocalTimeText .initializeTimezonesUsingAssets ();
338+       });
339+ 
340+       test ('assets; ensure the timezone database used to display users\'  local time is up-to-date' , () async  {
341+         tz.initializeTimeZones ();
342+         final  latestTimezones =  tz.tzdbSerialize (tz.timeZoneDatabase);
334343
335-       await  UserLocalTimeText .initializeTimezonesUsingAssets ();
336-       final  currentTimezones =  tz.tzdbSerialize (tz.timeZoneDatabase);
344+         await  UserLocalTimeText .initializeTimezonesUsingAssets ();
345+         final  currentTimezones =  tz.tzdbSerialize (tz.timeZoneDatabase);
346+ 
347+         check (
348+           listEquals (currentTimezones, latestTimezones),
349+           because: 
350+               'the timezone database used to display users\'  local time is not up-to-date, please copy `package:timezone/data/latest_all.tzf` to `assets/timezone/latest_all.tzf`' ,
351+         ).isTrue ();
352+       });
337353
338-       check (
339-         listEquals (currentTimezones, latestTimezones),
340-         because: 
341-             'the timezone database used to display users\'  local time is not up-to-date, please copy `package:timezone/data/latest_all.tzf` to `assets/timezone/latest_all.tzf`' ,
342-       ).isTrue ();
354+       final  testCases =  [(
355+           description:  'simple usecase' ,
356+           currentTimezone:  'America/Los_Angeles' ,
357+           currentYear:  2025 , currentMonth:  02 , currentDay:  01 , currentHour:  12 , currentMinute:  00 ,
358+           userTimezone:  'America/New_York' ,
359+           equalsTo:  '3:00 PM local time' 
360+         ), (
361+           description:  'abbreviation usecase' ,
362+           currentTimezone:  'Europe/Brussels' ,
363+           currentYear:  2025 , currentMonth:  02 , currentDay:  01 , currentHour:  12 , currentMinute:  00 ,
364+           userTimezone:  'CET' ,
365+           equalsTo:  '12:00 PM local time' 
366+         ), (
367+           description:  'DST usecase' ,
368+           currentTimezone:  'Europe/London' ,
369+           currentYear:  2025 , currentMonth:  08 , currentDay:  01 , currentHour:  12 , currentMinute:  00 ,
370+           userTimezone:  'UTC' ,
371+           equalsTo:  '11:00 AM local time' 
372+         )
373+       ];
374+ 
375+       for  (
376+         final  (
377+           : description,
378+           : currentTimezone,
379+           : currentYear,
380+           : currentMonth,
381+           : currentDay,
382+           : currentHour,
383+           : currentMinute, : userTimezone, : equalsTo) in  testCases) {
384+         testWidgets ('page builds; $description ' , (tester) async  {
385+           final  currentTime =  tz.TZDateTime (
386+             tz.getLocation (currentTimezone),
387+             currentYear,
388+             currentMonth,
389+             currentDay,
390+             currentHour,
391+             currentMinute
392+           );
393+           resetTimezones ();
394+ 
395+           await  withClock (Clock .fixed (currentTime), () async  {
396+             final  user =  eg.user (userId:  1 , timezone:  userTimezone);
397+             await  setupPage (tester, pageUserId:  user.userId, users:  [user]);
398+ 
399+             checkUserLocalTimeText (tester).equals (equalsTo);
400+           });
401+         });
402+       }
403+ 
404+       testWidgets ('page builds; keep "current" local time current' , (tester) async  {
405+         withClock (Clock .fixed (tz.TZDateTime (tz.getLocation ('Europe/London' ), 2025 , 02 , 01 , 12 , 00 )), () {
406+           FakeAsync ().run ((async ) {
407+             final  user =  eg.user (userId:  1 , timezone:  'Europe/London' );
408+             setupPage (tester, pageUserId:  user.userId, users:  [user]);
409+             async .flushMicrotasks ();
410+             checkUserLocalTimeText (tester).equals ('12:00 PM local time' );
411+ 
412+             async .elapse (Duration (minutes:  1 ));
413+             tester.pumpAndSettle ();
414+             async .flushMicrotasks ();
415+             checkUserLocalTimeText (tester).equals ('12:01 PM local time' );
416+ 
417+             async .elapse (Duration (minutes:  1 ));
418+             tester.pumpAndSettle ();
419+             async .flushMicrotasks ();
420+             checkUserLocalTimeText (tester).equals ('12:02 PM local time' );
421+           });
422+         });
423+       });
343424    });
344425  });
345426}
0 commit comments