Skip to content

Commit

Permalink
Merge pull request #9 from mindnervestech/mnt-products-test
Browse files Browse the repository at this point in the history
Product Test
  • Loading branch information
hillelcoren authored Jun 28, 2018
2 parents 27dbb69 + 29a5620 commit 3bd94ac
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/ui/product/edit/product_edit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:invoiceninja/ui/app/form_card.dart';
import 'package:invoiceninja/ui/product/edit/product_edit_vm.dart';
import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/ui/app/save_icon_button.dart';
import 'package:invoiceninja/utils/keys.dart';

class ProductEdit extends StatefulWidget {
final ProductEditVM viewModel;
Expand Down Expand Up @@ -112,6 +113,7 @@ class _ProductEditState extends State<ProductEdit> {
FormCard(
children: <Widget>[
TextFormField(
key: Key(ProductKeys.productEditProductFieldKeyString),
controller: _productKeyController,
autocorrect: false,
decoration: InputDecoration(
Expand All @@ -123,13 +125,15 @@ class _ProductEditState extends State<ProductEdit> {
: null,
),
TextFormField(
key: Key(ProductKeys.productEditNotesFieldKeyString),
controller: _notesController,
maxLines: 4,
decoration: InputDecoration(
labelText: AppLocalization.of(context).notes,
),
),
TextFormField(
key: Key(ProductKeys.productEditCostFieldKeyString),
autocorrect: false,
controller: _costController,
keyboardType: TextInputType.number,
Expand Down
2 changes: 2 additions & 0 deletions lib/ui/product/product_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja/redux/product/product_actions.dart';
import 'package:invoiceninja/ui/app/app_drawer_vm.dart';
import 'package:invoiceninja/ui/app/app_bottom_bar.dart';
import 'package:invoiceninja/utils/keys.dart';

class ProductScreen extends StatelessWidget {
static final String route = '/product';
Expand Down Expand Up @@ -52,6 +53,7 @@ class ProductScreen extends StatelessWidget {
),
floatingActionButtonLocation: FloatingActionButtonLocation.endDocked,
floatingActionButton: FloatingActionButton(
key: new Key(ProductKeys.productScreenFABKeyString),
backgroundColor: Theme.of(context).primaryColorDark,
onPressed: () {
store.dispatch(
Expand Down
8 changes: 8 additions & 0 deletions lib/utils/keys.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,12 @@ class LoginKeys {
static final String passwordKeyString = 'loginPassword';
static final String urlKeyString = 'loginUrl';
static final String secretKeyString = 'loginSecret';
}

// Keys for Product Screen
class ProductKeys {
static final String productScreenFABKeyString = 'productScreenFAB';
static final String productEditProductFieldKeyString = 'productEditProductField';
static final String productEditNotesFieldKeyString = 'productEditNotesField';
static final String productEditCostFieldKeyString = 'productEditCostField';
}
8 changes: 8 additions & 0 deletions test_driver/products_it.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:flutter_driver/driver_extension.dart';
import 'package:invoiceninja/main.dart' as app;

void main() {
// This line enables the extension
enableFlutterDriverExtension();
app.main();
}
153 changes: 153 additions & 0 deletions test_driver/products_it_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

import 'package:invoiceninja/utils/keys.dart';

import '../.env.dart';

class Constants {
static String newProductKey = 'Example Test Driver Product';
static String newProductNotes = 'Example Test Driver Notes';
static String newProductCost = '100.50';
static String updatedProductKey = 'Updated Example Test Driver Product';
static String updatedProductNotes = 'Updated Example Test Driver Notes';
static String updatedProductCost = '200.50';
static String saveToolTip = 'Save';
static String backToolTip = 'Back';
static String deleteToolTip = 'Delete';
static String menuToolTip = 'Show menu';
static String loginButton = 'LOGIN';
static String dashboardScreen = 'DashboardScreen';
static String productScreen = 'ProductScreen';
static String snackbarProductCreated = 'Successfully created product';
static String snackbarProductUpdated = 'Successfully updated product';
static String snackbarProductDeleted = 'Successfully deleted product';
static String openAppDrawer = 'Open navigation menu';
static String appDrawerProducts = 'Products';
}

void main() {
group('PRODUCTS TEST', () {

FlutterDriver driver;
String loginEmail, loginPassword, loginUrl, loginSecret;

setUp(() async {
driver = await FlutterDriver.connect();

// read config file
loginEmail = Config.LOGIN_EMAIL;
loginPassword = Config.LOGIN_PASSWORD;
loginUrl = Config.LOGIN_URL;
loginSecret = Config.LOGIN_API_SECRET;
});

tearDown(() async {
if(driver!=null) {
driver.close();
}
});

test('Login into the app and switch to products screen', () async {

await driver.tap(find.byValueKey(LoginKeys.emailKeyString), timeout: new Duration(seconds: 60));
await driver.enterText(loginEmail);

await driver.tap(find.byValueKey(LoginKeys.passwordKeyString));
await driver.enterText(loginPassword);

await driver.tap(find.byValueKey(LoginKeys.urlKeyString));
await driver.enterText(loginUrl);

await driver.tap(find.byValueKey(LoginKeys.secretKeyString));
await driver.enterText(loginSecret);

await driver.tap(find.text(Constants.loginButton));

await driver.waitFor(find.byType(Constants.dashboardScreen));

// open the app drawer and switch to products screen
// https://github.com/flutter/flutter/issues/9002[Issue still open] - Using this solution to implement it
final SerializableFinder drawerOpenButton = find.byTooltip(Constants.openAppDrawer);

await driver.tap(drawerOpenButton);

final SerializableFinder productsDrawerButton = find.text(Constants.appDrawerProducts);
await driver.tap(productsDrawerButton);

await driver.waitFor(find.byType(Constants.productScreen));
});

test('Add a new product', () async {
await driver.tap(find.byValueKey(ProductKeys.productScreenFABKeyString));

await driver.tap(find.byValueKey(ProductKeys.productEditProductFieldKeyString));
await driver.enterText(Constants.newProductKey);

await driver.tap(find.byValueKey(ProductKeys.productEditNotesFieldKeyString));
await driver.enterText(Constants.newProductNotes);

await driver.tap(find.byValueKey(ProductKeys.productEditCostFieldKeyString));
await driver.enterText(Constants.newProductCost);

await driver.tap(find.byTooltip(Constants.saveToolTip));

// verify snackbar
await driver.waitFor(find.text(Constants.snackbarProductCreated));

await driver.tap(find.byTooltip(Constants.backToolTip));

// verify entered text while new product creation
await driver.tap(find.text(Constants.newProductKey));
await driver.waitFor(find.text(Constants.newProductKey));
await driver.waitFor(find.text(Constants.newProductNotes));
await driver.waitFor(find.text(Constants.newProductCost));

await driver.tap(find.byTooltip(Constants.backToolTip));
});

test('Edit a existing product', () async {
await driver.tap(find.text(Constants.newProductKey));

await driver.tap(find.byValueKey(ProductKeys.productEditProductFieldKeyString));
await driver.enterText(Constants.updatedProductKey);

await driver.tap(find.byValueKey(ProductKeys.productEditNotesFieldKeyString));
await driver.enterText(Constants.updatedProductNotes);

await driver.tap(find.byValueKey(ProductKeys.productEditCostFieldKeyString));
await driver.enterText(Constants.updatedProductCost);

await driver.tap(find.byTooltip(Constants.saveToolTip));

// verify snackbar
await driver.waitFor(find.text(Constants.snackbarProductUpdated));

await driver.tap(find.byTooltip(Constants.backToolTip));

// verify updated values while editing existing product
await driver.tap(find.text(Constants.updatedProductKey));
await driver.waitFor(find.text(Constants.updatedProductKey));
await driver.waitFor(find.text(Constants.updatedProductNotes));
await driver.waitFor(find.text(Constants.updatedProductCost));

await driver.tap(find.byTooltip(Constants.backToolTip));
});

test('Deleteing an item test', () async {
// delete the test product created
await driver.tap(find.text(Constants.updatedProductKey));

await driver.tap(find.byTooltip(Constants.menuToolTip));
await driver.tap(find.text(Constants.deleteToolTip));

// verify snackbar
await driver.waitFor(find.text(Constants.snackbarProductDeleted));

await driver.tap(find.byTooltip(Constants.backToolTip));

// verify not in list
await driver.waitForAbsent(find.text(Constants.updatedProductKey));
});
});
}

0 comments on commit 3bd94ac

Please sign in to comment.