Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions app/lib/src/screens/host_setup_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import '../models/host_config.dart';
import '../models/plugin_info.dart';
import '../notifications/host_pairing.dart';
import '../widgets/error_message_view.dart';
import '../widgets/text_context_menu.dart';

/// Form for entering (or editing) the SSH connection details for the dev
/// machine running Herdr.
Expand Down Expand Up @@ -372,11 +373,13 @@ class _HostSetupScreenState extends State<HostSetupScreen> {
TextFormField(
controller: _nameController,
decoration: InputDecoration(labelText: l10n.hostSetupNameLabel),
contextMenuBuilder: noScanTextContextMenuBuilder,
),
const SizedBox(height: 12),
TextFormField(
controller: _hostController,
decoration: InputDecoration(labelText: l10n.hostSetupHostLabel),
contextMenuBuilder: noScanTextContextMenuBuilder,
validator: (v) => (v == null || v.trim().isEmpty)
? l10n.hostSetupHostRequired
: null,
Expand All @@ -386,6 +389,7 @@ class _HostSetupScreenState extends State<HostSetupScreen> {
controller: _portController,
decoration: InputDecoration(labelText: l10n.hostSetupPortLabel),
keyboardType: TextInputType.number,
contextMenuBuilder: noScanTextContextMenuBuilder,
// Blank is allowed and defaults to 22 (see _buildConfig); only a
// non-blank value has to be a valid port number.
validator: (v) {
Expand All @@ -402,6 +406,7 @@ class _HostSetupScreenState extends State<HostSetupScreen> {
TextFormField(
controller: _userController,
decoration: InputDecoration(labelText: l10n.hostSetupUserLabel),
contextMenuBuilder: noScanTextContextMenuBuilder,
validator: (v) => (v == null || v.trim().isEmpty)
? l10n.hostSetupUserRequired
: null,
Expand All @@ -414,6 +419,7 @@ class _HostSetupScreenState extends State<HostSetupScreen> {
),
style: const TextStyle(fontFamily: 'monospace'),
maxLines: 6,
contextMenuBuilder: noScanTextContextMenuBuilder,
validator: (v) {
final t = v?.trim() ?? '';
if (t.isEmpty) return l10n.hostSetupPrivateKeyRequired;
Expand All @@ -430,6 +436,7 @@ class _HostSetupScreenState extends State<HostSetupScreen> {
labelText: l10n.hostSetupPassphraseLabel,
),
obscureText: true,
contextMenuBuilder: noScanTextContextMenuBuilder,
),
const SizedBox(height: 12),
ExpansionTile(
Expand All @@ -441,6 +448,7 @@ class _HostSetupScreenState extends State<HostSetupScreen> {
decoration: InputDecoration(
labelText: l10n.hostSetupHerdrBinLabel,
),
contextMenuBuilder: noScanTextContextMenuBuilder,
),
],
),
Expand Down
43 changes: 43 additions & 0 deletions app/test/screens/host_setup_screen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:drover/src/models/host_config.dart';
import 'package:drover/src/models/plugin_info.dart';
import 'package:drover/src/notifications/host_pairing.dart';
import 'package:drover/src/screens/host_setup_screen.dart';
import 'package:drover/src/widgets/text_context_menu.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

Expand All @@ -21,6 +22,48 @@ const _samplePlugin = PluginInfo(
);

void main() {
testWidgets('disables Scan Text for every host setup input', (tester) async {
await tester.pumpWidget(
MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: HostSetupScreen(onSubmit: (config) async {}),
),
);
final editableTexts = tester.widgetList<EditableText>(
find.byType(EditableText),
);

expect(editableTexts, hasLength(6));
for (final editableText in editableTexts) {
expect(
editableText.contextMenuBuilder,
same(noScanTextContextMenuBuilder),
);
}

await tester.scrollUntilVisible(
find.byType(ExpansionTile),
500,
scrollable: find.byType(Scrollable).first,
);
await tester.tap(find.byType(ExpansionTile));
await tester.pumpAndSettle();

final herdrBinEditableText = tester.widget<EditableText>(
find.descendant(
of: find.byType(ExpansionTile),
matching: find.byType(EditableText),
),
);
expect(
herdrBinEditableText.contextMenuBuilder,
same(noScanTextContextMenuBuilder),
);

await tester.pumpWidget(const SizedBox());
});

testWidgets('renders the demo entry when onEnterDemo is provided', (
tester,
) async {
Expand Down
Loading