From 0313331a087bacd5c367f93c674dad71cdc95855 Mon Sep 17 00:00:00 2001 From: Efra Espada Date: Sat, 5 Oct 2024 02:10:14 +0200 Subject: [PATCH] feature: test builder --- .../bottom/catalog/test/fab_widget.test.dart | 2 +- .../bin/preview_builder/preview_builder.dart | 72 +++++++++++++++++++ lib/src/bin/tasks/main_task.dart | 4 +- lib/src/bin/tasks/preview_task.dart | 4 +- lib/src/bin/tasks/tasks/test_task.dart | 58 +++++++++++++++ 5 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 lib/src/bin/tasks/tasks/test_task.dart diff --git a/example/lib/widgets/utils/bottom/catalog/test/fab_widget.test.dart b/example/lib/widgets/utils/bottom/catalog/test/fab_widget.test.dart index 3121262..34b7fc0 100644 --- a/example/lib/widgets/utils/bottom/catalog/test/fab_widget.test.dart +++ b/example/lib/widgets/utils/bottom/catalog/test/fab_widget.test.dart @@ -1,6 +1,6 @@ /// AUTOGENERATED FILE. /// -/// Use this file for testing the widget FabWidgetPreview +/// Use this file to test the widget FabWidgetPreview /// import 'package:catalog/catalog.dart'; diff --git a/lib/src/bin/preview_builder/preview_builder.dart b/lib/src/bin/preview_builder/preview_builder.dart index ad8a6cd..ec817fc 100644 --- a/lib/src/bin/preview_builder/preview_builder.dart +++ b/lib/src/bin/preview_builder/preview_builder.dart @@ -160,6 +160,78 @@ $clazz build$clazz(Dummy dummy) { await file.writeAsString(content); } +Future generateTest( + String srcPath, + String className, + String prefix, +) async { + var clazz = className.replaceAll('()', ''); + + String fileName = srcPath.split('/').last; + String name = fileName.split('.').first; + String dirPath = srcPath.replaceAll(fileName, ''); + String testPath = '${dirPath}catalog/test/'; + + await Directory(testPath).create(recursive: true); + + String testFile = '$testPath$name.test.dart'; + File file = File(testFile); + + if (await file.exists()) { + print( + '๐Ÿงช ๐Ÿ‘Œ Test file already exist for $clazz - ${clazz}Test ($testFile)'); + return; + } + + print('๐Ÿงช Generating test for $clazz - ${clazz}Test ($testFile)'); + + var content = ''' +/// AUTOGENERATED FILE. +/// +/// Use this file to test the widget $clazz +/// + +import 'package:catalog/catalog.dart'; + +import '../dummy/$name.dummy.dart'; +import '../preview/$name.$prefix.dart'; + +class ${clazz}Test { + void main() { + group( + '$clazz - Tests', + () { + testWidgets( + 'Lorem text not found', + (tester) async { + final dummy = ${clazz}Dummy().dummies.first; + final widget = build$clazz(dummy); + await tester.test(widget); + + expect(find.text('lorem ipsu'), findsNothing); + }, + ); + + testWidgets( + 'Other lorem text not found', + (tester) async { + final dummy = ${clazz}Dummy().dummies.first; + final widget = build$clazz(dummy); + await tester.test(widget); + + expect(find.text('ipsu lorem'), findsNothing); + }, + ); + }, + ); + } +} + + '''; + + await file.writeAsString(content); +} + String dummyWidgetBuilder(String clazz) { return ''' PreviewBoundary( diff --git a/lib/src/bin/tasks/main_task.dart b/lib/src/bin/tasks/main_task.dart index b20ea2e..55d62a6 100644 --- a/lib/src/bin/tasks/main_task.dart +++ b/lib/src/bin/tasks/main_task.dart @@ -2,10 +2,12 @@ import 'base/base_task.dart'; import 'tasks/catalog_task.dart'; import 'tasks/format_task.dart'; import 'tasks/preview_task.dart'; +import 'tasks/test_task.dart'; class MainTask extends BaseTask { final tasks = [ PreviewTask(), + TestTask(), CatalogTask(), FormatTask(), ]; @@ -20,6 +22,6 @@ class MainTask extends BaseTask { print(e); } } - print('\n Previews and catalog generated \n'); + print('\n Previews, tests and catalog generated \n'); } } diff --git a/lib/src/bin/tasks/preview_task.dart b/lib/src/bin/tasks/preview_task.dart index 674c0e3..7aec303 100644 --- a/lib/src/bin/tasks/preview_task.dart +++ b/lib/src/bin/tasks/preview_task.dart @@ -1,10 +1,12 @@ import 'base/base_task.dart'; import 'tasks/format_task.dart'; import 'tasks/preview_task.dart' as preview; +import 'tasks/test_task.dart'; class PreviewTask extends BaseTask { final tasks = [ preview.PreviewTask(), + TestTask(), FormatTask(), ]; @@ -18,6 +20,6 @@ class PreviewTask extends BaseTask { print(e); } } - print('\n Previews generated \n'); + print('\n Previews and tests generated \n'); } } diff --git a/lib/src/bin/tasks/tasks/test_task.dart b/lib/src/bin/tasks/tasks/test_task.dart new file mode 100644 index 0000000..7b426ff --- /dev/null +++ b/lib/src/bin/tasks/tasks/test_task.dart @@ -0,0 +1,58 @@ +import 'dart:io'; + +import '../../preview_builder/preview_builder.dart'; +import '../../utils/configuration.dart'; +import '../base/base_task.dart'; + +class TestTask extends BaseTask { + @override + Future work(List args) async { + final base = args.isEmpty ? '' : '${args.first}/'; + + var config = loadConfigFile(base); + + final prefixValue = config['prefix'] ?? 'preview'; + + final dir = Directory('./$base${config['base']}'); + await dir.create(recursive: true); + + final dirOutPut = Directory('./$base${config['base']}/${config['output']}'); + await dirOutPut.create(recursive: true); + + final List entities = + await dir.list(recursive: true).toList(); + + final files = []; + + for (FileSystemEntity fileSystemEntity in entities) { + try { + if (fileSystemEntity is Directory) continue; + if (fileSystemEntity.path.endsWith('.DS_Store')) continue; + final File file = File(fileSystemEntity.path); + if (file.path.contains('.$prefixValue.')) continue; + final content = await file.readAsString(); + if (content.contains('@Preview(')) { + files.add(fileSystemEntity); + } + } catch (e) { + print(e); + } + } + + for (FileSystemEntity fileSystemEntity in files) { + final File file = File(fileSystemEntity.path); + var preview = await previewOnFile(base, config, file.path); + var previewAnnotation = await findPreviewAnnotation(file.path); + if (previewAnnotation == null) continue; + var className = await findClassName(file.path); + if (className == null) continue; + if (preview == null) continue; + + await generateTest( + file.path, + className, + prefixValue, + ); + } + } +}