107 lines
3.0 KiB
Dart
Executable File
107 lines
3.0 KiB
Dart
Executable File
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:kryz_go_flutter/time_formatter.dart';
|
|
import 'package:timezone/data/latest.dart' as tz;
|
|
import 'package:timezone/timezone.dart' as tz;
|
|
|
|
void main() {
|
|
setUpAll(() {
|
|
tz.initializeTimeZones();
|
|
});
|
|
|
|
group('formatStartingTime', () {
|
|
test('returns local display from source timezone naive server time', () {
|
|
const String sourceTime = '2026-05-14 20:00:00';
|
|
const String sourceZone = 'America/Los_Angeles';
|
|
|
|
final tz.TZDateTime source = tz.TZDateTime(
|
|
tz.getLocation(sourceZone),
|
|
2026,
|
|
5,
|
|
14,
|
|
20,
|
|
);
|
|
final String expected = DateFormat('jm').format(
|
|
DateTime.fromMillisecondsSinceEpoch(
|
|
source.millisecondsSinceEpoch,
|
|
isUtc: true,
|
|
).toLocal(),
|
|
);
|
|
|
|
expect(
|
|
formatStartingTime(sourceTime, sourceTimezone: sourceZone),
|
|
expected,
|
|
);
|
|
});
|
|
|
|
test('falls back to parsed local time when timezone is invalid', () {
|
|
final DateTime parsed = DateTime.parse('2026-05-14 20:00:00');
|
|
final String expected = DateFormat('jm').format(parsed);
|
|
|
|
expect(
|
|
formatStartingTime(
|
|
'2026-05-14 20:00:00',
|
|
sourceTimezone: 'Invalid/Timezone',
|
|
),
|
|
expected,
|
|
);
|
|
});
|
|
|
|
test('returns placeholder for invalid input', () {
|
|
expect(formatStartingTime('not-a-time'), '--:--');
|
|
expect(formatStartingTime(null), '--:--');
|
|
});
|
|
|
|
test('does not double-convert timestamps with explicit UTC designator', () {
|
|
const String utcStamp = '2026-05-15T03:00:00Z';
|
|
final String expected = DateFormat('jm').format(DateTime.parse(utcStamp).toLocal());
|
|
|
|
expect(
|
|
formatStartingTime(
|
|
utcStamp,
|
|
sourceTimezone: 'America/Los_Angeles',
|
|
),
|
|
expected,
|
|
);
|
|
});
|
|
|
|
test('keeps wall-clock time when local matches source zone for naive input', () {
|
|
const String sourceTime = '2026-05-14 20:00:00';
|
|
const String sourceZone = 'America/Los_Angeles';
|
|
|
|
final tz.TZDateTime source = tz.TZDateTime(
|
|
tz.getLocation(sourceZone),
|
|
2026,
|
|
5,
|
|
14,
|
|
20,
|
|
);
|
|
final String expected = DateFormat('jm').format(
|
|
DateTime.fromMillisecondsSinceEpoch(
|
|
source.millisecondsSinceEpoch,
|
|
isUtc: true,
|
|
).toLocal(),
|
|
);
|
|
|
|
expect(
|
|
formatStartingTime(sourceTime, sourceTimezone: sourceZone),
|
|
expected,
|
|
);
|
|
});
|
|
});
|
|
|
|
group('formatTimeWindow', () {
|
|
test('returns mm:ss style duration from server times', () {
|
|
expect(
|
|
formatTimeWindow('2026-05-15 05:18:46.000000', '2026-05-15 05:23:21.000000'),
|
|
'04:35',
|
|
);
|
|
});
|
|
|
|
test('returns placeholder for invalid windows', () {
|
|
expect(formatTimeWindow('nope', '2026-05-15 05:23:21.000000'), '--:--');
|
|
expect(formatTimeWindow(null, '2026-05-15 05:23:21.000000'), '--:--');
|
|
});
|
|
});
|
|
}
|