Skip to content

Commit

Permalink
test(widget): add widget tests to improve coverage (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
tsutsu3 authored Jan 24, 2025
1 parent b3f985b commit d2b1967
Show file tree
Hide file tree
Showing 15 changed files with 3,831 additions and 3 deletions.
2 changes: 1 addition & 1 deletion LICENSE.md
Original file line number Diff line number Diff line change
Expand Up @@ -438,4 +438,4 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

### Included Files

- `lib/screens/settings/about.dart`
- `lib/screens/settings/about/about.dart`
2 changes: 1 addition & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ dart_code_linter:
- avoid-unused-parameters
- prefer-trailing-comma
- check-unused-files
- check-unused-code
# - check-unused-code

dart_code_metrics:
extends:
Expand Down
2 changes: 2 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ignore:
- "lib/screens/settings/about/about.dart"
8 changes: 8 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.16"
flutter_svg_test:
dependency: "direct dev"
description:
name: flutter_svg_test
sha256: bfc0114ef604770d5c5dfd993c0ce7e8a5234c894361adee52dad98f6db53185
url: "https://pub.dev"
source: hosted
version: "1.0.3"
flutter_test:
dependency: "direct dev"
description: flutter
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ dev_dependencies:
dart_code_metrics_presets: ^2.19.0
dart_code_linter: ^1.2.1
full_coverage: ^1.0.0
flutter_svg_test: ^1.0.3

dependency_overrides:
analyzer: ^6.5.0
Expand Down
2 changes: 1 addition & 1 deletion sonar-project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ sonar.tests=test
sonar.sourceEncoding=UTF-8

# exclude generated files
sonar.exclusions=test/**/*_test.mocks.dart,lib/**/*.g.dart
sonar.exclusions=test/**/*_test.mocks.dart,lib/**/*.g.dart,lib/screens/settings/about/about.dart

# coverage
sonar.dart.lcov.reportPaths=coverage/lcov.info
108 changes: 108 additions & 0 deletions test/widgets/app_logs/app_logs_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import 'package:mockito/mockito.dart';
import 'package:pi_hole_client/screens/app_logs/app_log_details_modal.dart';
import 'package:pi_hole_client/screens/app_logs/app_logs.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import '../helpers.dart';

void main() async {
initializeApp();

group(
'App Log Screen Widget Tests',
() {
late TestSetupHelper testSetup;

setUp(() async {
testSetup = TestSetupHelper();
testSetup.initializeMock(useApiGatewayVersion: 'v6');
});

testWidgets(
'should show AppLogs screen with one log',
(WidgetTester tester) async {
tester.view.physicalSize = const Size(1080, 2400);
tester.view.devicePixelRatio = 1.0;

addTearDown(() {
tester.view.resetPhysicalSize();
tester.view.resetDevicePixelRatio();
});

await tester.pumpWidget(
testSetup.buildTestWidget(
const AppLogs(),
),
);

expect(find.byType(AppLogs), findsOneWidget);
await tester.pump();

expect(find.text('Logs'), findsOneWidget);
expect(find.byIcon(Icons.share), findsOneWidget);

expect(find.text('sample'), findsOneWidget);
expect(find.text('message'), findsOneWidget);
expect(find.text('2025-01-22 10:50:31.000'), findsOneWidget);

// TODO: show snackbar
// TODO: check clipboard data
// await tester.tap(find.byIcon(Icons.share));
// await tester.pump(const Duration(seconds: 1));
// await tester.pumpAndSettle(const Duration(seconds: 1));
// expect(find.text('Logs copied to clipboard'), findsOneWidget);

await tester.tap(find.text('sample'));
await tester.pumpAndSettle();
expect(find.byType(AppLogDetailsModal), findsOneWidget);
expect(find.text('Log details'), findsOneWidget);

// Message tab is selected by default
expect(find.text('sample'), findsOneWidget);

await tester.tap(find.text('Status code'));
await tester.pumpAndSettle();
expect(find.text('200'), findsOneWidget);

await tester.tap(find.text('Body'));
await tester.pumpAndSettle();
expect(find.text('body'), findsOneWidget);
},
);

testWidgets(
'should show blank screen (no app logs)',
(WidgetTester tester) async {
tester.view.physicalSize = const Size(1080, 2400);
tester.view.devicePixelRatio = 1.0;

when(testSetup.mockConfigProvider.logs).thenReturn([]);

addTearDown(() {
tester.view.resetPhysicalSize();
tester.view.resetDevicePixelRatio();
});

await tester.pumpWidget(
testSetup.buildTestWidget(
const AppLogs(),
),
);

expect(find.byType(AppLogs), findsOneWidget);
await tester.pump();

expect(find.text('Logs'), findsOneWidget);

// check log message
expect(find.text('sample'), findsNothing);

// can't tap on share icon because there are no logs
await tester.tap(find.byIcon(Icons.share));
await tester.pumpAndSettle();
expect(find.text('Logs copied to clipboard'), findsNothing);
},
);
},
);
}
Loading

0 comments on commit d2b1967

Please sign in to comment.