From 6bb5e0e9bbb340f56b87ce458480cad32a46fa14 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Mon, 21 Feb 2022 17:24:31 +0100 Subject: [PATCH] Add tests --- lib/bloc/product_bloc.dart | 4 +-- lib/bloc/product_bloc_states.dart | 8 ++--- test/cart_bloc_test.dart | 31 +++++++++++++++++++ test/product_service_mock.dart | 14 +++++---- test/total_price_test.dart | 49 +++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 13 deletions(-) create mode 100644 test/cart_bloc_test.dart create mode 100644 test/total_price_test.dart diff --git a/lib/bloc/product_bloc.dart b/lib/bloc/product_bloc.dart index dd59341..fe0e634 100644 --- a/lib/bloc/product_bloc.dart +++ b/lib/bloc/product_bloc.dart @@ -13,7 +13,7 @@ class ProductBloc implements Disposable { final UserBloc _userBloc; bool _hasDiscount; - var _productsState = ProductsState.loading(); + var _productsState = const ProductsState.loading(); ProductsState get productsState => _productsState; final _productsStateController = StreamController.broadcast(); @@ -59,7 +59,7 @@ class ProductBloc implements Disposable { void _handleLoadProductEvents() { _loadProductEventController.stream.listen((_) async { - _productsState = ProductsState.loading(); + _productsState = const ProductsState.loading(); _productsStateSink.add(_productsState); try { diff --git a/lib/bloc/product_bloc_states.dart b/lib/bloc/product_bloc_states.dart index 00f06c8..d6a8994 100644 --- a/lib/bloc/product_bloc_states.dart +++ b/lib/bloc/product_bloc_states.dart @@ -3,11 +3,9 @@ part of 'product_bloc.dart'; abstract class ProductsState { const ProductsState._(); - factory ProductsState.loading() => const ProductsLoading(); - factory ProductsState.error(String errorMessage) => - ProductsError(errorMessage); - factory ProductsState.loaded(List products) => - ProductsLoaded(products); + const factory ProductsState.loading() = ProductsLoading; + const factory ProductsState.error(String errorMessage) = ProductsError; + const factory ProductsState.loaded(List products) = ProductsLoaded; bool isLoading() => this is ProductsLoading; bool isLoaded() => this is ProductsLoaded; diff --git a/test/cart_bloc_test.dart b/test/cart_bloc_test.dart new file mode 100644 index 0000000..3fab486 --- /dev/null +++ b/test/cart_bloc_test.dart @@ -0,0 +1,31 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:thesis_shop/bloc/cart_bloc.dart'; +import 'package:thesis_shop/bloc/product_bloc.dart'; + +import 'product_service_mock.dart'; + +class ProductBlocMock implements ProductBloc { + const ProductBlocMock(); + @override + Future dispose() async {} + + @override + Sink get loadProductSink => throw UnimplementedError(); + + @override + final ProductsState productsState = const ProductsState.loaded(demoProducts); + + @override + Stream get productsStateStream => + Stream.value(productsState).asBroadcastStream(); +} + +void main() { + test('test cart bloc', () async { + const productBlocMock = ProductBlocMock(); + final cartBloc = CartBloc(productBlocMock); + final expectedCart = {demoProducts.first: 1}; + expectLater(cartBloc.cartStream, emits(expectedCart)); + cartBloc.quantityEventSink.add(IncreaseQuantityEvent(demoProducts.first)); + }); +} diff --git a/test/product_service_mock.dart b/test/product_service_mock.dart index d3dbb63..c54d122 100644 --- a/test/product_service_mock.dart +++ b/test/product_service_mock.dart @@ -1,15 +1,17 @@ import 'package:thesis_shop/models/product.dart'; import 'package:thesis_shop/service/product_service.dart'; +const demoProducts = [ + Product(title: 'Bananen', price: 3), + Product(title: 'Äpfel', price: 2), + Product(title: 'Birnen', price: 2.5), + Product(title: 'Kirschen', price: 1.2), +]; + class MockedProductService implements ProductService { @override Future> fetchProducts() async { - return const [ - Product(title: 'Bananen', price: 3), - Product(title: 'Äpfel', price: 2), - Product(title: 'Birnen', price: 2.5), - Product(title: 'Kirschen', price: 1.2), - ]; + return demoProducts; } @override diff --git a/test/total_price_test.dart b/test/total_price_test.dart new file mode 100644 index 0000000..c02fec1 --- /dev/null +++ b/test/total_price_test.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:thesis_shop/bloc/cart_bloc.dart'; +import 'package:thesis_shop/bloc/product_bloc.dart'; +import 'package:thesis_shop/bloc/user_bloc.dart'; +import 'package:thesis_shop/bloc_provider.dart'; +import 'package:thesis_shop/screens/cart/total_price_text.dart'; + +import 'product_service_mock.dart'; + +class CartBlocMock implements CartBloc { + @override + Stream numberOfProductsStream = const Stream.empty(); + + @override + Cart get cart => throw UnimplementedError(); + + @override + Stream get cartStream => throw UnimplementedError(); + + @override + Future dispose() async {} + + @override + final int numberOfProducts = 1; + + @override + Sink get quantityEventSink => throw UnimplementedError(); + + @override + double get totalPrice => 10.00; + + @override + Stream get totalPriceStream => Stream.value(totalPrice); +} + +void main() { + testWidgets('test total price widget', (tester) async { + final blocProvider = BlocProvider( + userBloc: UserBloc(), + productBloc: ProductBloc(MockedProductService(), UserBloc()), + cartBloc: CartBlocMock()); + final appStateWithTotalPrice = AppState( + blocProvider: blocProvider, + child: const MaterialApp(home: TotalPriceText())); + await tester.pumpWidget(appStateWithTotalPrice); + expect(find.text("Gesamtpreis: 10.00€"), findsOneWidget); + }); +}