/
fraq11
/
ElijahFlutter
Обзор
Документация
Войти
/
fraq11
/
ElijahFlutter
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
4
CI/CD
Аналитика
Безопасность
develop
test/viewmodels_test.dart
127 строк
4 KB
octomors
tests
26 апр 2026, 13:38
26 апр 2026, 13:38
35beaca
Код
Авторство
О чём код?
import 'package:elijahflutter/view/data/prototype_data.dart'; import 'package:elijahflutter/viewmodel/pages/chef_mode_view_model.dart'; import 'package:elijahflutter/viewmodel/pages/onboarding_view_model.dart'; import 'package:elijahflutter/viewmodel/pages/profile_view_model.dart'; import 'package:elijahflutter/viewmodel/pages/recipe_detail_view_model.dart'; import 'package:elijahflutter/viewmodel/pages/search_view_model.dart'; import 'package:elijahflutter/viewmodel/shared/settings_view_model.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { group('SettingsViewModel', () { test('toggles dark theme state', () { final viewModel = SettingsViewModel(); expect(viewModel.isDarkTheme, isFalse); viewModel.toggleTheme(); expect(viewModel.isDarkTheme, isTrue); }); }); group('OnboardingViewModel', () { test('advances until the last step', () { final viewModel = OnboardingViewModel(); expect(viewModel.currentStep, 0); expect(viewModel.isLastStep, isFalse); viewModel.nextStep(); expect(viewModel.currentStep, 1); viewModel.nextStep(); expect(viewModel.currentStep, 2); expect(viewModel.isLastStep, isTrue); viewModel.nextStep(); expect(viewModel.currentStep, 2); }); }); group('SearchViewModel', () { test('filters by query, difficulty and ingredients', () { final viewModel = SearchViewModel(); expect(viewModel.filteredRecipes, hasLength(recipes.length)); viewModel.setSearchQuery('Суп'); expect( viewModel.filteredRecipes.map((recipe) => recipe.title), contains('Крем-суп из тыквы'), ); viewModel.toggleDifficulty(RecipeDifficulty.easy); expect( viewModel.filteredRecipes.every((recipe) => recipe.difficulty == RecipeDifficulty.easy), isTrue, ); viewModel.toggleIngredient('Яйца'); expect( viewModel.filteredRecipes.every( (recipe) => recipe.ingredients.any((ingredient) => ingredient.toLowerCase().contains('яйц')), ), isTrue, ); }); }); group('RecipeDetailViewModel', () { test('loads recipe and switches tab', () { final viewModel = RecipeDetailViewModel(recipeId: '1'); expect(viewModel.recipe?.title, 'Французские тосты с ягодами'); expect(viewModel.selectedTab, RecipeDetailTab.ingredients); viewModel.setSelectedTab(RecipeDetailTab.steps); expect(viewModel.selectedTab, RecipeDetailTab.steps); }); }); group('ChefModeViewModel', () { test('moves through recipe steps without going out of range', () { final viewModel = ChefModeViewModel(recipeId: '1'); expect(viewModel.stepIndex, 0); expect(viewModel.isLastStep, isFalse); viewModel.previousStep(); expect(viewModel.stepIndex, 0); for (var index = 0; index < 10; index++) { viewModel.nextStep(); } expect(viewModel.stepIndex, recipeById('1')!.steps.length - 1); expect(viewModel.isLastStep, isTrue); }); }); group('ProfileViewModel', () { test('delegates theme toggles to shared settings view model', () { final settingsViewModel = SettingsViewModel(); final viewModel = ProfileViewModel(settingsViewModel); expect(viewModel.isDarkTheme, isFalse); viewModel.toggleTheme(); expect(settingsViewModel.isDarkTheme, isTrue); expect(viewModel.isDarkTheme, isTrue); expect(viewModel.notificationsEnabled, isTrue); viewModel.setNotificationsEnabled(false); expect(viewModel.notificationsEnabled, isFalse); }); }); } RecipeUi? recipeById(String id) { try { return recipes.firstWhere((recipe) => recipe.id == id); } catch (_) { return null; } }