mogen_unit_tests 1.0.21
mogen_unit_tests: ^1.0.21 copied to clipboard
Scans Riverpod AsyncNotifier classes and auto-generates Mocktail unit tests.
// ignore_for_file: avoid_print
/// This file demonstrates how mogen_unit_tests works end-to-end.
///
/// Given the following feature structure in your Flutter project:
///
/// ```
/// lib/
/// └── features/
/// └── cart/
/// └── presentation/
/// ├── notifiers/
/// │ └── cart_notifier.dart
/// └── states/
/// └── cart_state.dart
/// ```
///
/// Running `dart run mogen_unit_tests` from your project root generates:
///
/// ```
/// test/
/// └── unit/
/// └── features/
/// └── cart/
/// └── cart_notifier_test.dart
/// ```
///
/// ---
///
/// ## Example input — cart_notifier.dart
///
/// ```dart
/// import 'package:riverpod_annotation/riverpod_annotation.dart';
/// import '../../states/cart_state.dart';
///
/// part 'cart_notifier.g.dart';
///
/// @riverpod
/// class CartNotifier extends _$CartNotifier {
/// @override
/// Future<CartState> build() async {
/// final repo = ref.read(cartRepositoryProvider);
/// return repo.fetchCart();
/// }
///
/// Future<void> addItem(CartItem item) async {
/// final repo = ref.read(cartRepositoryProvider);
/// await repo.addItem(item);
/// ref.invalidateSelf();
/// }
///
/// Future<void> removeItem(String itemId) async {
/// final repo = ref.read(cartRepositoryProvider);
/// await repo.removeItem(itemId);
/// ref.invalidateSelf();
/// }
/// }
/// ```
///
/// ## Example output — cart_notifier_test.dart
///
/// ```dart
/// // GENERATED BY mogen_unit_tests — DO NOT EDIT
/// // ignore_for_file: lines_longer_than_80_chars
///
/// import 'package:flutter_riverpod/flutter_riverpod.dart';
/// import 'package:flutter_test/flutter_test.dart';
/// import 'package:mocktail/mocktail.dart';
///
/// import 'package:my_app/features/cart/presentation/notifiers/cart_notifier.dart';
/// import 'package:my_app/features/cart/presentation/states/cart_state.dart';
/// import 'package:my_app/features/cart/domain/repositories/cart_repository.dart';
/// /// import 'package:my_app/features/cart/data/repositories/cart_repository_impl.dart';
///
/// class MockCartRepository extends Mock implements CartRepository {}
///
/// class FakeCartItem extends Fake implements CartItem {}
///
/// void main() {
/// group('CartNotifier', () {
/// late MockCartRepository mockCartRepository;
/// late ProviderContainer container;
///
/// setUpAll(() {
/// registerFallbackValue(FakeCartItem());
/// });
///
/// setUp(() {
/// mockCartRepository = MockCartRepository();
/// container = ProviderContainer(
/// overrides: [
/// cartRepositoryProvider.overrideWithValue(mockCartRepository),
/// ],
/// );
/// });
///
/// tearDown(() {
/// container.dispose();
/// });
///
/// group('addItem', () {
/// test('addItem completes successfully', () async {
/// when(() => mockCartRepository.addItem(any()))
/// .thenAnswer((_) async => null);
///
/// final item = FakeCartItem();
///
/// await container.read(cartNotifierProvider.future);
/// await container.read(cartNotifierProvider.notifier).addItem(item);
/// final finalState = container.read(cartNotifierProvider);
///
/// expect(finalState.requireValue.error, isNull);
/// expect(finalState.requireValue.isLoadingAction, isFalse);
/// });
/// });
///
/// group('removeItem', () {
/// test('removeItem completes successfully', () async {
/// when(() => mockCartRepository.removeItem(any()))
/// .thenAnswer((_) async => null);
///
/// const itemId = '';
///
/// await container.read(cartNotifierProvider.future);
/// await container
/// .read(cartNotifierProvider.notifier)
/// .removeItem(itemId);
///
/// final finalState = container.read(cartNotifierProvider);
///
/// expect(finalState.requireValue.error, isNull);
/// expect(finalState.requireValue.isLoadingAction, isFalse);
/// });
/// });
/// });
/// }
/// ```
library;
void main() {
print('Run `dart run mogen_unit_tests` from your Flutter project root.');
}