From ddf610d682903f39ad17c38a27608ba172dc2e0a Mon Sep 17 00:00:00 2001 From: Jaideep Prasad Date: Tue, 28 Apr 2020 06:15:50 +0530 Subject: [PATCH] [provider_shopper] Added widget tests for login, catalog and cart screens (#400) --- provider_shopper/lib/models/catalog.dart | 6 +- provider_shopper/test/cart_widget_test.dart | 62 +++++++++++++++++++ .../test/catalog_widget_test.dart | 58 +++++++++++++++++ provider_shopper/test/login_widget_test.dart | 41 ++++++++++++ 4 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 provider_shopper/test/cart_widget_test.dart create mode 100644 provider_shopper/test/catalog_widget_test.dart create mode 100644 provider_shopper/test/login_widget_test.dart diff --git a/provider_shopper/lib/models/catalog.dart b/provider_shopper/lib/models/catalog.dart index 5b1e495ef..a7b26df17 100644 --- a/provider_shopper/lib/models/catalog.dart +++ b/provider_shopper/lib/models/catalog.dart @@ -12,7 +12,7 @@ import 'package:flutter/material.dart'; /// For simplicity, the catalog is expected to be immutable (no products are /// expected to be added, removed or changed during the execution of the app). class CatalogModel { - static const _itemNames = [ + static List itemNames = [ 'Code Smell', 'Control Flow', 'Interpreter', @@ -32,8 +32,8 @@ class CatalogModel { /// Get item by [id]. /// - /// In this sample, the catalog is infinite, looping over [_itemNames]. - Item getById(int id) => Item(id, _itemNames[id % _itemNames.length]); + /// In this sample, the catalog is infinite, looping over [itemNames]. + Item getById(int id) => Item(id, itemNames[id % itemNames.length]); /// Get item by its position in the catalog. Item getByPosition(int position) { diff --git a/provider_shopper/test/cart_widget_test.dart b/provider_shopper/test/cart_widget_test.dart new file mode 100644 index 000000000..8109fe43a --- /dev/null +++ b/provider_shopper/test/cart_widget_test.dart @@ -0,0 +1,62 @@ +// Copyright 2020 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:provider/provider.dart'; +import 'package:provider_shopper/models/cart.dart'; +import 'package:provider_shopper/models/catalog.dart'; +import 'package:provider_shopper/screens/cart.dart'; + +CartModel cartModel; +CatalogModel catalogModel; +Widget createCartScreen() => MultiProvider( + providers: [ + Provider(create: (context) => CatalogModel()), + ChangeNotifierProxyProvider( + create: (context) => CartModel(), + update: (context, catalog, cart) { + catalogModel = catalog; + cartModel = cart; + cart.catalog = catalogModel; + return cart; + }, + ), + ], + child: MaterialApp( + home: MyCart(), + ), + ); + +void main() { + group('CartScreen widget tests', () { + testWidgets('Tapping BUY button displays snackbar.', (tester) async { + await tester.pumpWidget(createCartScreen()); + + // Verify no snackbar initially exists. + expect(find.byType(SnackBar), findsNothing); + await tester.tap(find.text('BUY')); + // Schedule animation. + await tester.pump(); + // Verifying the snackbar upon clicking the button. + expect(find.byType(SnackBar), findsOneWidget); + }); + + testWidgets('Testing when the cart contains items', (tester) async { + await tester.pumpWidget(createCartScreen()); + + // Adding five items in the cart and testing. + for (int i = 0; i < 5; i++) { + var item = catalogModel.getByPosition(i); + cartModel.add(item); + await tester.pumpAndSettle(); + expect(find.text(item.name), findsOneWidget); + } + + // Testing total price of the five items. + expect(find.text('\$${42 * 5}'), findsOneWidget); + expect(find.byIcon(Icons.done), findsNWidgets(5)); + }); + }); +} diff --git a/provider_shopper/test/catalog_widget_test.dart b/provider_shopper/test/catalog_widget_test.dart new file mode 100644 index 000000000..0b1279549 --- /dev/null +++ b/provider_shopper/test/catalog_widget_test.dart @@ -0,0 +1,58 @@ +// Copyright 2020 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:provider/provider.dart'; +import 'package:provider_shopper/models/cart.dart'; +import 'package:provider_shopper/models/catalog.dart'; +import 'package:provider_shopper/screens/catalog.dart'; + +Widget createCatalogScreen() => MultiProvider( + providers: [ + Provider(create: (context) => CatalogModel()), + ChangeNotifierProxyProvider( + create: (context) => CartModel(), + update: (context, catalog, cart) { + cart.catalog = catalog; + return cart; + }, + ), + ], + child: MaterialApp( + home: MyCatalog(), + ), + ); + +void main() { + final catalogListItems = CatalogModel.itemNames.sublist(0, 3); + + group('CatalogScreen Widget Tests', () { + testWidgets('Testing item row counts and text', (tester) async { + await tester.pumpWidget(createCatalogScreen()); + + // Testing for the items on the screen after modifying + // the model for a fixed number of items. + for (String item in catalogListItems) { + expect(find.text(item), findsWidgets); + } + }); + + testWidgets('Testing the ADD buttons and check after clicking', + (tester) async { + await tester.pumpWidget(createCatalogScreen()); + + // Should find ADD buttons on the screen. + expect(find.text('ADD'), findsWidgets); + + // Performing the click on the ADD button of the first item in the list. + await tester.tap(find.widgetWithText(FlatButton, 'ADD').first); + await tester.pumpAndSettle(); + + // Verifying if the tapped ADD button has changed to the check icon. + expect(find.byIcon(Icons.check), findsOneWidget); + }); + }); +} diff --git a/provider_shopper/test/login_widget_test.dart b/provider_shopper/test/login_widget_test.dart new file mode 100644 index 000000000..88157631d --- /dev/null +++ b/provider_shopper/test/login_widget_test.dart @@ -0,0 +1,41 @@ +// Copyright 2020 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:provider/provider.dart'; +import 'package:provider_shopper/models/cart.dart'; +import 'package:provider_shopper/models/catalog.dart'; +import 'package:provider_shopper/screens/catalog.dart'; +import 'package:provider_shopper/screens/login.dart'; + +void main() { + testWidgets('Login page Widget test', (tester) async { + await tester.pumpWidget(MultiProvider( + providers: [ + Provider(create: (context) => CatalogModel()), + ChangeNotifierProxyProvider( + create: (context) => CartModel(), + update: (context, catalog, cart) { + cart.catalog = catalog; + return cart; + }, + ), + ], + child: MaterialApp( + initialRoute: '/', + routes: { + '/': (context) => MyLogin(), + '/catalog': (context) => MyCatalog(), + }, + ), + )); + + // Verifying the behaviour of ENTER button. + await tester.tap(find.text('ENTER')); + await tester.pumpAndSettle(); + + expect(find.text('Catalog'), findsOneWidget); + }); +}