Added Vendor Test
This commit is contained in:
parent
59f2ecd8c8
commit
cd503e7269
|
|
@ -265,6 +265,13 @@ abstract class VendorEntity extends Object
|
||||||
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
|
FormatNumberType get listDisplayAmountType => FormatNumberType.money;
|
||||||
|
|
||||||
static Serializer<VendorEntity> get serializer => _$vendorEntitySerializer;
|
static Serializer<VendorEntity> get serializer => _$vendorEntitySerializer;
|
||||||
|
|
||||||
|
bool get hasNameSet {
|
||||||
|
final contact = contacts.first;
|
||||||
|
return name.isNotEmpty ||
|
||||||
|
contact.fullName.isNotEmpty ||
|
||||||
|
contact.email.isNotEmpty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class VendorContactEntity extends Object
|
abstract class VendorContactEntity extends Object
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import 'package:flutter/material.dart';
|
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/form_card.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/vendor/edit/vendor_edit_vm.dart';
|
import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_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';
|
|
||||||
|
|
||||||
class VendorEditDetails extends StatefulWidget {
|
class VendorEditDetails extends StatefulWidget {
|
||||||
const VendorEditDetails({
|
const VendorEditDetails({
|
||||||
|
|
@ -95,44 +96,29 @@ class VendorEditDetailsState extends State<VendorEditDetails> {
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
FormCard(
|
FormCard(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
TextFormField(
|
DecoratedFormField(
|
||||||
autocorrect: false,
|
|
||||||
controller: _nameController,
|
controller: _nameController,
|
||||||
decoration: InputDecoration(
|
label: localization.name,
|
||||||
labelText: localization.name,
|
|
||||||
),
|
|
||||||
validator: (String val) => val == null || val.isEmpty
|
validator: (String val) => val == null || val.isEmpty
|
||||||
? AppLocalization.of(context).pleaseEnterAName
|
? AppLocalization.of(context).pleaseEnterAName
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
TextFormField(
|
DecoratedFormField(
|
||||||
autocorrect: false,
|
|
||||||
controller: _idNumberController,
|
controller: _idNumberController,
|
||||||
decoration: InputDecoration(
|
label: localization.idNumber,
|
||||||
labelText: localization.idNumber,
|
|
||||||
),
|
),
|
||||||
),
|
DecoratedFormField(
|
||||||
TextFormField(
|
|
||||||
autocorrect: false,
|
|
||||||
controller: _vatNumberController,
|
controller: _vatNumberController,
|
||||||
decoration: InputDecoration(
|
label: localization.vatNumber,
|
||||||
labelText: localization.vatNumber,
|
|
||||||
),
|
),
|
||||||
),
|
DecoratedFormField(
|
||||||
TextFormField(
|
|
||||||
autocorrect: false,
|
|
||||||
controller: _websiteController,
|
controller: _websiteController,
|
||||||
decoration: InputDecoration(
|
label: localization.website,
|
||||||
labelText: localization.website,
|
|
||||||
),
|
|
||||||
keyboardType: TextInputType.url,
|
keyboardType: TextInputType.url,
|
||||||
),
|
),
|
||||||
TextFormField(
|
DecoratedFormField(
|
||||||
autocorrect: false,
|
|
||||||
controller: _phoneController,
|
controller: _phoneController,
|
||||||
decoration: InputDecoration(
|
label: localization.phone,
|
||||||
labelText: localization.phone,
|
|
||||||
),
|
|
||||||
keyboardType: TextInputType.phone,
|
keyboardType: TextInputType.phone,
|
||||||
),
|
),
|
||||||
CustomField(
|
CustomField(
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,20 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
import 'package:invoiceninja_flutter/data/models/vendor_model.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_edit.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/vendor/vendor_screen.dart';
|
import 'package:invoiceninja_flutter/ui/vendor/vendor_screen.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/vendor/view/vendor_view_vm.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
|
||||||
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
|
|
||||||
import 'package:invoiceninja_flutter/ui/vendor/view/vendor_view_vm.dart';
|
|
||||||
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
|
|
||||||
import 'package:invoiceninja_flutter/data/models/vendor_model.dart';
|
|
||||||
import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_edit.dart';
|
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
|
||||||
|
|
||||||
class VendorEditScreen extends StatelessWidget {
|
class VendorEditScreen extends StatelessWidget {
|
||||||
const VendorEditScreen({Key key}) : super(key: key);
|
const VendorEditScreen({Key key}) : super(key: key);
|
||||||
|
|
@ -77,6 +79,15 @@ class VendorEditVM {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onSavePressed: (BuildContext context) {
|
onSavePressed: (BuildContext context) {
|
||||||
|
if (!vendor.hasNameSet) {
|
||||||
|
showDialog<ErrorDialog>(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return ErrorDialog(
|
||||||
|
AppLocalization.of(context).pleaseEnterAName);
|
||||||
|
});
|
||||||
|
return null;
|
||||||
|
}
|
||||||
final Completer<VendorEntity> completer = new Completer<VendorEntity>();
|
final Completer<VendorEntity> completer = new Completer<VendorEntity>();
|
||||||
store.dispatch(SaveVendorRequest(completer: completer, vendor: vendor));
|
store.dispatch(SaveVendorRequest(completer: completer, vendor: vendor));
|
||||||
return completer.future.then((savedVendor) {
|
return completer.future.then((savedVendor) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
import 'package:flutter_driver/driver_extension.dart';
|
||||||
|
import 'package:invoiceninja_flutter/main.dart' as app;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
// This line enables the extension
|
||||||
|
enableFlutterDriverExtension();
|
||||||
|
app.main(isTesting: true);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
import 'package:faker/faker.dart';
|
||||||
|
import 'package:flutter_driver/flutter_driver.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
import 'utils/common_actions.dart';
|
||||||
|
import 'utils/localizations.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
runTestSuite();
|
||||||
|
}
|
||||||
|
|
||||||
|
void runTestSuite({bool batchMode = false}) {
|
||||||
|
group('Vendor Tests', () {
|
||||||
|
TestLocalization localization;
|
||||||
|
FlutterDriver driver;
|
||||||
|
|
||||||
|
final name = makeUnique(faker.company.name());
|
||||||
|
|
||||||
|
final updatedName = makeUnique(faker.company.name());
|
||||||
|
|
||||||
|
setUpAll(() async {
|
||||||
|
localization = TestLocalization('en');
|
||||||
|
driver = await FlutterDriver.connect();
|
||||||
|
|
||||||
|
print('Login to app');
|
||||||
|
await login(driver, retype: batchMode);
|
||||||
|
|
||||||
|
print('View vendors');
|
||||||
|
viewSection(driver: driver, name: localization.vendors);
|
||||||
|
});
|
||||||
|
|
||||||
|
tearDownAll(() async {
|
||||||
|
await logout(driver, localization);
|
||||||
|
|
||||||
|
if (driver != null) {
|
||||||
|
driver.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create an empty vendor
|
||||||
|
test('Try to add an empty vendor', () async {
|
||||||
|
print('Tap new vendor');
|
||||||
|
await driver.tap(find.byTooltip(localization.newVendor));
|
||||||
|
|
||||||
|
print('Tap save');
|
||||||
|
await driver.tap(find.text(localization.save));
|
||||||
|
|
||||||
|
print('Check for error');
|
||||||
|
await driver.waitFor(find.text(localization.pleaseEnterAName));
|
||||||
|
|
||||||
|
if (await isMobile(driver)) {
|
||||||
|
print('Click back');
|
||||||
|
await driver.tap(find.pageBack());
|
||||||
|
await driver.waitFor(find.byTooltip(localization.newVendor));
|
||||||
|
} else {
|
||||||
|
print('Click cancel');
|
||||||
|
await driver.tap(find.text(localization.cancel));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create a new vendor
|
||||||
|
test('Add a new vendor', () async {
|
||||||
|
print('Tap new vendor');
|
||||||
|
await driver.tap(find.byTooltip(localization.newVendor));
|
||||||
|
|
||||||
|
print('Fill form: $name');
|
||||||
|
await fillAndSaveForm(driver, <String, dynamic>{
|
||||||
|
localization.name: name,
|
||||||
|
});
|
||||||
|
print('Form filled');
|
||||||
|
|
||||||
|
if (await isMobile(driver)) {
|
||||||
|
print('Click back');
|
||||||
|
await driver.tap(find.pageBack());
|
||||||
|
await driver.waitFor(find.byTooltip(localization.newVendor));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Edit the newly created vendor
|
||||||
|
test('Edit an existing vendor', () async {
|
||||||
|
if (await isMobile(driver)) {
|
||||||
|
print('Select vendor: $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, String>{
|
||||||
|
localization.name: updatedName,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Archive the edited vendor
|
||||||
|
test('Archieve/delete vendor test', () async {
|
||||||
|
await testArchiveAndDelete(
|
||||||
|
driver: driver,
|
||||||
|
archivedMessage: localization.archivedVendor,
|
||||||
|
deletedMessage: localization.deletedVendor,
|
||||||
|
restoredMessage: localization.restoredVendor);
|
||||||
|
|
||||||
|
if (await isMobile(driver)) {
|
||||||
|
await driver.tap(find.pageBack());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue