diff --git a/lib/src/commands/test/templates/test_runner_bundle.dart b/lib/src/commands/test/templates/test_runner_bundle.dart index 139331d6f..e681eb887 100644 --- a/lib/src/commands/test/templates/test_runner_bundle.dart +++ b/lib/src/commands/test/templates/test_runner_bundle.dart @@ -8,7 +8,7 @@ final testRunnerBundle = MasonBundle.fromJson({ { "path": "test/.test_runner.dart", "data": - "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gQ29uc2lkZXIgYWRkaW5nIHRoaXMgZmlsZSB0byB5b3VyIC5naXRpZ25vcmUuCgp7eyNpc0ZsdXR0ZXJ9fWltcG9ydCAnZGFydDppbyc7CgppbXBvcnQgJ3BhY2thZ2U6Zmx1dHRlcl90ZXN0L2ZsdXR0ZXJfdGVzdC5kYXJ0JzsKe3svaXNGbHV0dGVyfX17e15pc0ZsdXR0ZXJ9fWltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7e3svaXNGbHV0dGVyfX0KCnt7I3Rlc3RzfX1pbXBvcnQgJ3t7ey59fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7Ln19fXt7L3NuYWtlQ2FzZX19Owp7ey90ZXN0c319CnZvaWQgbWFpbigpIHsKe3sjaXNGbHV0dGVyfX0gIGdvbGRlbkZpbGVDb21wYXJhdG9yID0gX1Rlc3RPcHRpbWl6YXRpb25Bd2FyZUdvbGRlbkZpbGVDb21wYXJhdG9yKCk7e3svaXNGbHV0dGVyfX0Ke3sjdGVzdHN9fSAgZ3JvdXAoJ3t7I3NuYWtlQ2FzZX19e3t7Ln19fXt7L3NuYWtlQ2FzZX19Jywge3sjc25ha2VDYXNlfX17e3sufX19e3svc25ha2VDYXNlfX0ubWFpbik7Cnt7L3Rlc3RzfX19Cnt7I2lzRmx1dHRlcn19CmNsYXNzIF9UZXN0T3B0aW1pemF0aW9uQXdhcmVHb2xkZW5GaWxlQ29tcGFyYXRvciBleHRlbmRzIExvY2FsRmlsZUNvbXBhcmF0b3IgewogIGZpbmFsIExpc3Q8U3RyaW5nPiBnb2xkZW5GaWxlUGF0aHM7CgogIF9UZXN0T3B0aW1pemF0aW9uQXdhcmVHb2xkZW5GaWxlQ29tcGFyYXRvcigpCiAgICAgIDogZ29sZGVuRmlsZVBhdGhzID0gX2dvbGRlbkZpbGVQYXRocywKICAgICAgICBzdXBlcihfdGVzdEZpbGUpOwoKICBzdGF0aWMgVXJpIGdldCBfdGVzdEZpbGUgewogICAgZmluYWwgYmFzZWRpciA9CiAgICAgICAgKGdvbGRlbkZpbGVDb21wYXJhdG9yIGFzIExvY2FsRmlsZUNvbXBhcmF0b3IpLmJhc2VkaXIudG9TdHJpbmcoKTsKICAgIHJldHVybiBVcmkucGFyc2UoIiRiYXNlZGlyLy50ZXN0X3J1bm5lci5kYXJ0Iik7CiAgfQoKICBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldCBfZ29sZGVuRmlsZVBhdGhzID0+CiAgICAgIERpcmVjdG9yeS5mcm9tVXJpKChnb2xkZW5GaWxlQ29tcGFyYXRvciBhcyBMb2NhbEZpbGVDb21wYXJhdG9yKS5iYXNlZGlyKQogICAgICAgICAgLmxpc3RTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSwgZm9sbG93TGlua3M6IHRydWUpCiAgICAgICAgICAud2hlcmVUeXBlPEZpbGU+KCkKICAgICAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucGF0aCkKICAgICAgICAgIC53aGVyZSgocGF0aCkgPT4gcGF0aC5lbmRzV2l0aCgnLnBuZycpKQogICAgICAgICAgLnRvTGlzdCgpOwoKICBAb3ZlcnJpZGUKICBVcmkgZ2V0VGVzdFVyaShVcmkga2V5LCBpbnQ/IHZlcnNpb24pIHsKICAgIGZpbmFsIGtleVN0cmluZyA9IGtleS5wYXRoOwogICAgcmV0dXJuIFVyaS5wYXJzZShnb2xkZW5GaWxlUGF0aHMKICAgICAgICAuc2luZ2xlV2hlcmUoKGdvbGRlbkZpbGVQYXRoKSA9PiBnb2xkZW5GaWxlUGF0aC5lbmRzV2l0aChrZXlTdHJpbmcpKSk7CiAgfQp9Cnt7L2lzRmx1dHRlcn19", + "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gQ29uc2lkZXIgYWRkaW5nIHRoaXMgZmlsZSB0byB5b3VyIC5naXRpZ25vcmUuCgp7eyNpc0ZsdXR0ZXJ9fWltcG9ydCAnZGFydDppbyc7CgppbXBvcnQgJ3BhY2thZ2U6Zmx1dHRlcl90ZXN0L2ZsdXR0ZXJfdGVzdC5kYXJ0JzsKe3svaXNGbHV0dGVyfX17e15pc0ZsdXR0ZXJ9fWltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7e3svaXNGbHV0dGVyfX0KCnt7I3Rlc3RzfX1pbXBvcnQgJ3t7ey59fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7Ln19fXt7L3NuYWtlQ2FzZX19Owp7ey90ZXN0c319CnZvaWQgbWFpbigpIHsKe3sjaXNGbHV0dGVyfX0gIGdvbGRlbkZpbGVDb21wYXJhdG9yID0gX1Rlc3RPcHRpbWl6YXRpb25Bd2FyZUdvbGRlbkZpbGVDb21wYXJhdG9yKCk7e3svaXNGbHV0dGVyfX0Ke3sjdGVzdHN9fSAgZ3JvdXAoJ3t7I3NuYWtlQ2FzZX19e3t7Ln19fXt7L3NuYWtlQ2FzZX19Jywge3sjc25ha2VDYXNlfX17e3sufX19e3svc25ha2VDYXNlfX0ubWFpbik7Cnt7L3Rlc3RzfX19Cgp7eyNpc0ZsdXR0ZXJ9fQpjbGFzcyBfVGVzdE9wdGltaXphdGlvbkF3YXJlR29sZGVuRmlsZUNvbXBhcmF0b3IgZXh0ZW5kcyBMb2NhbEZpbGVDb21wYXJhdG9yIHsKICBmaW5hbCBMaXN0PFN0cmluZz4gZ29sZGVuRmlsZVBhdGhzOwoKICBfVGVzdE9wdGltaXphdGlvbkF3YXJlR29sZGVuRmlsZUNvbXBhcmF0b3IoKQogICAgICA6IGdvbGRlbkZpbGVQYXRocyA9IF9nb2xkZW5GaWxlUGF0aHMsCiAgICAgICAgc3VwZXIoX3Rlc3RGaWxlKTsKCiAgc3RhdGljIFVyaSBnZXQgX3Rlc3RGaWxlIHsKICAgIGZpbmFsIGJhc2VkaXIgPQogICAgICAgIChnb2xkZW5GaWxlQ29tcGFyYXRvciBhcyBMb2NhbEZpbGVDb21wYXJhdG9yKS5iYXNlZGlyLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gVXJpLnBhcnNlKCIkYmFzZWRpci8udGVzdF9ydW5uZXIuZGFydCIpOwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXQgX2dvbGRlbkZpbGVQYXRocyA9PgogICAgICBEaXJlY3RvcnkuZnJvbVVyaSgoZ29sZGVuRmlsZUNvbXBhcmF0b3IgYXMgTG9jYWxGaWxlQ29tcGFyYXRvcikuYmFzZWRpcikKICAgICAgICAgIC5saXN0U3luYyhyZWN1cnNpdmU6IHRydWUsIGZvbGxvd0xpbmtzOiB0cnVlKQogICAgICAgICAgLndoZXJlVHlwZTxGaWxlPigpCiAgICAgICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnBhdGgpCiAgICAgICAgICAud2hlcmUoKHBhdGgpID0+IHBhdGguZW5kc1dpdGgoJy5wbmcnKSkKICAgICAgICAgIC50b0xpc3QoKTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldFRlc3RVcmkoVXJpIGtleSwgaW50PyB2ZXJzaW9uKSB7CiAgICBmaW5hbCBrZXlTdHJpbmcgPSBrZXkucGF0aDsKICAgIHJldHVybiBVcmkucGFyc2UoZ29sZGVuRmlsZVBhdGhzCiAgICAgICAgLnNpbmdsZVdoZXJlKChnb2xkZW5GaWxlUGF0aCkgPT4gZ29sZGVuRmlsZVBhdGguZW5kc1dpdGgoa2V5U3RyaW5nKSkpOwogIH0KfQp7ey9pc0ZsdXR0ZXJ9fQ==", "type": "text" } ], diff --git a/test/fixtures/golden_test.png b/test/fixtures/golden_test.png new file mode 100644 index 000000000..493f34af1 Binary files /dev/null and b/test/fixtures/golden_test.png differ diff --git a/test/src/cli/flutter_cli_test.dart b/test/src/cli/flutter_cli_test.dart index 2a9044729..d326812da 100644 --- a/test/src/cli/flutter_cli_test.dart +++ b/test/src/cli/flutter_cli_test.dart @@ -69,6 +69,30 @@ void main() { }); }'''; +const flutterGoldenTestContents = ''' +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('test with golden', (tester) async { + await tester.pumpWidget( + MaterialApp( + debugShowCheckedModeBanner: false, + home: Scaffold( + appBar: AppBar(), + body: Center(child: ColoredBox(color: Colors.blue)), + ), + ), + ); + + await expectLater( + find.byType(MaterialApp), + matchesGoldenFile('golden_test.png'), + ); + }); +} +'''; + const longTestNameContents = ''' import 'package:test/test.dart'; @@ -210,6 +234,8 @@ dev_dependencies: class MockLogger extends Mock implements Logger {} void main() { + final cwd = Directory.current; + group('Flutter', () { group('.packagesGet', () { test('throws when there is no pubspec.yaml', () { @@ -847,6 +873,51 @@ void main() { ).called(1); }); + test( + 'completes when there is a nested golden test w/optimizations Flutter (passing)', + () async { + final directory = Directory.systemTemp.createTempSync(); + final testDirectory = Directory(p.join(directory.path, 'test')) + ..createSync(); + final goldenTestDirectory = + Directory(p.join(testDirectory.path, 'golden'))..createSync(); + File( + p.join(directory.path, 'pubspec.yaml'), + ).writeAsStringSync(pubspecFlutter); + File( + p.join(goldenTestDirectory.path, 'golden_test.dart'), + ).writeAsStringSync(flutterGoldenTestContents); + File( + p.join(goldenTestDirectory.path, 'golden_test.png'), + ).writeAsBytesSync( + File(p.join(cwd.path, 'test', 'fixtures', 'golden_test.png')) + .readAsBytesSync(), + ); + await expectLater( + Flutter.test( + cwd: directory.path, + optimizePerformance: true, + stdout: logger.write, + stderr: logger.err, + progress: logger.progress, + ), + completion(equals([ExitCode.success.code])), + ); + verify(() => logger.progress('Optimizing tests')).called(1); + verify( + () => logger.write( + any( + that: contains( + 'Running "flutter test" in ${p.dirname(directory.path)}', + ), + ), + ), + ).called(1); + verify( + () => logger.write(any(that: contains('+1: All tests passed!'))), + ).called(1); + }); + test('completes when there is a test directory (recursive)', () async { final directory = Directory.systemTemp.createTempSync(); final nestedDirectory = Directory(p.join(directory.path, 'nested'))