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']); }); }