54 lines
1.7 KiB
Dart
54 lines
1.7 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:fuel_tax_tracker/services/merge_utils.dart';
|
|
|
|
class _Record {
|
|
final String id;
|
|
final String value;
|
|
final DateTime updatedAt;
|
|
|
|
_Record(this.id, this.value, this.updatedAt);
|
|
}
|
|
|
|
void main() {
|
|
group('mergeById', () {
|
|
test('unions records that only exist on one side', () {
|
|
final remote = [_Record('a', 'remote-a', DateTime(2024, 1, 1))];
|
|
final local = [_Record('b', 'local-b', DateTime(2024, 1, 1))];
|
|
|
|
final result = mergeById(remote, local, (r) => r.id, (r) => r.updatedAt);
|
|
|
|
expect(result.map((r) => r.id), containsAll(['a', 'b']));
|
|
expect(result.length, 2);
|
|
});
|
|
|
|
test('keeps the newer updatedAt when a record exists on both sides', () {
|
|
final remote = [_Record('a', 'remote-old', DateTime(2024, 1, 1))];
|
|
final local = [_Record('a', 'local-new', DateTime(2024, 6, 1))];
|
|
|
|
final result = mergeById(remote, local, (r) => r.id, (r) => r.updatedAt);
|
|
|
|
expect(result.length, 1);
|
|
expect(result.first.value, 'local-new');
|
|
});
|
|
|
|
test('keeps the remote copy when it is newer than local', () {
|
|
final remote = [_Record('a', 'remote-new', DateTime(2024, 6, 1))];
|
|
final local = [_Record('a', 'local-old', DateTime(2024, 1, 1))];
|
|
|
|
final result = mergeById(remote, local, (r) => r.id, (r) => r.updatedAt);
|
|
|
|
expect(result.length, 1);
|
|
expect(result.first.value, 'remote-new');
|
|
});
|
|
|
|
test('local wins ties', () {
|
|
final sameTime = DateTime(2024, 1, 1);
|
|
final remote = [_Record('a', 'remote', sameTime)];
|
|
final local = [_Record('a', 'local', sameTime)];
|
|
|
|
final result = mergeById(remote, local, (r) => r.id, (r) => r.updatedAt);
|
|
|
|
expect(result.first.value, 'local');
|
|
});
|
|
});
|
|
}
|