Skip to content

Commit

Permalink
Add integration test for taking screenshots of the example
Browse files Browse the repository at this point in the history
Ref: #315
  • Loading branch information
jpnurmi committed May 18, 2023
1 parent 0ddefad commit fb36480
Show file tree
Hide file tree
Showing 27 changed files with 140 additions and 0 deletions.
22 changes: 22 additions & 0 deletions .github/workflows/flutter-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,28 @@ jobs:
- name: Check for any formatting issues
run: dart format --set-exit-if-changed .

integration:
runs-on: ubuntu-20.04
steps:

- uses: actions/checkout@v2
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: '3.10.x'

- name: Install dependencies
run: |
sudo apt update
sudo apt -y install clang cmake curl libgtk-3-dev ninja-build pkg-config unzip xvfb
- name: Get dependencies
run: flutter pub get

- name: Run integration tests
run: xvfb-run -a -s '-screen 0 1280x800x24 +extension GLX' flutter test -d linux integration_test
working-directory: example/

pub:
runs-on: ubuntu-20.04
steps:
Expand Down
116 changes: 116 additions & 0 deletions example/integration_test/screenshot_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:yaru/yaru.dart';
import 'package:yaru_example/main.dart' as app;
import 'package:yaru_example/main.dart';
import 'package:yaru_example/view/home_page.dart';

// NOTE: run `flutter test --update-goldens integration_test` to update screenshots

Future<void> main() async {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

testWidgets('fonts', (tester) async {
tester.runApp();
await tester.pumpAndSettle();
await tester.takeScreenshots('fonts');
});

testWidgets('buttons', (tester) async {
tester.runApp();
await tester.pumpAndSettle();
await tester.tap(find.text('Controls'));
await tester.pump();
await tester.takeScreenshots('buttons');
});

testWidgets('checks', (tester) async {
tester.runApp();
await tester.pumpAndSettle();
await tester.tap(find.text('Controls'));
await tester.pump();
await tester.tap(find.text('Checks'));
await tester.pump();
await tester.takeScreenshots('checks');
});

testWidgets('switches', (tester) async {
tester.runApp();
await tester.pumpAndSettle();
await tester.tap(find.text('Controls'));
await tester.pump();
await tester.tap(find.text('Switches'));
await tester.pump();
await tester.takeScreenshots('switches');
});

testWidgets('text fields', (tester) async {
tester.runApp();
await tester.pumpAndSettle();
await tester.tap(find.text('Text Fields'));
await tester.pump();
primaryFocus?.unfocus();
await tester.pump();
await tester.takeScreenshots('text-fields');
});

testWidgets('containers', (tester) async {
tester.runApp();
await tester.pumpAndSettle();
await tester.tap(find.text('Containers'));
await tester.pump();
await tester.takeScreenshots('containers');
});
}

extension on WidgetTester {
void runApp() {
view.physicalSize = const Size(600, 700);
app.main();
}

void selectTheme({
YaruVariant? variant,
bool? highContrast,
ThemeMode? themeMode,
}) async {
final context = element(find.byType(HomePage));
AppTheme.apply(
context,
variant: variant,
highContrast: highContrast,
themeMode: themeMode,
);
}

Future<void> takeScreenshots(String screen) async {
for (final themeMode in [ThemeMode.light, ThemeMode.dark]) {
selectTheme(
variant: YaruVariant.orange,
themeMode: themeMode,
highContrast: false,
);
await pumpAndSettle();
await takeScreenshot(screen);

selectTheme(themeMode: themeMode, highContrast: true);
await pumpAndSettle();
await takeScreenshot(screen);
}
}

Future<void> takeScreenshot(String screen) async {
final context = element(find.byType(HomePage));
final theme = AppTheme.of(context);
final suffix = [
if (theme.highContrast == true) 'high-contrast' else theme.variant?.name,
theme.themeMode?.name,
].join('-');

await expectLater(
find.byType(MaterialApp),
matchesGoldenFile('screenshots/$screen-$suffix.png'),
);
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ dev_dependencies:
flutter_lints: ^2.0.1
flutter_test:
sdk: flutter
integration_test:
sdk: flutter

flutter:
uses-material-design: true

0 comments on commit fb36480

Please sign in to comment.