diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 92e0fdbc2..e9f26a05c 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -32,6 +32,7 @@ jobs: # E2E tests for the test command - test/commands/test/async_main/async_main_test.dart - test/commands/test/no_project/no_project_test.dart + - test/commands/test/spaced_golden_file_name/spaced_golden_file_name_test.dart # E2E tests for the create command - test/commands/create/flutter_app/core_test.dart diff --git a/bricks/test_optimizer/__brick__/test/.test_optimizer.dart b/bricks/test_optimizer/__brick__/test/.test_optimizer.dart index b6cf029e7..ab5220302 100644 --- a/bricks/test_optimizer/__brick__/test/.test_optimizer.dart +++ b/bricks/test_optimizer/__brick__/test/.test_optimizer.dart @@ -37,7 +37,7 @@ class _TestOptimizationAwareGoldenFileComparator extends LocalFileComparator { @override Uri getTestUri(Uri key, int? version) { - final keyString = key.path; + final keyString = key.toFilePath(); return Uri.parse(goldenFilePaths .singleWhere((goldenFilePath) => goldenFilePath.endsWith(keyString))); } diff --git a/e2e/test/commands/test/spaced_golden_file_name/fixture/pubspec.yaml b/e2e/test/commands/test/spaced_golden_file_name/fixture/pubspec.yaml new file mode 100644 index 000000000..39ea058b6 --- /dev/null +++ b/e2e/test/commands/test/spaced_golden_file_name/fixture/pubspec.yaml @@ -0,0 +1,14 @@ +name: spaced_golden_file_name +description: Fixture for testing golden files with spaced file names. +publish_to: none + +environment: + sdk: ">=2.18.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter diff --git a/e2e/test/commands/test/spaced_golden_file_name/fixture/test/sized box.png b/e2e/test/commands/test/spaced_golden_file_name/fixture/test/sized box.png new file mode 100644 index 000000000..128801a15 Binary files /dev/null and b/e2e/test/commands/test/spaced_golden_file_name/fixture/test/sized box.png differ diff --git a/e2e/test/commands/test/spaced_golden_file_name/fixture/test/spaced_golden_file_name_test.dart b/e2e/test/commands/test/spaced_golden_file_name/fixture/test/spaced_golden_file_name_test.dart new file mode 100644 index 000000000..a781bb668 --- /dev/null +++ b/e2e/test/commands/test/spaced_golden_file_name/fixture/test/spaced_golden_file_name_test.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('renders SizedBox', (tester) async { + final widget = SizedBox.shrink(); + await tester.pumpWidget(widget); + + await expectLater( + find.byWidget(widget), + matchesGoldenFile('sized box.png'), + ); + }); +} diff --git a/e2e/test/commands/test/spaced_golden_file_name/spaced_golden_file_name_test.dart b/e2e/test/commands/test/spaced_golden_file_name/spaced_golden_file_name_test.dart new file mode 100644 index 000000000..98567f4ed --- /dev/null +++ b/e2e/test/commands/test/spaced_golden_file_name/spaced_golden_file_name_test.dart @@ -0,0 +1,39 @@ +import 'package:mason/mason.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; +import 'package:universal_io/io.dart'; + +import '../../../../helpers/helpers.dart'; + +void main() { + test( + 'allows golden files with spaces in the name', + timeout: const Timeout(Duration(minutes: 2)), + withRunner((commandRunner, logger, updater, logs) async { + final tempDirectory = Directory.systemTemp.createTempSync('async_main'); + addTearDown(() => tempDirectory.deleteSync(recursive: true)); + + await copyDirectory( + Directory('test/commands/test/spaced_golden_file_name/fixture'), + tempDirectory, + ); + + await expectSuccessfulProcessResult( + 'flutter', + ['pub', 'get'], + workingDirectory: tempDirectory.path, + ); + await expectSuccessfulProcessResult( + 'flutter', + ['test', '--update-goldens'], + workingDirectory: tempDirectory.path, + ); + + Directory.current = tempDirectory; + final result = await commandRunner.run(['test']); + + verifyNever(() => logger.err(any())); + expect(result, equals(ExitCode.success.code)); + }), + ); +} diff --git a/lib/src/commands/test/templates/test_optimizer_bundle.dart b/lib/src/commands/test/templates/test_optimizer_bundle.dart index 72774a9fe..71fd84518 100644 --- a/lib/src/commands/test/templates/test_optimizer_bundle.dart +++ b/lib/src/commands/test/templates/test_optimizer_bundle.dart @@ -9,7 +9,7 @@ final testOptimizerBundle = MasonBundle.fromJson({ { "path": "test/.test_optimizer.dart", "data": - "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gQ29uc2lkZXIgYWRkaW5nIHRoaXMgZmlsZSB0byB5b3VyIC5naXRpZ25vcmUuCgp7eyNpc0ZsdXR0ZXJ9fWltcG9ydCAnZGFydDppbyc7CgppbXBvcnQgJ3BhY2thZ2U6Zmx1dHRlcl90ZXN0L2ZsdXR0ZXJfdGVzdC5kYXJ0JzsKe3svaXNGbHV0dGVyfX17e15pc0ZsdXR0ZXJ9fWltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7e3svaXNGbHV0dGVyfX0KCnt7I3Rlc3RzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7aWRlbnRpZmllcn19Owp7ey90ZXN0c319CnZvaWQgbWFpbigpIHsKe3sjaXNGbHV0dGVyfX0gIGdvbGRlbkZpbGVDb21wYXJhdG9yID0gX1Rlc3RPcHRpbWl6YXRpb25Bd2FyZUdvbGRlbkZpbGVDb21wYXJhdG9yKCk7e3svaXNGbHV0dGVyfX0Ke3sjdGVzdHN9fSAgZ3JvdXAoJ3t7e3BhdGh9fX0nLCAoKSB7IHt7aWRlbnRpZmllcn19Lm1haW4oKTsgfSk7Cnt7L3Rlc3RzfX19Cgp7eyNpc0ZsdXR0ZXJ9fQpjbGFzcyBfVGVzdE9wdGltaXphdGlvbkF3YXJlR29sZGVuRmlsZUNvbXBhcmF0b3IgZXh0ZW5kcyBMb2NhbEZpbGVDb21wYXJhdG9yIHsKICBmaW5hbCBMaXN0PFN0cmluZz4gZ29sZGVuRmlsZVBhdGhzOwoKICBfVGVzdE9wdGltaXphdGlvbkF3YXJlR29sZGVuRmlsZUNvbXBhcmF0b3IoKQogICAgICA6IGdvbGRlbkZpbGVQYXRocyA9IF9nb2xkZW5GaWxlUGF0aHMsCiAgICAgICAgc3VwZXIoX3Rlc3RGaWxlKTsKCiAgc3RhdGljIFVyaSBnZXQgX3Rlc3RGaWxlIHsKICAgIGZpbmFsIGJhc2VkaXIgPQogICAgICAgIChnb2xkZW5GaWxlQ29tcGFyYXRvciBhcyBMb2NhbEZpbGVDb21wYXJhdG9yKS5iYXNlZGlyLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gVXJpLnBhcnNlKCIkYmFzZWRpci8udGVzdF9vcHRpbWl6ZXIuZGFydCIpOwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXQgX2dvbGRlbkZpbGVQYXRocyA9PgogICAgICBEaXJlY3RvcnkuZnJvbVVyaSgoZ29sZGVuRmlsZUNvbXBhcmF0b3IgYXMgTG9jYWxGaWxlQ29tcGFyYXRvcikuYmFzZWRpcikKICAgICAgICAgIC5saXN0U3luYyhyZWN1cnNpdmU6IHRydWUsIGZvbGxvd0xpbmtzOiB0cnVlKQogICAgICAgICAgLndoZXJlVHlwZTxGaWxlPigpCiAgICAgICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnBhdGgpCiAgICAgICAgICAud2hlcmUoKHBhdGgpID0+IHBhdGguZW5kc1dpdGgoJy5wbmcnKSkKICAgICAgICAgIC50b0xpc3QoKTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldFRlc3RVcmkoVXJpIGtleSwgaW50PyB2ZXJzaW9uKSB7CiAgICBmaW5hbCBrZXlTdHJpbmcgPSBrZXkucGF0aDsKICAgIHJldHVybiBVcmkucGFyc2UoZ29sZGVuRmlsZVBhdGhzCiAgICAgICAgLnNpbmdsZVdoZXJlKChnb2xkZW5GaWxlUGF0aCkgPT4gZ29sZGVuRmlsZVBhdGguZW5kc1dpdGgoa2V5U3RyaW5nKSkpOwogIH0KfQp7ey9pc0ZsdXR0ZXJ9fQ==", + "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gQ29uc2lkZXIgYWRkaW5nIHRoaXMgZmlsZSB0byB5b3VyIC5naXRpZ25vcmUuCgp7eyNpc0ZsdXR0ZXJ9fWltcG9ydCAnZGFydDppbyc7CgppbXBvcnQgJ3BhY2thZ2U6Zmx1dHRlcl90ZXN0L2ZsdXR0ZXJfdGVzdC5kYXJ0JzsKe3svaXNGbHV0dGVyfX17e15pc0ZsdXR0ZXJ9fWltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7e3svaXNGbHV0dGVyfX0KCnt7I3Rlc3RzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7aWRlbnRpZmllcn19Owp7ey90ZXN0c319CnZvaWQgbWFpbigpIHsKe3sjaXNGbHV0dGVyfX0gIGdvbGRlbkZpbGVDb21wYXJhdG9yID0gX1Rlc3RPcHRpbWl6YXRpb25Bd2FyZUdvbGRlbkZpbGVDb21wYXJhdG9yKCk7e3svaXNGbHV0dGVyfX0Ke3sjdGVzdHN9fSAgZ3JvdXAoJ3t7e3BhdGh9fX0nLCAoKSB7IHt7aWRlbnRpZmllcn19Lm1haW4oKTsgfSk7Cnt7L3Rlc3RzfX19Cgp7eyNpc0ZsdXR0ZXJ9fQpjbGFzcyBfVGVzdE9wdGltaXphdGlvbkF3YXJlR29sZGVuRmlsZUNvbXBhcmF0b3IgZXh0ZW5kcyBMb2NhbEZpbGVDb21wYXJhdG9yIHsKICBmaW5hbCBMaXN0PFN0cmluZz4gZ29sZGVuRmlsZVBhdGhzOwoKICBfVGVzdE9wdGltaXphdGlvbkF3YXJlR29sZGVuRmlsZUNvbXBhcmF0b3IoKQogICAgICA6IGdvbGRlbkZpbGVQYXRocyA9IF9nb2xkZW5GaWxlUGF0aHMsCiAgICAgICAgc3VwZXIoX3Rlc3RGaWxlKTsKCiAgc3RhdGljIFVyaSBnZXQgX3Rlc3RGaWxlIHsKICAgIGZpbmFsIGJhc2VkaXIgPQogICAgICAgIChnb2xkZW5GaWxlQ29tcGFyYXRvciBhcyBMb2NhbEZpbGVDb21wYXJhdG9yKS5iYXNlZGlyLnRvU3RyaW5nKCk7CiAgICByZXR1cm4gVXJpLnBhcnNlKCIkYmFzZWRpci8udGVzdF9vcHRpbWl6ZXIuZGFydCIpOwogIH0KCiAgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXQgX2dvbGRlbkZpbGVQYXRocyA9PgogICAgICBEaXJlY3RvcnkuZnJvbVVyaSgoZ29sZGVuRmlsZUNvbXBhcmF0b3IgYXMgTG9jYWxGaWxlQ29tcGFyYXRvcikuYmFzZWRpcikKICAgICAgICAgIC5saXN0U3luYyhyZWN1cnNpdmU6IHRydWUsIGZvbGxvd0xpbmtzOiB0cnVlKQogICAgICAgICAgLndoZXJlVHlwZTxGaWxlPigpCiAgICAgICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnBhdGgpCiAgICAgICAgICAud2hlcmUoKHBhdGgpID0+IHBhdGguZW5kc1dpdGgoJy5wbmcnKSkKICAgICAgICAgIC50b0xpc3QoKTsKCiAgQG92ZXJyaWRlCiAgVXJpIGdldFRlc3RVcmkoVXJpIGtleSwgaW50PyB2ZXJzaW9uKSB7CiAgICBmaW5hbCBrZXlTdHJpbmcgPSBrZXkudG9GaWxlUGF0aCgpOwogICAgcmV0dXJuIFVyaS5wYXJzZShnb2xkZW5GaWxlUGF0aHMKICAgICAgICAuc2luZ2xlV2hlcmUoKGdvbGRlbkZpbGVQYXRoKSA9PiBnb2xkZW5GaWxlUGF0aC5lbmRzV2l0aChrZXlTdHJpbmcpKSk7CiAgfQp9Cnt7L2lzRmx1dHRlcn19", "type": "text" } ],