This commit is contained in:
Hillel Coren 2019-08-23 11:24:17 +03:00
parent 410b4cdb63
commit 4422b64e14
5 changed files with 110 additions and 40 deletions

View File

@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
class DecoratedFormField extends StatelessWidget {
const DecoratedFormField({
@required this.controller,
@required this.label,
this.validator,
this.keyboardType,
});
final TextEditingController controller;
final String label;
final Function(String) validator;
final TextInputType keyboardType;
@override
Widget build(BuildContext context) {
return TextFormField(
key: ValueKey(label),
autocorrect: false,
controller: controller,
decoration: InputDecoration(
labelText: label,
),
validator: validator,
keyboardType: null,
);
}
}

View File

@ -1,7 +1,6 @@
import 'package:invoiceninja_flutter/ui/app/app_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/app_scaffold.dart';
import 'package:invoiceninja_flutter/ui/app/list_filter.dart'; import 'package:invoiceninja_flutter/ui/app/list_filter.dart';
import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart'; import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart';
import 'package:invoiceninja_flutter/utils/keys.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -63,7 +62,6 @@ class ClientScreen extends StatelessWidget {
), ),
floatingActionButton: user.canCreate(EntityType.client) floatingActionButton: user.canCreate(EntityType.client)
? FloatingActionButton( ? FloatingActionButton(
key: Key(ClientKeys.fab),
backgroundColor: Theme.of(context).primaryColorDark, backgroundColor: Theme.of(context).primaryColorDark,
onPressed: () => store.dispatch( onPressed: () => store.dispatch(
EditClient(client: ClientEntity(), context: context)), EditClient(client: ClientEntity(), context: context)),

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart';
import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart';
import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart';
@ -95,44 +96,29 @@ class ClientEditDetailsState extends State<ClientEditDetails> {
children: <Widget>[ children: <Widget>[
FormCard( FormCard(
children: <Widget>[ children: <Widget>[
TextFormField( DecoratedFormField(
autocorrect: false, label: localization.name,
controller: _nameController, controller: _nameController,
decoration: InputDecoration(
labelText: localization.name,
),
validator: (String val) => !viewModel.client.hasNameSet validator: (String val) => !viewModel.client.hasNameSet
? AppLocalization.of(context).pleaseEnterAClientOrContactName ? AppLocalization.of(context).pleaseEnterAClientOrContactName
: null, : null,
), ),
TextFormField( DecoratedFormField(
autocorrect: false, label: localization.idNumber,
controller: _idNumberController, controller: _idNumberController,
decoration: InputDecoration(
labelText: localization.idNumber,
), ),
), DecoratedFormField(
TextFormField( label: localization.vatNumber,
autocorrect: false,
controller: _vatNumberController, controller: _vatNumberController,
decoration: InputDecoration(
labelText: localization.vatNumber,
), ),
), DecoratedFormField(
TextFormField( label: localization.website,
autocorrect: false,
controller: _websiteController, controller: _websiteController,
decoration: InputDecoration(
labelText: localization.website,
),
keyboardType: TextInputType.url, keyboardType: TextInputType.url,
), ),
TextFormField( DecoratedFormField(
autocorrect: false, label: localization.phone,
controller: _phoneController, controller: _phoneController,
decoration: InputDecoration(
labelText: localization.phone,
),
keyboardType: TextInputType.phone, keyboardType: TextInputType.phone,
), ),
CustomField( CustomField(

View File

@ -1,5 +0,0 @@
class ClientKeys {
static const String screen = 'ClientScreen';
static const String fab = 'clientFab';
static const String drawer = 'clientDrawer';
}

View File

@ -1,22 +1,27 @@
import 'package:flutter_driver/flutter_driver.dart'; import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'package:invoiceninja_flutter/utils/keys.dart'; import 'package:faker/faker.dart';
import 'utils/common_actions.dart'; import 'utils/common_actions.dart';
import 'utils/localizations.dart'; import 'utils/localizations.dart';
void main() { void main() {
group('CLIENTS TEST', () { group('Client Tests', () {
TestLocalization localization; TestLocalization localization;
FlutterDriver driver; FlutterDriver driver;
final name = makeUnique(faker.company.name());
final updatedName = makeUnique(faker.company.name());
setUpAll(() async { setUpAll(() async {
localization = TestLocalization('en'); localization = TestLocalization('en');
driver = await FlutterDriver.connect(); driver = await FlutterDriver.connect();
//await loginAndOpenClients(driver); print('Login to app');
await login(driver);
print('View clients');
viewSection(driver: driver, name: localization.clients);
}); });
tearDownAll(() async { tearDownAll(() async {
@ -29,14 +34,71 @@ void main() {
// Create an empty client // Create an empty client
test('Try to add an empty client', () async { test('Try to add an empty client', () async {
await driver.tap(find.byValueKey(ClientKeys.fab)); print('Tap new client');
await driver.tap(find.byTooltip(localization.newClient));
print('Tap save');
await driver.tap(find.text(localization.save)); await driver.tap(find.text(localization.save));
print('Check for error');
await driver.waitFor(find.text(localization.pleaseEnterAClientOrContactName)); await driver.waitFor(find.text(localization.pleaseEnterAClientOrContactName));
if (await isMobile(driver)) {
print('Click back');
await driver.tap(find.pageBack()); await driver.tap(find.pageBack());
await driver.waitFor(find.byTooltip(localization.newClient));
} else {
print('Click cancel');
await driver.tap(find.text(localization.cancel));
}
}); });
// Create a new client
test('Add a new client', () async {
print('Tap new client');
await driver.tap(find.byTooltip(localization.newClient));
print('Fill form: $name');
await fillAndSaveForm(driver, <String, dynamic>{
localization.name: name,
});
if (await isMobile(driver)) {
print('Click back');
await driver.tap(find.pageBack());
await driver.waitFor(find.byTooltip(localization.newClient));
}
});
// Edit the newly created client
test('Edit an existing client', () async {
if (await isMobile(driver)) {
print('Select client: $name');
await driver.scrollUntilVisible(
find.byType('ListView'), find.text(name),
dyScroll: -300);
await driver.tap(find.text(name));
}
print('Tap edit');
await driver.tap(find.text(localization.edit));
await fillAndSaveForm(driver, <String, dynamic>{
localization.name: updatedName,
});
});
// Archive the edited client
test('Archieve/delete client test', () async {
await testArchiveAndDelete(
driver: driver,
archivedMessage: localization.archivedClient,
deletedMessage: localization.deletedClient,
restoredMessage: localization.restoredClient);
if (await isMobile(driver)) {
await driver.tap(find.pageBack());
}
});
}); });
} }