Files
receipity/test/backup_format_test.dart
T
2026-08-30 12:24:29 +02:00

119 lines
3.1 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:receipity/services/backup_format.dart';
void main() {
test('round-trips a backup document', () {
const original = BackupDocument(
version: 2,
exportedAt: '2026-08-29T12:00:00.000',
darkMode: true,
supermarkets: [
{'id': 1, 'name': 'Jumbo', 'color': 0xFFEEC21B, 'sort_order': 0},
],
products: [
{
'id': 1,
'name': 'Milk',
'normalized_name': 'MILK',
'last_price': 1.5,
'times_seen': 2,
'favourite': 1,
'image_path': 'products/product_1.jpg',
'supermarket': 'Jumbo',
'notes': 'Organic',
'created_at': '2026-08-29T12:00:00.000',
'updated_at': '2026-08-29T12:00:00.000',
},
],
shops: [
{
'id': 8,
'supermarket': 'Jumbo',
'shopped_at': '2026-08-29T12:00:00.000',
'receipt_image_path': 'receipts/shop_8.jpg',
'total': 1.5,
'created_at': '2026-08-29T12:00:00.000',
},
],
shopItems: [
{
'id': 1,
'shop_id': 8,
'product_id': 1,
'name': 'Milk',
'price': 1.5,
'quantity': 1,
'unit_price': 1.5,
},
],
shoppingLists: [
{
'id': 1,
'name': 'Weekly',
'created_at': '2026-08-29T12:00:00.000',
'updated_at': '2026-08-29T12:00:00.000',
},
],
shoppingListItems: [
{
'id': 1,
'list_id': 1,
'product_id': 1,
'name': 'Milk',
'checked': 0,
'sort_order': 0,
},
],
images: {'products/product_1.jpg': 'abc123'},
);
final parsed = BackupDocument.parse(original.encode());
expect(parsed.darkMode, isTrue);
expect(parsed.products.single['name'], 'Milk');
expect(parsed.shops.single['id'], 8);
expect(parsed.shopItems.single['product_id'], 1);
expect(parsed.shoppingLists.single['name'], 'Weekly');
expect(parsed.shoppingListItems.single['name'], 'Milk');
expect(parsed.images['products/product_1.jpg'], 'abc123');
});
test('accepts a version 1 backup without shopping lists', () {
const json = '''
{
"format": "receipity-backup",
"version": 1,
"exportedAt": "2026-08-29T12:00:00.000",
"darkMode": false,
"supermarkets": [],
"products": [],
"shops": [],
"shopItems": [],
"images": {}
}
''';
final parsed = BackupDocument.parse(json);
expect(parsed.version, 1);
expect(parsed.shoppingLists, isEmpty);
expect(parsed.shoppingListItems, isEmpty);
});
test('rejects a file that is not a Receipity backup', () {
expect(
() => BackupDocument.parse('{"hello":"world"}'),
throwsFormatException,
);
});
test('maps stored photo paths to backup keys', () {
expect(
backupImageKey('/data/app_flutter/products/product_12.jpg'),
'products/product_12.jpg',
);
expect(
backupImageKey('/data/app_flutter/receipts/shop_3.jpg'),
'receipts/shop_3.jpg',
);
expect(backupImageKey(null), isNull);
});
}