Skip to content

Commit

Permalink
Finish create test template
Browse files Browse the repository at this point in the history
  • Loading branch information
Nialixus committed Jun 2, 2024
1 parent 5d9f08c commit 5979dbc
Show file tree
Hide file tree
Showing 38 changed files with 849 additions and 228 deletions.
8 changes: 8 additions & 0 deletions bin/api_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ Future<void> main(List<String> arguments) async {
ReadView(argument),
WriteView(argument),
],
testRunner: [
ReadControllerTest(argument),
WriteControllerTest(argument),
ReadModelTest(argument),
WriteModelTest(argument),
ReadViewTest(argument),
WriteViewTest(argument),
],
).run(buffer);

print(buffer);
Expand Down
74 changes: 74 additions & 0 deletions bin/src/read/controllers/read_controller_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
part of '../read.dart';

class ReadControllerTest extends SharedRunner {
ReadControllerTest(
super.data, {
super.type = SharedType.controllers,
});

@override
Directory get directory {
return Directory(
'${data['output']}'
.toLowerCase()
.toPath
.replaceFirst(RegExp(r'(^|/)\blib/'), 'test/') +
module.toLowerCase().toPath,
)..createSync(recursive: true);
}

@override
List<String> get submodules {
return data['read'];
}

@override
String template({
required String module,
required String submodule,
}) {
return '''
// ignore: avoid_relative_lib_imports
import '../../../../${directory.path.replaceFirst(RegExp(r'(^|/)\btest/'), 'lib/')}/${module.toLowerCase()}.dart';
import 'package:api_bloc/api_bloc.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('${module.toCamelCase()}${submodule.toCamelCase()}Controller', () {
late ${module.toCamelCase()}${submodule.toCamelCase()}Controller controller;
setUp(() {
controller = ${module.toCamelCase()}${submodule.toCamelCase()}Controller();
});
tearDown(() {
controller.dispose();
});
test('Validate Loading State', () async {
await controller.run();
expect(controller.value, isA<ReadLoadingState>());
expect(controller.value.data, isNull);
expect(controller.value.message, equals('Fetching On Progress'));
});
test('Validate Success State', () async {
await controller.run();
expect(controller.value, isA<ReadSuccessState>());
expect(controller.value, isA<ReadSuccessState<${module.toCamelCase()}${submodule.toCamelCase()}Model>>());
expect(controller.value.data, isA<${module.toCamelCase()}${submodule.toCamelCase()}Model>());
expect(controller.value.message, equals('Data Successfully Fetched'));
});
test('Validate Error State', () async {
await controller.run();
expect(controller.value, isA<ReadErrorState>());
expect(controller.value.message, equals('Something Went Wrong'));
expect(controller.value.data, isNotNull);
expect(controller.value.data, isA<StackTrace>());
});
});
}
''';
}
}
45 changes: 45 additions & 0 deletions bin/src/read/models/read_model_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
part of '../read.dart';

class ReadModelTest extends SharedRunner {
ReadModelTest(
super.data, {
super.type = SharedType.models,
});

@override
Directory get directory {
return Directory(
'${data['output']}'
.toLowerCase()
.toPath
.replaceFirst(RegExp(r'(^|/)\blib/'), 'test/') +
module.toLowerCase().toPath,
)..createSync(recursive: true);
}

@override
List<String> get submodules {
return data['read'];
}

@override
String template({
required String module,
required String submodule,
}) {
return '''
// ignore: avoid_relative_lib_imports
import '../../../../${directory.path.replaceFirst(RegExp(r'(^|/)\btest/'), 'lib/')}/${module.toLowerCase()}.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('${module.toCamelCase()}${submodule.toCamelCase()}Model', () {
test('Validate Type', () {
const ${module.toCamelCase()}${submodule.toCamelCase()}Model data = ${module.toCamelCase()}${submodule.toCamelCase()}Model.test();
expect(data, isA<${module.toCamelCase()}${submodule.toCamelCase()}Model>());
});
});
}
''';
}
}
5 changes: 5 additions & 0 deletions bin/src/read/read.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
library read;

import 'dart:io';

import '../shared/shared.dart';

part 'controllers/read_controller_test.dart';
part 'controllers/read_controller.dart';
part 'models/read_model_test.dart';
part 'models/read_model.dart';
part 'views/read_view_test.dart';
part 'views/read_view.dart';
4 changes: 2 additions & 2 deletions bin/src/read/views/read_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ final class ReadView extends SharedRunner {
return '''
part of '../$module.dart';
class ${module.toCamelCase()}${submodule.toCamelCase()}${type.name.toCamelCase()} extends StatelessWidget {
const ${module.toCamelCase()}${submodule.toCamelCase()}${type.name.toCamelCase()}({super.key});
class ${module.toCamelCase()}${submodule.toCamelCase()}${type.toString().toCamelCase()} extends StatelessWidget {
const ${module.toCamelCase()}${submodule.toCamelCase()}${type.toString().toCamelCase()}({super.key});
@override
Widget build(BuildContext context) {
Expand Down
124 changes: 124 additions & 0 deletions bin/src/read/views/read_view_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
part of '../read.dart';

class ReadViewTest extends SharedRunner {
ReadViewTest(
super.data, {
super.type = SharedType.views,
});

@override
Directory get directory {
return Directory(
'${data['output']}'
.toLowerCase()
.toPath
.replaceFirst(RegExp(r'(^|/)\blib/'), 'test/') +
module.toLowerCase().toPath,
)..createSync(recursive: true);
}

@override
List<String> get submodules {
return data['read'];
}

@override
String template({
required String module,
required String submodule,
}) {
return '''
// ignore: avoid_relative_lib_imports
import '../../../../${directory.path.replaceFirst(RegExp(r'(^|/)\btest/'), 'lib/')}/${module.toLowerCase()}.dart';
import 'package:api_bloc/api_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('${module.toCamelCase()}${submodule.toCamelCase()}View', () {
testWidgets('Validate Loading Consumer', (tester) async {
late ${module.toCamelCase()}${submodule.toCamelCase()}Controller controller;
setUp(() {
controller = ${module.toCamelCase()}${submodule.toCamelCase()}Controller();
});
tearDown(() {
controller.dispose();
});
await controller.run();
expect(controller.value, isA<ReadLoadingState>());
expect(controller.value, isA<ReadLoadingState<dynamic>>());
expect(controller.value.data, isNull);
expect(controller.value.message, equals('Submitting In Progress'));
expect(() async {
await tester.pumpWidget(const MaterialApp(home: ${module.toCamelCase()}${submodule.toCamelCase()}View()));
await tester.pump();
expect(find.byType(Text), findsNothing);
expect(find.text('Submitting In Progress'), findsNothing);
expect(find.byType(CircularProgressIndicator), findsOneWidget);
expect(find.byType(SnackBar), findsNothing);
}, returnsNormally);
});
testWidgets('Validate Success Consumer', (tester) async {
late ${module.toCamelCase()}${submodule.toCamelCase()}Controller controller;
setUp(() {
controller = ${module.toCamelCase()}${submodule.toCamelCase()}Controller();
});
tearDown(() {
controller.dispose();
});
await controller.run();
expect(controller.value, isA<ReadSuccessState>());
expect(controller.value, isA<ReadSuccessState<${module.toCamelCase()}${submodule.toCamelCase()}Model>>());
expect(controller.value.data, isA<${module.toCamelCase()}${submodule.toCamelCase()}Model>());
expect(controller.value.message, equals('Data Successfully Submitted'));
expect(() async {
await tester.pumpWidget(const MaterialApp(home: ${module.toCamelCase()}${submodule.toCamelCase()}View()));
await tester.pump();
expect(find.byType(Text), findsWidgets);
expect(find.text('Data Successfully Submitted'), findsWidgets);
expect(find.byType(CircularProgressIndicator), findsNothing);
expect(find.byType(SnackBar), findsOneWidget);
}, returnsNormally);
});
testWidgets('Validate Error Consumer', (tester) async {
late ${module.toCamelCase()}${submodule.toCamelCase()}Controller controller;
setUp(() {
controller = ${module.toCamelCase()}${submodule.toCamelCase()}Controller();
});
tearDown(() {
controller.dispose();
});
await controller.run();
expect(controller.value, isA<ReadErrorState>());
expect(controller.value.message, equals('Something Went Wrong'));
expect(controller.value.data, isNotNull);
expect(controller.value.data, isA<StackTrace>());
expect(() async {
await tester.pumpWidget(const MaterialApp(home: ${module.toCamelCase()}${submodule.toCamelCase()}View()));
await tester.pump();
expect(find.byType(Text), findsWidgets);
expect(find.text('Something Went Wrong'), findsWidgets);
expect(find.byType(CircularProgressIndicator), findsNothing);
expect(find.byType(SnackBar), findsOneWidget);
}, returnsNormally);
});
});
}
''';
}
}
8 changes: 0 additions & 8 deletions bin/src/shared/models/shared_enum.dart

This file was deleted.

27 changes: 22 additions & 5 deletions bin/src/shared/shared.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ library shared;
import 'dart:io';
import 'package:args/args.dart';

part 'models/shared_enum.dart';
part 'models/shared_extension.dart';
part 'models/shared_runner.dart';
part 'shared_enum.dart';
part 'shared_extension.dart';
part 'shared_runner.dart';

final class Shared extends SharedRunner {
const Shared(
super.data, {
required this.runner,
required this.testRunner,
}) : super(type: SharedType.models);

final List<SharedRunner> runner;
final List<SharedRunner> testRunner;

@override
List<String> get submodules {
Expand All @@ -30,6 +32,7 @@ final class Shared extends SharedRunner {
// Auto-Generated API Bloc structure
// Created at ${DateTime.now()}
// 🍔 [Buy me a coffee](https://www.buymeacoffee.com/nialixus) 🚀
library ${module.toLowerCase()};
import 'package:api_bloc/api_bloc.dart';
import 'package:flutter/material.dart';
Expand All @@ -45,10 +48,10 @@ import 'package:flutter/material.dart';

@override
void run(StringBuffer buffer) {
final folder = Directory(directory.path.toPath)
Directory folder = Directory(directory.path.toPath)
..createSync(recursive: true);
buffer.write('📂 ${folder.path.toPath}\n');
final file = File('${folder.path.toPath}$module.dart');
File file = File('${folder.path.toPath}$module.dart');

if (file.existsSync()) {
buffer.write('\x1B[30m 📄 ${file.path} \x1B[33m[SKIPPED]\x1B[32m\n');
Expand All @@ -58,8 +61,22 @@ import 'package:flutter/material.dart';
..createSync(recursive: true)
..writeAsStringSync(template(module: module, submodule: ''));
}

for (var runner in this.runner) {
runner.run(buffer);
}

folder = Directory('${data['output']}'
.toLowerCase()
.toPath
.replaceFirst(RegExp(r'(^|/)\blib/'), 'test/') +
module.toLowerCase().toPath)
..createSync(recursive: true);

buffer.write('📂 ${folder.path.toPath}\n');

for (var runner in testRunner) {
runner.run(buffer);
}
}
}
20 changes: 20 additions & 0 deletions bin/src/shared/shared_enum.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
part of 'shared.dart';

/// The type of the module, either `Model`, `View` or `Controller.
enum SharedType {
models,
views,
controllers;

@override
String toString() {
switch (this) {
case SharedType.models:
return 'Model';
case SharedType.views:
return 'View';
case SharedType.controllers:
return 'Controller';
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
part of '../shared.dart';
part of 'shared.dart';

extension SharedExtension on String {
String get toPath => endsWith('/') ? this : '$this/';
Expand Down
Loading

0 comments on commit 5979dbc

Please sign in to comment.