82 lines
3.0 KiB
Dart
82 lines
3.0 KiB
Dart
import 'package:cookit/src/recipes/models/recipe.dart';
|
||||
|
|
import 'package:cookit/src/recipes/recipe_draft.dart';
|
|||
|
|
import 'package:flutter_test/flutter_test.dart';
|
|||
|
|
import 'package:intl/date_symbol_data_local.dart';
|
|||
|
|
|
|||
|
|
void main() {
|
|||
|
|
setUpAll(() => initializeDateFormatting('de'));
|
|||
|
|
|
|||
|
|
group('ingredients', () {
|
|||
|
|
const groups = [
|
|||
|
|
IngredientGroup(
|
|||
|
|
lines: [
|
|||
|
|
IngredientLine(amount: 300, unitKey: 'gram', name: 'Mehl'),
|
|||
|
|
IngredientLine(amount: 2, amountMax: 3, unitKey: 'tablespoon', name: 'Öl', remark: 'gutes'),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
IngredientGroup(lines: [IngredientLine(name: 'Salz')]),
|
|||
|
|
IngredientGroup(
|
|||
|
|
name: 'Topping',
|
|||
|
|
lines: [IngredientLine(amount: 0.5, unitKey: 'pinch', name: 'Rosmarin')],
|
|||
|
|
),
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
test('the first unnamed group has no heading; later groups get one', () {
|
|||
|
|
final entries = ingredientEntriesFrom(groups);
|
|||
|
|
expect(entries.map((e) => e.runtimeType), [LineEntry, LineEntry, GroupEntry, LineEntry, GroupEntry, LineEntry]);
|
|||
|
|
expect((entries[1] as LineEntry).amount.text, '2–3');
|
|||
|
|
expect((entries[5] as LineEntry).amount.text, '½');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('round-trips', () {
|
|||
|
|
final back = ingredientGroupsFrom(ingredientEntriesFrom(groups));
|
|||
|
|
expect([for (final g in back) g.toJson()], [for (final g in groups) g.toJson()]);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('lines without a name and empty groups are dropped', () {
|
|||
|
|
final entries = [
|
|||
|
|
GroupEntry('Leer'),
|
|||
|
|
LineEntry()..name.text = ' ',
|
|||
|
|
GroupEntry(' Sauce '),
|
|||
|
|
LineEntry()
|
|||
|
|
..amount.text = '1,5'
|
|||
|
|
..name.text = 'Sahne',
|
|||
|
|
];
|
|||
|
|
final groups = ingredientGroupsFrom(entries);
|
|||
|
|
expect(groups, hasLength(1));
|
|||
|
|
expect(groups.single.name, 'Sauce');
|
|||
|
|
expect(groups.single.lines.single.amount, 1.5);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('a heading with an empty name becomes an unnamed group', () {
|
|||
|
|
final entries = [LineEntry()..name.text = 'Mehl', GroupEntry(''), LineEntry()..name.text = 'Zucker'];
|
|||
|
|
expect(ingredientGroupsFrom(entries).map((g) => g.name), [null, null]);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
group('steps', () {
|
|||
|
|
test('round-trips sections', () {
|
|||
|
|
const sections = [
|
|||
|
|
StepSection(steps: ['Ofen vorheizen.']),
|
|||
|
|
StepSection(title: 'Teig', steps: ['Kneten.', 'Ruhen lassen.']),
|
|||
|
|
];
|
|||
|
|
final back = stepSectionsFrom(stepEntriesFrom(sections));
|
|||
|
|
expect([for (final s in back) s.toJson()], [for (final s in sections) s.toJson()]);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('empty steps are dropped', () {
|
|||
|
|
final entries = [StepTextEntry(' '), SectionEntry('Soße'), StepTextEntry('Rühren.')];
|
|||
|
|
final sections = stepSectionsFrom(entries);
|
|||
|
|
expect(sections.single.title, 'Soße');
|
|||
|
|
expect(sections.single.steps, ['Rühren.']);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('tagsFrom trims and removes duplicates ignoring case', () {
|
|||
|
|
expect(tagsFrom('vegan, schnell , Vegan,,'), ['vegan', 'schnell']);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
test('linesFrom', () {
|
|||
|
|
expect(linesFrom(' https://a.de \n\nhttps://b.de'), ['https://a.de', 'https://b.de']);
|
|||
|
|
});
|
|||
|
|
}
|