diff --git a/.fvm/fvm_config.json b/.fvm/fvm_config.json index 35101378..fcad119e 100644 --- a/.fvm/fvm_config.json +++ b/.fvm/fvm_config.json @@ -1,4 +1,4 @@ { - "flutterSdkVersion": "2.5.1", + "flutterSdkVersion": "3.0.1", "flavors": {} } \ No newline at end of file diff --git a/README.md b/README.md index 0274a08f..f18cb823 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) [![Open Source](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://opensource.org/) -![Dart Version](https://img.shields.io/static/v1?label=dart&message=2.14.2&color=00579d) -![Flutter Version](https://img.shields.io/static/v1?label=flutter&message=2.5.1&color=42a5f5) +![Dart Version](https://img.shields.io/static/v1?label=dart&message=2.17.1&color=00579d) +![Flutter Version](https://img.shields.io/static/v1?label=flutter&message=3.0.1&color=42a5f5) ![Null Safety](https://img.shields.io/static/v1?label=null-safety&message=done&color=success) # **4Dev Flutter - Enquetes para Programadores** @@ -114,4 +114,4 @@ O objetivo do treinamento é mostrar como criar um aplicativo com Flutter usando * Test Doubles * Mocks * Stubs -* Spies \ No newline at end of file +* Spies diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 00000000..84a55123 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,86 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + require_trailing_commas: true + always_put_required_named_parameters_first: true + use_super_parameters: true + always_declare_return_types: true + avoid_print: true + curly_braces_in_flow_control_structures: true + sized_box_shrink_expand: true + avoid_unnecessary_containers: true + avoid_web_libraries_in_flutter: true + no_logic_in_create_state: false + prefer_const_constructors: true + prefer_const_constructors_in_immutables: true + prefer_const_declarations: true + prefer_const_literals_to_create_immutables: true + sized_box_for_whitespace: true + use_full_hex_values_for_flutter_colors: true + cancel_subscriptions: true + close_sinks: true + comment_references: false + one_member_abstracts: false + # only_throw_errors: true + package_api_docs: true + prefer_single_quotes: true + sort_child_properties_last: true + camel_case_types: true + library_names: true + file_names: true + library_prefixes: true + non_constant_identifier_names: true + constant_identifier_names: false + directives_ordering: true + slash_for_doc_comments: false + prefer_interpolation_to_compose_strings: true + prefer_collection_literals: true + avoid_function_literals_in_foreach_calls: false + avoid_init_to_null: true + prefer_initializing_formals: true + type_init_formals: true + empty_constructor_bodies: true + empty_statements: true + unnecessary_new: true + unnecessary_this: true + unnecessary_const: true + unnecessary_overrides: true + unnecessary_parenthesis: true + unnecessary_getters_setters: true + avoid_setters_without_getters: true + avoid_return_types_on_setters: true + parameter_assignments: true + prefer_function_declarations_over_variables: false + unawaited_futures: false + prefer_relative_imports: true + annotate_overrides: false + overridden_fields: false + deprecated_member_use: true + + + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/app/build.gradle b/android/app/build.gradle index 3db7a877..e008472f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 28 + compileSdkVersion 31 sourceSets { main.java.srcDirs += 'src/main/kotlin' diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a3f2b8d7..d9d87f3c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,11 +6,12 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - - diff --git a/android/build.gradle b/android/build.gradle index 3100ad2d..6dfcd6a8 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.6.21' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -14,15 +14,13 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { project.evaluationDependsOn(':app') } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 296b146b..cc5527d7 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/lib/data/cache/cache.dart b/lib/data/cache/cache.dart index 30617400..2faa3deb 100644 --- a/lib/data/cache/cache.dart +++ b/lib/data/cache/cache.dart @@ -1,4 +1,4 @@ -export './save_secure_cache_storage.dart'; -export './fetch_secure_cache_storage.dart'; +export './cache_storage.dart'; export './delete_secure_cache_storage.dart'; -export './cache_storage.dart'; \ No newline at end of file +export './fetch_secure_cache_storage.dart'; +export './save_secure_cache_storage.dart'; diff --git a/lib/data/cache/cache_storage.dart b/lib/data/cache/cache_storage.dart index d9aace1d..0e015f75 100644 --- a/lib/data/cache/cache_storage.dart +++ b/lib/data/cache/cache_storage.dart @@ -1,5 +1,5 @@ abstract class CacheStorage { Future fetch(String key); Future delete(String key); - Future save({ required String key, required dynamic value }); -} \ No newline at end of file + Future save({required String key, required dynamic value}); +} diff --git a/lib/data/cache/delete_secure_cache_storage.dart b/lib/data/cache/delete_secure_cache_storage.dart index 07c026a1..d99126bb 100644 --- a/lib/data/cache/delete_secure_cache_storage.dart +++ b/lib/data/cache/delete_secure_cache_storage.dart @@ -1,3 +1,3 @@ abstract class DeleteSecureCacheStorage { Future delete(String key); -} \ No newline at end of file +} diff --git a/lib/data/cache/fetch_secure_cache_storage.dart b/lib/data/cache/fetch_secure_cache_storage.dart index abe30e07..0470cec4 100644 --- a/lib/data/cache/fetch_secure_cache_storage.dart +++ b/lib/data/cache/fetch_secure_cache_storage.dart @@ -1,3 +1,3 @@ abstract class FetchSecureCacheStorage { Future fetch(String key); -} \ No newline at end of file +} diff --git a/lib/data/cache/save_secure_cache_storage.dart b/lib/data/cache/save_secure_cache_storage.dart index ab114df9..215f9d8a 100644 --- a/lib/data/cache/save_secure_cache_storage.dart +++ b/lib/data/cache/save_secure_cache_storage.dart @@ -1,6 +1,3 @@ abstract class SaveSecureCacheStorage { - Future save({ - required String key, - required String value - }); -} \ No newline at end of file + Future save({required String key, required String value}); +} diff --git a/lib/data/data.dart b/lib/data/data.dart new file mode 100644 index 00000000..123def11 --- /dev/null +++ b/lib/data/data.dart @@ -0,0 +1,4 @@ +export './cache/cache.dart'; +export './http/http.dart'; +export './models/models.dart'; +export './usecases/usecases.dart'; diff --git a/lib/data/http/http.dart b/lib/data/http/http.dart index b114ec29..0b84f404 100644 --- a/lib/data/http/http.dart +++ b/lib/data/http/http.dart @@ -1,2 +1,2 @@ export './http_client.dart'; -export './http_error.dart'; \ No newline at end of file +export './http_error.dart'; diff --git a/lib/data/http/http_client.dart b/lib/data/http/http_client.dart index a2ff5ced..8ccf6c61 100644 --- a/lib/data/http/http_client.dart +++ b/lib/data/http/http_client.dart @@ -5,4 +5,4 @@ abstract class HttpClient { Map? body, Map? headers, }); -} \ No newline at end of file +} diff --git a/lib/data/http/http_error.dart b/lib/data/http/http_error.dart index dbf018f5..ce1be5cc 100644 --- a/lib/data/http/http_error.dart +++ b/lib/data/http/http_error.dart @@ -5,4 +5,4 @@ enum HttpError { unauthorized, forbidden, invalidData -} \ No newline at end of file +} diff --git a/lib/data/models/local_survey_answer_model.dart b/lib/data/models/local_survey_answer_model.dart index 5ed5fcd4..912eda3c 100644 --- a/lib/data/models/local_survey_answer_model.dart +++ b/lib/data/models/local_survey_answer_model.dart @@ -1,4 +1,4 @@ -import '../../domain/entities/entities.dart'; +import '../../domain/domain.dart'; class LocalSurveyAnswerModel { final String? image; @@ -7,42 +7,45 @@ class LocalSurveyAnswerModel { final int percent; LocalSurveyAnswerModel({ - this.image, required this.answer, required this.isCurrentAnswer, required this.percent, + this.image, }); factory LocalSurveyAnswerModel.fromJson(Map json) { - if (!json.keys.toSet().containsAll(['answer', 'isCurrentAnswer', 'percent'])) { + if (!json.keys + .toSet() + .containsAll(['answer', 'isCurrentAnswer', 'percent'])) { throw Exception(); } return LocalSurveyAnswerModel( image: json['image'], answer: json['answer'], isCurrentAnswer: json['isCurrentAnswer'].toLowerCase() == 'true', - percent: int.parse(json['percent']) + percent: int.parse(json['percent']), ); } - factory LocalSurveyAnswerModel.fromEntity(SurveyAnswerEntity entity) => LocalSurveyAnswerModel( - image: entity.image, - answer: entity.answer, - percent: entity.percent, - isCurrentAnswer: entity.isCurrentAnswer - ); + factory LocalSurveyAnswerModel.fromEntity(SurveyAnswerEntity entity) => + LocalSurveyAnswerModel( + image: entity.image, + answer: entity.answer, + percent: entity.percent, + isCurrentAnswer: entity.isCurrentAnswer, + ); SurveyAnswerEntity toEntity() => SurveyAnswerEntity( - image: image, - answer: answer, - isCurrentAnswer: isCurrentAnswer, - percent: percent - ); + image: image, + answer: answer, + isCurrentAnswer: isCurrentAnswer, + percent: percent, + ); Map toJson() => { - 'image': image, - 'answer': answer, - 'isCurrentAnswer': isCurrentAnswer.toString(), - 'percent': percent.toString() - }; -} \ No newline at end of file + 'image': image, + 'answer': answer, + 'isCurrentAnswer': isCurrentAnswer.toString(), + 'percent': percent.toString() + }; +} diff --git a/lib/data/models/local_survey_model.dart b/lib/data/models/local_survey_model.dart index b07f2e18..5ac624dc 100644 --- a/lib/data/models/local_survey_model.dart +++ b/lib/data/models/local_survey_model.dart @@ -1,4 +1,4 @@ -import '../../domain/entities/entities.dart'; +import '../../domain/domain.dart'; class LocalSurveyModel { final String id; @@ -14,7 +14,9 @@ class LocalSurveyModel { }); factory LocalSurveyModel.fromJson(Map json) { - if (!json.keys.toSet().containsAll(['id', 'question', 'date', 'didAnswer'])) { + if (!json.keys + .toSet() + .containsAll(['id', 'question', 'date', 'didAnswer'])) { throw Exception(); } return LocalSurveyModel( @@ -26,23 +28,23 @@ class LocalSurveyModel { } factory LocalSurveyModel.fromEntity(SurveyEntity entity) => LocalSurveyModel( - id: entity.id, - question: entity.question, - date: entity.dateTime, - didAnswer: entity.didAnswer, - ); + id: entity.id, + question: entity.question, + date: entity.dateTime, + didAnswer: entity.didAnswer, + ); SurveyEntity toEntity() => SurveyEntity( - id: id, - question: question, - dateTime: date, - didAnswer: didAnswer, - ); + id: id, + question: question, + dateTime: date, + didAnswer: didAnswer, + ); Map toJson() => { - 'id': id, - 'question': question, - 'date': date.toIso8601String(), - 'didAnswer': didAnswer.toString(), - }; -} \ No newline at end of file + 'id': id, + 'question': question, + 'date': date.toIso8601String(), + 'didAnswer': didAnswer.toString(), + }; +} diff --git a/lib/data/models/local_survey_result_model.dart b/lib/data/models/local_survey_result_model.dart index 4bbb39e5..2c70e958 100644 --- a/lib/data/models/local_survey_result_model.dart +++ b/lib/data/models/local_survey_result_model.dart @@ -1,5 +1,5 @@ -import '../../domain/entities/entities.dart'; import './models.dart'; +import '../../domain/domain.dart'; class LocalSurveyResultModel { final String surveyId; @@ -19,25 +19,41 @@ class LocalSurveyResultModel { return LocalSurveyResultModel( surveyId: json['surveyId'], question: json['question'], - answers: json['answers'].map((answerJson) => LocalSurveyAnswerModel.fromJson(answerJson)).toList() + answers: json['answers'] + .map( + (answerJson) => LocalSurveyAnswerModel.fromJson(answerJson), + ) + .toList(), ); } - factory LocalSurveyResultModel.fromEntity(SurveyResultEntity entity) => LocalSurveyResultModel( - surveyId: entity.surveyId, - question: entity.question, - answers: entity.answers.map((answer) => LocalSurveyAnswerModel.fromEntity(answer)).toList() - ); + factory LocalSurveyResultModel.fromEntity(SurveyResultEntity entity) => + LocalSurveyResultModel( + surveyId: entity.surveyId, + question: entity.question, + answers: entity.answers + .map( + (SurveyAnswerEntity answer) => + LocalSurveyAnswerModel.fromEntity(answer), + ) + .toList(), + ); SurveyResultEntity toEntity() => SurveyResultEntity( - surveyId: surveyId, - question: question, - answers: answers.map((answer) => answer.toEntity()).toList() - ); + surveyId: surveyId, + question: question, + answers: answers + .map( + (LocalSurveyAnswerModel answer) => answer.toEntity(), + ) + .toList(), + ); Map toJson() => { - 'surveyId': surveyId, - 'question': question, - 'answers': answers.map((answer) => answer.toJson()).toList() - }; -} \ No newline at end of file + 'surveyId': surveyId, + 'question': question, + 'answers': answers + .map((LocalSurveyAnswerModel answer) => answer.toJson()) + .toList() + }; +} diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index 20f95718..67b25f76 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -1,7 +1,7 @@ -export './remote_account_model.dart'; -export './remote_survey_model.dart'; +export './local_survey_answer_model.dart'; export './local_survey_model.dart'; +export './local_survey_result_model.dart'; +export './remote_account_model.dart'; export './remote_survey_answer_model.dart'; +export './remote_survey_model.dart'; export './remote_survey_result_model.dart'; -export './local_survey_answer_model.dart'; -export './local_survey_result_model.dart'; \ No newline at end of file diff --git a/lib/data/models/remote_account_model.dart b/lib/data/models/remote_account_model.dart index 0bbceba9..ef3b2bf8 100644 --- a/lib/data/models/remote_account_model.dart +++ b/lib/data/models/remote_account_model.dart @@ -1,10 +1,10 @@ -import '../../domain/entities/entities.dart'; +import '../../domain/domain.dart'; import '../http/http.dart'; class RemoteAccountModel { final String accessToken; - RemoteAccountModel({ required this.accessToken }); + RemoteAccountModel({required this.accessToken}); factory RemoteAccountModel.fromJson(Map json) { if (!json.containsKey('accessToken')) { @@ -14,4 +14,4 @@ class RemoteAccountModel { } AccountEntity toEntity() => AccountEntity(token: accessToken); -} \ No newline at end of file +} diff --git a/lib/data/models/remote_survey_answer_model.dart b/lib/data/models/remote_survey_answer_model.dart index c044da16..f82d51e7 100644 --- a/lib/data/models/remote_survey_answer_model.dart +++ b/lib/data/models/remote_survey_answer_model.dart @@ -1,4 +1,4 @@ -import '../../domain/entities/entities.dart'; +import '../../domain/domain.dart'; import '../http/http.dart'; class RemoteSurveyAnswerModel { @@ -8,14 +8,16 @@ class RemoteSurveyAnswerModel { final int percent; RemoteSurveyAnswerModel({ - this.image, required this.answer, required this.isCurrentAccountAnswer, required this.percent, + this.image, }); factory RemoteSurveyAnswerModel.fromJson(Map json) { - if (!json.keys.toSet().containsAll(['answer', 'isCurrentAccountAnswer', 'percent'])) { + if (!json.keys + .toSet() + .containsAll(['answer', 'isCurrentAccountAnswer', 'percent'])) { throw HttpError.invalidData; } return RemoteSurveyAnswerModel( @@ -27,9 +29,9 @@ class RemoteSurveyAnswerModel { } SurveyAnswerEntity toEntity() => SurveyAnswerEntity( - image: image, - answer: answer, - isCurrentAnswer: isCurrentAccountAnswer, - percent: percent, - ); -} \ No newline at end of file + image: image, + answer: answer, + isCurrentAnswer: isCurrentAccountAnswer, + percent: percent, + ); +} diff --git a/lib/data/models/remote_survey_model.dart b/lib/data/models/remote_survey_model.dart index 30fb7dba..db71b286 100644 --- a/lib/data/models/remote_survey_model.dart +++ b/lib/data/models/remote_survey_model.dart @@ -1,5 +1,5 @@ -import '../../domain/entities/entities.dart'; import '../../data/http/http.dart'; +import '../../domain/domain.dart'; class RemoteSurveyModel { final String id; @@ -15,7 +15,9 @@ class RemoteSurveyModel { }); factory RemoteSurveyModel.fromJson(Map json) { - if (!json.keys.toSet().containsAll(['id', 'question', 'date', 'didAnswer'])) { + if (!json.keys + .toSet() + .containsAll(['id', 'question', 'date', 'didAnswer'])) { throw HttpError.invalidData; } return RemoteSurveyModel( @@ -27,9 +29,9 @@ class RemoteSurveyModel { } SurveyEntity toEntity() => SurveyEntity( - id: id, - question: question, - dateTime: DateTime.parse(date), - didAnswer: didAnswer, - ); -} \ No newline at end of file + id: id, + question: question, + dateTime: DateTime.parse(date), + didAnswer: didAnswer, + ); +} diff --git a/lib/data/models/remote_survey_result_model.dart b/lib/data/models/remote_survey_result_model.dart index bcf0b9d5..1fb9605e 100644 --- a/lib/data/models/remote_survey_result_model.dart +++ b/lib/data/models/remote_survey_result_model.dart @@ -1,6 +1,6 @@ -import '../../domain/entities/entities.dart'; -import '../http/http.dart'; import './models.dart'; +import '../../domain/domain.dart'; +import '../http/http.dart'; class RemoteSurveyResultModel { final String surveyId; @@ -14,19 +14,29 @@ class RemoteSurveyResultModel { }); factory RemoteSurveyResultModel.fromJson(Map json) { - if (!json.keys.toSet().containsAll(['surveyId', 'question', 'answers'])) { + if (!json.keys + .toSet() + .containsAll(['surveyId', 'question', 'answers'])) { throw HttpError.invalidData; } return RemoteSurveyResultModel( surveyId: json['surveyId'], question: json['question'], - answers: json['answers'].map((answerJson) => RemoteSurveyAnswerModel.fromJson(answerJson)).toList(), + answers: json['answers'] + .map( + (answerJson) => RemoteSurveyAnswerModel.fromJson(answerJson), + ) + .toList(), ); } SurveyResultEntity toEntity() => SurveyResultEntity( - surveyId: surveyId, - question: question, - answers: answers.map((answer) => answer.toEntity()).toList(), - ); -} \ No newline at end of file + surveyId: surveyId, + question: question, + answers: answers + .map( + (RemoteSurveyAnswerModel answer) => answer.toEntity(), + ) + .toList(), + ); +} diff --git a/lib/data/usecases/add_account/add_account.dart b/lib/data/usecases/add_account/add_account.dart index 5e014116..2c840207 100644 --- a/lib/data/usecases/add_account/add_account.dart +++ b/lib/data/usecases/add_account/add_account.dart @@ -1 +1 @@ -export './remote_add_account.dart'; \ No newline at end of file +export './remote_add_account.dart'; diff --git a/lib/data/usecases/add_account/remote_add_account.dart b/lib/data/usecases/add_account/remote_add_account.dart index 4d613774..70078b93 100644 --- a/lib/data/usecases/add_account/remote_add_account.dart +++ b/lib/data/usecases/add_account/remote_add_account.dart @@ -8,20 +8,19 @@ class RemoteAddAccount implements AddAccount { final HttpClient httpClient; final String url; - RemoteAddAccount({ - required this.httpClient, - required this.url - }); + RemoteAddAccount({required this.httpClient, required this.url}); + @override Future add(AddAccountParams params) async { - final body = RemoteAddAccountParams.fromDomain(params).toJson(); + final Map body = RemoteAddAccountParams.fromDomain(params).toJson(); try { - final httpResponse = await httpClient.request(url: url, method: 'post', body: body); + final httpResponse = + await httpClient.request(url: url, method: 'post', body: body); return RemoteAccountModel.fromJson(httpResponse).toEntity(); - } on HttpError catch(error) { + } on HttpError catch (error) { throw error == HttpError.forbidden - ? DomainError.emailInUse - : DomainError.unexpected; + ? DomainError.emailInUse + : DomainError.unexpected; } } } @@ -36,20 +35,21 @@ class RemoteAddAccountParams { required this.name, required this.email, required this.password, - required this.passwordConfirmation + required this.passwordConfirmation, }); - factory RemoteAddAccountParams.fromDomain(AddAccountParams params) => RemoteAddAccountParams( - name: params.name, - email: params.email, - password: params.password, - passwordConfirmation: params.passwordConfirmation, - ); + factory RemoteAddAccountParams.fromDomain(AddAccountParams params) => + RemoteAddAccountParams( + name: params.name, + email: params.email, + password: params.password, + passwordConfirmation: params.passwordConfirmation, + ); Map toJson() => { - 'name': name, - 'email': email, - 'password': password, - 'passwordConfirmation': passwordConfirmation, - }; -} \ No newline at end of file + 'name': name, + 'email': email, + 'password': password, + 'passwordConfirmation': passwordConfirmation, + }; +} diff --git a/lib/data/usecases/authentication/authentication.dart b/lib/data/usecases/authentication/authentication.dart index c7f5c5bf..da5e00b5 100644 --- a/lib/data/usecases/authentication/authentication.dart +++ b/lib/data/usecases/authentication/authentication.dart @@ -1 +1 @@ -export './remote_authentication.dart'; \ No newline at end of file +export './remote_authentication.dart'; diff --git a/lib/data/usecases/authentication/remote_authentication.dart b/lib/data/usecases/authentication/remote_authentication.dart index fe1edba7..d62447d2 100644 --- a/lib/data/usecases/authentication/remote_authentication.dart +++ b/lib/data/usecases/authentication/remote_authentication.dart @@ -8,20 +8,19 @@ class RemoteAuthentication implements Authentication { final HttpClient httpClient; final String url; - RemoteAuthentication({ - required this.httpClient, - required this.url - }); + RemoteAuthentication({required this.httpClient, required this.url}); + @override Future auth(AuthenticationParams params) async { - final body = RemoteAuthenticationParams.fromDomain(params).toJson(); + final Map body = RemoteAuthenticationParams.fromDomain(params).toJson(); try { - final httpResponse = await httpClient.request(url: url, method: 'post', body: body); + final httpResponse = + await httpClient.request(url: url, method: 'post', body: body); return RemoteAccountModel.fromJson(httpResponse).toEntity(); - } on HttpError catch(error) { + } on HttpError catch (error) { throw error == HttpError.unauthorized - ? DomainError.invalidCredentials - : DomainError.unexpected; + ? DomainError.invalidCredentials + : DomainError.unexpected; } } } @@ -30,13 +29,10 @@ class RemoteAuthenticationParams { final String email; final String password; - RemoteAuthenticationParams({ - required this.email, - required this.password - }); + RemoteAuthenticationParams({required this.email, required this.password}); - factory RemoteAuthenticationParams.fromDomain(AuthenticationParams params) => - RemoteAuthenticationParams(email: params.email, password: params.secret); + factory RemoteAuthenticationParams.fromDomain(AuthenticationParams params) => + RemoteAuthenticationParams(email: params.email, password: params.secret); Map toJson() => {'email': email, 'password': password}; -} \ No newline at end of file +} diff --git a/lib/data/usecases/load_current_account/load_current_account.dart b/lib/data/usecases/load_current_account/load_current_account.dart index 07d48f1b..584622ae 100644 --- a/lib/data/usecases/load_current_account/load_current_account.dart +++ b/lib/data/usecases/load_current_account/load_current_account.dart @@ -1 +1 @@ -export './local_load_current_account.dart'; \ No newline at end of file +export './local_load_current_account.dart'; diff --git a/lib/data/usecases/load_current_account/local_load_current_account.dart b/lib/data/usecases/load_current_account/local_load_current_account.dart index 87b02494..7b3f4b19 100644 --- a/lib/data/usecases/load_current_account/local_load_current_account.dart +++ b/lib/data/usecases/load_current_account/local_load_current_account.dart @@ -6,15 +6,16 @@ import '../../cache/cache.dart'; class LocalLoadCurrentAccount implements LoadCurrentAccount { final FetchSecureCacheStorage fetchSecureCacheStorage; - LocalLoadCurrentAccount({ required this.fetchSecureCacheStorage }); + LocalLoadCurrentAccount({required this.fetchSecureCacheStorage}); + @override Future load() async { try { - final token = await fetchSecureCacheStorage.fetch('token'); + final String? token = await fetchSecureCacheStorage.fetch('token'); if (token == null) throw Error(); return AccountEntity(token: token); - } catch(error) { + } catch (error) { throw DomainError.unexpected; } } -} \ No newline at end of file +} diff --git a/lib/data/usecases/load_survey_result/load_survey_result.dart b/lib/data/usecases/load_survey_result/load_survey_result.dart index eebdbae9..cb61ef40 100644 --- a/lib/data/usecases/load_survey_result/load_survey_result.dart +++ b/lib/data/usecases/load_survey_result/load_survey_result.dart @@ -1,2 +1,2 @@ +export './local_load_survey_result.dart'; export './remote_load_survey_result.dart'; -export './local_load_survey_result.dart'; \ No newline at end of file diff --git a/lib/data/usecases/load_survey_result/local_load_survey_result.dart b/lib/data/usecases/load_survey_result/local_load_survey_result.dart index 18de8e37..ae4534e6 100644 --- a/lib/data/usecases/load_survey_result/local_load_survey_result.dart +++ b/lib/data/usecases/load_survey_result/local_load_survey_result.dart @@ -7,16 +7,17 @@ import '../../models/models.dart'; class LocalLoadSurveyResult implements LoadSurveyResult { final CacheStorage cacheStorage; - LocalLoadSurveyResult({ required this.cacheStorage }); + LocalLoadSurveyResult({required this.cacheStorage}); - Future loadBySurvey({ required String surveyId }) async { + @override + Future loadBySurvey({required String surveyId}) async { try { final data = await cacheStorage.fetch('survey_result/$surveyId'); if (data?.isEmpty != false) { throw Exception(); } return LocalSurveyResultModel.fromJson(data).toEntity(); - } catch(error) { + } catch (error) { throw DomainError.unexpected; } } @@ -25,17 +26,20 @@ class LocalLoadSurveyResult implements LoadSurveyResult { try { final data = await cacheStorage.fetch('survey_result/$surveyId'); LocalSurveyResultModel.fromJson(data).toEntity(); - } catch(error) { + } catch (error) { await cacheStorage.delete('survey_result/$surveyId'); } } Future save(SurveyResultEntity surveyResult) async { try { - final json = LocalSurveyResultModel.fromEntity(surveyResult).toJson(); - await cacheStorage.save(key: 'survey_result/${surveyResult.surveyId}', value: json); - } catch(error) { + final Map json = LocalSurveyResultModel.fromEntity(surveyResult).toJson(); + await cacheStorage.save( + key: 'survey_result/${surveyResult.surveyId}', + value: json, + ); + } catch (error) { throw DomainError.unexpected; } } -} \ No newline at end of file +} diff --git a/lib/data/usecases/load_survey_result/remote_load_survey_result.dart b/lib/data/usecases/load_survey_result/remote_load_survey_result.dart index a7313c0a..038c0d2a 100644 --- a/lib/data/usecases/load_survey_result/remote_load_survey_result.dart +++ b/lib/data/usecases/load_survey_result/remote_load_survey_result.dart @@ -8,19 +8,17 @@ class RemoteLoadSurveyResult implements LoadSurveyResult { final String url; final HttpClient httpClient; - RemoteLoadSurveyResult({ - required this.url, - required this.httpClient - }); + RemoteLoadSurveyResult({required this.url, required this.httpClient}); - Future loadBySurvey({ required String surveyId }) async { + @override + Future loadBySurvey({required String surveyId}) async { try { final json = await httpClient.request(url: url, method: 'get'); return RemoteSurveyResultModel.fromJson(json).toEntity(); - } on HttpError catch(error) { + } on HttpError catch (error) { throw error == HttpError.forbidden - ? DomainError.accessDenied - : DomainError.unexpected; + ? DomainError.accessDenied + : DomainError.unexpected; } } -} \ No newline at end of file +} diff --git a/lib/data/usecases/load_surveys/load_surveys.dart b/lib/data/usecases/load_surveys/load_surveys.dart index 54806ea3..24e12235 100644 --- a/lib/data/usecases/load_surveys/load_surveys.dart +++ b/lib/data/usecases/load_surveys/load_surveys.dart @@ -1,2 +1,2 @@ +export './local_load_surveys.dart'; export './remote_load_surveys.dart'; -export './local_load_surveys.dart'; \ No newline at end of file diff --git a/lib/data/usecases/load_surveys/local_load_surveys.dart b/lib/data/usecases/load_surveys/local_load_surveys.dart index 34961500..e0619a0e 100644 --- a/lib/data/usecases/load_surveys/local_load_surveys.dart +++ b/lib/data/usecases/load_surveys/local_load_surveys.dart @@ -7,8 +7,9 @@ import '../../models/models.dart'; class LocalLoadSurveys implements LoadSurveys { final CacheStorage cacheStorage; - LocalLoadSurveys({ required this.cacheStorage }); + LocalLoadSurveys({required this.cacheStorage}); + @override Future> load() async { try { final data = await cacheStorage.fetch('surveys'); @@ -16,7 +17,7 @@ class LocalLoadSurveys implements LoadSurveys { throw Exception(); } return _mapToEntity(data); - } catch(error) { + } catch (error) { throw DomainError.unexpected; } } @@ -25,23 +26,27 @@ class LocalLoadSurveys implements LoadSurveys { try { final data = await cacheStorage.fetch('surveys'); _mapToEntity(data); - } catch(error) { + } catch (error) { await cacheStorage.delete('surveys'); } } Future save(List surveys) async { try { - final json = _mapToJson(surveys); + final List json = _mapToJson(surveys); await cacheStorage.save(key: 'surveys', value: json); - } catch(error) { + } catch (error) { throw DomainError.unexpected; } } - List _mapToEntity(dynamic list) => - list.map((json) => LocalSurveyModel.fromJson(json).toEntity()).toList(); + List _mapToEntity(dynamic list) => list + .map((json) => LocalSurveyModel.fromJson(json).toEntity()) + .toList(); - List _mapToJson(List list) => - list.map((entity) => LocalSurveyModel.fromEntity(entity).toJson()).toList(); -} \ No newline at end of file + List _mapToJson(List list) => list + .map( + (SurveyEntity entity) => LocalSurveyModel.fromEntity(entity).toJson(), + ) + .toList(); +} diff --git a/lib/data/usecases/load_surveys/remote_load_surveys.dart b/lib/data/usecases/load_surveys/remote_load_surveys.dart index 8b7f105c..b503ba9c 100644 --- a/lib/data/usecases/load_surveys/remote_load_surveys.dart +++ b/lib/data/usecases/load_surveys/remote_load_surveys.dart @@ -8,19 +8,21 @@ class RemoteLoadSurveys implements LoadSurveys { final String url; final HttpClient httpClient; - RemoteLoadSurveys({ - required this.url, - required this.httpClient - }); + RemoteLoadSurveys({required this.url, required this.httpClient}); + @override Future> load() async { try { final httpResponse = await httpClient.request(url: url, method: 'get'); - return httpResponse.map((json) => RemoteSurveyModel.fromJson(json).toEntity()).toList(); - } on HttpError catch(error) { + return httpResponse + .map( + (json) => RemoteSurveyModel.fromJson(json).toEntity(), + ) + .toList(); + } on HttpError catch (error) { throw error == HttpError.forbidden - ? DomainError.accessDenied - : DomainError.unexpected; + ? DomainError.accessDenied + : DomainError.unexpected; } } -} \ No newline at end of file +} diff --git a/lib/data/usecases/save_current_account/local_save_current_account.dart b/lib/data/usecases/save_current_account/local_save_current_account.dart index 2ad1e888..824f441f 100644 --- a/lib/data/usecases/save_current_account/local_save_current_account.dart +++ b/lib/data/usecases/save_current_account/local_save_current_account.dart @@ -6,13 +6,14 @@ import '../../cache/cache.dart'; class LocalSaveCurrentAccount implements SaveCurrentAccount { final SaveSecureCacheStorage saveSecureCacheStorage; - LocalSaveCurrentAccount({ required this.saveSecureCacheStorage }); + LocalSaveCurrentAccount({required this.saveSecureCacheStorage}); + @override Future save(AccountEntity account) async { try { await saveSecureCacheStorage.save(key: 'token', value: account.token); - } catch(error) { + } catch (error) { throw DomainError.unexpected; } } -} \ No newline at end of file +} diff --git a/lib/data/usecases/save_current_account/save_current_account.dart b/lib/data/usecases/save_current_account/save_current_account.dart index 859e75c3..6f2fb482 100644 --- a/lib/data/usecases/save_current_account/save_current_account.dart +++ b/lib/data/usecases/save_current_account/save_current_account.dart @@ -1 +1 @@ -export './local_save_current_account.dart'; \ No newline at end of file +export './local_save_current_account.dart'; diff --git a/lib/data/usecases/save_survey_result/remote_save_survey_result.dart b/lib/data/usecases/save_survey_result/remote_save_survey_result.dart index 5511940a..b6609cc0 100644 --- a/lib/data/usecases/save_survey_result/remote_save_survey_result.dart +++ b/lib/data/usecases/save_survey_result/remote_save_survey_result.dart @@ -8,19 +8,18 @@ class RemoteSaveSurveyResult implements SaveSurveyResult { final String url; final HttpClient httpClient; - RemoteSaveSurveyResult({ - required this.url, - required this.httpClient - }); + RemoteSaveSurveyResult({required this.url, required this.httpClient}); - Future save({ required String answer }) async { + @override + Future save({required String answer}) async { try { - final json = await httpClient.request(url: url, method: 'put', body: {'answer': answer}); + final json = await httpClient + .request(url: url, method: 'put', body: {'answer': answer}); return RemoteSurveyResultModel.fromJson(json).toEntity(); - } on HttpError catch(error) { + } on HttpError catch (error) { throw error == HttpError.forbidden - ? DomainError.accessDenied - : DomainError.unexpected; + ? DomainError.accessDenied + : DomainError.unexpected; } } -} \ No newline at end of file +} diff --git a/lib/data/usecases/save_survey_result/save_survey_result.dart b/lib/data/usecases/save_survey_result/save_survey_result.dart index 198d22ed..ef652747 100644 --- a/lib/data/usecases/save_survey_result/save_survey_result.dart +++ b/lib/data/usecases/save_survey_result/save_survey_result.dart @@ -1 +1 @@ -export './remote_save_survey_result.dart'; \ No newline at end of file +export './remote_save_survey_result.dart'; diff --git a/lib/data/usecases/usecases.dart b/lib/data/usecases/usecases.dart index 42f1325f..e5475a2b 100644 --- a/lib/data/usecases/usecases.dart +++ b/lib/data/usecases/usecases.dart @@ -1,7 +1,7 @@ -export './authentication/authentication.dart'; export './add_account/add_account.dart'; -export './load_surveys/load_surveys.dart'; +export './authentication/authentication.dart'; +export './load_current_account/load_current_account.dart'; export './load_survey_result/load_survey_result.dart'; -export './save_survey_result/save_survey_result.dart'; +export './load_surveys/load_surveys.dart'; export './save_current_account/save_current_account.dart'; -export './load_current_account/load_current_account.dart'; \ No newline at end of file +export './save_survey_result/save_survey_result.dart'; diff --git a/lib/domain/domain.dart b/lib/domain/domain.dart new file mode 100644 index 00000000..de868b11 --- /dev/null +++ b/lib/domain/domain.dart @@ -0,0 +1,3 @@ +export './entities/entities.dart'; +export './helpers/helpers.dart'; +export './usecases/usecases.dart'; diff --git a/lib/domain/entities/account_entity.dart b/lib/domain/entities/account_entity.dart index a08144a9..8b907b7c 100644 --- a/lib/domain/entities/account_entity.dart +++ b/lib/domain/entities/account_entity.dart @@ -3,7 +3,8 @@ import 'package:equatable/equatable.dart'; class AccountEntity extends Equatable { final String token; - List get props => [token]; + @override + List get props => [token]; - AccountEntity({ required this.token }); -} \ No newline at end of file + const AccountEntity({required this.token}); +} diff --git a/lib/domain/entities/entities.dart b/lib/domain/entities/entities.dart index 1301b706..17b6b839 100644 --- a/lib/domain/entities/entities.dart +++ b/lib/domain/entities/entities.dart @@ -1,4 +1,4 @@ export './account_entity.dart'; +export './survey_answer_entity.dart'; export './survey_entity.dart'; export './survey_result_entity.dart'; -export './survey_answer_entity.dart'; \ No newline at end of file diff --git a/lib/domain/entities/survey_answer_entity.dart b/lib/domain/entities/survey_answer_entity.dart index ebe32699..4e8f25e0 100644 --- a/lib/domain/entities/survey_answer_entity.dart +++ b/lib/domain/entities/survey_answer_entity.dart @@ -6,12 +6,13 @@ class SurveyAnswerEntity extends Equatable { final bool isCurrentAnswer; final int percent; - List get props => [image, answer, isCurrentAnswer, percent]; + @override + List get props => [image, answer, isCurrentAnswer, percent]; - SurveyAnswerEntity({ - this.image, + const SurveyAnswerEntity({ required this.answer, - required this.isCurrentAnswer, required this.percent, + required this.isCurrentAnswer, + this.image, }); -} \ No newline at end of file +} diff --git a/lib/domain/entities/survey_entity.dart b/lib/domain/entities/survey_entity.dart index 8533cb9b..ea4187ed 100644 --- a/lib/domain/entities/survey_entity.dart +++ b/lib/domain/entities/survey_entity.dart @@ -6,12 +6,13 @@ class SurveyEntity extends Equatable { final DateTime dateTime; final bool didAnswer; - List get props => [id, question, dateTime, didAnswer]; + @override + List get props => [id, question, dateTime, didAnswer]; - SurveyEntity({ + const SurveyEntity({ required this.id, required this.question, required this.dateTime, required this.didAnswer, }); -} \ No newline at end of file +} diff --git a/lib/domain/entities/survey_result_entity.dart b/lib/domain/entities/survey_result_entity.dart index 7d038d6b..d91cd23c 100644 --- a/lib/domain/entities/survey_result_entity.dart +++ b/lib/domain/entities/survey_result_entity.dart @@ -7,11 +7,12 @@ class SurveyResultEntity extends Equatable { final String question; final List answers; - List get props => [surveyId, question, answers]; + @override + List get props => [surveyId, question, answers]; - SurveyResultEntity({ + const SurveyResultEntity({ required this.surveyId, required this.question, required this.answers, }); -} \ No newline at end of file +} diff --git a/lib/domain/helpers/domain_error.dart b/lib/domain/helpers/domain_error.dart index 18596702..1e2bd90f 100644 --- a/lib/domain/helpers/domain_error.dart +++ b/lib/domain/helpers/domain_error.dart @@ -1,6 +1 @@ -enum DomainError { - unexpected, - invalidCredentials, - emailInUse, - accessDenied -} \ No newline at end of file +enum DomainError { unexpected, invalidCredentials, emailInUse, accessDenied } diff --git a/lib/domain/helpers/helpers.dart b/lib/domain/helpers/helpers.dart index effaf60a..0d552307 100644 --- a/lib/domain/helpers/helpers.dart +++ b/lib/domain/helpers/helpers.dart @@ -1 +1 @@ -export './domain_error.dart'; \ No newline at end of file +export './domain_error.dart'; diff --git a/lib/domain/usecases/add_account.dart b/lib/domain/usecases/add_account.dart index 231241a2..a916fe04 100644 --- a/lib/domain/usecases/add_account.dart +++ b/lib/domain/usecases/add_account.dart @@ -1,7 +1,7 @@ -import '../entities/entities.dart'; - import 'package:equatable/equatable.dart'; +import '../entities/entities.dart'; + abstract class AddAccount { Future add(AddAccountParams params); } @@ -12,12 +12,14 @@ class AddAccountParams extends Equatable { final String password; final String passwordConfirmation; - List get props => [name, email, password, passwordConfirmation]; + @override + List get props => + [name, email, password, passwordConfirmation]; - AddAccountParams({ + const AddAccountParams({ required this.name, required this.email, required this.password, - required this.passwordConfirmation + required this.passwordConfirmation, }); -} \ No newline at end of file +} diff --git a/lib/domain/usecases/authentication.dart b/lib/domain/usecases/authentication.dart index a53c506c..57fe80a3 100644 --- a/lib/domain/usecases/authentication.dart +++ b/lib/domain/usecases/authentication.dart @@ -1,7 +1,7 @@ -import '../entities/entities.dart'; - import 'package:equatable/equatable.dart'; +import '../entities/entities.dart'; + abstract class Authentication { Future auth(AuthenticationParams params); } @@ -10,7 +10,8 @@ class AuthenticationParams extends Equatable { final String email; final String secret; - List get props => [email, secret]; + @override + List get props => [email, secret]; - AuthenticationParams({ required this.email, required this.secret }); -} \ No newline at end of file + const AuthenticationParams({required this.email, required this.secret}); +} diff --git a/lib/domain/usecases/load_current_account.dart b/lib/domain/usecases/load_current_account.dart index ca8c782e..2aba2100 100644 --- a/lib/domain/usecases/load_current_account.dart +++ b/lib/domain/usecases/load_current_account.dart @@ -2,4 +2,4 @@ import '../entities/entities.dart'; abstract class LoadCurrentAccount { Future load(); -} \ No newline at end of file +} diff --git a/lib/domain/usecases/load_survey_result.dart b/lib/domain/usecases/load_survey_result.dart index 4b555db7..89c9fe27 100644 --- a/lib/domain/usecases/load_survey_result.dart +++ b/lib/domain/usecases/load_survey_result.dart @@ -1,5 +1,5 @@ import '../entities/entities.dart'; abstract class LoadSurveyResult { - Future loadBySurvey({ required String surveyId }); -} \ No newline at end of file + Future loadBySurvey({required String surveyId}); +} diff --git a/lib/domain/usecases/load_surveys.dart b/lib/domain/usecases/load_surveys.dart index d2c90dc5..c3ba22b5 100644 --- a/lib/domain/usecases/load_surveys.dart +++ b/lib/domain/usecases/load_surveys.dart @@ -2,4 +2,4 @@ import '../entities/entities.dart'; abstract class LoadSurveys { Future> load(); -} \ No newline at end of file +} diff --git a/lib/domain/usecases/save_current_account.dart b/lib/domain/usecases/save_current_account.dart index cfec1c71..c631f162 100644 --- a/lib/domain/usecases/save_current_account.dart +++ b/lib/domain/usecases/save_current_account.dart @@ -2,4 +2,4 @@ import '../entities/entities.dart'; abstract class SaveCurrentAccount { Future save(AccountEntity account); -} \ No newline at end of file +} diff --git a/lib/domain/usecases/save_survey_result.dart b/lib/domain/usecases/save_survey_result.dart index d4b7286e..adf747bb 100644 --- a/lib/domain/usecases/save_survey_result.dart +++ b/lib/domain/usecases/save_survey_result.dart @@ -1,5 +1,5 @@ import '../entities/entities.dart'; abstract class SaveSurveyResult { - Future save({ required String answer }); -} \ No newline at end of file + Future save({required String answer}); +} diff --git a/lib/domain/usecases/usecases.dart b/lib/domain/usecases/usecases.dart index be283538..7f52e7f7 100644 --- a/lib/domain/usecases/usecases.dart +++ b/lib/domain/usecases/usecases.dart @@ -1,7 +1,7 @@ -export './authentication.dart'; export './add_account.dart'; -export './load_surveys.dart'; -export './save_current_account.dart'; +export './authentication.dart'; export './load_current_account.dart'; export './load_survey_result.dart'; -export './save_survey_result.dart'; \ No newline at end of file +export './load_surveys.dart'; +export './save_current_account.dart'; +export './save_survey_result.dart'; diff --git a/lib/infra/cache/cache.dart b/lib/infra/cache/cache.dart index b23b2c8b..58300c30 100644 --- a/lib/infra/cache/cache.dart +++ b/lib/infra/cache/cache.dart @@ -1,2 +1,2 @@ +export './local_storage_adapter.dart'; export './secure_storage_adapter.dart'; -export './local_storage_adapter.dart'; \ No newline at end of file diff --git a/lib/infra/cache/local_storage_adapter.dart b/lib/infra/cache/local_storage_adapter.dart index a22cca31..ca012347 100644 --- a/lib/infra/cache/local_storage_adapter.dart +++ b/lib/infra/cache/local_storage_adapter.dart @@ -1,22 +1,25 @@ -import '../../data/cache/cache.dart'; - import 'package:localstorage/localstorage.dart'; +import '../../data/cache/cache.dart'; + class LocalStorageAdapter implements CacheStorage { final LocalStorage localStorage; - LocalStorageAdapter({ required this.localStorage }); + LocalStorageAdapter({required this.localStorage}); - Future save({ required String key, required dynamic value }) async { + @override + Future save({required String key, required dynamic value}) async { await localStorage.deleteItem(key); await localStorage.setItem(key, value); } + @override Future delete(String key) async { await localStorage.deleteItem(key); } + @override Future fetch(String key) async { return await localStorage.getItem(key); } -} \ No newline at end of file +} diff --git a/lib/infra/cache/secure_storage_adapter.dart b/lib/infra/cache/secure_storage_adapter.dart index c42e16d6..076df1ba 100644 --- a/lib/infra/cache/secure_storage_adapter.dart +++ b/lib/infra/cache/secure_storage_adapter.dart @@ -1,21 +1,28 @@ -import '../../data/cache/cache.dart'; - import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -class SecureStorageAdapter implements SaveSecureCacheStorage, FetchSecureCacheStorage, DeleteSecureCacheStorage { +import '../../data/cache/cache.dart'; + +class SecureStorageAdapter + implements + SaveSecureCacheStorage, + FetchSecureCacheStorage, + DeleteSecureCacheStorage { final FlutterSecureStorage secureStorage; - SecureStorageAdapter({ required this.secureStorage }); + SecureStorageAdapter({required this.secureStorage}); - Future save({ required String key, required String value }) async { + @override + Future save({required String key, required String value}) async { await secureStorage.write(key: key, value: value); } + @override Future fetch(String key) async { return await secureStorage.read(key: key); } + @override Future delete(String key) async { await secureStorage.delete(key: key); } -} \ No newline at end of file +} diff --git a/lib/infra/http/http.dart b/lib/infra/http/http.dart index 66499859..fb1105b9 100644 --- a/lib/infra/http/http.dart +++ b/lib/infra/http/http.dart @@ -1 +1 @@ -export './http_adapter.dart'; \ No newline at end of file +export './http_adapter.dart'; diff --git a/lib/infra/http/http_adapter.dart b/lib/infra/http/http_adapter.dart index f417cb74..0d3798ec 100644 --- a/lib/infra/http/http_adapter.dart +++ b/lib/infra/http/http_adapter.dart @@ -1,33 +1,46 @@ -import '../../data/http/http.dart'; +import 'dart:convert'; import 'package:http/http.dart'; -import 'dart:convert'; + +import '../../data/http/http.dart'; class HttpAdapter implements HttpClient { final Client client; HttpAdapter(this.client); - Future request({ required String url, required String method, Map? body, Map? headers }) async { - final defaultHeaders = headers?.cast() ?? {}..addAll({ - 'content-type': 'application/json', - 'accept': 'application/json' - }); - final jsonBody = body != null ? jsonEncode(body) : null; - var response = Response('', 500); + @override + Future request({ + required String url, + required String method, + Map? body, + Map? headers, + }) async { + final Map defaultHeaders = + headers?.cast() ?? {} + ..addAll( + {'content-type': 'application/json', 'accept': 'application/json'}, + ); + final String? jsonBody = body != null ? jsonEncode(body) : null; + Response response = Response('', 500); Future? futureResponse; try { if (method == 'post') { - futureResponse = client.post(Uri.parse(url), headers: defaultHeaders, body: jsonBody); + futureResponse = client.post( + Uri.parse(url), + headers: defaultHeaders, + body: jsonBody, + ); } else if (method == 'get') { futureResponse = client.get(Uri.parse(url), headers: defaultHeaders); } else if (method == 'put') { - futureResponse = client.put(Uri.parse(url), headers: defaultHeaders, body: jsonBody); + futureResponse = + client.put(Uri.parse(url), headers: defaultHeaders, body: jsonBody); } if (futureResponse != null) { - response = await futureResponse.timeout(Duration(seconds: 10)); + response = await futureResponse.timeout(const Duration(seconds: 10)); } - } catch(error) { + } catch (error) { throw HttpError.serverError; } return _handleResponse(response); @@ -35,13 +48,20 @@ class HttpAdapter implements HttpClient { dynamic _handleResponse(Response response) { switch (response.statusCode) { - case 200: return response.body.isEmpty ? null : jsonDecode(response.body); - case 204: return null; - case 400: throw HttpError.badRequest; - case 401: throw HttpError.unauthorized; - case 403: throw HttpError.forbidden; - case 404: throw HttpError.notFound; - default: throw HttpError.serverError; + case 200: + return response.body.isEmpty ? null : jsonDecode(response.body); + case 204: + return null; + case 400: + throw HttpError.badRequest; + case 401: + throw HttpError.unauthorized; + case 403: + throw HttpError.forbidden; + case 404: + throw HttpError.notFound; + default: + throw HttpError.serverError; } } -} \ No newline at end of file +} diff --git a/lib/infra/infra.dart b/lib/infra/infra.dart new file mode 100644 index 00000000..260166f3 --- /dev/null +++ b/lib/infra/infra.dart @@ -0,0 +1,2 @@ +export './cache/cache.dart'; +export './http/http.dart'; diff --git a/lib/main/builders/builders.dart b/lib/main/builders/builders.dart index b57e0dfd..8ca90a52 100644 --- a/lib/main/builders/builders.dart +++ b/lib/main/builders/builders.dart @@ -1 +1 @@ -export './validation_builder.dart'; \ No newline at end of file +export './validation_builder.dart'; diff --git a/lib/main/builders/validation_builder.dart b/lib/main/builders/validation_builder.dart index 39d9c07d..cfa5bff1 100644 --- a/lib/main/builders/validation_builder.dart +++ b/lib/main/builders/validation_builder.dart @@ -29,9 +29,14 @@ class ValidationBuilder { } ValidationBuilder sameAs(String fieldToCompare) { - validations.add(CompareFieldsValidation(field: fieldName, fieldToCompare: fieldToCompare)); + validations.add( + CompareFieldsValidation( + field: fieldName, + fieldToCompare: fieldToCompare, + ), + ); return this; } List build() => validations; -} \ No newline at end of file +} diff --git a/lib/main/composites/composites.dart b/lib/main/composites/composites.dart index 489f9d4d..127b053e 100644 --- a/lib/main/composites/composites.dart +++ b/lib/main/composites/composites.dart @@ -1,3 +1,3 @@ -export './validation_composite.dart'; +export './remote_load_survey_result_with_local_fallback.dart'; export './remote_load_surveys_with_local_fallback.dart'; -export './remote_load_survey_result_with_local_fallback.dart'; \ No newline at end of file +export './validation_composite.dart'; diff --git a/lib/main/composites/remote_load_survey_result_with_local_fallback.dart b/lib/main/composites/remote_load_survey_result_with_local_fallback.dart index 09cc4728..2a6fa95c 100644 --- a/lib/main/composites/remote_load_survey_result_with_local_fallback.dart +++ b/lib/main/composites/remote_load_survey_result_with_local_fallback.dart @@ -1,7 +1,5 @@ -import '../../domain/entities/entities.dart'; -import '../../domain/helpers/helpers.dart'; -import '../../domain/usecases/usecases.dart'; -import '../../data/usecases/usecases.dart'; +import '../../data/data.dart'; +import '../../domain/domain.dart'; class RemoteLoadSurveyResultWithLocalFallback implements LoadSurveyResult { final RemoteLoadSurveyResult remote; @@ -12,12 +10,14 @@ class RemoteLoadSurveyResultWithLocalFallback implements LoadSurveyResult { required this.local, }); - Future loadBySurvey({ required String surveyId }) async { + @override + Future loadBySurvey({required String surveyId}) async { try { - final surveyResult = await remote.loadBySurvey(surveyId: surveyId); + final SurveyResultEntity surveyResult = + await remote.loadBySurvey(surveyId: surveyId); await local.save(surveyResult); return surveyResult; - } catch(error) { + } catch (error) { if (error == DomainError.accessDenied) { rethrow; } @@ -25,4 +25,4 @@ class RemoteLoadSurveyResultWithLocalFallback implements LoadSurveyResult { return await local.loadBySurvey(surveyId: surveyId); } } -} \ No newline at end of file +} diff --git a/lib/main/composites/remote_load_surveys_with_local_fallback.dart b/lib/main/composites/remote_load_surveys_with_local_fallback.dart index dd24ccf5..3b33954d 100644 --- a/lib/main/composites/remote_load_surveys_with_local_fallback.dart +++ b/lib/main/composites/remote_load_surveys_with_local_fallback.dart @@ -1,7 +1,5 @@ import '../../data/usecases/usecases.dart'; -import '../../domain/entities/entities.dart'; -import '../../domain/helpers/helpers.dart'; -import '../../domain/usecases/usecases.dart'; +import '../../domain/domain.dart'; class RemoteLoadSurveysWithLocalFallback implements LoadSurveys { final RemoteLoadSurveys remote; @@ -9,15 +7,16 @@ class RemoteLoadSurveysWithLocalFallback implements LoadSurveys { RemoteLoadSurveysWithLocalFallback({ required this.remote, - required this.local + required this.local, }); + @override Future> load() async { try { - final surveys = await remote.load(); + final List surveys = await remote.load(); await local.save(surveys); return surveys; - } catch(error) { + } catch (error) { if (error == DomainError.accessDenied) { rethrow; } @@ -25,4 +24,4 @@ class RemoteLoadSurveysWithLocalFallback implements LoadSurveys { return await local.load(); } } -} \ No newline at end of file +} diff --git a/lib/main/composites/validation_composite.dart b/lib/main/composites/validation_composite.dart index 31ee86d3..a26ef831 100644 --- a/lib/main/composites/validation_composite.dart +++ b/lib/main/composites/validation_composite.dart @@ -6,9 +6,11 @@ class ValidationComposite implements Validation { ValidationComposite(this.validations); - ValidationError? validate({ required String field, required Map input}) { + @override + ValidationError? validate({required String field, required Map input}) { ValidationError? error; - for (final validation in validations.where((v) => v.field == field)) { + for (final FieldValidation validation + in validations.where((FieldValidation v) => v.field == field)) { error = validation.validate(input); if (error != null) { return error; @@ -16,4 +18,4 @@ class ValidationComposite implements Validation { } return error; } -} \ No newline at end of file +} diff --git a/lib/main/decorators/authorize_http_client_decorator.dart b/lib/main/decorators/authorize_http_client_decorator.dart index 7624f279..ac80e420 100644 --- a/lib/main/decorators/authorize_http_client_decorator.dart +++ b/lib/main/decorators/authorize_http_client_decorator.dart @@ -12,6 +12,7 @@ class AuthorizeHttpClientDecorator implements HttpClient { required this.decoratee, }); + @override Future request({ required String url, required String method, @@ -19,10 +20,16 @@ class AuthorizeHttpClientDecorator implements HttpClient { Map? headers, }) async { try { - final token = await fetchSecureCacheStorage.fetch('token'); - final authorizedHeaders = headers ?? {}..addAll({'x-access-token': token}); - return await decoratee.request(url: url, method: method, body: body, headers: authorizedHeaders); - } catch(error) { + final String? token = await fetchSecureCacheStorage.fetch('token'); + final Map authorizedHeaders = headers ?? {} + ..addAll({'x-access-token': token}); + return await decoratee.request( + url: url, + method: method, + body: body, + headers: authorizedHeaders, + ); + } catch (error) { if (error is HttpError && error != HttpError.forbidden) { rethrow; } else { @@ -31,4 +38,4 @@ class AuthorizeHttpClientDecorator implements HttpClient { } } } -} \ No newline at end of file +} diff --git a/lib/main/decorators/decorators.dart b/lib/main/decorators/decorators.dart index 903fa4ba..bbfbb69c 100644 --- a/lib/main/decorators/decorators.dart +++ b/lib/main/decorators/decorators.dart @@ -1 +1 @@ -export './authorize_http_client_decorator.dart'; \ No newline at end of file +export './authorize_http_client_decorator.dart'; diff --git a/lib/main/factories/cache/cache.dart b/lib/main/factories/cache/cache.dart index 5b08fce2..d26fd682 100644 --- a/lib/main/factories/cache/cache.dart +++ b/lib/main/factories/cache/cache.dart @@ -1,2 +1,2 @@ +export './local_storage_adapter_factory.dart'; export './secure_storage_adapter_factory.dart'; -export './local_storage_adapter_factory.dart'; \ No newline at end of file diff --git a/lib/main/factories/cache/local_storage_adapter_factory.dart b/lib/main/factories/cache/local_storage_adapter_factory.dart index 77b652a1..5d1df12f 100644 --- a/lib/main/factories/cache/local_storage_adapter_factory.dart +++ b/lib/main/factories/cache/local_storage_adapter_factory.dart @@ -1,6 +1,6 @@ -import '../../../infra/cache/cache.dart'; - import 'package:localstorage/localstorage.dart'; +import '../../../infra/cache/cache.dart'; + LocalStorageAdapter makeLocalStorageAdapter() => - LocalStorageAdapter(localStorage: LocalStorage('fordev')); \ No newline at end of file + LocalStorageAdapter(localStorage: LocalStorage('fordev')); diff --git a/lib/main/factories/cache/secure_storage_adapter_factory.dart b/lib/main/factories/cache/secure_storage_adapter_factory.dart index 9621abd0..b497b984 100644 --- a/lib/main/factories/cache/secure_storage_adapter_factory.dart +++ b/lib/main/factories/cache/secure_storage_adapter_factory.dart @@ -1,6 +1,6 @@ -import '../../../infra/cache/cache.dart'; - import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import '../../../infra/cache/cache.dart'; + SecureStorageAdapter makeSecureStorageAdapter() => - SecureStorageAdapter(secureStorage: FlutterSecureStorage()); \ No newline at end of file + SecureStorageAdapter(secureStorage: const FlutterSecureStorage()); diff --git a/lib/main/factories/factories.dart b/lib/main/factories/factories.dart index 3a63e6c9..94dc1f78 100644 --- a/lib/main/factories/factories.dart +++ b/lib/main/factories/factories.dart @@ -1,4 +1,4 @@ export './cache/cache.dart'; export './http/http.dart'; export './pages/pages.dart'; -export './usecases/usecases.dart'; \ No newline at end of file +export './usecases/usecases.dart'; diff --git a/lib/main/factories/http/api_url_factory.dart b/lib/main/factories/http/api_url_factory.dart index 362b2374..1f1c4942 100644 --- a/lib/main/factories/http/api_url_factory.dart +++ b/lib/main/factories/http/api_url_factory.dart @@ -1 +1 @@ -String makeApiUrl(String path) => 'http://fordevs.herokuapp.com/api/$path'; \ No newline at end of file +String makeApiUrl(String path) => 'http://fordevs.herokuapp.com/api/$path'; diff --git a/lib/main/factories/http/authorize_http_client_decorator_factory.dart b/lib/main/factories/http/authorize_http_client_decorator_factory.dart index 0ce9e404..e0befe37 100644 --- a/lib/main/factories/http/authorize_http_client_decorator_factory.dart +++ b/lib/main/factories/http/authorize_http_client_decorator_factory.dart @@ -3,7 +3,7 @@ import '../../decorators/decorators.dart'; import '../../factories/factories.dart'; HttpClient makeAuthorizeHttpClientDecorator() => AuthorizeHttpClientDecorator( - decoratee: makeHttpAdapter(), - fetchSecureCacheStorage: makeSecureStorageAdapter(), - deleteSecureCacheStorage: makeSecureStorageAdapter(), -); \ No newline at end of file + decoratee: makeHttpAdapter(), + fetchSecureCacheStorage: makeSecureStorageAdapter(), + deleteSecureCacheStorage: makeSecureStorageAdapter(), + ); diff --git a/lib/main/factories/http/http.dart b/lib/main/factories/http/http.dart index b8639d26..28f1b2ca 100644 --- a/lib/main/factories/http/http.dart +++ b/lib/main/factories/http/http.dart @@ -1,3 +1,3 @@ -export './http_client_factory.dart'; export './api_url_factory.dart'; -export './authorize_http_client_decorator_factory.dart'; \ No newline at end of file +export './authorize_http_client_decorator_factory.dart'; +export './http_client_factory.dart'; diff --git a/lib/main/factories/http/http_client_factory.dart b/lib/main/factories/http/http_client_factory.dart index 7f839b07..d5ed6600 100644 --- a/lib/main/factories/http/http_client_factory.dart +++ b/lib/main/factories/http/http_client_factory.dart @@ -1,6 +1,6 @@ +import 'package:http/http.dart'; + import '../../../data/http/http.dart'; import '../../../infra/http/http.dart'; -import 'package:http/http.dart'; - -HttpClient makeHttpAdapter() => HttpAdapter(Client()); \ No newline at end of file +HttpClient makeHttpAdapter() => HttpAdapter(Client()); diff --git a/lib/main/factories/pages/login/login.dart b/lib/main/factories/pages/login/login.dart index e2412043..fec661e0 100644 --- a/lib/main/factories/pages/login/login.dart +++ b/lib/main/factories/pages/login/login.dart @@ -1,3 +1,3 @@ export './login_page_factory.dart'; export './login_presenter_factory.dart'; -export './login_validation_factory.dart'; \ No newline at end of file +export './login_validation_factory.dart'; diff --git a/lib/main/factories/pages/login/login_page_factory.dart b/lib/main/factories/pages/login/login_page_factory.dart index 13fc27cb..03993582 100644 --- a/lib/main/factories/pages/login/login_page_factory.dart +++ b/lib/main/factories/pages/login/login_page_factory.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; + import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; -import 'package:flutter/material.dart'; - -Widget makeLoginPage() => LoginPage(makeGetxLoginPresenter()); \ No newline at end of file +Widget makeLoginPage() => LoginPage(makeGetxLoginPresenter()); diff --git a/lib/main/factories/pages/login/login_presenter_factory.dart b/lib/main/factories/pages/login/login_presenter_factory.dart index d07fc58f..e6fe0d63 100644 --- a/lib/main/factories/pages/login/login_presenter_factory.dart +++ b/lib/main/factories/pages/login/login_presenter_factory.dart @@ -3,7 +3,7 @@ import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; LoginPresenter makeGetxLoginPresenter() => GetxLoginPresenter( - authentication: makeRemoteAuthentication(), - validation: makeLoginValidation(), - saveCurrentAccount: makeLocalSaveCurrentAccount() -); \ No newline at end of file + authentication: makeRemoteAuthentication(), + validation: makeLoginValidation(), + saveCurrentAccount: makeLocalSaveCurrentAccount(), + ); diff --git a/lib/main/factories/pages/login/login_validation_factory.dart b/lib/main/factories/pages/login/login_validation_factory.dart index 409f8474..5c29855a 100644 --- a/lib/main/factories/pages/login/login_validation_factory.dart +++ b/lib/main/factories/pages/login/login_validation_factory.dart @@ -6,6 +6,6 @@ import '../../../composites/composites.dart'; Validation makeLoginValidation() => ValidationComposite(makeLoginValidations()); List makeLoginValidations() => [ - ...ValidationBuilder.field('email').required().email().build(), - ...ValidationBuilder.field('password').required().min(3).build() -]; \ No newline at end of file + ...ValidationBuilder.field('email').required().email().build(), + ...ValidationBuilder.field('password').required().min(3).build() + ]; diff --git a/lib/main/factories/pages/pages.dart b/lib/main/factories/pages/pages.dart index ca4fcbc5..8bd0668e 100644 --- a/lib/main/factories/pages/pages.dart +++ b/lib/main/factories/pages/pages.dart @@ -1,5 +1,5 @@ export './login/login.dart'; export './signup/signup.dart'; export './splash/splash.dart'; +export './survey_result/survey_result.dart'; export './surveys/surveys.dart'; -export './survey_result/survey_result.dart'; \ No newline at end of file diff --git a/lib/main/factories/pages/signup/signup.dart b/lib/main/factories/pages/signup/signup.dart index 5b5f8be0..64781491 100644 --- a/lib/main/factories/pages/signup/signup.dart +++ b/lib/main/factories/pages/signup/signup.dart @@ -1,3 +1,3 @@ export './signup_page_factory.dart'; export './signup_presenter_factory.dart'; -export './signup_validation_factory.dart'; \ No newline at end of file +export './signup_validation_factory.dart'; diff --git a/lib/main/factories/pages/signup/signup_page_factory.dart b/lib/main/factories/pages/signup/signup_page_factory.dart index 45fe38b6..63856d75 100644 --- a/lib/main/factories/pages/signup/signup_page_factory.dart +++ b/lib/main/factories/pages/signup/signup_page_factory.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; + import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; -import 'package:flutter/material.dart'; - -Widget makeSignUpPage() => SignUpPage(makeGetxSignUpPresenter()); \ No newline at end of file +Widget makeSignUpPage() => SignUpPage(makeGetxSignUpPresenter()); diff --git a/lib/main/factories/pages/signup/signup_presenter_factory.dart b/lib/main/factories/pages/signup/signup_presenter_factory.dart index 5dc5dfe4..9c41e9bd 100644 --- a/lib/main/factories/pages/signup/signup_presenter_factory.dart +++ b/lib/main/factories/pages/signup/signup_presenter_factory.dart @@ -3,7 +3,7 @@ import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; SignUpPresenter makeGetxSignUpPresenter() => GetxSignUpPresenter( - addAccount: makeRemoteAddAccount(), - validation: makeSignUpValidation(), - saveCurrentAccount: makeLocalSaveCurrentAccount() -); \ No newline at end of file + addAccount: makeRemoteAddAccount(), + validation: makeSignUpValidation(), + saveCurrentAccount: makeLocalSaveCurrentAccount(), + ); diff --git a/lib/main/factories/pages/signup/signup_validation_factory.dart b/lib/main/factories/pages/signup/signup_validation_factory.dart index 46a81451..fac178ba 100644 --- a/lib/main/factories/pages/signup/signup_validation_factory.dart +++ b/lib/main/factories/pages/signup/signup_validation_factory.dart @@ -3,11 +3,15 @@ import '../../../../validation/protocols/protocols.dart'; import '../../../builders/builders.dart'; import '../../../composites/composites.dart'; -Validation makeSignUpValidation() => ValidationComposite(makeSignUpValidations()); +Validation makeSignUpValidation() => + ValidationComposite(makeSignUpValidations()); List makeSignUpValidations() => [ - ...ValidationBuilder.field('name').required().min(3).build(), - ...ValidationBuilder.field('email').required().email().build(), - ...ValidationBuilder.field('password').required().min(3).build(), - ...ValidationBuilder.field('passwordConfirmation').required().sameAs('password').build() -]; \ No newline at end of file + ...ValidationBuilder.field('name').required().min(3).build(), + ...ValidationBuilder.field('email').required().email().build(), + ...ValidationBuilder.field('password').required().min(3).build(), + ...ValidationBuilder.field('passwordConfirmation') + .required() + .sameAs('password') + .build() + ]; diff --git a/lib/main/factories/pages/splash/splash.dart b/lib/main/factories/pages/splash/splash.dart index 57b019ca..d2c3c431 100644 --- a/lib/main/factories/pages/splash/splash.dart +++ b/lib/main/factories/pages/splash/splash.dart @@ -1,2 +1,2 @@ export './splash_page_factory.dart'; -export './splash_presenter_factory.dart'; \ No newline at end of file +export './splash_presenter_factory.dart'; diff --git a/lib/main/factories/pages/splash/splash_page_factory.dart b/lib/main/factories/pages/splash/splash_page_factory.dart index 6b8c99df..66279af8 100644 --- a/lib/main/factories/pages/splash/splash_page_factory.dart +++ b/lib/main/factories/pages/splash/splash_page_factory.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; + import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; -import 'package:flutter/material.dart'; - -Widget makeSplashPage() => SplashPage(presenter: makeGetxSplashPresenter()); \ No newline at end of file +Widget makeSplashPage() => SplashPage(presenter: makeGetxSplashPresenter()); diff --git a/lib/main/factories/pages/splash/splash_presenter_factory.dart b/lib/main/factories/pages/splash/splash_presenter_factory.dart index 16653035..e4fdad95 100644 --- a/lib/main/factories/pages/splash/splash_presenter_factory.dart +++ b/lib/main/factories/pages/splash/splash_presenter_factory.dart @@ -3,4 +3,4 @@ import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; SplashPresenter makeGetxSplashPresenter() => - GetxSplashPresenter(loadCurrentAccount: makeLocalLoadCurrentAccount()); \ No newline at end of file + GetxSplashPresenter(loadCurrentAccount: makeLocalLoadCurrentAccount()); diff --git a/lib/main/factories/pages/survey_result/survey_result.dart b/lib/main/factories/pages/survey_result/survey_result.dart index 5642f687..b49f5d51 100644 --- a/lib/main/factories/pages/survey_result/survey_result.dart +++ b/lib/main/factories/pages/survey_result/survey_result.dart @@ -1,2 +1,2 @@ export './survey_result_page_factory.dart'; -export './survey_result_presenter_factory.dart'; \ No newline at end of file +export './survey_result_presenter_factory.dart'; diff --git a/lib/main/factories/pages/survey_result/survey_result_page_factory.dart b/lib/main/factories/pages/survey_result/survey_result_page_factory.dart index c808b4c4..d653df91 100644 --- a/lib/main/factories/pages/survey_result/survey_result_page_factory.dart +++ b/lib/main/factories/pages/survey_result/survey_result_page_factory.dart @@ -1,8 +1,9 @@ -import '../../../../ui/pages/pages.dart'; -import '../../factories.dart'; - import 'package:flutter/material.dart'; import 'package:get/get.dart'; -Widget makeSurveyResultPage() => - SurveyResultPage(makeGetxSurveyResultPresenter(Get.parameters['survey_id'] ?? '')); \ No newline at end of file +import '../../../../ui/pages/pages.dart'; +import '../../factories.dart'; + +Widget makeSurveyResultPage() => SurveyResultPage( + makeGetxSurveyResultPresenter(Get.parameters['survey_id'] ?? ''), + ); diff --git a/lib/main/factories/pages/survey_result/survey_result_presenter_factory.dart b/lib/main/factories/pages/survey_result/survey_result_presenter_factory.dart index c0de61bf..4139d6f7 100644 --- a/lib/main/factories/pages/survey_result/survey_result_presenter_factory.dart +++ b/lib/main/factories/pages/survey_result/survey_result_presenter_factory.dart @@ -2,8 +2,9 @@ import '../../../../presentation/presenters/presenters.dart'; import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; -SurveyResultPresenter makeGetxSurveyResultPresenter(String surveyId) => GetxSurveyResultPresenter( - loadSurveyResult: makeRemoteLoadSurveyResultWithLocalFallback(surveyId), - saveSurveyResult: makeRemoteSaveSurveyResult(surveyId), - surveyId: surveyId -); \ No newline at end of file +SurveyResultPresenter makeGetxSurveyResultPresenter(String surveyId) => + GetxSurveyResultPresenter( + loadSurveyResult: makeRemoteLoadSurveyResultWithLocalFallback(surveyId), + saveSurveyResult: makeRemoteSaveSurveyResult(surveyId), + surveyId: surveyId, + ); diff --git a/lib/main/factories/pages/surveys/surveys.dart b/lib/main/factories/pages/surveys/surveys.dart index 3f417acd..5955bf70 100644 --- a/lib/main/factories/pages/surveys/surveys.dart +++ b/lib/main/factories/pages/surveys/surveys.dart @@ -1,2 +1,2 @@ export './surveys_page_factory.dart'; -export './surveys_presenter_factory.dart'; \ No newline at end of file +export './surveys_presenter_factory.dart'; diff --git a/lib/main/factories/pages/surveys/surveys_page_factory.dart b/lib/main/factories/pages/surveys/surveys_page_factory.dart index 0ef6ded7..c317edad 100644 --- a/lib/main/factories/pages/surveys/surveys_page_factory.dart +++ b/lib/main/factories/pages/surveys/surveys_page_factory.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; + import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; -import 'package:flutter/material.dart'; - -Widget makeSurveysPage() => SurveysPage(makeGetxSurveysPresenter()); \ No newline at end of file +Widget makeSurveysPage() => SurveysPage(makeGetxSurveysPresenter()); diff --git a/lib/main/factories/pages/surveys/surveys_presenter_factory.dart b/lib/main/factories/pages/surveys/surveys_presenter_factory.dart index 25c41305..b9ddd7e3 100644 --- a/lib/main/factories/pages/surveys/surveys_presenter_factory.dart +++ b/lib/main/factories/pages/surveys/surveys_presenter_factory.dart @@ -3,5 +3,5 @@ import '../../../../ui/pages/pages.dart'; import '../../factories.dart'; SurveysPresenter makeGetxSurveysPresenter() => GetxSurveysPresenter( - loadSurveys: makeRemoteLoadSurveysWithLocalFallback(), -); \ No newline at end of file + loadSurveys: makeRemoteLoadSurveysWithLocalFallback(), + ); diff --git a/lib/main/factories/usecases/add_account_factory.dart b/lib/main/factories/usecases/add_account_factory.dart index 4d2b3b3b..e15538b0 100644 --- a/lib/main/factories/usecases/add_account_factory.dart +++ b/lib/main/factories/usecases/add_account_factory.dart @@ -2,7 +2,5 @@ import '../../../data/usecases/usecases.dart'; import '../../../domain/usecases/usecases.dart'; import '../factories.dart'; -AddAccount makeRemoteAddAccount() => RemoteAddAccount( - httpClient: makeHttpAdapter(), - url: makeApiUrl('signup') -); \ No newline at end of file +AddAccount makeRemoteAddAccount() => + RemoteAddAccount(httpClient: makeHttpAdapter(), url: makeApiUrl('signup')); diff --git a/lib/main/factories/usecases/authentication_factory.dart b/lib/main/factories/usecases/authentication_factory.dart index 129e2ebf..e9aaf16f 100644 --- a/lib/main/factories/usecases/authentication_factory.dart +++ b/lib/main/factories/usecases/authentication_factory.dart @@ -3,6 +3,6 @@ import '../../../domain/usecases/usecases.dart'; import '../factories.dart'; Authentication makeRemoteAuthentication() => RemoteAuthentication( - httpClient: makeHttpAdapter(), - url: makeApiUrl('login') -); \ No newline at end of file + httpClient: makeHttpAdapter(), + url: makeApiUrl('login'), + ); diff --git a/lib/main/factories/usecases/load_current_account_factory.dart b/lib/main/factories/usecases/load_current_account_factory.dart index 5fc0f420..595fef6b 100644 --- a/lib/main/factories/usecases/load_current_account_factory.dart +++ b/lib/main/factories/usecases/load_current_account_factory.dart @@ -3,5 +3,5 @@ import '../../../domain/usecases/usecases.dart'; import '../factories.dart'; LoadCurrentAccount makeLocalLoadCurrentAccount() => LocalLoadCurrentAccount( - fetchSecureCacheStorage: makeSecureStorageAdapter() -); \ No newline at end of file + fetchSecureCacheStorage: makeSecureStorageAdapter(), + ); diff --git a/lib/main/factories/usecases/load_survey_result_factory.dart b/lib/main/factories/usecases/load_survey_result_factory.dart index b31c579a..6c98a1e3 100644 --- a/lib/main/factories/usecases/load_survey_result_factory.dart +++ b/lib/main/factories/usecases/load_survey_result_factory.dart @@ -3,16 +3,17 @@ import '../../../domain/usecases/usecases.dart'; import '../../composites/composites.dart'; import '../factories.dart'; -RemoteLoadSurveyResult makeRemoteLoadSurveyResult(String surveyId) => RemoteLoadSurveyResult( - httpClient: makeAuthorizeHttpClientDecorator(), - url: makeApiUrl('surveys/$surveyId/results') -); +RemoteLoadSurveyResult makeRemoteLoadSurveyResult(String surveyId) => + RemoteLoadSurveyResult( + httpClient: makeAuthorizeHttpClientDecorator(), + url: makeApiUrl('surveys/$surveyId/results'), + ); -LocalLoadSurveyResult makeLocalLoadSurveyResult(String surveyId) => LocalLoadSurveyResult( - cacheStorage: makeLocalStorageAdapter() -); +LocalLoadSurveyResult makeLocalLoadSurveyResult(String surveyId) => + LocalLoadSurveyResult(cacheStorage: makeLocalStorageAdapter()); -LoadSurveyResult makeRemoteLoadSurveyResultWithLocalFallback(String surveyId) => RemoteLoadSurveyResultWithLocalFallback( - remote: makeRemoteLoadSurveyResult(surveyId), - local: makeLocalLoadSurveyResult(surveyId) -); \ No newline at end of file +LoadSurveyResult makeRemoteLoadSurveyResultWithLocalFallback(String surveyId) => + RemoteLoadSurveyResultWithLocalFallback( + remote: makeRemoteLoadSurveyResult(surveyId), + local: makeLocalLoadSurveyResult(surveyId), + ); diff --git a/lib/main/factories/usecases/load_surveys_factory.dart b/lib/main/factories/usecases/load_surveys_factory.dart index 195823ad..8f44ee73 100644 --- a/lib/main/factories/usecases/load_surveys_factory.dart +++ b/lib/main/factories/usecases/load_surveys_factory.dart @@ -4,15 +4,15 @@ import '../../composites/composites.dart'; import '../factories.dart'; RemoteLoadSurveys makeRemoteLoadSurveys() => RemoteLoadSurveys( - httpClient: makeAuthorizeHttpClientDecorator(), - url: makeApiUrl('surveys') -); + httpClient: makeAuthorizeHttpClientDecorator(), + url: makeApiUrl('surveys'), + ); -LocalLoadSurveys makeLocalLoadSurveys() => LocalLoadSurveys( - cacheStorage: makeLocalStorageAdapter() -); +LocalLoadSurveys makeLocalLoadSurveys() => + LocalLoadSurveys(cacheStorage: makeLocalStorageAdapter()); -LoadSurveys makeRemoteLoadSurveysWithLocalFallback() => RemoteLoadSurveysWithLocalFallback( - remote: makeRemoteLoadSurveys(), - local: makeLocalLoadSurveys() -); \ No newline at end of file +LoadSurveys makeRemoteLoadSurveysWithLocalFallback() => + RemoteLoadSurveysWithLocalFallback( + remote: makeRemoteLoadSurveys(), + local: makeLocalLoadSurveys(), + ); diff --git a/lib/main/factories/usecases/save_current_account_factory.dart b/lib/main/factories/usecases/save_current_account_factory.dart index bdff11a5..97cc41df 100644 --- a/lib/main/factories/usecases/save_current_account_factory.dart +++ b/lib/main/factories/usecases/save_current_account_factory.dart @@ -2,6 +2,5 @@ import '../../../data/usecases/usecases.dart'; import '../../../domain/usecases/usecases.dart'; import '../factories.dart'; -SaveCurrentAccount makeLocalSaveCurrentAccount() => LocalSaveCurrentAccount( - saveSecureCacheStorage: makeSecureStorageAdapter() -); \ No newline at end of file +SaveCurrentAccount makeLocalSaveCurrentAccount() => + LocalSaveCurrentAccount(saveSecureCacheStorage: makeSecureStorageAdapter()); diff --git a/lib/main/factories/usecases/save_survey_result_factory.dart b/lib/main/factories/usecases/save_survey_result_factory.dart index 3cf6c3da..5b50a894 100644 --- a/lib/main/factories/usecases/save_survey_result_factory.dart +++ b/lib/main/factories/usecases/save_survey_result_factory.dart @@ -2,7 +2,8 @@ import '../../../data/usecases/usecases.dart'; import '../../../domain/usecases/usecases.dart'; import '../factories.dart'; -SaveSurveyResult makeRemoteSaveSurveyResult(String surveyId) => RemoteSaveSurveyResult( - httpClient: makeAuthorizeHttpClientDecorator(), - url: makeApiUrl('surveys/$surveyId/results') -); \ No newline at end of file +SaveSurveyResult makeRemoteSaveSurveyResult(String surveyId) => + RemoteSaveSurveyResult( + httpClient: makeAuthorizeHttpClientDecorator(), + url: makeApiUrl('surveys/$surveyId/results'), + ); diff --git a/lib/main/factories/usecases/usecases.dart b/lib/main/factories/usecases/usecases.dart index 36b00865..b0e3a71c 100644 --- a/lib/main/factories/usecases/usecases.dart +++ b/lib/main/factories/usecases/usecases.dart @@ -1,7 +1,7 @@ -export './authentication_factory.dart'; export './add_account_factory.dart'; -export './load_surveys_factory.dart'; +export './authentication_factory.dart'; +export './load_current_account_factory.dart'; export './load_survey_result_factory.dart'; -export './save_survey_result_factory.dart'; +export './load_surveys_factory.dart'; export './save_current_account_factory.dart'; -export './load_current_account_factory.dart'; \ No newline at end of file +export './save_survey_result_factory.dart'; diff --git a/lib/main/main.dart b/lib/main/main.dart index 31dac82a..89a22085 100644 --- a/lib/main/main.dart +++ b/lib/main/main.dart @@ -1,19 +1,27 @@ -import '../ui/components/components.dart'; -import './factories/factories.dart'; - import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; +import './factories/factories.dart'; +import '../ui/components/components.dart'; + +export './builders/builders.dart'; +export './composites/composites.dart'; +export './decorators/decorators.dart'; +export './factories/factories.dart'; + void main() { - runApp(App()); + runApp(const App()); } class App extends StatelessWidget { + const App({super.key}); + @override Widget build(BuildContext context) { SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light); - final routeObserver = Get.put(RouteObserver()); + final RouteObserver routeObserver = + Get.put(RouteObserver()); return GetMaterialApp( title: '4Dev', @@ -22,12 +30,30 @@ class App extends StatelessWidget { navigatorObservers: [routeObserver], initialRoute: '/', getPages: [ - GetPage(name: '/', page: makeSplashPage, transition: Transition.fade), - GetPage(name: '/login', page: makeLoginPage, transition: Transition.fadeIn), - GetPage(name: '/signup', page: makeSignUpPage), - GetPage(name: '/surveys', page: makeSurveysPage, transition: Transition.fadeIn), - GetPage(name: '/survey_result/:survey_id', page: makeSurveyResultPage), + GetPage( + name: '/', + page: makeSplashPage, + transition: Transition.fade, + ), + GetPage( + name: '/login', + page: makeLoginPage, + transition: Transition.fadeIn, + ), + GetPage( + name: '/signup', + page: makeSignUpPage, + ), + GetPage( + name: '/surveys', + page: makeSurveysPage, + transition: Transition.fadeIn, + ), + GetPage( + name: '/survey_result/:survey_id', + page: makeSurveyResultPage, + ), ], ); } -} \ No newline at end of file +} diff --git a/lib/presentation/helpers/helpers.dart b/lib/presentation/helpers/helpers.dart index d9d7c754..c6adf4be 100644 --- a/lib/presentation/helpers/helpers.dart +++ b/lib/presentation/helpers/helpers.dart @@ -1 +1 @@ -export './survey_result_entity_extensions.dart'; \ No newline at end of file +export './survey_result_entity_extensions.dart'; diff --git a/lib/presentation/helpers/survey_result_entity_extensions.dart b/lib/presentation/helpers/survey_result_entity_extensions.dart index cd4e6b73..8db4d62d 100644 --- a/lib/presentation/helpers/survey_result_entity_extensions.dart +++ b/lib/presentation/helpers/survey_result_entity_extensions.dart @@ -1,19 +1,21 @@ -import '../../domain/entities/entities.dart'; +import '../../domain/domain.dart'; import '../../ui/pages/pages.dart'; extension SurveyResultEntityExtensions on SurveyResultEntity { SurveyResultViewModel toViewModel() => SurveyResultViewModel( - surveyId: surveyId, - question: question, - answers: answers.map((answer) => answer.toViewModel()).toList() - ); + surveyId: surveyId, + question: question, + answers: answers + .map((SurveyAnswerEntity answer) => answer.toViewModel()) + .toList(), + ); } extension SurveyAnswerEntityExtensions on SurveyAnswerEntity { SurveyAnswerViewModel toViewModel() => SurveyAnswerViewModel( - image: image, - answer: answer, - percent: '$percent%', - isCurrentAnswer: isCurrentAnswer - ); -} \ No newline at end of file + image: image, + answer: answer, + percent: '$percent%', + isCurrentAnswer: isCurrentAnswer, + ); +} diff --git a/lib/presentation/mixins/form_manager.dart b/lib/presentation/mixins/form_manager.dart index 3f03ab42..b79cc25b 100644 --- a/lib/presentation/mixins/form_manager.dart +++ b/lib/presentation/mixins/form_manager.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; mixin FormManager on GetxController { - final _isFormValid = false.obs; + final RxBool _isFormValid = false.obs; Stream get isFormValidStream => _isFormValid.stream; set isFormValid(bool value) => _isFormValid.value = value; -} \ No newline at end of file +} diff --git a/lib/presentation/mixins/loading_manager.dart b/lib/presentation/mixins/loading_manager.dart index ee1d0ebe..2b6aac30 100644 --- a/lib/presentation/mixins/loading_manager.dart +++ b/lib/presentation/mixins/loading_manager.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; mixin LoadingManager on GetxController { - final _isLoading = false.obs; + final RxBool _isLoading = false.obs; Stream get isLoadingStream => _isLoading.stream; set isLoading(bool value) => _isLoading.value = value; -} \ No newline at end of file +} diff --git a/lib/presentation/mixins/mixins.dart b/lib/presentation/mixins/mixins.dart index 305e160d..12380af8 100644 --- a/lib/presentation/mixins/mixins.dart +++ b/lib/presentation/mixins/mixins.dart @@ -1,5 +1,5 @@ +export './form_manager.dart'; export './loading_manager.dart'; -export './session_manager.dart'; export './navigation_manager.dart'; -export './form_manager.dart'; -export './ui_error_manager.dart'; \ No newline at end of file +export './session_manager.dart'; +export './ui_error_manager.dart'; diff --git a/lib/presentation/mixins/navigation_manager.dart b/lib/presentation/mixins/navigation_manager.dart index 0a601707..ee6f37d2 100644 --- a/lib/presentation/mixins/navigation_manager.dart +++ b/lib/presentation/mixins/navigation_manager.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; mixin NavigationManager on GetxController { - final _navigateTo = Rx(null); + final Rx _navigateTo = Rx(null); Stream get navigateToStream => _navigateTo.stream; set navigateTo(String value) => _navigateTo.subject.add(value); -} \ No newline at end of file +} diff --git a/lib/presentation/mixins/session_manager.dart b/lib/presentation/mixins/session_manager.dart index 3c9b6f68..26d236e1 100644 --- a/lib/presentation/mixins/session_manager.dart +++ b/lib/presentation/mixins/session_manager.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; mixin SessionManager on GetxController { - final _isSessionExpired = false.obs; + final RxBool _isSessionExpired = false.obs; Stream get isSessionExpiredStream => _isSessionExpired.stream; set isSessionExpired(bool value) => _isSessionExpired.value = value; -} \ No newline at end of file +} diff --git a/lib/presentation/mixins/ui_error_manager.dart b/lib/presentation/mixins/ui_error_manager.dart index 09798a22..e4b200ef 100644 --- a/lib/presentation/mixins/ui_error_manager.dart +++ b/lib/presentation/mixins/ui_error_manager.dart @@ -1,9 +1,9 @@ -import '../../ui/helpers/helpers.dart'; - import 'package:get/get.dart'; +import '../../ui/helpers/helpers.dart'; + mixin UIErrorManager on GetxController { - final _mainError = Rx(null); + final Rx _mainError = Rx(null); Stream get mainErrorStream => _mainError.stream; set mainError(UIError? value) => _mainError.value = value; -} \ No newline at end of file +} diff --git a/lib/presentation/presentation.dart b/lib/presentation/presentation.dart new file mode 100644 index 00000000..d0b7e6df --- /dev/null +++ b/lib/presentation/presentation.dart @@ -0,0 +1,4 @@ +export './helpers/helpers.dart'; +export './mixins/mixins.dart'; +export './presenters/presenters.dart'; +export './protocols/protocols.dart'; diff --git a/lib/presentation/presenters/getx_login_presenter.dart b/lib/presentation/presenters/getx_login_presenter.dart index 3858c4b7..76dd757b 100644 --- a/lib/presentation/presenters/getx_login_presenter.dart +++ b/lib/presentation/presenters/getx_login_presenter.dart @@ -1,38 +1,43 @@ +import 'package:get/get.dart'; + +import '../../domain/domain.dart'; import '../../ui/helpers/helpers.dart'; import '../../ui/pages/pages.dart'; -import '../../domain/helpers/helpers.dart'; -import '../../domain/usecases/usecases.dart'; -import '../protocols/protocols.dart'; import '../mixins/mixins.dart'; +import '../protocols/protocols.dart'; -import 'package:get/get.dart'; - -class GetxLoginPresenter extends GetxController with LoadingManager, NavigationManager, FormManager, UIErrorManager implements LoginPresenter { +class GetxLoginPresenter extends GetxController + with LoadingManager, NavigationManager, FormManager, UIErrorManager + implements LoginPresenter { final Validation validation; final Authentication authentication; final SaveCurrentAccount saveCurrentAccount; - - final _emailError = Rx(null); - final _passwordError = Rx(null); - + + final Rx _emailError = Rx(null); + final Rx _passwordError = Rx(null); + String? _email; String? _password; + @override Stream get emailErrorStream => _emailError.stream; + @override Stream get passwordErrorStream => _passwordError.stream; GetxLoginPresenter({ required this.validation, required this.authentication, - required this.saveCurrentAccount + required this.saveCurrentAccount, }); + @override void validateEmail(String email) { _email = email; _emailError.value = _validateField('email'); _validateForm(); } + @override void validatePassword(String password) { _password = password; _passwordError.value = _validateField('password'); @@ -40,42 +45,53 @@ class GetxLoginPresenter extends GetxController with LoadingManager, NavigationM } UIError? _validateField(String field) { - final formData = { + final Map formData = { 'email': _email, 'password': _password, }; - final error = validation.validate(field: field, input: formData); + final ValidationError? error = + validation.validate(field: field, input: formData); switch (error) { - case ValidationError.invalidField: return UIError.invalidField; - case ValidationError.requiredField: return UIError.requiredField; - default: return null; + case ValidationError.invalidField: + return UIError.invalidField; + case ValidationError.requiredField: + return UIError.requiredField; + default: + return null; } } void _validateForm() { - isFormValid = _emailError.value == null - && _passwordError.value == null - && _email != null - && _password != null; + isFormValid = _emailError.value == null && + _passwordError.value == null && + _email != null && + _password != null; } + @override Future auth() async { try { mainError = null; isLoading = true; - final account = await authentication.auth(AuthenticationParams(email: _email!, secret: _password!)); + final AccountEntity account = await authentication + .auth(AuthenticationParams(email: _email!, secret: _password!)); await saveCurrentAccount.save(account); navigateTo = '/surveys'; } on DomainError catch (error) { switch (error) { - case DomainError.invalidCredentials: mainError = UIError.invalidCredentials; break; - default: mainError = UIError.unexpected; break; + case DomainError.invalidCredentials: + mainError = UIError.invalidCredentials; + break; + default: + mainError = UIError.unexpected; + break; } isLoading = false; } } + @override void goToSignUp() { navigateTo = '/signup'; } -} \ No newline at end of file +} diff --git a/lib/presentation/presenters/getx_signup_presenter.dart b/lib/presentation/presenters/getx_signup_presenter.dart index 55bb8b82..f2aa2b00 100644 --- a/lib/presentation/presenters/getx_signup_presenter.dart +++ b/lib/presentation/presenters/getx_signup_presenter.dart @@ -1,56 +1,66 @@ +import 'package:get/get.dart'; + +import '../../domain/domain.dart'; import '../../ui/helpers/helpers.dart'; import '../../ui/pages/pages.dart'; -import '../../domain/helpers/helpers.dart'; -import '../../domain/usecases/usecases.dart'; -import '../protocols/protocols.dart'; import '../mixins/mixins.dart'; +import '../protocols/protocols.dart'; -import 'package:get/get.dart'; - -class GetxSignUpPresenter extends GetxController with LoadingManager, NavigationManager, FormManager, UIErrorManager implements SignUpPresenter { +class GetxSignUpPresenter extends GetxController + with LoadingManager, NavigationManager, FormManager, UIErrorManager + implements SignUpPresenter { final Validation validation; final AddAccount addAccount; final SaveCurrentAccount saveCurrentAccount; - - final _emailError = Rx(null); - final _nameError = Rx(null); - final _passwordError = Rx(null); - final _passwordConfirmationError = Rx(null); - + + final Rx _emailError = Rx(null); + final Rx _nameError = Rx(null); + final Rx _passwordError = Rx(null); + final Rx _passwordConfirmationError = Rx(null); + String? _name; String? _email; String? _password; String? _passwordConfirmation; + @override Stream get emailErrorStream => _emailError.stream; + @override Stream get nameErrorStream => _nameError.stream; + @override Stream get passwordErrorStream => _passwordError.stream; - Stream get passwordConfirmationErrorStream => _passwordConfirmationError.stream; + @override + Stream get passwordConfirmationErrorStream => + _passwordConfirmationError.stream; GetxSignUpPresenter({ required this.validation, required this.addAccount, - required this.saveCurrentAccount + required this.saveCurrentAccount, }); + @override void validateEmail(String email) { _email = email; _emailError.value = _validateField('email'); _validateForm(); } + @override void validateName(String name) { _name = name; _nameError.value = _validateField('name'); _validateForm(); } + @override void validatePassword(String password) { _password = password; _passwordError.value = _validateField('password'); _validateForm(); } + @override void validatePasswordConfirmation(String passwordConfirmation) { _passwordConfirmation = passwordConfirmation; _passwordConfirmationError.value = _validateField('passwordConfirmation'); @@ -58,53 +68,65 @@ class GetxSignUpPresenter extends GetxController with LoadingManager, Navigation } UIError? _validateField(String field) { - final formData = { + final Map formData = { 'name': _name, 'email': _email, 'password': _password, 'passwordConfirmation': _passwordConfirmation }; - final error = validation.validate(field: field, input: formData); + final ValidationError? error = + validation.validate(field: field, input: formData); switch (error) { - case ValidationError.invalidField: return UIError.invalidField; - case ValidationError.requiredField: return UIError.requiredField; - default: return null; + case ValidationError.invalidField: + return UIError.invalidField; + case ValidationError.requiredField: + return UIError.requiredField; + default: + return null; } } void _validateForm() { - isFormValid = _emailError.value == null - && _nameError.value == null - && _passwordError.value == null - && _passwordConfirmationError.value == null - && _name != null - && _email != null - && _password != null - && _passwordConfirmation != null; + isFormValid = _emailError.value == null && + _nameError.value == null && + _passwordError.value == null && + _passwordConfirmationError.value == null && + _name != null && + _email != null && + _password != null && + _passwordConfirmation != null; } + @override Future signUp() async { try { mainError = null; isLoading = true; - final account = await addAccount.add(AddAccountParams( - name: _name!, - email: _email!, - password: _password!, - passwordConfirmation: _passwordConfirmation! - )); + final AccountEntity account = await addAccount.add( + AddAccountParams( + name: _name!, + email: _email!, + password: _password!, + passwordConfirmation: _passwordConfirmation!, + ), + ); await saveCurrentAccount.save(account); navigateTo = '/surveys'; } on DomainError catch (error) { switch (error) { - case DomainError.emailInUse: mainError = UIError.emailInUse; break; - default: mainError = UIError.unexpected; break; + case DomainError.emailInUse: + mainError = UIError.emailInUse; + break; + default: + mainError = UIError.unexpected; + break; } isLoading = false; } } + @override void goToLogin() { navigateTo = '/login'; } -} \ No newline at end of file +} diff --git a/lib/presentation/presenters/getx_splash_presenter.dart b/lib/presentation/presenters/getx_splash_presenter.dart index 16fe4b0d..c73bf3f0 100644 --- a/lib/presentation/presenters/getx_splash_presenter.dart +++ b/lib/presentation/presenters/getx_splash_presenter.dart @@ -1,21 +1,24 @@ -import '../../domain/usecases/usecases.dart'; +import 'package:get/get.dart'; + +import '../../domain/domain.dart'; import '../../ui/pages/pages.dart'; import '../mixins/mixins.dart'; -import 'package:get/get.dart'; - -class GetxSplashPresenter extends GetxController with NavigationManager implements SplashPresenter { +class GetxSplashPresenter extends GetxController + with NavigationManager + implements SplashPresenter { final LoadCurrentAccount loadCurrentAccount; - GetxSplashPresenter({ required this.loadCurrentAccount }); + GetxSplashPresenter({required this.loadCurrentAccount}); + @override Future checkAccount({int durationInSeconds = 2}) async { await Future.delayed(Duration(seconds: durationInSeconds)); try { await loadCurrentAccount.load(); navigateTo = '/surveys'; - } catch(error) { + } catch (error) { navigateTo = '/login'; } } -} \ No newline at end of file +} diff --git a/lib/presentation/presenters/getx_survey_result_presenter.dart b/lib/presentation/presenters/getx_survey_result_presenter.dart index 4a3870fc..7335122a 100644 --- a/lib/presentation/presenters/getx_survey_result_presenter.dart +++ b/lib/presentation/presenters/getx_survey_result_presenter.dart @@ -1,19 +1,21 @@ -import '../../domain/entities/entities.dart'; -import '../../domain/helpers/helpers.dart'; -import '../../domain/usecases/usecases.dart'; +import 'package:get/get.dart'; + +import '../../domain/domain.dart'; import '../../ui/helpers/helpers.dart'; import '../../ui/pages/pages.dart'; import '../helpers/helpers.dart'; import '../mixins/mixins.dart'; -import 'package:get/get.dart'; - -class GetxSurveyResultPresenter extends GetxController with LoadingManager, SessionManager implements SurveyResultPresenter { +class GetxSurveyResultPresenter extends GetxController + with LoadingManager, SessionManager + implements SurveyResultPresenter { final LoadSurveyResult loadSurveyResult; final SaveSurveyResult saveSurveyResult; final String surveyId; - final _surveyResult = Rx(null); + final Rx _surveyResult = + Rx(null); + @override Stream get surveyResultStream => _surveyResult.stream; GetxSurveyResultPresenter({ @@ -22,20 +24,26 @@ class GetxSurveyResultPresenter extends GetxController with LoadingManager, Sess required this.surveyId, }); + @override Future loadData() async { - showResultOnAction(() => loadSurveyResult.loadBySurvey(surveyId: surveyId)); + await showResultOnAction( + () => loadSurveyResult.loadBySurvey(surveyId: surveyId), + ); } - Future save({ required String answer }) async { - showResultOnAction(() => saveSurveyResult.save(answer: answer)); + @override + Future save({required String answer}) async { + await showResultOnAction(() => saveSurveyResult.save(answer: answer)); } - Future showResultOnAction(Future action()) async { + Future showResultOnAction( + Future Function() action, + ) async { try { isLoading = true; - final surveyResult = await action(); + final SurveyResultEntity surveyResult = await action(); _surveyResult.subject.add(surveyResult.toViewModel()); - } on DomainError catch(error) { + } on DomainError catch (error) { if (error == DomainError.accessDenied) { isSessionExpired = true; } else { @@ -45,4 +53,4 @@ class GetxSurveyResultPresenter extends GetxController with LoadingManager, Sess isLoading = false; } } -} \ No newline at end of file +} diff --git a/lib/presentation/presenters/getx_surveys_presenter.dart b/lib/presentation/presenters/getx_surveys_presenter.dart index fcd28cc8..e653b754 100644 --- a/lib/presentation/presenters/getx_surveys_presenter.dart +++ b/lib/presentation/presenters/getx_surveys_presenter.dart @@ -1,33 +1,38 @@ -import '../../domain/helpers/helpers.dart'; -import '../../domain/usecases/usecases.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +import '../../domain/domain.dart'; import '../../ui/helpers/helpers.dart'; import '../../ui/pages/pages.dart'; import '../mixins/mixins.dart'; -import 'package:get/get.dart'; -import 'package:intl/intl.dart'; - -class GetxSurveysPresenter extends GetxController with SessionManager, LoadingManager, NavigationManager implements SurveysPresenter { +class GetxSurveysPresenter extends GetxController + with SessionManager, LoadingManager, NavigationManager + implements SurveysPresenter { final LoadSurveys loadSurveys; - final _surveys = Rx>([]); + final Rx> _surveys = Rx>([]); + @override Stream> get surveysStream => _surveys.stream; - GetxSurveysPresenter({ required this.loadSurveys }); + GetxSurveysPresenter({required this.loadSurveys}); + @override Future loadData() async { try { isLoading = true; - final surveys = await loadSurveys.load(); + final List surveys = await loadSurveys.load(); _surveys.value = surveys - .map((survey) => SurveyViewModel( - id: survey.id, - question: survey.question, - date: DateFormat('dd MMM yyyy').format(survey.dateTime), - didAnswer: survey.didAnswer - )) - .toList(); - } on DomainError catch(error) { + .map( + (SurveyEntity survey) => SurveyViewModel( + id: survey.id, + question: survey.question, + date: DateFormat('dd MMM yyyy').format(survey.dateTime), + didAnswer: survey.didAnswer, + ), + ) + .toList(); + } on DomainError catch (error) { if (error == DomainError.accessDenied) { isSessionExpired = true; } else { @@ -38,7 +43,8 @@ class GetxSurveysPresenter extends GetxController with SessionManager, LoadingMa } } + @override void goToSurveyResult(String surveyId) { navigateTo = '/survey_result/$surveyId'; } -} \ No newline at end of file +} diff --git a/lib/presentation/presenters/presenters.dart b/lib/presentation/presenters/presenters.dart index 94d44945..999de320 100644 --- a/lib/presentation/presenters/presenters.dart +++ b/lib/presentation/presenters/presenters.dart @@ -1,5 +1,5 @@ export './getx_login_presenter.dart'; export './getx_signup_presenter.dart'; export './getx_splash_presenter.dart'; +export './getx_survey_result_presenter.dart'; export './getx_surveys_presenter.dart'; -export './getx_survey_result_presenter.dart'; \ No newline at end of file diff --git a/lib/presentation/protocols/protocols.dart b/lib/presentation/protocols/protocols.dart index 5e553283..e653c60e 100644 --- a/lib/presentation/protocols/protocols.dart +++ b/lib/presentation/protocols/protocols.dart @@ -1 +1 @@ -export './validation.dart'; \ No newline at end of file +export './validation.dart'; diff --git a/lib/presentation/protocols/validation.dart b/lib/presentation/protocols/validation.dart index 69cd10ad..c306ece2 100644 --- a/lib/presentation/protocols/validation.dart +++ b/lib/presentation/protocols/validation.dart @@ -1,11 +1,5 @@ abstract class Validation { - ValidationError? validate({ - required String field, - required Map input - }); + ValidationError? validate({required String field, required Map input}); } -enum ValidationError { - requiredField, - invalidField -} \ No newline at end of file +enum ValidationError { requiredField, invalidField } diff --git a/lib/ui/components/app_theme.dart b/lib/ui/components/app_theme.dart index f30407ef..cd89e849 100644 --- a/lib/ui/components/app_theme.dart +++ b/lib/ui/components/app_theme.dart @@ -1,40 +1,40 @@ import 'package:flutter/material.dart'; ThemeData makeAppTheme() { - final primaryColor = Color.fromRGBO(136, 14, 79, 1); - final primaryColorDark = Color.fromRGBO(96, 0, 39, 1); - final primaryColorLight = Color.fromRGBO(188, 71, 123, 1); - final secondaryColor = Color.fromRGBO(0, 77, 64, 1); - final secondaryColorDark = Color.fromRGBO(0, 37, 26, 1); - final disabledColor = Colors.grey[400]; - final dividerColor = Colors.grey; - final textTheme = TextTheme( + const Color primaryColor = Color.fromRGBO(136, 14, 79, 1); + const Color primaryColorDark = Color.fromRGBO(96, 0, 39, 1); + const Color primaryColorLight = Color.fromRGBO(188, 71, 123, 1); + const Color secondaryColor = Color.fromRGBO(0, 77, 64, 1); + const Color secondaryColorDark = Color.fromRGBO(0, 37, 26, 1); + final Color? disabledColor = Colors.grey[400]; + const MaterialColor dividerColor = Colors.grey; + const TextTheme textTheme = TextTheme( headline1: TextStyle( fontSize: 30, fontWeight: FontWeight.bold, - color: primaryColorDark - ) + color: primaryColorDark, + ), ); - final inputDecorationTheme = InputDecorationTheme( + const InputDecorationTheme inputDecorationTheme = InputDecorationTheme( enabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColorLight) + borderSide: BorderSide(color: primaryColorLight), ), focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: primaryColor) + borderSide: BorderSide(color: primaryColor), ), - alignLabelWithHint: true + alignLabelWithHint: true, ); - final buttonTheme = ButtonThemeData( - colorScheme: ColorScheme.light(primary: primaryColor), + final ButtonThemeData buttonTheme = ButtonThemeData( + colorScheme: const ColorScheme.light(primary: primaryColor), buttonColor: primaryColor, splashColor: primaryColorLight, - padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20), + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20), textTheme: ButtonTextTheme.primary, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20) - ) + borderRadius: BorderRadius.circular(20), + ), ); - + return ThemeData( primaryColor: primaryColor, primaryColorDark: primaryColorDark, @@ -43,10 +43,10 @@ ThemeData makeAppTheme() { secondaryHeaderColor: secondaryColorDark, disabledColor: disabledColor, dividerColor: dividerColor, - colorScheme: ColorScheme.light(primary: primaryColor), + colorScheme: const ColorScheme.light(primary: primaryColor), backgroundColor: Colors.white, textTheme: textTheme, inputDecorationTheme: inputDecorationTheme, - buttonTheme: buttonTheme + buttonTheme: buttonTheme, ); -} \ No newline at end of file +} diff --git a/lib/ui/components/components.dart b/lib/ui/components/components.dart index df5d9bd3..362b8ca3 100644 --- a/lib/ui/components/components.dart +++ b/lib/ui/components/components.dart @@ -1,6 +1,6 @@ export './app_theme.dart'; -export './login_header.dart'; +export './error_message.dart'; export './headline1.dart'; +export './login_header.dart'; +export './reload_screen.dart'; export './spinner_dialog.dart'; -export './error_message.dart'; -export './reload_screen.dart'; \ No newline at end of file diff --git a/lib/ui/components/error_message.dart b/lib/ui/components/error_message.dart index b9b1b0af..27bc2c76 100644 --- a/lib/ui/components/error_message.dart +++ b/lib/ui/components/error_message.dart @@ -5,6 +5,6 @@ void showErrorMessage(BuildContext context, String error) { SnackBar( backgroundColor: Colors.red[900], content: Text(error, textAlign: TextAlign.center), - ) + ), ); -} \ No newline at end of file +} diff --git a/lib/ui/components/headline1.dart b/lib/ui/components/headline1.dart index 2c2e9908..ad82512f 100644 --- a/lib/ui/components/headline1.dart +++ b/lib/ui/components/headline1.dart @@ -3,14 +3,14 @@ import 'package:flutter/material.dart'; class Headline1 extends StatelessWidget { final String text; - Headline1({ required this.text }); + const Headline1({required this.text, super.key}); @override Widget build(BuildContext context) { return Text( text.toUpperCase(), textAlign: TextAlign.center, - style: Theme.of(context).textTheme.headline1 + style: Theme.of(context).textTheme.headline1, ); } -} \ No newline at end of file +} diff --git a/lib/ui/components/login_header.dart b/lib/ui/components/login_header.dart index 8944cfb4..9927f4d7 100644 --- a/lib/ui/components/login_header.dart +++ b/lib/ui/components/login_header.dart @@ -1,31 +1,33 @@ import 'package:flutter/material.dart'; class LoginHeader extends StatelessWidget { + const LoginHeader({super.key}); + @override Widget build(BuildContext context) { return Container( height: 240, - margin: EdgeInsets.only(bottom: 32), + margin: const EdgeInsets.only(bottom: 32), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topRight, end: Alignment.bottomLeft, - colors: [ + colors: [ Theme.of(context).primaryColorLight, Theme.of(context).primaryColorDark - ] + ], ), - boxShadow: [ + boxShadow: const [ BoxShadow( offset: Offset(0, 0), spreadRadius: 0, blurRadius: 4, - color: Colors.black + color: Colors.black, ) ], - borderRadius: BorderRadius.only(bottomLeft: Radius.circular(80)) + borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(80)), ), - child: Image(image: AssetImage('lib/ui/assets/logo.png')), + child: const Image(image: AssetImage('lib/ui/assets/logo.png')), ); } -} \ No newline at end of file +} diff --git a/lib/ui/components/reload_screen.dart b/lib/ui/components/reload_screen.dart index 7d8fa7f6..3562325a 100644 --- a/lib/ui/components/reload_screen.dart +++ b/lib/ui/components/reload_screen.dart @@ -1,22 +1,26 @@ -import '../helpers/helpers.dart'; - import 'package:flutter/material.dart'; +import '../helpers/helpers.dart'; + class ReloadScreen extends StatelessWidget { final String error; final Future Function() reload; - const ReloadScreen({ required this.error, required this.reload }); + const ReloadScreen({required this.error, required this.reload, super.key}); @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.all(40), + padding: const EdgeInsets.all(40), child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(error, style: TextStyle(fontSize: 16), textAlign: TextAlign.center), - SizedBox(height: 10), + children: [ + Text( + error, + style: const TextStyle(fontSize: 16), + textAlign: TextAlign.center, + ), + const SizedBox(height: 10), ElevatedButton( onPressed: reload, child: Text(R.string.reload), @@ -25,4 +29,4 @@ class ReloadScreen extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/components/spinner_dialog.dart b/lib/ui/components/spinner_dialog.dart index 5d6ae58b..a05f1508 100644 --- a/lib/ui/components/spinner_dialog.dart +++ b/lib/ui/components/spinner_dialog.dart @@ -1,24 +1,26 @@ -import '../helpers/helpers.dart'; - import 'package:flutter/material.dart'; +import '../helpers/helpers.dart'; + Future showLoading(BuildContext context) async { - await Future.delayed(Duration.zero); + // await Future.delayed(Duration.zero); await showDialog( context: context, barrierDismissible: false, - builder: (context) => SimpleDialog( - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator(), - SizedBox(height: 10), - Text(R.string.wait, textAlign: TextAlign.center), - ], - ), - ], - ), + builder: (BuildContext context) { + return SimpleDialog( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator(), + const SizedBox(height: 10), + Text(R.string.wait, textAlign: TextAlign.center), + ], + ), + ], + ); + }, ); } @@ -26,4 +28,4 @@ void hideLoading(BuildContext context) { if (Navigator.canPop(context)) { Navigator.of(context).pop(); } -} \ No newline at end of file +} diff --git a/lib/ui/helpers/errors/errors.dart b/lib/ui/helpers/errors/errors.dart index 708c196b..7278b910 100644 --- a/lib/ui/helpers/errors/errors.dart +++ b/lib/ui/helpers/errors/errors.dart @@ -1 +1 @@ -export './ui_error.dart'; \ No newline at end of file +export './ui_error.dart'; diff --git a/lib/ui/helpers/errors/ui_error.dart b/lib/ui/helpers/errors/ui_error.dart index 787fc975..b2657a6a 100644 --- a/lib/ui/helpers/errors/ui_error.dart +++ b/lib/ui/helpers/errors/ui_error.dart @@ -10,12 +10,17 @@ enum UIError { extension UIErrorExtension on UIError { String get description { - switch(this) { - case UIError.requiredField: return R.string.msgRequiredField; - case UIError.invalidField: return R.string.msgInvalidField; - case UIError.invalidCredentials: return R.string.msgInvalidCredentials; - case UIError.emailInUse: return R.string.msgEmailInUse; - default: return R.string.msgUnexpectedError; + switch (this) { + case UIError.requiredField: + return R.string.msgRequiredField; + case UIError.invalidField: + return R.string.msgInvalidField; + case UIError.invalidCredentials: + return R.string.msgInvalidCredentials; + case UIError.emailInUse: + return R.string.msgEmailInUse; + default: + return R.string.msgUnexpectedError; } } -} \ No newline at end of file +} diff --git a/lib/ui/helpers/helpers.dart b/lib/ui/helpers/helpers.dart index 64ecb99a..781022d5 100644 --- a/lib/ui/helpers/helpers.dart +++ b/lib/ui/helpers/helpers.dart @@ -1,2 +1,2 @@ export './errors/errors.dart'; -export './i18n/i18n.dart'; \ No newline at end of file +export './i18n/i18n.dart'; diff --git a/lib/ui/helpers/i18n/i18n.dart b/lib/ui/helpers/i18n/i18n.dart index 6ac20b27..bd781475 100644 --- a/lib/ui/helpers/i18n/i18n.dart +++ b/lib/ui/helpers/i18n/i18n.dart @@ -1 +1 @@ -export './resources.dart'; \ No newline at end of file +export './resources.dart'; diff --git a/lib/ui/helpers/i18n/resources.dart b/lib/ui/helpers/i18n/resources.dart index cb669256..6e11d562 100644 --- a/lib/ui/helpers/i18n/resources.dart +++ b/lib/ui/helpers/i18n/resources.dart @@ -1,13 +1,15 @@ -import './strings/strings.dart'; - import 'package:flutter/widgets.dart'; +import './strings/strings.dart'; + class R { static Translation string = PtBr(); static void load(Locale locale) { switch (locale.toString()) { - default: string = PtBr(); break; + default: + string = PtBr(); + break; } } -} \ No newline at end of file +} diff --git a/lib/ui/helpers/i18n/strings/pt_br.dart b/lib/ui/helpers/i18n/strings/pt_br.dart index c303409d..ebfb0902 100644 --- a/lib/ui/helpers/i18n/strings/pt_br.dart +++ b/lib/ui/helpers/i18n/strings/pt_br.dart @@ -1,21 +1,38 @@ import './translation.dart'; class PtBr implements Translation { + @override String get msgEmailInUse => 'O email já está em uso.'; + @override String get msgInvalidCredentials => 'Credenciais inválidas.'; + @override String get msgInvalidField => 'Campo inválido'; + @override String get msgRequiredField => 'Campo obrigatório'; - String get msgUnexpectedError => 'Algo errado aconteceu. Tente novamente em breve.'; + @override + String get msgUnexpectedError => + 'Algo errado aconteceu. Tente novamente em breve.'; + @override String get addAccount => 'Criar conta'; + @override String get confirmPassword => 'Confirmar senha'; + @override String get email => 'Email'; + @override String get enter => 'Entrar'; + @override String get login => 'Login'; + @override String get name => 'Nome'; + @override String get password => 'Senha'; + @override String get reload => 'Recarregar'; + @override String get surveys => 'Enquetes'; + @override String get surveyResult => 'Resultado da enquete'; + @override String get wait => 'Aguarde...'; -} \ No newline at end of file +} diff --git a/lib/ui/helpers/i18n/strings/strings.dart b/lib/ui/helpers/i18n/strings/strings.dart index 6e083207..3d4de407 100644 --- a/lib/ui/helpers/i18n/strings/strings.dart +++ b/lib/ui/helpers/i18n/strings/strings.dart @@ -1,2 +1,2 @@ +export './pt_br.dart'; export './translation.dart'; -export './pt_br.dart'; \ No newline at end of file diff --git a/lib/ui/helpers/i18n/strings/translation.dart b/lib/ui/helpers/i18n/strings/translation.dart index 50bad48b..acf8dd32 100644 --- a/lib/ui/helpers/i18n/strings/translation.dart +++ b/lib/ui/helpers/i18n/strings/translation.dart @@ -16,4 +16,4 @@ abstract class Translation { String get surveys; String get surveyResult; String get wait; -} \ No newline at end of file +} diff --git a/lib/ui/mixins/keyboard_manager.dart b/lib/ui/mixins/keyboard_manager.dart index 5d4d8925..d4afd530 100644 --- a/lib/ui/mixins/keyboard_manager.dart +++ b/lib/ui/mixins/keyboard_manager.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; mixin KeyboardManager { void hideKeyboard(BuildContext context) { - final currectFocus = FocusScope.of(context); + final FocusScopeNode currectFocus = FocusScope.of(context); if (!currectFocus.hasPrimaryFocus) { currectFocus.unfocus(); } } -} \ No newline at end of file +} diff --git a/lib/ui/mixins/loading_manager.dart b/lib/ui/mixins/loading_manager.dart index 11bdb090..eb38de63 100644 --- a/lib/ui/mixins/loading_manager.dart +++ b/lib/ui/mixins/loading_manager.dart @@ -1,10 +1,10 @@ -import '../components/components.dart'; - import 'package:flutter/material.dart'; +import '../components/components.dart'; + mixin LoadingManager { void handleLoading(BuildContext context, Stream stream) { - stream.listen((isLoading) async { + stream.listen((bool isLoading) async { if (isLoading == true) { await showLoading(context); } else { @@ -12,4 +12,4 @@ mixin LoadingManager { } }); } -} \ No newline at end of file +} diff --git a/lib/ui/mixins/mixins.dart b/lib/ui/mixins/mixins.dart index 6b2f9bd8..6f245717 100644 --- a/lib/ui/mixins/mixins.dart +++ b/lib/ui/mixins/mixins.dart @@ -1,5 +1,5 @@ export './keyboard_manager.dart'; export './loading_manager.dart'; -export './ui_error_manager.dart'; export './navigation_manager.dart'; -export './session_manager.dart'; \ No newline at end of file +export './session_manager.dart'; +export './ui_error_manager.dart'; diff --git a/lib/ui/mixins/navigation_manager.dart b/lib/ui/mixins/navigation_manager.dart index 43453129..fa8d066c 100644 --- a/lib/ui/mixins/navigation_manager.dart +++ b/lib/ui/mixins/navigation_manager.dart @@ -2,7 +2,7 @@ import 'package:get/get.dart'; mixin NavigationManager { void handleNavigation(Stream stream, {bool clear = false}) { - stream.listen((page) { + stream.listen((String? page) { if (page != null && page.isNotEmpty) { if (clear == true) { Get.offAllNamed(page); @@ -12,4 +12,4 @@ mixin NavigationManager { } }); } -} \ No newline at end of file +} diff --git a/lib/ui/mixins/session_manager.dart b/lib/ui/mixins/session_manager.dart index 4910d0a3..3d0543fa 100644 --- a/lib/ui/mixins/session_manager.dart +++ b/lib/ui/mixins/session_manager.dart @@ -2,10 +2,10 @@ import 'package:get/get.dart'; mixin SessionManager { void handleSessionExpired(Stream stream) { - stream.listen((isExpired) { + stream.listen((bool isExpired) { if (isExpired == true) { Get.offAllNamed('/login'); } }); } -} \ No newline at end of file +} diff --git a/lib/ui/mixins/ui_error_manager.dart b/lib/ui/mixins/ui_error_manager.dart index 3f573b11..9fcfab4d 100644 --- a/lib/ui/mixins/ui_error_manager.dart +++ b/lib/ui/mixins/ui_error_manager.dart @@ -1,14 +1,14 @@ +import 'package:flutter/material.dart'; + import '../components/components.dart'; import '../helpers/errors/errors.dart'; -import 'package:flutter/material.dart'; - mixin UIErrorManager { void handleMainError(BuildContext context, Stream stream) { - stream.listen((error) { + stream.listen((UIError? error) { if (error != null) { showErrorMessage(context, error.description); } }); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/login/components/components.dart b/lib/ui/pages/login/components/components.dart index 743aec31..5c5f8469 100644 --- a/lib/ui/pages/login/components/components.dart +++ b/lib/ui/pages/login/components/components.dart @@ -1,3 +1,3 @@ export './email_input.dart'; +export './login_button.dart'; export './password_input.dart'; -export './login_button.dart'; \ No newline at end of file diff --git a/lib/ui/pages/login/components/email_input.dart b/lib/ui/pages/login/components/email_input.dart index b5f3b9dd..e79a0588 100644 --- a/lib/ui/pages/login/components/email_input.dart +++ b/lib/ui/pages/login/components/email_input.dart @@ -1,16 +1,18 @@ -import '../../../helpers/helpers.dart'; -import '../login.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../login.dart'; + class EmailInput extends StatelessWidget { + const EmailInput({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final LoginPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.emailErrorStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return TextFormField( decoration: InputDecoration( labelText: R.string.email, @@ -23,4 +25,4 @@ class EmailInput extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/login/components/login_button.dart b/lib/ui/pages/login/components/login_button.dart index 7acf8b78..3395c4c9 100644 --- a/lib/ui/pages/login/components/login_button.dart +++ b/lib/ui/pages/login/components/login_button.dart @@ -1,21 +1,23 @@ -import '../../../helpers/helpers.dart'; -import '../login.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../login.dart'; + class LoginButton extends StatelessWidget { + const LoginButton({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final LoginPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.isFormValidStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return ElevatedButton( onPressed: snapshot.data == true ? presenter.auth : null, child: Text(R.string.enter.toUpperCase()), ); - } + }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/login/components/password_input.dart b/lib/ui/pages/login/components/password_input.dart index 5756518e..a4952f6e 100644 --- a/lib/ui/pages/login/components/password_input.dart +++ b/lib/ui/pages/login/components/password_input.dart @@ -1,16 +1,18 @@ -import '../../../helpers/helpers.dart'; -import '../login.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../login.dart'; + class PasswordInput extends StatelessWidget { + const PasswordInput({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final LoginPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.passwordErrorStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return TextFormField( decoration: InputDecoration( labelText: R.string.password, @@ -20,7 +22,7 @@ class PasswordInput extends StatelessWidget { obscureText: true, onChanged: presenter.validatePassword, ); - } + }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/login/login.dart b/lib/ui/pages/login/login.dart index 2fda2193..a9f16742 100644 --- a/lib/ui/pages/login/login.dart +++ b/lib/ui/pages/login/login.dart @@ -1,2 +1,2 @@ export './login_page.dart'; -export './login_presenter.dart'; \ No newline at end of file +export './login_presenter.dart'; diff --git a/lib/ui/pages/login/login_page.dart b/lib/ui/pages/login/login_page.dart index a2c02718..b47bcd63 100644 --- a/lib/ui/pages/login/login_page.dart +++ b/lib/ui/pages/login/login_page.dart @@ -1,22 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import './components/components.dart'; +import './login.dart'; import '../../components/components.dart'; import '../../helpers/helpers.dart'; import '../../mixins/mixins.dart'; -import './components/components.dart'; -import './login.dart'; - -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -class LoginPage extends StatelessWidget with KeyboardManager, LoadingManager, UIErrorManager, NavigationManager { +class LoginPage extends StatelessWidget + with KeyboardManager, LoadingManager, UIErrorManager, NavigationManager { final LoginPresenter presenter; - LoginPage(this.presenter); + LoginPage(this.presenter, {super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Builder( - builder: (context) { + builder: (BuildContext context) { handleLoading(context, presenter.isLoadingStream); handleMainError(context, presenter.mainErrorStream); handleNavigation(presenter.navigateToStream, clear: true); @@ -27,25 +28,25 @@ class LoginPage extends StatelessWidget with KeyboardManager, LoadingManager, UI child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - LoginHeader(), + const LoginHeader(), Headline1(text: R.string.login), Padding( - padding: EdgeInsets.all(32), - child: ListenableProvider( + padding: const EdgeInsets.all(32), + child: ListenableProvider( create: (_) => presenter, child: Form( child: Column( children: [ - EmailInput(), - Padding( + const EmailInput(), + const Padding( padding: EdgeInsets.only(top: 8, bottom: 32), child: PasswordInput(), ), - LoginButton(), + const LoginButton(), TextButton.icon( onPressed: presenter.goToSignUp, - icon: Icon(Icons.person), - label: Text(R.string.addAccount) + icon: const Icon(Icons.person), + label: Text(R.string.addAccount), ) ], ), diff --git a/lib/ui/pages/login/login_presenter.dart b/lib/ui/pages/login/login_presenter.dart index cb16cc5b..11012b3f 100644 --- a/lib/ui/pages/login/login_presenter.dart +++ b/lib/ui/pages/login/login_presenter.dart @@ -1,7 +1,7 @@ -import '../../helpers/helpers.dart'; - import 'package:flutter/material.dart'; +import '../../helpers/helpers.dart'; + abstract class LoginPresenter implements Listenable { Stream get emailErrorStream; Stream get passwordErrorStream; @@ -14,4 +14,4 @@ abstract class LoginPresenter implements Listenable { void validatePassword(String password); Future auth(); void goToSignUp(); -} \ No newline at end of file +} diff --git a/lib/ui/pages/pages.dart b/lib/ui/pages/pages.dart index ca4fcbc5..8bd0668e 100644 --- a/lib/ui/pages/pages.dart +++ b/lib/ui/pages/pages.dart @@ -1,5 +1,5 @@ export './login/login.dart'; export './signup/signup.dart'; export './splash/splash.dart'; +export './survey_result/survey_result.dart'; export './surveys/surveys.dart'; -export './survey_result/survey_result.dart'; \ No newline at end of file diff --git a/lib/ui/pages/signup/components/components.dart b/lib/ui/pages/signup/components/components.dart index 5ec0c203..e554f182 100644 --- a/lib/ui/pages/signup/components/components.dart +++ b/lib/ui/pages/signup/components/components.dart @@ -1,5 +1,5 @@ -export './name_input.dart'; export './email_input.dart'; -export './password_input.dart'; +export './name_input.dart'; export './password_confirmation_input.dart'; -export './signup_button.dart'; \ No newline at end of file +export './password_input.dart'; +export './signup_button.dart'; diff --git a/lib/ui/pages/signup/components/email_input.dart b/lib/ui/pages/signup/components/email_input.dart index 65cbb6c7..c235af9b 100644 --- a/lib/ui/pages/signup/components/email_input.dart +++ b/lib/ui/pages/signup/components/email_input.dart @@ -1,16 +1,18 @@ -import '../../../helpers/helpers.dart'; -import '../signup.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../signup.dart'; + class EmailInput extends StatelessWidget { + const EmailInput({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final SignUpPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.emailErrorStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return TextFormField( decoration: InputDecoration( labelText: R.string.email, @@ -23,4 +25,4 @@ class EmailInput extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/signup/components/name_input.dart b/lib/ui/pages/signup/components/name_input.dart index f8540203..dfe0aaaa 100644 --- a/lib/ui/pages/signup/components/name_input.dart +++ b/lib/ui/pages/signup/components/name_input.dart @@ -1,20 +1,23 @@ -import '../../../helpers/helpers.dart'; -import '../signup.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../signup.dart'; + class NameInput extends StatelessWidget { + const NameInput({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final SignUpPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.nameErrorStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return TextFormField( decoration: InputDecoration( labelText: R.string.name, - icon: Icon(Icons.person, color: Theme.of(context).primaryColorLight), + icon: + Icon(Icons.person, color: Theme.of(context).primaryColorLight), errorText: snapshot.data?.description, ), keyboardType: TextInputType.name, @@ -23,4 +26,4 @@ class NameInput extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/signup/components/password_confirmation_input.dart b/lib/ui/pages/signup/components/password_confirmation_input.dart index dee084e2..adb26b6f 100644 --- a/lib/ui/pages/signup/components/password_confirmation_input.dart +++ b/lib/ui/pages/signup/components/password_confirmation_input.dart @@ -1,16 +1,18 @@ -import '../../../helpers/helpers.dart'; -import '../signup.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../signup.dart'; + class PasswordConfirmationInput extends StatelessWidget { + const PasswordConfirmationInput({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final SignUpPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.passwordConfirmationErrorStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return TextFormField( decoration: InputDecoration( labelText: R.string.confirmPassword, @@ -23,4 +25,4 @@ class PasswordConfirmationInput extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/signup/components/password_input.dart b/lib/ui/pages/signup/components/password_input.dart index c36c936d..235f26e5 100644 --- a/lib/ui/pages/signup/components/password_input.dart +++ b/lib/ui/pages/signup/components/password_input.dart @@ -1,16 +1,18 @@ -import '../../../helpers/helpers.dart'; -import '../signup.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../signup.dart'; + class PasswordInput extends StatelessWidget { + const PasswordInput({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final SignUpPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.passwordErrorStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return TextFormField( decoration: InputDecoration( labelText: R.string.password, @@ -23,4 +25,4 @@ class PasswordInput extends StatelessWidget { }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/signup/components/signup_button.dart b/lib/ui/pages/signup/components/signup_button.dart index 207245ff..d3393325 100644 --- a/lib/ui/pages/signup/components/signup_button.dart +++ b/lib/ui/pages/signup/components/signup_button.dart @@ -1,21 +1,23 @@ -import '../../../helpers/helpers.dart'; -import '../signup.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../../helpers/helpers.dart'; +import '../signup.dart'; + class SignUpButton extends StatelessWidget { + const SignUpButton({super.key}); + @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final SignUpPresenter presenter = Provider.of(context); return StreamBuilder( stream: presenter.isFormValidStream, - builder: (context, snapshot) { + builder: (BuildContext context, AsyncSnapshot snapshot) { return ElevatedButton( onPressed: snapshot.data == true ? presenter.signUp : null, child: Text(R.string.addAccount.toUpperCase()), ); - } + }, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/signup/signup.dart b/lib/ui/pages/signup/signup.dart index dabe3d3b..6a500205 100644 --- a/lib/ui/pages/signup/signup.dart +++ b/lib/ui/pages/signup/signup.dart @@ -1,2 +1,2 @@ export './signup_page.dart'; -export './signup_presenter.dart'; \ No newline at end of file +export './signup_presenter.dart'; diff --git a/lib/ui/pages/signup/signup_page.dart b/lib/ui/pages/signup/signup_page.dart index d76a39be..2f187ea6 100644 --- a/lib/ui/pages/signup/signup_page.dart +++ b/lib/ui/pages/signup/signup_page.dart @@ -1,22 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import './components/components.dart'; +import './signup.dart'; import '../../components/components.dart'; import '../../helpers/helpers.dart'; import '../../mixins/mixins.dart'; -import './components/components.dart'; -import './signup.dart'; - -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -class SignUpPage extends StatelessWidget with KeyboardManager, LoadingManager, UIErrorManager, NavigationManager { +class SignUpPage extends StatelessWidget + with KeyboardManager, LoadingManager, UIErrorManager, NavigationManager { final SignUpPresenter presenter; - SignUpPage(this.presenter); + SignUpPage(this.presenter, {super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Builder( - builder: (context) { + builder: (BuildContext context) { handleLoading(context, presenter.isLoadingStream); handleMainError(context, presenter.mainErrorStream); handleNavigation(presenter.navigateToStream, clear: true); @@ -27,30 +28,30 @@ class SignUpPage extends StatelessWidget with KeyboardManager, LoadingManager, U child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - LoginHeader(), + const LoginHeader(), Headline1(text: R.string.addAccount), Padding( - padding: EdgeInsets.all(32), - child: ListenableProvider( + padding: const EdgeInsets.all(32), + child: ListenableProvider( create: (_) => presenter, child: Form( child: Column( children: [ - NameInput(), - Padding( + const NameInput(), + const Padding( padding: EdgeInsets.symmetric(vertical: 8), child: EmailInput(), ), - PasswordInput(), - Padding( + const PasswordInput(), + const Padding( padding: EdgeInsets.only(top: 8, bottom: 32), child: PasswordConfirmationInput(), ), - SignUpButton(), + const SignUpButton(), TextButton.icon( onPressed: presenter.goToLogin, - icon: Icon(Icons.exit_to_app), - label: Text(R.string.login) + icon: const Icon(Icons.exit_to_app), + label: Text(R.string.login), ) ], ), diff --git a/lib/ui/pages/signup/signup_presenter.dart b/lib/ui/pages/signup/signup_presenter.dart index 6168cd79..740f5f63 100644 --- a/lib/ui/pages/signup/signup_presenter.dart +++ b/lib/ui/pages/signup/signup_presenter.dart @@ -1,7 +1,7 @@ -import '../../helpers/helpers.dart'; - import 'package:flutter/material.dart'; +import '../../helpers/helpers.dart'; + abstract class SignUpPresenter implements Listenable { Stream get nameErrorStream; Stream get emailErrorStream; @@ -18,4 +18,4 @@ abstract class SignUpPresenter implements Listenable { void validatePasswordConfirmation(String passwordConfirmation); Future signUp(); void goToLogin(); -} \ No newline at end of file +} diff --git a/lib/ui/pages/splash/splash.dart b/lib/ui/pages/splash/splash.dart index c7958b85..916aa2af 100644 --- a/lib/ui/pages/splash/splash.dart +++ b/lib/ui/pages/splash/splash.dart @@ -1,2 +1,2 @@ export './splash_page.dart'; -export './splash_presenter.dart'; \ No newline at end of file +export './splash_presenter.dart'; diff --git a/lib/ui/pages/splash/splash_page.dart b/lib/ui/pages/splash/splash_page.dart index 6eee6ac0..69faa77e 100644 --- a/lib/ui/pages/splash/splash_page.dart +++ b/lib/ui/pages/splash/splash_page.dart @@ -1,28 +1,28 @@ -import '../../mixins/mixins.dart'; -import './splash.dart'; - import 'package:flutter/material.dart'; +import './splash.dart'; +import '../../mixins/mixins.dart'; + class SplashPage extends StatelessWidget with NavigationManager { final SplashPresenter presenter; - SplashPage({ required this.presenter }); + SplashPage({required this.presenter, super.key}); @override Widget build(BuildContext context) { presenter.checkAccount(); return Scaffold( - appBar: AppBar(title: Text('4Dev')), + appBar: AppBar(title: const Text('4Dev')), body: Builder( - builder: (context) { + builder: (BuildContext context) { handleNavigation(presenter.navigateToStream, clear: true); - return Center( + return const Center( child: CircularProgressIndicator(), ); }, ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/splash/splash_presenter.dart b/lib/ui/pages/splash/splash_presenter.dart index 0b2e5bce..fa8fb4dc 100644 --- a/lib/ui/pages/splash/splash_presenter.dart +++ b/lib/ui/pages/splash/splash_presenter.dart @@ -4,4 +4,4 @@ abstract class SplashPresenter implements Listenable { Stream get navigateToStream; Future checkAccount({int durationInSeconds}); -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/components/active_icon.dart b/lib/ui/pages/survey_result/components/active_icon.dart index 8215cd71..37439a62 100644 --- a/lib/ui/pages/survey_result/components/active_icon.dart +++ b/lib/ui/pages/survey_result/components/active_icon.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; class ActiveIcon extends StatelessWidget { + const ActiveIcon({super.key}); + @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(left: 10), + padding: const EdgeInsets.only(left: 10), child: Icon( Icons.check_circle, color: Theme.of(context).highlightColor, ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/components/components.dart b/lib/ui/pages/survey_result/components/components.dart index 6b88bdda..4df3d1bb 100644 --- a/lib/ui/pages/survey_result/components/components.dart +++ b/lib/ui/pages/survey_result/components/components.dart @@ -1,5 +1,5 @@ -export './survey_result.dart'; export './active_icon.dart'; export './disabled_icon.dart'; +export './survey_answer.dart'; export './survey_header.dart'; -export './survey_answer.dart'; \ No newline at end of file +export './survey_result.dart'; diff --git a/lib/ui/pages/survey_result/components/disabled_icon.dart b/lib/ui/pages/survey_result/components/disabled_icon.dart index fb62f733..6cc6275a 100644 --- a/lib/ui/pages/survey_result/components/disabled_icon.dart +++ b/lib/ui/pages/survey_result/components/disabled_icon.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; class DisabledIcon extends StatelessWidget { + const DisabledIcon({super.key}); + @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(left: 10), + padding: const EdgeInsets.only(left: 10), child: Icon( Icons.check_circle, color: Theme.of(context).disabledColor, ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/components/survey_answer.dart b/lib/ui/pages/survey_result/components/survey_answer.dart index 678cc44a..51e2f908 100644 --- a/lib/ui/pages/survey_result/components/survey_answer.dart +++ b/lib/ui/pages/survey_result/components/survey_answer.dart @@ -1,12 +1,11 @@ -import '../survey_result.dart'; -import './components.dart'; - import 'package:flutter/material.dart'; +import '../survey_result.dart'; + class SurveyAnswer extends StatelessWidget { final SurveyAnswerViewModel viewModel; - SurveyAnswer(this.viewModel); + const SurveyAnswer(this.viewModel, {super.key}); @override Widget build(BuildContext context) { @@ -14,11 +13,8 @@ class SurveyAnswer extends StatelessWidget { List children = [ Expanded( child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10), - child: Text( - viewModel.answer, - style: TextStyle(fontSize: 16) - ), + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Text(viewModel.answer, style: const TextStyle(fontSize: 16)), ), ), Text( @@ -27,15 +23,18 @@ class SurveyAnswer extends StatelessWidget { fontSize: 16, fontWeight: FontWeight.bold, color: Theme.of(context).primaryColorDark, - ) + ), ), - viewModel.isCurrentAnswer ? ActiveIcon() : DisabledIcon() + viewModel.isCurrentAnswer ? const ActiveIcon() : const DisabledIcon() ]; if (viewModel.image != null) { - children.insert(0, Image.network( - viewModel.image!, - width: 40, - )); + children.insert( + 0, + Image.network( + viewModel.image!, + width: 40, + ), + ); } return children; } @@ -43,17 +42,15 @@ class SurveyAnswer extends StatelessWidget { return Column( children: [ Container( - padding: EdgeInsets.all(15), - decoration: BoxDecoration( - color: Theme.of(context).backgroundColor - ), + padding: const EdgeInsets.all(15), + decoration: BoxDecoration(color: Theme.of(context).backgroundColor), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: _buildItems(), ), ), - Divider(height: 1) + const Divider(height: 1) ], ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/components/survey_header.dart b/lib/ui/pages/survey_result/components/survey_header.dart index b5ebd913..3f9ed9fb 100644 --- a/lib/ui/pages/survey_result/components/survey_header.dart +++ b/lib/ui/pages/survey_result/components/survey_header.dart @@ -3,16 +3,15 @@ import 'package:flutter/material.dart'; class SurveyHeader extends StatelessWidget { final String question; - SurveyHeader(this.question); + const SurveyHeader(this.question, {super.key}); @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.only(top: 40, bottom: 20, left: 20, right: 20), - decoration: BoxDecoration( - color: Theme.of(context).disabledColor.withAlpha(90) - ), - child: Text(question) + padding: const EdgeInsets.only(top: 40, bottom: 20, left: 20, right: 20), + decoration: + BoxDecoration(color: Theme.of(context).disabledColor.withAlpha(90)), + child: Text(question), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/components/survey_result.dart b/lib/ui/pages/survey_result/components/survey_result.dart index ab833cc9..f732d1b7 100644 --- a/lib/ui/pages/survey_result/components/survey_result.dart +++ b/lib/ui/pages/survey_result/components/survey_result.dart @@ -1,28 +1,32 @@ -import '../survey_result.dart'; -import './components.dart'; - import 'package:flutter/material.dart'; +import '../survey_result.dart'; + class SurveyResult extends StatelessWidget { final SurveyResultViewModel viewModel; - final void Function({ required String answer }) onSave; + final void Function({required String answer}) onSave; - SurveyResult({ required this.viewModel, required this.onSave }); + const SurveyResult({ + required this.viewModel, + required this.onSave, + super.key, + }); @override Widget build(BuildContext context) { return ListView.builder( - itemBuilder: (context, index) { + itemBuilder: (BuildContext context, int index) { if (index == 0) { return SurveyHeader(viewModel.question); } - final answer = viewModel.answers[index - 1]; + final SurveyAnswerViewModel answer = viewModel.answers[index - 1]; return GestureDetector( - onTap: () => answer.isCurrentAnswer ? null : onSave(answer: answer.answer), - child: SurveyAnswer(answer) + onTap: () => + answer.isCurrentAnswer ? null : onSave(answer: answer.answer), + child: SurveyAnswer(answer), ); }, itemCount: viewModel.answers.length + 1, ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/survey_answer_viewmodel.dart b/lib/ui/pages/survey_result/survey_answer_viewmodel.dart index 9ede0b1b..9676a47f 100644 --- a/lib/ui/pages/survey_result/survey_answer_viewmodel.dart +++ b/lib/ui/pages/survey_result/survey_answer_viewmodel.dart @@ -6,12 +6,13 @@ class SurveyAnswerViewModel extends Equatable { final bool isCurrentAnswer; final String percent; - List get props => [image, answer, isCurrentAnswer, percent]; + @override + List get props => [image, answer, isCurrentAnswer, percent]; - SurveyAnswerViewModel({ - this.image, + const SurveyAnswerViewModel({ required this.answer, required this.isCurrentAnswer, required this.percent, + this.image, }); -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/survey_result.dart b/lib/ui/pages/survey_result/survey_result.dart index afd8d761..e31f0eef 100644 --- a/lib/ui/pages/survey_result/survey_result.dart +++ b/lib/ui/pages/survey_result/survey_result.dart @@ -1,4 +1,5 @@ +export './components/components.dart'; +export './survey_answer_viewmodel.dart'; export './survey_result_page.dart'; export './survey_result_presenter.dart'; export './survey_result_viewmodel.dart'; -export './survey_answer_viewmodel.dart'; \ No newline at end of file diff --git a/lib/ui/pages/survey_result/survey_result_page.dart b/lib/ui/pages/survey_result/survey_result_page.dart index a39e633c..b3dfa450 100644 --- a/lib/ui/pages/survey_result/survey_result_page.dart +++ b/lib/ui/pages/survey_result/survey_result_page.dart @@ -1,40 +1,49 @@ +import 'package:flutter/material.dart'; + +import './survey_result.dart'; import '../../components/components.dart'; import '../../helpers/helpers.dart'; import '../../mixins/mixins.dart'; -import './components/components.dart'; -import './survey_result.dart'; - -import 'package:flutter/material.dart'; -class SurveyResultPage extends StatelessWidget with LoadingManager, SessionManager { +class SurveyResultPage extends StatelessWidget + with LoadingManager, SessionManager { final SurveyResultPresenter presenter; - SurveyResultPage(this.presenter); + SurveyResultPage(this.presenter, {super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(R.string.surveyResult)), body: Builder( - builder: (context) { + builder: (BuildContext context) { handleLoading(context, presenter.isLoadingStream); handleSessionExpired(presenter.isSessionExpiredStream); presenter.loadData(); return StreamBuilder( stream: presenter.surveyResultStream, - builder: (context, snapshot) { + builder: ( + BuildContext context, + AsyncSnapshot snapshot, + ) { if (snapshot.hasError) { - return ReloadScreen(error: '${snapshot.error}', reload: presenter.loadData); + return ReloadScreen( + error: '${snapshot.error}', + reload: presenter.loadData, + ); } if (snapshot.hasData) { - return SurveyResult(viewModel: snapshot.data!, onSave: presenter.save); + return SurveyResult( + viewModel: snapshot.data!, + onSave: presenter.save, + ); } - return SizedBox(height: 0); - } + return const SizedBox.shrink(); + }, ); - } - ) + }, + ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/survey_result/survey_result_presenter.dart b/lib/ui/pages/survey_result/survey_result_presenter.dart index 0aa212ae..3bce40ec 100644 --- a/lib/ui/pages/survey_result/survey_result_presenter.dart +++ b/lib/ui/pages/survey_result/survey_result_presenter.dart @@ -1,12 +1,12 @@ -import './survey_result.dart'; - import 'package:flutter/material.dart'; +import './survey_result.dart'; + abstract class SurveyResultPresenter implements Listenable { Stream get isLoadingStream; Stream get isSessionExpiredStream; Stream get surveyResultStream; - + Future loadData(); - Future save({ required String answer }); -} \ No newline at end of file + Future save({required String answer}); +} diff --git a/lib/ui/pages/survey_result/survey_result_viewmodel.dart b/lib/ui/pages/survey_result/survey_result_viewmodel.dart index 572278b5..e2dd4831 100644 --- a/lib/ui/pages/survey_result/survey_result_viewmodel.dart +++ b/lib/ui/pages/survey_result/survey_result_viewmodel.dart @@ -1,17 +1,18 @@ -import './survey_result.dart'; - import 'package:equatable/equatable.dart'; +import './survey_result.dart'; + class SurveyResultViewModel extends Equatable { final String surveyId; final String question; final List answers; - List get props => [surveyId, question, answers]; + @override + List get props => [surveyId, question, answers]; - SurveyResultViewModel({ + const SurveyResultViewModel({ required this.surveyId, required this.question, required this.answers, }); -} \ No newline at end of file +} diff --git a/lib/ui/pages/surveys/components/components.dart b/lib/ui/pages/surveys/components/components.dart index ede8fb58..b24d7918 100644 --- a/lib/ui/pages/surveys/components/components.dart +++ b/lib/ui/pages/surveys/components/components.dart @@ -1,2 +1,2 @@ export './survey_item.dart'; -export './survey_items.dart'; \ No newline at end of file +export './survey_items.dart'; diff --git a/lib/ui/pages/surveys/components/survey_item.dart b/lib/ui/pages/surveys/components/survey_item.dart index 16d167e6..43b8583d 100644 --- a/lib/ui/pages/surveys/components/survey_item.dart +++ b/lib/ui/pages/surveys/components/survey_item.dart @@ -1,45 +1,53 @@ -import '../surveys.dart'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../surveys.dart'; + class SurveyItem extends StatelessWidget { final SurveyViewModel viewModel; - SurveyItem(this.viewModel); + const SurveyItem(this.viewModel, {super.key}); @override Widget build(BuildContext context) { - final presenter = Provider.of(context); + final SurveysPresenter presenter = Provider.of(context); return GestureDetector( onTap: () => presenter.goToSurveyResult(viewModel.id), child: Padding( - padding: EdgeInsets.symmetric(vertical: 5), + padding: const EdgeInsets.symmetric(vertical: 5), child: Container( - padding: EdgeInsets.all(20), + padding: const EdgeInsets.all(20), decoration: BoxDecoration( - color: viewModel.didAnswer ? Theme.of(context).secondaryHeaderColor : Theme.of(context).primaryColorDark, - boxShadow: [ + color: viewModel.didAnswer + ? Theme.of(context).secondaryHeaderColor + : Theme.of(context).primaryColorDark, + boxShadow: const [ BoxShadow( offset: Offset(0, 1), spreadRadius: 0, blurRadius: 2, - color: Colors.black + color: Colors.black, ) ], - borderRadius: BorderRadius.all(Radius.circular(10)) + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( viewModel.date, - style: TextStyle(color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold), + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), ), - SizedBox(height: 20), + const SizedBox(height: 20), Text( viewModel.question, - style: TextStyle(color: Colors.white, fontSize: 24), + style: const TextStyle(color: Colors.white, fontSize: 24), ), ], ), @@ -47,4 +55,4 @@ class SurveyItem extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/surveys/components/survey_items.dart b/lib/ui/pages/surveys/components/survey_items.dart index 239e46cd..ef2ecba5 100644 --- a/lib/ui/pages/surveys/components/survey_items.dart +++ b/lib/ui/pages/surveys/components/survey_items.dart @@ -1,25 +1,24 @@ -import '../surveys.dart'; -import './components.dart'; - import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; +import './components.dart'; +import '../surveys.dart'; + class SurveyItems extends StatelessWidget { final List viewModels; - SurveyItems(this.viewModels); + const SurveyItems(this.viewModels, {super.key}); @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.symmetric(vertical: 20), + padding: const EdgeInsets.symmetric(vertical: 20), child: CarouselSlider( - options: CarouselOptions( - enlargeCenterPage: true, - aspectRatio: 1 - ), - items: viewModels.map((viewModel) => SurveyItem(viewModel)).toList(), + options: CarouselOptions(enlargeCenterPage: true, aspectRatio: 1), + items: viewModels + .map((SurveyViewModel viewModel) => SurveyItem(viewModel)) + .toList(), ), ); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/surveys/survey_viewmodel.dart b/lib/ui/pages/surveys/survey_viewmodel.dart index 20ff7629..a41e015e 100644 --- a/lib/ui/pages/surveys/survey_viewmodel.dart +++ b/lib/ui/pages/surveys/survey_viewmodel.dart @@ -6,12 +6,13 @@ class SurveyViewModel extends Equatable { final String date; final bool didAnswer; - List get props => [id, question, date, didAnswer]; + @override + List get props => [id, question, date, didAnswer]; - SurveyViewModel({ + const SurveyViewModel({ required this.id, required this.question, required this.date, - required this.didAnswer + required this.didAnswer, }); -} \ No newline at end of file +} diff --git a/lib/ui/pages/surveys/surveys.dart b/lib/ui/pages/surveys/surveys.dart index 9b8901f4..862f2b6a 100644 --- a/lib/ui/pages/surveys/surveys.dart +++ b/lib/ui/pages/surveys/surveys.dart @@ -1,3 +1,3 @@ +export './survey_viewmodel.dart'; export './surveys_page.dart'; export './surveys_presenter.dart'; -export './survey_viewmodel.dart'; \ No newline at end of file diff --git a/lib/ui/pages/surveys/surveys_page.dart b/lib/ui/pages/surveys/surveys_page.dart index 30f62191..10445c26 100644 --- a/lib/ui/pages/surveys/surveys_page.dart +++ b/lib/ui/pages/surveys/surveys_page.dart @@ -1,30 +1,32 @@ -import '../../components/components.dart'; -import '../../helpers/helpers.dart'; -import '../../mixins/mixins.dart'; -import './components/components.dart'; -import './surveys.dart'; - import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:provider/provider.dart'; +import './components/components.dart'; +import './surveys.dart'; +import '../../components/components.dart'; +import '../../helpers/helpers.dart'; +import '../../mixins/mixins.dart'; + class SurveysPage extends StatefulWidget { final SurveysPresenter presenter; - SurveysPage(this.presenter); + const SurveysPage(this.presenter, {super.key}); @override - _SurveysPageState createState() => _SurveysPageState(); + State createState() => _SurveysPageState(); } -class _SurveysPageState extends State with LoadingManager, NavigationManager, SessionManager, RouteAware { +class _SurveysPageState extends State + with LoadingManager, NavigationManager, SessionManager, RouteAware { @override Widget build(BuildContext context) { - Get.find().subscribe(this, ModalRoute.of(context) as PageRoute); + Get.find() + .subscribe(this, ModalRoute.of(context) as PageRoute); return Scaffold( appBar: AppBar(title: Text(R.string.surveys)), body: Builder( - builder: (context) { + builder: (BuildContext context) { handleLoading(context, widget.presenter.isLoadingStream); handleSessionExpired(widget.presenter.isSessionExpiredStream); handleNavigation(widget.presenter.navigateToStream); @@ -32,18 +34,24 @@ class _SurveysPageState extends State with LoadingManager, Navigati return StreamBuilder>( stream: widget.presenter.surveysStream, - builder: (context, snapshot) { + builder: ( + BuildContext context, + AsyncSnapshot> snapshot, + ) { if (snapshot.hasError) { - return ReloadScreen(error: '${snapshot.error}', reload: widget.presenter.loadData); + return ReloadScreen( + error: '${snapshot.error}', + reload: widget.presenter.loadData, + ); } if (snapshot.hasData) { return ListenableProvider( create: (_) => widget.presenter, - child: SurveyItems(snapshot.data!) + child: SurveyItems(snapshot.data!), ); } - return SizedBox(height: 0); - } + return const SizedBox.shrink(); + }, ); }, ), @@ -60,4 +68,4 @@ class _SurveysPageState extends State with LoadingManager, Navigati Get.find().unsubscribe(this); super.dispose(); } -} \ No newline at end of file +} diff --git a/lib/ui/pages/surveys/surveys_presenter.dart b/lib/ui/pages/surveys/surveys_presenter.dart index e79220a7..b26c4a41 100644 --- a/lib/ui/pages/surveys/surveys_presenter.dart +++ b/lib/ui/pages/surveys/surveys_presenter.dart @@ -1,7 +1,7 @@ -import './surveys.dart'; - import 'package:flutter/material.dart'; +import './surveys.dart'; + abstract class SurveysPresenter implements Listenable { Stream get isLoadingStream; Stream get isSessionExpiredStream; @@ -10,4 +10,4 @@ abstract class SurveysPresenter implements Listenable { Future loadData(); void goToSurveyResult(String surveyId); -} \ No newline at end of file +} diff --git a/lib/ui/ui.dart b/lib/ui/ui.dart new file mode 100644 index 00000000..3720d0e4 --- /dev/null +++ b/lib/ui/ui.dart @@ -0,0 +1,4 @@ +export './components/components.dart'; +export './helpers/helpers.dart'; +export './mixins/mixins.dart'; +export './pages/pages.dart'; diff --git a/lib/validation/protocols/field_validation.dart b/lib/validation/protocols/field_validation.dart index a7e85a80..e330bfae 100644 --- a/lib/validation/protocols/field_validation.dart +++ b/lib/validation/protocols/field_validation.dart @@ -3,4 +3,4 @@ import '../../presentation/protocols/protocols.dart'; abstract class FieldValidation { String get field; ValidationError? validate(Map input); -} \ No newline at end of file +} diff --git a/lib/validation/protocols/protocols.dart b/lib/validation/protocols/protocols.dart index ea0cf637..643c5966 100644 --- a/lib/validation/protocols/protocols.dart +++ b/lib/validation/protocols/protocols.dart @@ -1 +1 @@ -export './field_validation.dart'; \ No newline at end of file +export './field_validation.dart'; diff --git a/lib/validation/validation.dart b/lib/validation/validation.dart new file mode 100644 index 00000000..79e8b2eb --- /dev/null +++ b/lib/validation/validation.dart @@ -0,0 +1,2 @@ +export './protocols/protocols.dart'; +export './validators/validators.dart'; diff --git a/lib/validation/validators/compare_fields_validation.dart b/lib/validation/validators/compare_fields_validation.dart index aa0b90a3..ee3a49bc 100644 --- a/lib/validation/validators/compare_fields_validation.dart +++ b/lib/validation/validators/compare_fields_validation.dart @@ -1,20 +1,27 @@ +import 'package:equatable/equatable.dart'; + import '../../presentation/protocols/protocols.dart'; import '../protocols/protocols.dart'; -import 'package:equatable/equatable.dart'; - class CompareFieldsValidation extends Equatable implements FieldValidation { + @override final String field; final String fieldToCompare; - List get props => [field, fieldToCompare]; + @override + List get props => [field, fieldToCompare]; - CompareFieldsValidation({ required this.field, required this.fieldToCompare}); + const CompareFieldsValidation({ + required this.field, + required this.fieldToCompare, + }); - ValidationError? validate(Map input) => - input[field] != null - && input[fieldToCompare] != null - && input[field] != input[fieldToCompare] - ? ValidationError.invalidField - : null; -} \ No newline at end of file + @override + ValidationError? validate(Map input) { + return input[field] != null && + input[fieldToCompare] != null && + input[field] != input[fieldToCompare] + ? ValidationError.invalidField + : null; + } +} diff --git a/lib/validation/validators/email_validation.dart b/lib/validation/validators/email_validation.dart index 4a0514b8..413dfe6b 100644 --- a/lib/validation/validators/email_validation.dart +++ b/lib/validation/validators/email_validation.dart @@ -1,18 +1,24 @@ +import 'package:equatable/equatable.dart'; + import '../../presentation/protocols/protocols.dart'; import '../protocols/protocols.dart'; -import 'package:equatable/equatable.dart'; - class EmailValidation extends Equatable implements FieldValidation { + @override final String field; - List get props => [field]; + @override + List get props => [field]; - EmailValidation(this.field); + const EmailValidation(this.field); + @override ValidationError? validate(Map input) { - final regex = RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+"); - final isValid = input[field]?.isNotEmpty != true || regex.hasMatch(input[field]); + final RegExp regex = RegExp( + r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+", + ); + final bool isValid = + input[field]?.isNotEmpty != true || regex.hasMatch(input[field]); return isValid ? null : ValidationError.invalidField; } -} \ No newline at end of file +} diff --git a/lib/validation/validators/min_length_validation.dart b/lib/validation/validators/min_length_validation.dart index 3222add2..fd63f7b6 100644 --- a/lib/validation/validators/min_length_validation.dart +++ b/lib/validation/validators/min_length_validation.dart @@ -1,19 +1,21 @@ +import 'package:equatable/equatable.dart'; + import '../../presentation/protocols/protocols.dart'; import '../protocols/protocols.dart'; -import 'package:equatable/equatable.dart'; - class MinLengthValidation extends Equatable implements FieldValidation { + @override final String field; final int size; - List get props => [field, size]; + @override + List get props => [field, size]; - MinLengthValidation({ required this.field, required this.size}); + const MinLengthValidation({required this.field, required this.size}); + @override ValidationError? validate(Map input) => - input[field] != null - && input[field].length >= size - ? null - : ValidationError.invalidField; -} \ No newline at end of file + input[field] != null && input[field].length >= size + ? null + : ValidationError.invalidField; +} diff --git a/lib/validation/validators/required_field_validation.dart b/lib/validation/validators/required_field_validation.dart index aee3e303..43060b0b 100644 --- a/lib/validation/validators/required_field_validation.dart +++ b/lib/validation/validators/required_field_validation.dart @@ -1,15 +1,19 @@ +import 'package:equatable/equatable.dart'; + import '../../presentation/protocols/protocols.dart'; import '../protocols/protocols.dart'; -import 'package:equatable/equatable.dart'; - class RequiredFieldValidation extends Equatable implements FieldValidation { + @override final String field; - List get props => [field]; + @override + List get props => [field]; - RequiredFieldValidation(this.field); + @override + const RequiredFieldValidation(this.field); + @override ValidationError? validate(Map input) => - input[field]?.isNotEmpty == true ? null : ValidationError.requiredField; -} \ No newline at end of file + input[field]?.isNotEmpty == true ? null : ValidationError.requiredField; +} diff --git a/lib/validation/validators/validators.dart b/lib/validation/validators/validators.dart index 6464b206..7914dd91 100644 --- a/lib/validation/validators/validators.dart +++ b/lib/validation/validators/validators.dart @@ -1,4 +1,4 @@ -export './required_field_validation.dart'; -export './min_length_validation.dart'; +export './compare_fields_validation.dart'; export './email_validation.dart'; -export './compare_fields_validation.dart'; \ No newline at end of file +export './min_length_validation.dart'; +export './required_field_validation.dart'; diff --git a/pubspec.lock b/pubspec.lock index bfb20e54..c9fd0b76 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,35 +7,35 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "26.0.0" + version: "40.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "4.1.0" archive: dependency: transitive description: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.2" + version: "3.3.0" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.3.1" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.8.1" + version: "2.8.2" boolean_selector: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.3.0" built_collection: dependency: transitive description: @@ -63,21 +63,21 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.1.2" + version: "8.3.2" carousel_slider: dependency: "direct main" description: name: carousel_slider url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.1.1" characters: dependency: transitive description: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" charcode: dependency: transitive description: @@ -85,13 +85,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.3" clock: dependency: transitive description: @@ -112,7 +105,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -126,28 +119,28 @@ packages: name: coverage url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.3.2" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.0.4" dart_style: dependency: transitive description: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.0" + version: "2.2.3" equatable: dependency: "direct main" description: @@ -161,7 +154,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" faker: dependency: "direct dev" description: @@ -175,7 +168,7 @@ packages: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "2.0.0" file: dependency: transitive description: @@ -189,7 +182,7 @@ packages: name: fixnum url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" flutter: dependency: "direct main" description: flutter @@ -202,67 +195,114 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.9.2" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage url: "https://pub.dartlang.org" source: hosted - version: "4.2.1" + version: "5.0.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" frontend_server_client: dependency: transitive description: name: frontend_server_client url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.3" get: dependency: "direct main" description: name: get url: "https://pub.dartlang.org" source: hosted - version: "4.3.8" + version: "4.6.5" glob: dependency: transitive description: name: glob url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.2" http: dependency: "direct main" description: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.13.3" + version: "0.13.4" http_multi_server: dependency: transitive description: name: http_multi_server url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.2.0" http_parser: dependency: transitive description: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.1" image: dependency: transitive description: name: image url: "https://pub.dartlang.org" source: hosted - version: "3.0.5" + version: "3.2.0" intl: dependency: "direct main" description: @@ -283,7 +323,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" localstorage: dependency: "direct main" description: @@ -304,7 +351,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10" + version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" meta: dependency: transitive description: @@ -318,21 +372,21 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.2" mockito: dependency: transitive description: name: mockito url: "https://pub.dartlang.org" source: hosted - version: "5.0.16" + version: "5.2.0" mocktail: dependency: "direct dev" description: name: mocktail url: "https://pub.dartlang.org" source: hosted - version: "0.1.4" + version: "0.3.0" nested: dependency: transitive description: @@ -346,7 +400,7 @@ packages: name: network_image_mock url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.0" node_preamble: dependency: transitive description: @@ -367,70 +421,77 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_provider: dependency: transitive description: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.10" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.14" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.7" path_provider_macos: dependency: transitive description: name: path_provider_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" + version: "2.1.0" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.3.0" + version: "5.0.0" platform: dependency: transitive description: name: platform url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.2" pool: dependency: transitive description: @@ -444,28 +505,28 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.2.3" + version: "4.2.4" provider: dependency: "direct main" description: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.1" + version: "6.0.3" pub_semver: dependency: transitive description: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" shelf: dependency: transitive description: name: shelf url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" shelf_packages_handler: dependency: transitive description: @@ -498,7 +559,7 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.2" source_map_stack_trace: dependency: transitive description: @@ -519,7 +580,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -554,91 +615,91 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.17.10" + version: "1.21.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.9" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.0" + version: "0.4.13" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0" + version: "1.3.1" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.3.0" + version: "8.3.0" watcher: dependency: transitive description: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.1.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.2.9" + version: "2.7.0" xdg_directories: dependency: transitive description: name: xdg_directories url: "https://pub.dartlang.org" source: hosted - version: "0.2.0" + version: "0.2.0+1" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.0" + version: "6.1.0" yaml: dependency: transitive description: name: yaml url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.17.0 <3.0.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index ae0f1f98..6dd21efb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,30 +4,31 @@ publish_to: 'none' version: 0.0.1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" dependencies: flutter: sdk: flutter - cupertino_icons: 1.0.3 - http: 0.13.3 - provider: 6.0.1 + cupertino_icons: 1.0.4 + http: 0.13.4 + provider: 6.0.3 equatable: 2.0.3 - get: 4.3.8 - flutter_secure_storage: 4.2.1 + get: 4.6.5 + flutter_secure_storage: 5.0.2 localstorage: 4.0.0+1 - carousel_slider: 4.0.0 + carousel_slider: 4.1.1 intl: 0.17.0 dev_dependencies: flutter_test: sdk: flutter flutter_launcher_icons: 0.9.2 - test: 1.17.10 - mocktail: 0.1.4 + test: 1.21.1 + mocktail: 0.3.0 faker: 2.0.0 - network_image_mock: 2.0.1 - + network_image_mock: 2.1.0 + flutter_lints: 2.0.1 + flutter: uses-material-design: true assets: diff --git a/test/data/data.dart b/test/data/data.dart new file mode 100644 index 00000000..e739a823 --- /dev/null +++ b/test/data/data.dart @@ -0,0 +1 @@ +export './mocks/mocks.dart'; diff --git a/test/data/mocks/cache_storage_spy.dart b/test/data/mocks/cache_storage_spy.dart index 72b9cf5d..200ddbe9 100644 --- a/test/data/mocks/cache_storage_spy.dart +++ b/test/data/mocks/cache_storage_spy.dart @@ -1,22 +1,22 @@ -import 'package:fordev/data/cache/cache.dart'; - +import 'package:fordev/data/data.dart'; import 'package:mocktail/mocktail.dart'; class CacheStorageSpy extends Mock implements CacheStorage { CacheStorageSpy() { - this.mockDelete(); - this.mockSave(); + mockDelete(); + mockSave(); } - - When mockFetchCall() => when(() => this.fetch(any())); - void mockFetch(dynamic json) => this.mockFetchCall().thenAnswer((_) async => json); - void mockFetchError() => this.mockFetchCall().thenThrow(Exception()); - When mockDeleteCall() => when(() => this.delete(any())); - void mockDelete() => this.mockDeleteCall().thenAnswer((_) async => _); - void mockDeleteError() => this.mockDeleteCall().thenThrow(Exception()); + When mockFetchCall() => when(() => fetch(any())); + void mockFetch(dynamic json) => mockFetchCall().thenAnswer((_) async => json); + void mockFetchError() => mockFetchCall().thenThrow(Exception()); + + When mockDeleteCall() => when(() => delete(any())); + void mockDelete() => mockDeleteCall().thenAnswer((_) async => _); + void mockDeleteError() => mockDeleteCall().thenThrow(Exception()); - When mockSaveCall() => when(() => this.save(key: any(named: 'key'), value: any(named: 'value'))); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => this.mockSaveCall().thenThrow(Exception()); -} \ No newline at end of file + When mockSaveCall() => + when(() => save(key: any(named: 'key'), value: any(named: 'value'))); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => mockSaveCall().thenThrow(Exception()); +} diff --git a/test/data/mocks/http_client_spy.dart b/test/data/mocks/http_client_spy.dart index 02a547fa..9775ab82 100644 --- a/test/data/mocks/http_client_spy.dart +++ b/test/data/mocks/http_client_spy.dart @@ -1,14 +1,17 @@ -import 'package:fordev/data/http/http.dart'; +import 'package:fordev/data/data.dart'; import 'package:mocktail/mocktail.dart'; class HttpClientSpy extends Mock implements HttpClient { - When mockRequestCall() => when(() => this.request( - url: any(named: 'url'), - method: any(named: 'method'), - body: any(named: 'body'), - headers: any(named: 'headers') - )); - void mockRequest(dynamic data) => this.mockRequestCall().thenAnswer((_) async => data); - void mockRequestError(HttpError error) => this.mockRequestCall().thenThrow(error); -} \ No newline at end of file + When mockRequestCall() => when( + () => request( + url: any(named: 'url'), + method: any(named: 'method'), + body: any(named: 'body'), + headers: any(named: 'headers'), + ), + ); + void mockRequest(dynamic data) => + mockRequestCall().thenAnswer((_) async => data); + void mockRequestError(HttpError error) => mockRequestCall().thenThrow(error); +} diff --git a/test/data/mocks/load_survey_result_spy.dart b/test/data/mocks/load_survey_result_spy.dart index aad71cdb..c2d5eb71 100644 --- a/test/data/mocks/load_survey_result_spy.dart +++ b/test/data/mocks/load_survey_result_spy.dart @@ -1,11 +1,11 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class LoadSurveyResultSpy extends Mock implements LoadSurveyResult { - When mockLoadCall() => when(() => this.loadBySurvey(surveyId: any(named: 'surveyId'))); - void mockLoad(SurveyResultEntity surveyResult) => this.mockLoadCall().thenAnswer((_) async => surveyResult); - void mockLoadError(DomainError error) => this.mockLoadCall().thenThrow(error); -} \ No newline at end of file + When mockLoadCall() => + when(() => loadBySurvey(surveyId: any(named: 'surveyId'))); + void mockLoad(SurveyResultEntity surveyResult) => + mockLoadCall().thenAnswer((_) async => surveyResult); + void mockLoadError(DomainError error) => mockLoadCall().thenThrow(error); +} diff --git a/test/data/mocks/load_surveys_spy.dart b/test/data/mocks/load_surveys_spy.dart index aeb0829e..1bf9745a 100644 --- a/test/data/mocks/load_surveys_spy.dart +++ b/test/data/mocks/load_surveys_spy.dart @@ -1,11 +1,10 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class LoadSurveysSpy extends Mock implements LoadSurveys { - When mockLoadCall() => when(() => this.load()); - void mockLoad(List surveys) => this.mockLoadCall().thenAnswer((_) async => surveys); - void mockLoadError(DomainError error) => this.mockLoadCall().thenThrow(error); -} \ No newline at end of file + When mockLoadCall() => when(() => load()); + void mockLoad(List surveys) => + mockLoadCall().thenAnswer((_) async => surveys); + void mockLoadError(DomainError error) => mockLoadCall().thenThrow(error); +} diff --git a/test/data/mocks/local_load_survey_result_spy.dart b/test/data/mocks/local_load_survey_result_spy.dart index ee5ad851..db784f35 100644 --- a/test/data/mocks/local_load_survey_result_spy.dart +++ b/test/data/mocks/local_load_survey_result_spy.dart @@ -1,24 +1,25 @@ -import 'package:fordev/data/usecases/usecases.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class LocalLoadSurveyResultSpy extends Mock implements LocalLoadSurveyResult { LocalLoadSurveyResultSpy() { - this.mockValidate(); - this.mockSave(); + mockValidate(); + mockSave(); } - When mockLoadCall() => when(() => this.loadBySurvey(surveyId: any(named: 'surveyId'))); - void mockLoad(SurveyResultEntity surveyResult) => this.mockLoadCall().thenAnswer((_) async => surveyResult); - void mockLoadError() => this.mockLoadCall().thenThrow(DomainError.unexpected); + When mockLoadCall() => + when(() => loadBySurvey(surveyId: any(named: 'surveyId'))); + void mockLoad(SurveyResultEntity surveyResult) => + mockLoadCall().thenAnswer((_) async => surveyResult); + void mockLoadError() => mockLoadCall().thenThrow(DomainError.unexpected); - When mockValidateCall() => when(() => this.validate(any())); - void mockValidate() => this.mockValidateCall().thenAnswer((_) async => _); - void mockValidateError() => this.mockValidateCall().thenThrow(Exception()); + When mockValidateCall() => when(() => validate(any())); + void mockValidate() => mockValidateCall().thenAnswer((_) async => _); + void mockValidateError() => mockValidateCall().thenThrow(Exception()); - When mockSaveCall() => when(() => this.save(any())); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => this.mockSaveCall().thenThrow(Exception()); -} \ No newline at end of file + When mockSaveCall() => when(() => save(any())); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => mockSaveCall().thenThrow(Exception()); +} diff --git a/test/data/mocks/local_load_surveys_spy.dart b/test/data/mocks/local_load_surveys_spy.dart index 660fac65..00a43912 100644 --- a/test/data/mocks/local_load_surveys_spy.dart +++ b/test/data/mocks/local_load_surveys_spy.dart @@ -1,24 +1,24 @@ -import 'package:fordev/data/usecases/usecases.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class LocalLoadSurveysSpy extends Mock implements LocalLoadSurveys { LocalLoadSurveysSpy() { - this.mockValidate(); - this.mockSave(); + mockValidate(); + mockSave(); } - When mockLoadCall() => when(() => this.load()); - void mockLoad(List surveys) => this.mockLoadCall().thenAnswer((_) async => surveys); - void mockLoadError() => this.mockLoadCall().thenThrow(DomainError.unexpected); + When mockLoadCall() => when(() => load()); + void mockLoad(List surveys) => + mockLoadCall().thenAnswer((_) async => surveys); + void mockLoadError() => mockLoadCall().thenThrow(DomainError.unexpected); - When mockValidateCall() => when(() => this.validate()); - void mockValidate() => this.mockValidateCall().thenAnswer((_) async => _); - void mockValidateError() => this.mockValidateCall().thenThrow(Exception()); + When mockValidateCall() => when(() => validate()); + void mockValidate() => mockValidateCall().thenAnswer((_) async => _); + void mockValidateError() => mockValidateCall().thenThrow(Exception()); - When mockSaveCall() => when(() => this.save(any())); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => this.mockSaveCall().thenThrow(Exception()); -} \ No newline at end of file + When mockSaveCall() => when(() => save(any())); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => mockSaveCall().thenThrow(Exception()); +} diff --git a/test/data/mocks/mocks.dart b/test/data/mocks/mocks.dart index a801a3fe..f46e86ae 100644 --- a/test/data/mocks/mocks.dart +++ b/test/data/mocks/mocks.dart @@ -1,9 +1,9 @@ export './cache_storage_spy.dart'; export './http_client_spy.dart'; -export './secure_cache_storage_spy.dart'; +export './load_survey_result_spy.dart'; +export './load_surveys_spy.dart'; export './local_load_survey_result_spy.dart'; export './local_load_surveys_spy.dart'; -export './load_survey_result_spy.dart'; export './remote_load_survey_result_spy.dart'; -export './load_surveys_spy.dart'; -export './remote_load_surveys_spy.dart'; \ No newline at end of file +export './remote_load_surveys_spy.dart'; +export './secure_cache_storage_spy.dart'; diff --git a/test/data/mocks/remote_load_survey_result_spy.dart b/test/data/mocks/remote_load_survey_result_spy.dart index 77939fe2..71a2aa0f 100644 --- a/test/data/mocks/remote_load_survey_result_spy.dart +++ b/test/data/mocks/remote_load_survey_result_spy.dart @@ -1,11 +1,12 @@ -import 'package:fordev/data/usecases/usecases.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class RemoteLoadSurveyResultSpy extends Mock implements RemoteLoadSurveyResult { - When mockLoadCall() => when(() => this.loadBySurvey(surveyId: any(named: 'surveyId'))); - void mockLoad(SurveyResultEntity surveyResult) => this.mockLoadCall().thenAnswer((_) async => surveyResult); - void mockLoadError(DomainError error) => this.mockLoadCall().thenThrow(error); -} \ No newline at end of file + When mockLoadCall() => + when(() => loadBySurvey(surveyId: any(named: 'surveyId'))); + void mockLoad(SurveyResultEntity surveyResult) => + mockLoadCall().thenAnswer((_) async => surveyResult); + void mockLoadError(DomainError error) => mockLoadCall().thenThrow(error); +} diff --git a/test/data/mocks/remote_load_surveys_spy.dart b/test/data/mocks/remote_load_surveys_spy.dart index a9505a97..bedf0657 100644 --- a/test/data/mocks/remote_load_surveys_spy.dart +++ b/test/data/mocks/remote_load_surveys_spy.dart @@ -1,11 +1,11 @@ -import 'package:fordev/data/usecases/usecases.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class RemoteLoadSurveysSpy extends Mock implements RemoteLoadSurveys { - When mockLoadCall() => when(() => this.load()); - void mockLoad(List surveys) => this.mockLoadCall().thenAnswer((_) async => surveys); - void mockLoadError(DomainError error) => this.mockLoadCall().thenThrow(error); -} \ No newline at end of file + When mockLoadCall() => when(() => load()); + void mockLoad(List surveys) => + mockLoadCall().thenAnswer((_) async => surveys); + void mockLoadError(DomainError error) => mockLoadCall().thenThrow(error); +} diff --git a/test/data/mocks/secure_cache_storage_spy.dart b/test/data/mocks/secure_cache_storage_spy.dart index 40729ea3..fd2abd35 100644 --- a/test/data/mocks/secure_cache_storage_spy.dart +++ b/test/data/mocks/secure_cache_storage_spy.dart @@ -1,22 +1,27 @@ -import 'package:fordev/data/cache/cache.dart'; +import 'package:fordev/data/data.dart'; import 'package:mocktail/mocktail.dart'; -class SecureCacheStorageSpy extends Mock implements FetchSecureCacheStorage, DeleteSecureCacheStorage, SaveSecureCacheStorage { +class SecureCacheStorageSpy extends Mock + implements + FetchSecureCacheStorage, + DeleteSecureCacheStorage, + SaveSecureCacheStorage { SecureCacheStorageSpy() { - this.mockDelete(); - this.mockSave(); + mockDelete(); + mockSave(); } - - When mockFetchCall() => when(() => this.fetch(any())); - void mockFetch(String? data) => this.mockFetchCall().thenAnswer((_) async => data); - void mockFetchError() => this.mockFetchCall().thenThrow(Exception()); - When mockDeleteCall() => when(() => this.delete(any())); - void mockDelete() => this.mockDeleteCall().thenAnswer((_) async => _); - void mockDeleteError() => this.mockDeleteCall().thenThrow(Exception()); + When mockFetchCall() => when(() => fetch(any())); + void mockFetch(String? data) => mockFetchCall().thenAnswer((_) async => data); + void mockFetchError() => mockFetchCall().thenThrow(Exception()); - When mockSaveCall() => when(() => this.save(key: any(named: 'key'), value: any(named: 'value'))); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => this.mockSaveCall().thenThrow(Exception()); -} \ No newline at end of file + When mockDeleteCall() => when(() => delete(any())); + void mockDelete() => mockDeleteCall().thenAnswer((_) async => _); + void mockDeleteError() => mockDeleteCall().thenThrow(Exception()); + + When mockSaveCall() => + when(() => save(key: any(named: 'key'), value: any(named: 'value'))); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => mockSaveCall().thenThrow(Exception()); +} diff --git a/test/data/usecases/add_account/remote_add_account_test.dart b/test/data/usecases/add_account/remote_add_account_test.dart index 8103c468..3e9e0d05 100644 --- a/test/data/usecases/add_account/remote_add_account_test.dart +++ b/test/data/usecases/add_account/remote_add_account_test.dart @@ -1,16 +1,13 @@ -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/data/usecases/usecases.dart'; +import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; import '../../../domain/mocks/mocks.dart'; import '../../../infra/mocks/mocks.dart'; import '../../mocks/mocks.dart'; -import 'package:faker/faker.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - void main() { late RemoteAddAccount sut; late HttpClientSpy httpClient; @@ -30,22 +27,24 @@ void main() { test('Should call HttpClient with correct values', () async { await sut.add(params); - verify(() => httpClient.request( - url: url, - method: 'post', - body: { - 'name': params.name, - 'email': params.email, - 'password': params.password, - 'passwordConfirmation': params.passwordConfirmation - } - )); + verify( + () => httpClient.request( + url: url, + method: 'post', + body: { + 'name': params.name, + 'email': params.email, + 'password': params.password, + 'passwordConfirmation': params.passwordConfirmation + }, + ), + ); }); test('Should throw UnexpectedError if HttpClient returns 400', () async { httpClient.mockRequestError(HttpError.badRequest); - final future = sut.add(params); + final Future future = sut.add(params); expect(future, throwsA(DomainError.unexpected)); }); @@ -53,7 +52,7 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 404', () async { httpClient.mockRequestError(HttpError.notFound); - final future = sut.add(params); + final Future future = sut.add(params); expect(future, throwsA(DomainError.unexpected)); }); @@ -61,30 +60,33 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 500', () async { httpClient.mockRequestError(HttpError.serverError); - final future = sut.add(params); + final Future future = sut.add(params); expect(future, throwsA(DomainError.unexpected)); }); - test('Should throw InvalidCredentialsError if HttpClient returns 403', () async { + test('Should throw InvalidCredentialsError if HttpClient returns 403', + () async { httpClient.mockRequestError(HttpError.forbidden); - final future = sut.add(params); + final Future future = sut.add(params); expect(future, throwsA(DomainError.emailInUse)); }); test('Should return an Account if HttpClient returns 200', () async { - final account = await sut.add(params); + final AccountEntity account = await sut.add(params); expect(account.token, apiResult['accessToken']); }); - test('Should throw UnexpectedError if HttpClient returns 200 with invalid data', () async { + test( + 'Should throw UnexpectedError if HttpClient returns 200 with invalid data', + () async { httpClient.mockRequest({'invalid_key': 'invalid_value'}); - final future = sut.add(params); + final Future future = sut.add(params); expect(future, throwsA(DomainError.unexpected)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/authentication/remote_authentication_test.dart b/test/data/usecases/authentication/remote_authentication_test.dart index 9dc40538..2da060b6 100644 --- a/test/data/usecases/authentication/remote_authentication_test.dart +++ b/test/data/usecases/authentication/remote_authentication_test.dart @@ -1,16 +1,13 @@ -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/data/usecases/usecases.dart'; +import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; import '../../../domain/mocks/mocks.dart'; import '../../../infra/mocks/mocks.dart'; import '../../mocks/mocks.dart'; -import 'package:faker/faker.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - void main() { late RemoteAuthentication sut; late HttpClientSpy httpClient; @@ -30,17 +27,19 @@ void main() { test('Should call HttpClient with correct values', () async { await sut.auth(params); - verify(() => httpClient.request( - url: url, - method: 'post', - body: {'email': params.email, 'password': params.secret} - )); + verify( + () => httpClient.request( + url: url, + method: 'post', + body: {'email': params.email, 'password': params.secret}, + ), + ); }); test('Should throw UnexpectedError if HttpClient returns 400', () async { httpClient.mockRequestError(HttpError.badRequest); - final future = sut.auth(params); + final Future future = sut.auth(params); expect(future, throwsA(DomainError.unexpected)); }); @@ -48,7 +47,7 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 404', () async { httpClient.mockRequestError(HttpError.notFound); - final future = sut.auth(params); + final Future future = sut.auth(params); expect(future, throwsA(DomainError.unexpected)); }); @@ -56,30 +55,33 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 500', () async { httpClient.mockRequestError(HttpError.serverError); - final future = sut.auth(params); + final Future future = sut.auth(params); expect(future, throwsA(DomainError.unexpected)); }); - test('Should throw InvalidCredentialsError if HttpClient returns 401', () async { + test('Should throw InvalidCredentialsError if HttpClient returns 401', + () async { httpClient.mockRequestError(HttpError.unauthorized); - final future = sut.auth(params); + final Future future = sut.auth(params); expect(future, throwsA(DomainError.invalidCredentials)); }); test('Should return an Account if HttpClient returns 200', () async { - final account = await sut.auth(params); + final AccountEntity account = await sut.auth(params); expect(account.token, apiResult['accessToken']); }); - test('Should throw UnexpectedError if HttpClient returns 200 with invalid data', () async { + test( + 'Should throw UnexpectedError if HttpClient returns 200 with invalid data', + () async { httpClient.mockRequest({'invalid_key': 'invalid_value'}); - final future = sut.auth(params); + final Future future = sut.auth(params); expect(future, throwsA(DomainError.unexpected)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/load_current_account/local_load_current_account_test.dart b/test/data/usecases/load_current_account/local_load_current_account_test.dart index e6b2973e..8c916879 100644 --- a/test/data/usecases/load_current_account/local_load_current_account_test.dart +++ b/test/data/usecases/load_current_account/local_load_current_account_test.dart @@ -1,13 +1,11 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/usecases/usecases.dart'; - -import '../../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../mocks/mocks.dart'; + void main() { late LocalLoadCurrentAccount sut; late SecureCacheStorageSpy secureCacheStorage; @@ -27,24 +25,26 @@ void main() { }); test('Should return an AccountEntity', () async { - final account = await sut.load(); + final AccountEntity account = await sut.load(); expect(account, AccountEntity(token: token)); }); - test('Should throw UnexpectedError if FetchSecureCacheStorage throws', () async { + test('Should throw UnexpectedError if FetchSecureCacheStorage throws', + () async { secureCacheStorage.mockFetchError(); - final future = sut.load(); + final Future future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); - test('Should throw UnexpectedError if FetchSecureCacheStorage returns null', () async { + test('Should throw UnexpectedError if FetchSecureCacheStorage returns null', + () async { secureCacheStorage.mockFetch(null); - final future = sut.load(); + final Future future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/load_survey_result/local_load_survey_result_test.dart b/test/data/usecases/load_survey_result/local_load_survey_result_test.dart index 4e467c27..d6a87723 100644 --- a/test/data/usecases/load_survey_result/local_load_survey_result_test.dart +++ b/test/data/usecases/load_survey_result/local_load_survey_result_test.dart @@ -1,15 +1,13 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/usecases/usecases.dart'; - -import '../../../domain/mocks/mocks.dart'; -import '../../../infra/mocks/mocks.dart'; -import '../../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../../domain/domain.dart'; +import '../../../infra/mocks/mocks.dart'; +import '../../mocks/mocks.dart'; + void main() { late LocalLoadSurveyResult sut; late CacheStorageSpy cacheStorage; @@ -34,31 +32,36 @@ void main() { }); test('Should return surveyResult on success', () async { - final surveyResult = await sut.loadBySurvey(surveyId: surveyId); - - expect(surveyResult, SurveyResultEntity( - surveyId: data['surveyId'], - question: data['question'], - answers: [ - SurveyAnswerEntity( - image: data['answers'][0]['image'], - answer: data['answers'][0]['answer'], - percent: 40, - isCurrentAnswer: true, - ), - SurveyAnswerEntity( - answer: data['answers'][1]['answer'], - percent: 60, - isCurrentAnswer: false, - ) - ] - )); + final SurveyResultEntity surveyResult = + await sut.loadBySurvey(surveyId: surveyId); + + expect( + surveyResult, + SurveyResultEntity( + surveyId: data['surveyId'], + question: data['question'], + answers: [ + SurveyAnswerEntity( + image: data['answers'][0]['image'], + answer: data['answers'][0]['answer'], + percent: 40, + isCurrentAnswer: true, + ), + SurveyAnswerEntity( + answer: data['answers'][1]['answer'], + percent: 60, + isCurrentAnswer: false, + ) + ], + ), + ); }); test('Should throw UnexpectedError if cache is empty', () async { cacheStorage.mockFetch({}); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -66,7 +69,8 @@ void main() { test('Should throw UnexpectedError if cache is isvalid', () async { cacheStorage.mockFetch(CacheFactory.makeInvalidSurveyResult()); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -74,7 +78,8 @@ void main() { test('Should throw UnexpectedError if cache is incomplete', () async { cacheStorage.mockFetch(CacheFactory.makeIncompleteSurveyResult()); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -82,7 +87,8 @@ void main() { test('Should throw UnexpectedError if cache throws', () async { cacheStorage.mockFetchError(); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -125,30 +131,38 @@ void main() { Map json = { 'surveyId': surveyResult.surveyId, 'question': surveyResult.question, - 'answers': [{ - 'image': surveyResult.answers[0].image, - 'answer': surveyResult.answers[0].answer, - 'percent': '40', - 'isCurrentAnswer': 'true' - }, { - 'image': null, - 'answer': surveyResult.answers[1].answer, - 'percent': '60', - 'isCurrentAnswer': 'false' - }] + 'answers': [ + { + 'image': surveyResult.answers[0].image, + 'answer': surveyResult.answers[0].answer, + 'percent': '40', + 'isCurrentAnswer': 'true' + }, + { + 'image': null, + 'answer': surveyResult.answers[1].answer, + 'percent': '60', + 'isCurrentAnswer': 'false' + } + ] }; await sut.save(surveyResult); - verify(() => cacheStorage.save(key: 'survey_result/${surveyResult.surveyId}', value: json)).called(1); + verify( + () => cacheStorage.save( + key: 'survey_result/${surveyResult.surveyId}', + value: json, + ), + ).called(1); }); test('Should throw UnexpectedError if save throws', () async { cacheStorage.mockSaveError(); - final future = sut.save(surveyResult); + final Future future = sut.save(surveyResult); expect(future, throwsA(DomainError.unexpected)); }); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/load_survey_result/remote_load_survey_result_test.dart b/test/data/usecases/load_survey_result/remote_load_survey_result_test.dart index 84552279..93e9d33f 100644 --- a/test/data/usecases/load_survey_result/remote_load_survey_result_test.dart +++ b/test/data/usecases/load_survey_result/remote_load_survey_result_test.dart @@ -1,15 +1,12 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/data/usecases/usecases.dart'; - -import '../../../infra/mocks/mocks.dart'; -import '../../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../../infra/mocks/mocks.dart'; +import '../../mocks/mocks.dart'; + void main() { late RemoteLoadSurveyResult sut; late HttpClientSpy httpClient; @@ -33,31 +30,40 @@ void main() { }); test('Should return surveyResult on 200', () async { - final result = await sut.loadBySurvey(surveyId: surveyId); - - expect(result, SurveyResultEntity( - surveyId: surveyResult['surveyId'], - question: surveyResult['question'], - answers: [ - SurveyAnswerEntity( - image: surveyResult['answers'][0]['image'], - answer: surveyResult['answers'][0]['answer'], - isCurrentAnswer: surveyResult['answers'][0]['isCurrentAccountAnswer'], - percent: surveyResult['answers'][0]['percent'], - ), - SurveyAnswerEntity( - answer: surveyResult['answers'][1]['answer'], - isCurrentAnswer: surveyResult['answers'][1]['isCurrentAccountAnswer'], - percent: surveyResult['answers'][1]['percent'], - ) - ] - )); + final SurveyResultEntity result = + await sut.loadBySurvey(surveyId: surveyId); + + expect( + result, + SurveyResultEntity( + surveyId: surveyResult['surveyId'], + question: surveyResult['question'], + answers: [ + SurveyAnswerEntity( + image: surveyResult['answers'][0]['image'], + answer: surveyResult['answers'][0]['answer'], + isCurrentAnswer: surveyResult['answers'][0] + ['isCurrentAccountAnswer'], + percent: surveyResult['answers'][0]['percent'], + ), + SurveyAnswerEntity( + answer: surveyResult['answers'][1]['answer'], + isCurrentAnswer: surveyResult['answers'][1] + ['isCurrentAccountAnswer'], + percent: surveyResult['answers'][1]['percent'], + ) + ], + ), + ); }); - test('Should throw UnexpectedError if HttpClient returns 200 with invalid data', () async { + test( + 'Should throw UnexpectedError if HttpClient returns 200 with invalid data', + () async { httpClient.mockRequest(ApiFactory.makeInvalidJson()); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -65,7 +71,8 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 404', () async { httpClient.mockRequestError(HttpError.notFound); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -73,7 +80,8 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 500', () async { httpClient.mockRequestError(HttpError.serverError); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); @@ -81,8 +89,9 @@ void main() { test('Should throw AccessDeniedError if HttpClient returns 403', () async { httpClient.mockRequestError(HttpError.forbidden); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.accessDenied)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/load_surveys/local_load_surveys_test.dart b/test/data/usecases/load_surveys/local_load_surveys_test.dart index 87b7cda5..f8aa0b44 100644 --- a/test/data/usecases/load_surveys/local_load_surveys_test.dart +++ b/test/data/usecases/load_surveys/local_load_surveys_test.dart @@ -1,14 +1,12 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/usecases/usecases.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; import '../../../domain/mocks/entity_factory.dart'; import '../../../infra/mocks/mocks.dart'; import '../../mocks/mocks.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - void main() { late LocalLoadSurveys sut; late CacheStorageSpy cacheStorage; @@ -31,18 +29,28 @@ void main() { }); test('Should return a list of surveys on success', () async { - final surveys = await sut.load(); + final List surveys = await sut.load(); expect(surveys, [ - SurveyEntity(id: data[0]['id'], question: data[0]['question'], dateTime: DateTime.utc(2020, 7, 20), didAnswer: false), - SurveyEntity(id: data[1]['id'], question: data[1]['question'], dateTime: DateTime.utc(2019, 2, 2), didAnswer: true), + SurveyEntity( + id: data[0]['id'], + question: data[0]['question'], + dateTime: DateTime.utc(2020, 7, 20), + didAnswer: false, + ), + SurveyEntity( + id: data[1]['id'], + question: data[1]['question'], + dateTime: DateTime.utc(2019, 2, 2), + didAnswer: true, + ), ]); }); test('Should throw UnexpectedError if cache is empty', () async { cacheStorage.mockFetch([]); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -50,7 +58,7 @@ void main() { test('Should throw UnexpectedError if cache is isvalid', () async { cacheStorage.mockFetch(CacheFactory.makeInvalidSurveyList()); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -58,7 +66,7 @@ void main() { test('Should throw UnexpectedError if cache is incomplete', () async { cacheStorage.mockFetch(CacheFactory.makeIncompleteSurveyList()); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -66,7 +74,7 @@ void main() { test('Should throw UnexpectedError if cache throws', () async { cacheStorage.mockFetchError(); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -106,17 +114,20 @@ void main() { group('save', () { test('Should call cacheStorage with correct values', () async { - final list = [{ - 'id': surveys[0].id, - 'question': surveys[0].question, - 'date': '2020-02-02T00:00:00.000Z', - 'didAnswer': 'true', - }, { - 'id': surveys[1].id, - 'question': surveys[1].question, - 'date': '2018-12-20T00:00:00.000Z', - 'didAnswer': 'false', - }]; + final List> list = [ + { + 'id': surveys[0].id, + 'question': surveys[0].question, + 'date': '2020-02-02T00:00:00.000Z', + 'didAnswer': 'true', + }, + { + 'id': surveys[1].id, + 'question': surveys[1].question, + 'date': '2018-12-20T00:00:00.000Z', + 'didAnswer': 'false', + } + ]; await sut.save(surveys); @@ -126,9 +137,9 @@ void main() { test('Should throw UnexpectedError if save throws', () async { cacheStorage.mockSaveError(); - final future = sut.save(surveys); + final Future future = sut.save(surveys); expect(future, throwsA(DomainError.unexpected)); }); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/load_surveys/remote_load_surveys_test.dart b/test/data/usecases/load_surveys/remote_load_surveys_test.dart index 2985fe92..e5360b30 100644 --- a/test/data/usecases/load_surveys/remote_load_surveys_test.dart +++ b/test/data/usecases/load_surveys/remote_load_surveys_test.dart @@ -1,15 +1,12 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/data/usecases/usecases.dart'; - -import '../../../infra/mocks/mocks.dart'; -import '../../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../../infra/mocks/mocks.dart'; +import '../../mocks/mocks.dart'; + void main() { late RemoteLoadSurveys sut; late HttpClientSpy httpClient; @@ -31,7 +28,7 @@ void main() { }); test('Should return surveys on 200', () async { - final surveys = await sut.load(); + final List surveys = await sut.load(); expect(surveys, [ SurveyEntity( @@ -49,10 +46,12 @@ void main() { ]); }); - test('Should throw UnexpectedError if HttpClient returns 200 with invalid data', () async { + test( + 'Should throw UnexpectedError if HttpClient returns 200 with invalid data', + () async { httpClient.mockRequest(ApiFactory.makeInvalidList()); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -60,7 +59,7 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 404', () async { httpClient.mockRequestError(HttpError.notFound); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -68,7 +67,7 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 500', () async { httpClient.mockRequestError(HttpError.serverError); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); @@ -76,8 +75,8 @@ void main() { test('Should throw AccessDeniedError if HttpClient returns 403', () async { httpClient.mockRequestError(HttpError.forbidden); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.accessDenied)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/save_current_account/local_save_current_account_test.dart b/test/data/usecases/save_current_account/local_save_current_account_test.dart index ad0e2a35..cf8da82d 100644 --- a/test/data/usecases/save_current_account/local_save_current_account_test.dart +++ b/test/data/usecases/save_current_account/local_save_current_account_test.dart @@ -1,13 +1,11 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/usecases/usecases.dart'; - -import '../../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../mocks/mocks.dart'; + void main() { late LocalSaveCurrentAccount sut; late SecureCacheStorageSpy secureCacheStorage; @@ -25,11 +23,12 @@ void main() { verify(() => secureCacheStorage.save(key: 'token', value: account.token)); }); - test('Should throw UnexpectedError if SaveSecureCacheStorage throws', () async { + test('Should throw UnexpectedError if SaveSecureCacheStorage throws', + () async { secureCacheStorage.mockSaveError(); - final future = sut.save(account); + final Future future = sut.save(account); expect(future, throwsA(DomainError.unexpected)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/save_survey_result/remote_save_survey_result_test.dart b/test/data/usecases/save_survey_result/remote_save_survey_result_test.dart index 1db37245..2dcde321 100644 --- a/test/data/usecases/save_survey_result/remote_save_survey_result_test.dart +++ b/test/data/usecases/save_survey_result/remote_save_survey_result_test.dart @@ -1,15 +1,12 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/data/usecases/usecases.dart'; - -import '../../../infra/mocks/mocks.dart'; -import '../../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../../infra/mocks/mocks.dart'; +import '../../mocks/mocks.dart'; + void main() { late RemoteSaveSurveyResult sut; late HttpClientSpy httpClient; @@ -29,35 +26,45 @@ void main() { test('Should call HttpClient with correct values', () async { await sut.save(answer: answer); - verify(() => httpClient.request(url: url, method: 'put', body: {'answer': answer})); + verify( + () => + httpClient.request(url: url, method: 'put', body: {'answer': answer}), + ); }); test('Should return surveyResult on 200', () async { - final result = await sut.save(answer: answer); - - expect(result, SurveyResultEntity( - surveyId: surveyResult['surveyId'], - question: surveyResult['question'], - answers: [ - SurveyAnswerEntity( - image: surveyResult['answers'][0]['image'], - answer: surveyResult['answers'][0]['answer'], - isCurrentAnswer: surveyResult['answers'][0]['isCurrentAccountAnswer'], - percent: surveyResult['answers'][0]['percent'], - ), - SurveyAnswerEntity( - answer: surveyResult['answers'][1]['answer'], - isCurrentAnswer: surveyResult['answers'][1]['isCurrentAccountAnswer'], - percent: surveyResult['answers'][1]['percent'], - ) - ] - )); + final SurveyResultEntity result = await sut.save(answer: answer); + + expect( + result, + SurveyResultEntity( + surveyId: surveyResult['surveyId'], + question: surveyResult['question'], + answers: [ + SurveyAnswerEntity( + image: surveyResult['answers'][0]['image'], + answer: surveyResult['answers'][0]['answer'], + isCurrentAnswer: surveyResult['answers'][0] + ['isCurrentAccountAnswer'], + percent: surveyResult['answers'][0]['percent'], + ), + SurveyAnswerEntity( + answer: surveyResult['answers'][1]['answer'], + isCurrentAnswer: surveyResult['answers'][1] + ['isCurrentAccountAnswer'], + percent: surveyResult['answers'][1]['percent'], + ) + ], + ), + ); }); - test('Should throw UnexpectedError if HttpClient returns 200 with invalid data', () async { + test( + 'Should throw UnexpectedError if HttpClient returns 200 with invalid data', + () async { httpClient.mockRequest(ApiFactory.makeInvalidJson()); - final future = sut.save(answer: answer); + final Future future = sut.save(answer: answer); expect(future, throwsA(DomainError.unexpected)); }); @@ -65,7 +72,7 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 404', () async { httpClient.mockRequestError(HttpError.notFound); - final future = sut.save(answer: answer); + final Future future = sut.save(answer: answer); expect(future, throwsA(DomainError.unexpected)); }); @@ -73,7 +80,7 @@ void main() { test('Should throw UnexpectedError if HttpClient returns 500', () async { httpClient.mockRequestError(HttpError.serverError); - final future = sut.save(answer: answer); + final Future future = sut.save(answer: answer); expect(future, throwsA(DomainError.unexpected)); }); @@ -81,8 +88,8 @@ void main() { test('Should throw AccessDeniedError if HttpClient returns 403', () async { httpClient.mockRequestError(HttpError.forbidden); - final future = sut.save(answer: answer); + final Future future = sut.save(answer: answer); expect(future, throwsA(DomainError.accessDenied)); }); -} \ No newline at end of file +} diff --git a/test/data/usecases/save_survey_result/save_survey_result.dart b/test/data/usecases/save_survey_result/save_survey_result.dart new file mode 100644 index 00000000..e39a15f6 --- /dev/null +++ b/test/data/usecases/save_survey_result/save_survey_result.dart @@ -0,0 +1 @@ +export 'remote_save_survey_result_test.dart'; diff --git a/test/domain/domain.dart b/test/domain/domain.dart new file mode 100644 index 00000000..e739a823 --- /dev/null +++ b/test/domain/domain.dart @@ -0,0 +1 @@ +export './mocks/mocks.dart'; diff --git a/test/domain/mocks/add_account_spy.dart b/test/domain/mocks/add_account_spy.dart index eee6e107..6efb8bdc 100644 --- a/test/domain/mocks/add_account_spy.dart +++ b/test/domain/mocks/add_account_spy.dart @@ -1,11 +1,11 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class AddAccountSpy extends Mock implements AddAccount { - When mockAddAccountCall() => when(() => this.add(any())); - void mockAddAccount(AccountEntity data) => this.mockAddAccountCall().thenAnswer((_) async => data); - void mockAddAccountError(DomainError error) => this.mockAddAccountCall().thenThrow(error); -} \ No newline at end of file + When mockAddAccountCall() => when(() => add(any())); + void mockAddAccount(AccountEntity data) => + mockAddAccountCall().thenAnswer((_) async => data); + void mockAddAccountError(DomainError error) => + mockAddAccountCall().thenThrow(error); +} diff --git a/test/domain/mocks/authentication_spy.dart b/test/domain/mocks/authentication_spy.dart index 6834b179..86b31d9c 100644 --- a/test/domain/mocks/authentication_spy.dart +++ b/test/domain/mocks/authentication_spy.dart @@ -1,11 +1,11 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class AuthenticationSpy extends Mock implements Authentication { - When mockAuthenticationCall() => when(() => this.auth(any())); - void mockAuthentication(AccountEntity data) => this.mockAuthenticationCall().thenAnswer((_) async => data); - void mockAuthenticationError(DomainError error) => this.mockAuthenticationCall().thenThrow(error); -} \ No newline at end of file + When mockAuthenticationCall() => when(() => auth(any())); + void mockAuthentication(AccountEntity data) => + mockAuthenticationCall().thenAnswer((_) async => data); + void mockAuthenticationError(DomainError error) => + mockAuthenticationCall().thenThrow(error); +} diff --git a/test/domain/mocks/entity_factory.dart b/test/domain/mocks/entity_factory.dart index ea2543ab..8c58695e 100644 --- a/test/domain/mocks/entity_factory.dart +++ b/test/domain/mocks/entity_factory.dart @@ -1,42 +1,39 @@ -import 'package:fordev/domain/entities/entities.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/domain/domain.dart'; class EntityFactory { - static AccountEntity makeAccount() => AccountEntity( - token: faker.guid.guid() - ); + static AccountEntity makeAccount() => AccountEntity(token: faker.guid.guid()); static SurveyResultEntity makeSurveyResult() => SurveyResultEntity( - surveyId: faker.guid.guid(), - question: faker.lorem.sentence(), - answers: [ - SurveyAnswerEntity( - image: faker.internet.httpUrl(), - answer: faker.lorem.sentence(), - isCurrentAnswer: true, - percent: 40 - ), - SurveyAnswerEntity( - answer: faker.lorem.sentence(), - isCurrentAnswer: false, - percent: 60 - ) - ] - ); + surveyId: faker.guid.guid(), + question: faker.lorem.sentence(), + answers: [ + SurveyAnswerEntity( + image: faker.internet.httpUrl(), + answer: faker.lorem.sentence(), + isCurrentAnswer: true, + percent: 40, + ), + SurveyAnswerEntity( + answer: faker.lorem.sentence(), + isCurrentAnswer: false, + percent: 60, + ) + ], + ); static List makeSurveyList() => [ - SurveyEntity( - id: faker.guid.guid(), - question: faker.randomGenerator.string(10), - dateTime: DateTime.utc(2020, 2, 2), - didAnswer: true - ), - SurveyEntity( - id: faker.guid.guid(), - question: faker.randomGenerator.string(10), - dateTime: DateTime.utc(2018, 12, 20), - didAnswer: false - ) - ]; -} \ No newline at end of file + SurveyEntity( + id: faker.guid.guid(), + question: faker.randomGenerator.string(10), + dateTime: DateTime.utc(2020, 2, 2), + didAnswer: true, + ), + SurveyEntity( + id: faker.guid.guid(), + question: faker.randomGenerator.string(10), + dateTime: DateTime.utc(2018, 12, 20), + didAnswer: false, + ) + ]; +} diff --git a/test/domain/mocks/load_current_account_spy.dart b/test/domain/mocks/load_current_account_spy.dart index e36c6389..8c1efe52 100644 --- a/test/domain/mocks/load_current_account_spy.dart +++ b/test/domain/mocks/load_current_account_spy.dart @@ -1,10 +1,10 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class LoadCurrentAccountSpy extends Mock implements LoadCurrentAccount { - When mockLoadCall() => when(() => this.load()); - void mockLoad({ required AccountEntity account }) => this.mockLoadCall().thenAnswer((_) async => account); - void mockLoadError() => this.mockLoadCall().thenThrow(Exception()); -} \ No newline at end of file + When mockLoadCall() => when(() => load()); + void mockLoad({required AccountEntity account}) => + mockLoadCall().thenAnswer((_) async => account); + void mockLoadError() => mockLoadCall().thenThrow(Exception()); +} diff --git a/test/domain/mocks/mocks.dart b/test/domain/mocks/mocks.dart index ce2fd0c3..42f0bd17 100644 --- a/test/domain/mocks/mocks.dart +++ b/test/domain/mocks/mocks.dart @@ -1,7 +1,7 @@ +export './add_account_spy.dart'; +export './authentication_spy.dart'; export './entity_factory.dart'; +export './load_current_account_spy.dart'; export './params_factory.dart'; -export './authentication_spy.dart'; export './save_current_account_spy.dart'; -export './load_current_account_spy.dart'; export './save_survey_result_spy.dart'; -export './add_account_spy.dart'; \ No newline at end of file diff --git a/test/domain/mocks/params_factory.dart b/test/domain/mocks/params_factory.dart index e9f61bcf..f1cd84bb 100644 --- a/test/domain/mocks/params_factory.dart +++ b/test/domain/mocks/params_factory.dart @@ -1,17 +1,16 @@ -import 'package:fordev/domain/usecases/usecases.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/domain/domain.dart'; class ParamsFactory { static AddAccountParams makeAddAccount() => AddAccountParams( - name: faker.person.name(), - email: faker.internet.email(), - password: faker.internet.password(), - passwordConfirmation: faker.internet.password() - ); + name: faker.person.name(), + email: faker.internet.email(), + password: faker.internet.password(), + passwordConfirmation: faker.internet.password(), + ); static AuthenticationParams makeAuthentication() => AuthenticationParams( - email: faker.internet.email(), - secret: faker.internet.password() - ); -} \ No newline at end of file + email: faker.internet.email(), + secret: faker.internet.password(), + ); +} diff --git a/test/domain/mocks/save_current_account_spy.dart b/test/domain/mocks/save_current_account_spy.dart index b303a31f..db887ec7 100644 --- a/test/domain/mocks/save_current_account_spy.dart +++ b/test/domain/mocks/save_current_account_spy.dart @@ -1,14 +1,13 @@ -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class SaveCurrentAccountSpy extends Mock implements SaveCurrentAccount { SaveCurrentAccountSpy() { - this.mockSave(); + mockSave(); } - When mockSaveCall() => when(() => this.save(any())); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => this.mockSaveCall().thenThrow(DomainError.unexpected); -} \ No newline at end of file + When mockSaveCall() => when(() => save(any())); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => mockSaveCall().thenThrow(DomainError.unexpected); +} diff --git a/test/domain/mocks/save_survey_result_spy.dart b/test/domain/mocks/save_survey_result_spy.dart index 585ea69b..1aea4684 100644 --- a/test/domain/mocks/save_survey_result_spy.dart +++ b/test/domain/mocks/save_survey_result_spy.dart @@ -1,11 +1,10 @@ -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; +import 'package:fordev/domain/domain.dart'; import 'package:mocktail/mocktail.dart'; class SaveSurveyResultSpy extends Mock implements SaveSurveyResult { - When mockSaveCall() => when(() => this.save(answer: any(named: 'answer'))); - void mockSave(SurveyResultEntity data) => mockSaveCall().thenAnswer((_) async => data); + When mockSaveCall() => when(() => save(answer: any(named: 'answer'))); + void mockSave(SurveyResultEntity data) => + mockSaveCall().thenAnswer((_) async => data); void mockSaveError(DomainError error) => mockSaveCall().thenThrow(error); -} \ No newline at end of file +} diff --git a/test/infra/cache/local_storage_adapter_test.dart b/test/infra/cache/local_storage_adapter_test.dart index c55893eb..d4c4dfa0 100644 --- a/test/infra/cache/local_storage_adapter_test.dart +++ b/test/infra/cache/local_storage_adapter_test.dart @@ -1,11 +1,10 @@ -import 'package:fordev/infra/cache/cache.dart'; - -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/infra/infra.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../mocks/mocks.dart'; + void main() { late LocalStorageAdapter sut; late LocalStorageSpy localStorage; @@ -33,17 +32,17 @@ void main() { test('Should throw if deleteItem throws', () async { localStorage.mockDeleteError(); - final future = sut.save(key: key, value: value); + final Future future = sut.save(key: key, value: value); - expect(future, throwsA(TypeMatcher())); + expect(future, throwsA(const TypeMatcher())); }); test('Should throw if deleteItem throws', () async { localStorage.mockSaveError(); - - final future = sut.save(key: key, value: value); - expect(future, throwsA(TypeMatcher())); + final Future future = sut.save(key: key, value: value); + + expect(future, throwsA(const TypeMatcher())); }); }); @@ -57,9 +56,9 @@ void main() { test('Should throw if deleteItem throws', () async { localStorage.mockDeleteError(); - final future = sut.delete(key); + final Future future = sut.delete(key); - expect(future, throwsA(TypeMatcher())); + expect(future, throwsA(const TypeMatcher())); }); }); @@ -79,9 +78,9 @@ void main() { test('Should throw if getItem throws', () async { localStorage.mockFetchError(); - final future = sut.fetch(key); + final Future future = sut.fetch(key); - expect(future, throwsA(TypeMatcher())); + expect(future, throwsA(const TypeMatcher())); }); }); -} \ No newline at end of file +} diff --git a/test/infra/cache/secure_storage_adapter_test.dart b/test/infra/cache/secure_storage_adapter_test.dart index 01b32d91..264644e3 100644 --- a/test/infra/cache/secure_storage_adapter_test.dart +++ b/test/infra/cache/secure_storage_adapter_test.dart @@ -1,11 +1,10 @@ -import 'package:fordev/infra/cache/cache.dart'; - -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/infra/infra.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../mocks/mocks.dart'; + void main() { late SecureStorageAdapter sut; late FlutterSecureStorageSpy secureStorage; @@ -30,9 +29,9 @@ void main() { test('Should throw if save secure throws', () async { secureStorage.mockSaveError(); - final future = sut.save(key: key, value: value); + final Future future = sut.save(key: key, value: value); - expect(future, throwsA(TypeMatcher())); + expect(future, throwsA(const TypeMatcher())); }); }); @@ -44,7 +43,7 @@ void main() { }); test('Should return correct value on success', () async { - final fetchedValue = await sut.fetch(key); + final String? fetchedValue = await sut.fetch(key); expect(fetchedValue, value); }); @@ -52,9 +51,9 @@ void main() { test('Should throw if fetch secure throws', () async { secureStorage.mockFetchError(); - final future = sut.fetch(key); + final Future future = sut.fetch(key); - expect(future, throwsA(TypeMatcher())); + expect(future, throwsA(const TypeMatcher())); }); }); @@ -68,9 +67,9 @@ void main() { test('Should throw if delete throws', () async { secureStorage.mockDeleteError(); - final future = sut.delete(key); + final Future future = sut.delete(key); - expect(future, throwsA(TypeMatcher())); + expect(future, throwsA(const TypeMatcher())); }); }); -} \ No newline at end of file +} diff --git a/test/infra/http/http_adapter_test.dart b/test/infra/http/http_adapter_test.dart index 1bf751a6..1fd3b48f 100644 --- a/test/infra/http/http_adapter_test.dart +++ b/test/infra/http/http_adapter_test.dart @@ -1,12 +1,11 @@ -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/infra/http/http.dart'; - -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/infra/infra.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../mocks/mocks.dart'; + void main() { late HttpAdapter sut; late ClientSpy client; @@ -24,7 +23,7 @@ void main() { group('shared', () { test('Should throw ServerError if invalid method is provided', () async { - final future = sut.request(url: url, method: 'invalid_method'); + final Future future = sut.request(url: url, method: 'invalid_method'); expect(future, throwsA(HttpError.serverError)); }); @@ -32,35 +31,42 @@ void main() { group('post', () { test('Should call post with correct values', () async { - await sut.request(url: url, method: 'post', body: {'any_key': 'any_value'}); - verify(() => client.post( - Uri.parse(url), - headers: { - 'content-type': 'application/json', - 'accept': 'application/json' - }, - body: '{"any_key":"any_value"}' - )); - - await sut.request(url: url, method: 'post', body: {'any_key': 'any_value'}, headers: {'any_header': 'any_value'}); - verify(() => client.post( - Uri.parse(url), - headers: { - 'content-type': 'application/json', - 'accept': 'application/json', - 'any_header': 'any_value' - }, - body: '{"any_key":"any_value"}' - )); + await sut + .request(url: url, method: 'post', body: {'any_key': 'any_value'}); + verify( + () => client.post( + Uri.parse(url), + headers: { + 'content-type': 'application/json', + 'accept': 'application/json' + }, + body: '{"any_key":"any_value"}', + ), + ); + + await sut.request( + url: url, + method: 'post', + body: {'any_key': 'any_value'}, + headers: {'any_header': 'any_value'}, + ); + verify( + () => client.post( + Uri.parse(url), + headers: { + 'content-type': 'application/json', + 'accept': 'application/json', + 'any_header': 'any_value' + }, + body: '{"any_key":"any_value"}', + ), + ); }); test('Should call post without body', () async { await sut.request(url: url, method: 'post'); - verify(() => client.post( - any(), - headers: any(named: 'headers') - )); + verify(() => client.post(any(), headers: any(named: 'headers'))); }); test('Should return data if post returns 200', () async { @@ -96,7 +102,7 @@ void main() { test('Should return BadRequestError if post returns 400', () async { client.mockPost(400, body: ''); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.badRequest)); }); @@ -104,7 +110,7 @@ void main() { test('Should return BadRequestError if post returns 400', () async { client.mockPost(400); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.badRequest)); }); @@ -112,7 +118,7 @@ void main() { test('Should return UnauthorizedError if post returns 401', () async { client.mockPost(401); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.unauthorized)); }); @@ -120,7 +126,7 @@ void main() { test('Should return ForbiddenError if post returns 403', () async { client.mockPost(403); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.forbidden)); }); @@ -128,7 +134,7 @@ void main() { test('Should return NotFoundError if post returns 404', () async { client.mockPost(404); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.notFound)); }); @@ -136,7 +142,7 @@ void main() { test('Should return ServerError if post returns 500', () async { client.mockPost(500); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.serverError)); }); @@ -144,7 +150,7 @@ void main() { test('Should return ServerError if post throws', () async { client.mockPostError(); - final future = sut.request(url: url, method: 'post'); + final Future future = sut.request(url: url, method: 'post'); expect(future, throwsA(HttpError.serverError)); }); @@ -153,23 +159,31 @@ void main() { group('get', () { test('Should call get with correct values', () async { await sut.request(url: url, method: 'get'); - verify(() => client.get( - Uri.parse(url), - headers: { - 'content-type': 'application/json', - 'accept': 'application/json' - } - )); - - await sut.request(url: url, method: 'get', headers: {'any_header': 'any_value'}); - verify(() => client.get( - Uri.parse(url), - headers: { - 'content-type': 'application/json', - 'accept': 'application/json', - 'any_header': 'any_value' - } - )); + verify( + () => client.get( + Uri.parse(url), + headers: { + 'content-type': 'application/json', + 'accept': 'application/json' + }, + ), + ); + + await sut.request( + url: url, + method: 'get', + headers: {'any_header': 'any_value'}, + ); + verify( + () => client.get( + Uri.parse(url), + headers: { + 'content-type': 'application/json', + 'accept': 'application/json', + 'any_header': 'any_value' + }, + ), + ); }); test('Should return data if get returns 200', () async { @@ -205,7 +219,7 @@ void main() { test('Should return BadRequestError if get returns 400', () async { client.mockGet(400, body: ''); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.badRequest)); }); @@ -213,7 +227,7 @@ void main() { test('Should return BadRequestError if get returns 400', () async { client.mockGet(400); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.badRequest)); }); @@ -221,7 +235,7 @@ void main() { test('Should return UnauthorizedError if get returns 401', () async { client.mockGet(401); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.unauthorized)); }); @@ -229,7 +243,7 @@ void main() { test('Should return ForbiddenError if get returns 403', () async { client.mockGet(403); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.forbidden)); }); @@ -237,7 +251,7 @@ void main() { test('Should return NotFoundError if get returns 404', () async { client.mockGet(404); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.notFound)); }); @@ -245,7 +259,7 @@ void main() { test('Should return ServerError if get returns 500', () async { client.mockGet(500); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.serverError)); }); @@ -253,7 +267,7 @@ void main() { test('Should return ServerError if get throws', () async { client.mockGetError(); - final future = sut.request(url: url, method: 'get'); + final Future future = sut.request(url: url, method: 'get'); expect(future, throwsA(HttpError.serverError)); }); @@ -261,35 +275,42 @@ void main() { group('put', () { test('Should call put with correct values', () async { - await sut.request(url: url, method: 'put', body: {'any_key': 'any_value'}); - verify(() => client.put( - Uri.parse(url), - headers: { - 'content-type': 'application/json', - 'accept': 'application/json' - }, - body: '{"any_key":"any_value"}' - )); - - await sut.request(url: url, method: 'put', body: {'any_key': 'any_value'}, headers: {'any_header': 'any_value'}); - verify(() => client.put( - Uri.parse(url), - headers: { - 'content-type': 'application/json', - 'accept': 'application/json', - 'any_header': 'any_value' - }, - body: '{"any_key":"any_value"}' - )); + await sut + .request(url: url, method: 'put', body: {'any_key': 'any_value'}); + verify( + () => client.put( + Uri.parse(url), + headers: { + 'content-type': 'application/json', + 'accept': 'application/json' + }, + body: '{"any_key":"any_value"}', + ), + ); + + await sut.request( + url: url, + method: 'put', + body: {'any_key': 'any_value'}, + headers: {'any_header': 'any_value'}, + ); + verify( + () => client.put( + Uri.parse(url), + headers: { + 'content-type': 'application/json', + 'accept': 'application/json', + 'any_header': 'any_value' + }, + body: '{"any_key":"any_value"}', + ), + ); }); test('Should call put without body', () async { await sut.request(url: url, method: 'put'); - verify(() => client.put( - any(), - headers: any(named: 'headers') - )); + verify(() => client.put(any(), headers: any(named: 'headers'))); }); test('Should return data if put returns 200', () async { @@ -325,7 +346,7 @@ void main() { test('Should return BadRequestError if put returns 400', () async { client.mockPut(400, body: ''); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.badRequest)); }); @@ -333,7 +354,7 @@ void main() { test('Should return BadRequestError if put returns 400', () async { client.mockPut(400); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.badRequest)); }); @@ -341,7 +362,7 @@ void main() { test('Should return UnauthorizedError if put returns 401', () async { client.mockPut(401); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.unauthorized)); }); @@ -349,7 +370,7 @@ void main() { test('Should return ForbiddenError if put returns 403', () async { client.mockPut(403); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.forbidden)); }); @@ -357,7 +378,7 @@ void main() { test('Should return NotFoundError if put returns 404', () async { client.mockPut(404); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.notFound)); }); @@ -365,7 +386,7 @@ void main() { test('Should return ServerError if put returns 500', () async { client.mockPut(500); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.serverError)); }); @@ -373,9 +394,9 @@ void main() { test('Should return ServerError if put throws', () async { client.mockPutError(); - final future = sut.request(url: url, method: 'put'); + final Future future = sut.request(url: url, method: 'put'); expect(future, throwsA(HttpError.serverError)); }); }); -} \ No newline at end of file +} diff --git a/test/infra/mocks/api_factory.dart b/test/infra/mocks/api_factory.dart index 29a0fb17..ceada802 100644 --- a/test/infra/mocks/api_factory.dart +++ b/test/infra/mocks/api_factory.dart @@ -1,47 +1,46 @@ import 'package:faker/faker.dart'; class ApiFactory { - static Map makeAccountJson() => { - 'accessToken': faker.guid.guid(), - 'name': faker.person.name() - }; + static Map makeAccountJson() => + {'accessToken': faker.guid.guid(), 'name': faker.person.name()}; static Map makeSurveyResultJson() => { - 'surveyId': faker.guid.guid(), - 'question': faker.randomGenerator.string(50), - 'answers': [{ - 'image': faker.internet.httpUrl(), - 'answer': faker.randomGenerator.string(20), - 'percent': faker.randomGenerator.integer(100), - 'count': faker.randomGenerator.integer(1000), - 'isCurrentAccountAnswer': faker.randomGenerator.boolean() - }, { - 'answer': faker.randomGenerator.string(20), - 'percent': faker.randomGenerator.integer(100), - 'count': faker.randomGenerator.integer(1000), - 'isCurrentAccountAnswer': faker.randomGenerator.boolean() - }], - 'date': faker.date.dateTime().toIso8601String(), - }; + 'surveyId': faker.guid.guid(), + 'question': faker.randomGenerator.string(50), + 'answers': [ + { + 'image': faker.internet.httpUrl(), + 'answer': faker.randomGenerator.string(20), + 'percent': faker.randomGenerator.integer(100), + 'count': faker.randomGenerator.integer(1000), + 'isCurrentAccountAnswer': faker.randomGenerator.boolean() + }, + { + 'answer': faker.randomGenerator.string(20), + 'percent': faker.randomGenerator.integer(100), + 'count': faker.randomGenerator.integer(1000), + 'isCurrentAccountAnswer': faker.randomGenerator.boolean() + } + ], + 'date': faker.date.dateTime().toIso8601String(), + }; - static List makeSurveyList() => [{ - 'id': faker.guid.guid(), - 'question': faker.randomGenerator.string(50), - 'didAnswer': faker.randomGenerator.boolean(), - 'date': faker.date.dateTime().toIso8601String(), - }, { - 'id': faker.guid.guid(), - 'question': faker.randomGenerator.string(50), - 'didAnswer': faker.randomGenerator.boolean(), - 'date': faker.date.dateTime().toIso8601String(), - }]; + static List makeSurveyList() => [ + { + 'id': faker.guid.guid(), + 'question': faker.randomGenerator.string(50), + 'didAnswer': faker.randomGenerator.boolean(), + 'date': faker.date.dateTime().toIso8601String(), + }, + { + 'id': faker.guid.guid(), + 'question': faker.randomGenerator.string(50), + 'didAnswer': faker.randomGenerator.boolean(), + 'date': faker.date.dateTime().toIso8601String(), + } + ]; - static Map makeInvalidJson() => { - 'invalid_key': 'invalid_value' - }; + static Map makeInvalidJson() => {'invalid_key': 'invalid_value'}; - static List makeInvalidList() => [ - makeInvalidJson(), - makeInvalidJson() - ]; -} \ No newline at end of file + static List makeInvalidList() => [makeInvalidJson(), makeInvalidJson()]; +} diff --git a/test/infra/mocks/cache_factory.dart b/test/infra/mocks/cache_factory.dart index 79cf28f6..197446c7 100644 --- a/test/infra/mocks/cache_factory.dart +++ b/test/infra/mocks/cache_factory.dart @@ -2,56 +2,66 @@ import 'package:faker/faker.dart'; class CacheFactory { static Map makeSurveyResult() => { - 'surveyId': faker.guid.guid(), - 'question': faker.lorem.sentence(), - 'answers': [{ - 'image': faker.internet.httpUrl(), - 'answer': faker.lorem.sentence(), - 'isCurrentAnswer': 'true', - 'percent': '40' - }, { - 'answer': faker.lorem.sentence(), - 'isCurrentAnswer': 'false', - 'percent': '60' - }], - }; + 'surveyId': faker.guid.guid(), + 'question': faker.lorem.sentence(), + 'answers': [ + { + 'image': faker.internet.httpUrl(), + 'answer': faker.lorem.sentence(), + 'isCurrentAnswer': 'true', + 'percent': '40' + }, + { + 'answer': faker.lorem.sentence(), + 'isCurrentAnswer': 'false', + 'percent': '60' + } + ], + }; static Map makeInvalidSurveyResult() => { - 'surveyId': faker.guid.guid(), - 'question': faker.lorem.sentence(), - 'answers': [{ - 'image': faker.internet.httpUrl(), - 'answer': faker.lorem.sentence(), - 'isCurrentAnswer': 'invalid bool', - 'percent': 'invalid int' - }], - }; + 'surveyId': faker.guid.guid(), + 'question': faker.lorem.sentence(), + 'answers': [ + { + 'image': faker.internet.httpUrl(), + 'answer': faker.lorem.sentence(), + 'isCurrentAnswer': 'invalid bool', + 'percent': 'invalid int' + } + ], + }; - static Map makeIncompleteSurveyResult() => { - 'surveyId': faker.guid.guid() - }; + static Map makeIncompleteSurveyResult() => {'surveyId': faker.guid.guid()}; - static List makeSurveyList() => [{ - 'id': faker.guid.guid(), - 'question': faker.randomGenerator.string(10), - 'date': '2020-07-20T00:00:00Z', - 'didAnswer': 'false', - }, { - 'id': faker.guid.guid(), - 'question': faker.randomGenerator.string(10), - 'date': '2019-02-02T00:00:00Z', - 'didAnswer': 'true', - }]; + static List makeSurveyList() => [ + { + 'id': faker.guid.guid(), + 'question': faker.randomGenerator.string(10), + 'date': '2020-07-20T00:00:00Z', + 'didAnswer': 'false', + }, + { + 'id': faker.guid.guid(), + 'question': faker.randomGenerator.string(10), + 'date': '2019-02-02T00:00:00Z', + 'didAnswer': 'true', + } + ]; - static List makeInvalidSurveyList() => [{ - 'id': faker.guid.guid(), - 'question': faker.randomGenerator.string(10), - 'date': 'invalid date', - 'didAnswer': 'false', - }]; + static List makeInvalidSurveyList() => [ + { + 'id': faker.guid.guid(), + 'question': faker.randomGenerator.string(10), + 'date': 'invalid date', + 'didAnswer': 'false', + } + ]; - static List makeIncompleteSurveyList() => [{ - 'date': '2019-02-02T00:00:00Z', - 'didAnswer': 'false', - }]; -} \ No newline at end of file + static List makeIncompleteSurveyList() => [ + { + 'date': '2019-02-02T00:00:00Z', + 'didAnswer': 'false', + } + ]; +} diff --git a/test/infra/mocks/client_spy.dart b/test/infra/mocks/client_spy.dart index 98bbf8cd..89dfe3e6 100644 --- a/test/infra/mocks/client_spy.dart +++ b/test/infra/mocks/client_spy.dart @@ -3,20 +3,36 @@ import 'package:mocktail/mocktail.dart'; class ClientSpy extends Mock implements Client { ClientSpy() { - this.mockPost(200); - this.mockPut(200); - this.mockGet(200); + mockPost(200); + mockPut(200); + mockGet(200); } - When mockPostCall() => when(() => this.post(any(), body: any(named: 'body'), headers: any(named: 'headers'))); - void mockPost(int statusCode, {String body = '{"any_key":"any_value"}'}) => this.mockPostCall().thenAnswer((_) async => Response(body, statusCode)); - void mockPostError() => when(() => this.mockPostCall().thenThrow(Exception())); + When mockPostCall() => when( + () => this.post( + any(), + body: any(named: 'body'), + headers: any(named: 'headers'), + ), + ); + void mockPost(int statusCode, {String body = '{"any_key":"any_value"}'}) => + mockPostCall().thenAnswer((_) async => Response(body, statusCode)); + void mockPostError() => when(() => mockPostCall().thenThrow(Exception())); - When mockPutCall() => when(() => this.put(any(), body: any(named: 'body'), headers: any(named: 'headers'))); - void mockPut(int statusCode, {String body = '{"any_key":"any_value"}'}) => this.mockPutCall().thenAnswer((_) async => Response(body, statusCode)); - void mockPutError() => when(() => this.mockPutCall().thenThrow(Exception())); + When mockPutCall() => when( + () => this.put( + any(), + body: any(named: 'body'), + headers: any(named: 'headers'), + ), + ); + void mockPut(int statusCode, {String body = '{"any_key":"any_value"}'}) => + mockPutCall().thenAnswer((_) async => Response(body, statusCode)); + void mockPutError() => when(() => mockPutCall().thenThrow(Exception())); - When mockGetCall() => when(() => this.get(any(), headers: any(named: 'headers'))); - void mockGet(int statusCode, {String body = '{"any_key":"any_value"}'}) => this.mockGetCall().thenAnswer((_) async => Response(body, statusCode)); - void mockGetError() => when(() => this.mockGetCall().thenThrow(Exception())); -} \ No newline at end of file + When mockGetCall() => + when(() => this.get(any(), headers: any(named: 'headers'))); + void mockGet(int statusCode, {String body = '{"any_key":"any_value"}'}) => + mockGetCall().thenAnswer((_) async => Response(body, statusCode)); + void mockGetError() => when(() => mockGetCall().thenThrow(Exception())); +} diff --git a/test/infra/mocks/flutter_secure_storage_spy.dart b/test/infra/mocks/flutter_secure_storage_spy.dart index ebb31024..c0581c2a 100644 --- a/test/infra/mocks/flutter_secure_storage_spy.dart +++ b/test/infra/mocks/flutter_secure_storage_spy.dart @@ -3,19 +3,20 @@ import 'package:mocktail/mocktail.dart'; class FlutterSecureStorageSpy extends Mock implements FlutterSecureStorage { FlutterSecureStorageSpy() { - this.mockDelete(); - this.mockSave(); + mockDelete(); + mockSave(); } - When mockDeleteCall() => when(() => this.delete(key: any(named: 'key'))); - void mockDelete() => this.mockDeleteCall().thenAnswer((_) async => _); - void mockDeleteError() => when(() => this.mockDeleteCall().thenThrow(Exception())); + When mockDeleteCall() => when(() => delete(key: any(named: 'key'))); + void mockDelete() => mockDeleteCall().thenAnswer((_) async => _); + void mockDeleteError() => when(() => mockDeleteCall().thenThrow(Exception())); - When mockSaveCall() => when(() => this.write(key: any(named: 'key'), value: any(named: 'value'))); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => when(() => this.mockSaveCall().thenThrow(Exception())); + When mockSaveCall() => + when(() => write(key: any(named: 'key'), value: any(named: 'value'))); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => when(() => mockSaveCall().thenThrow(Exception())); - When mockFetchCall() => when(() => this.read(key: any(named: 'key'))); - void mockFetch(String? data) => this.mockFetchCall().thenAnswer((_) async => data); - void mockFetchError() => when(() => this.mockFetchCall().thenThrow(Exception())); -} \ No newline at end of file + When mockFetchCall() => when(() => read(key: any(named: 'key'))); + void mockFetch(String? data) => mockFetchCall().thenAnswer((_) async => data); + void mockFetchError() => when(() => mockFetchCall().thenThrow(Exception())); +} diff --git a/test/infra/mocks/local_storage_spy.dart b/test/infra/mocks/local_storage_spy.dart index 802026f9..9b38c1ec 100644 --- a/test/infra/mocks/local_storage_spy.dart +++ b/test/infra/mocks/local_storage_spy.dart @@ -3,19 +3,19 @@ import 'package:mocktail/mocktail.dart'; class LocalStorageSpy extends Mock implements LocalStorage { LocalStorageSpy() { - this.mockDelete(); - this.mockSave(); + mockDelete(); + mockSave(); } - When mockDeleteCall() => when(() => this.deleteItem(any())); - void mockDelete() => this.mockDeleteCall().thenAnswer((_) async => _); - void mockDeleteError() => when(() => this.mockDeleteCall().thenThrow(Exception())); + When mockDeleteCall() => when(() => deleteItem(any())); + void mockDelete() => mockDeleteCall().thenAnswer((_) async => _); + void mockDeleteError() => when(() => mockDeleteCall().thenThrow(Exception())); - When mockSaveCall() => when(() => this.setItem(any(), any())); - void mockSave() => this.mockSaveCall().thenAnswer((_) async => _); - void mockSaveError() => when(() => this.mockSaveCall().thenThrow(Exception())); + When mockSaveCall() => when(() => setItem(any(), any())); + void mockSave() => mockSaveCall().thenAnswer((_) async => _); + void mockSaveError() => when(() => mockSaveCall().thenThrow(Exception())); - When mockFetchCall() => when(() => this.getItem(any())); - void mockFetch(dynamic data) => this.mockFetchCall().thenAnswer((_) async => data); - void mockFetchError() => when(() => this.mockFetchCall().thenThrow(Exception())); -} \ No newline at end of file + When mockFetchCall() => when(() => getItem(any())); + void mockFetch(dynamic data) => mockFetchCall().thenAnswer((_) async => data); + void mockFetchError() => when(() => mockFetchCall().thenThrow(Exception())); +} diff --git a/test/infra/mocks/mocks.dart b/test/infra/mocks/mocks.dart index 879ab61c..20e8052e 100644 --- a/test/infra/mocks/mocks.dart +++ b/test/infra/mocks/mocks.dart @@ -1,5 +1,5 @@ export './api_factory.dart'; export './cache_factory.dart'; -export './local_storage_spy.dart'; +export './client_spy.dart'; export './flutter_secure_storage_spy.dart'; -export './client_spy.dart'; \ No newline at end of file +export './local_storage_spy.dart'; diff --git a/test/main/composites/remote_load_survey_result_with_local_fallback_test.dart b/test/main/composites/remote_load_survey_result_with_local_fallback_test.dart index fe38fc82..1983e185 100644 --- a/test/main/composites/remote_load_survey_result_with_local_fallback_test.dart +++ b/test/main/composites/remote_load_survey_result_with_local_fallback_test.dart @@ -1,14 +1,12 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/main/composites/composites.dart'; - -import '../../data/mocks/mocks.dart'; -import '../../domain/mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:fordev/main/main.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../data/mocks/mocks.dart'; +import '../../domain/domain.dart'; + void main() { late RemoteLoadSurveyResultWithLocalFallback sut; late RemoteLoadSurveyResultSpy remote; @@ -25,10 +23,7 @@ void main() { remoteSurveyResult = EntityFactory.makeSurveyResult(); remote = RemoteLoadSurveyResultSpy(); remote.mockLoad(remoteSurveyResult); - sut = RemoteLoadSurveyResultWithLocalFallback( - remote: remote, - local: local - ); + sut = RemoteLoadSurveyResultWithLocalFallback(remote: remote, local: local); }); setUpAll(() { @@ -48,15 +43,18 @@ void main() { }); test('Should return remote surveyResult', () async { - final response = await sut.loadBySurvey(surveyId: surveyId); + final SurveyResultEntity response = + await sut.loadBySurvey(surveyId: surveyId); expect(response, remoteSurveyResult); }); - test('Should rethrow if remote loadBySurvey throws AccessDeniedError', () async { + test('Should rethrow if remote loadBySurvey throws AccessDeniedError', + () async { remote.mockLoadError(DomainError.accessDenied); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.accessDenied)); }); @@ -73,17 +71,20 @@ void main() { test('Should return local surveyResult', () async { remote.mockLoadError(DomainError.unexpected); - final response = await sut.loadBySurvey(surveyId: surveyId); + final SurveyResultEntity response = + await sut.loadBySurvey(surveyId: surveyId); expect(response, localSurveyResult); }); - test('Should throw UnexpectedError if remote and local loadBySurvey throws', () async { + test('Should throw UnexpectedError if remote and local loadBySurvey throws', + () async { remote.mockLoadError(DomainError.unexpected); local.mockLoadError(); - final future = sut.loadBySurvey(surveyId: surveyId); + final Future future = + sut.loadBySurvey(surveyId: surveyId); expect(future, throwsA(DomainError.unexpected)); }); -} \ No newline at end of file +} diff --git a/test/main/composites/remote_load_surveys_with_local_fallback_test.dart b/test/main/composites/remote_load_surveys_with_local_fallback_test.dart index 2b756528..7b287378 100644 --- a/test/main/composites/remote_load_surveys_with_local_fallback_test.dart +++ b/test/main/composites/remote_load_surveys_with_local_fallback_test.dart @@ -1,13 +1,11 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/main/composites/composites.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:fordev/main/main.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; import '../../data/mocks/mocks.dart'; import '../../domain/mocks/mocks.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - void main() { late RemoteLoadSurveysWithLocalFallback sut; late RemoteLoadSurveysSpy remote; @@ -22,10 +20,7 @@ void main() { remoteSurveys = EntityFactory.makeSurveyList(); remote = RemoteLoadSurveysSpy(); remote.mockLoad(remoteSurveys); - sut = RemoteLoadSurveysWithLocalFallback( - remote: remote, - local: local - ); + sut = RemoteLoadSurveysWithLocalFallback(remote: remote, local: local); }); test('Should call remote load', () async { @@ -41,7 +36,7 @@ void main() { }); test('Should return remote surveys', () async { - final surveys = await sut.load(); + final List surveys = await sut.load(); expect(surveys, remoteSurveys); }); @@ -49,7 +44,7 @@ void main() { test('Should rethrow if remote load throws AccessDeniedError', () async { remote.mockLoadError(DomainError.accessDenied); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.accessDenied)); }); @@ -66,7 +61,7 @@ void main() { test('Should return local surveys', () async { remote.mockLoadError(DomainError.unexpected); - final surveys = await sut.load(); + final List surveys = await sut.load(); expect(surveys, localSurveys); }); @@ -75,8 +70,8 @@ void main() { remote.mockLoadError(DomainError.unexpected); local.mockLoadError(); - final future = sut.load(); + final Future> future = sut.load(); expect(future, throwsA(DomainError.unexpected)); }); -} \ No newline at end of file +} diff --git a/test/main/composites/validation_composite_test.dart b/test/main/composites/validation_composite_test.dart index 33037941..805f7dce 100644 --- a/test/main/composites/validation_composite_test.dart +++ b/test/main/composites/validation_composite_test.dart @@ -1,10 +1,9 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; -import 'package:fordev/main/composites/composites.dart'; +import 'package:fordev/main/main.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:test/test.dart'; import '../../validation/mocks/mocks.dart'; -import 'package:test/test.dart'; - void main() { late ValidationComposite sut; late FieldValidationSpy validation1; @@ -20,7 +19,8 @@ void main() { }); test('Should return null if all validations returns null or empty', () { - final error = sut.validate(field: 'any_field', input: {'any_field': 'any_value'}); + final ValidationError? error = + sut.validate(field: 'any_field', input: {'any_field': 'any_value'}); expect(error, null); }); @@ -30,8 +30,9 @@ void main() { validation2.mockValidationError(ValidationError.requiredField); validation3.mockValidationError(ValidationError.invalidField); - final error = sut.validate(field: 'any_field', input: {'any_field': 'any_value'}); + final ValidationError? error = + sut.validate(field: 'any_field', input: {'any_field': 'any_value'}); expect(error, ValidationError.requiredField); }); -} \ No newline at end of file +} diff --git a/test/main/decorators/authorize_http_client_decorator_test.dart b/test/main/decorators/authorize_http_client_decorator_test.dart index 0c82d199..3389d1a9 100644 --- a/test/main/decorators/authorize_http_client_decorator_test.dart +++ b/test/main/decorators/authorize_http_client_decorator_test.dart @@ -1,12 +1,11 @@ -import 'package:fordev/data/http/http.dart'; -import 'package:fordev/main/decorators/decorators.dart'; - -import '../../data/mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/data/data.dart'; +import 'package:fordev/main/main.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../data/mocks/mocks.dart'; + void main() { late AuthorizeHttpClientDecorator sut; late SecureCacheStorageSpy secureCacheStorage; @@ -30,7 +29,7 @@ void main() { sut = AuthorizeHttpClientDecorator( fetchSecureCacheStorage: secureCacheStorage, deleteSecureCacheStorage: secureCacheStorage, - decoratee: httpClient + decoratee: httpClient, ); }); @@ -42,15 +41,29 @@ void main() { test('Should call decoratee with access token on header', () async { await sut.request(url: url, method: method, body: body); - verify(() => httpClient.request(url: url, method: method, body: body, headers: {'x-access-token': token})).called(1); - - await sut.request(url: url, method: method, body: body, headers: {'any_header': 'any_value'}); - verify(() => httpClient.request( + verify( + () => httpClient.request( + url: url, + method: method, + body: body, + headers: {'x-access-token': token}, + ), + ).called(1); + + await sut.request( url: url, method: method, body: body, - headers: {'x-access-token': token, 'any_header': 'any_value'} - )).called(1); + headers: {'any_header': 'any_value'}, + ); + verify( + () => httpClient.request( + url: url, + method: method, + body: body, + headers: {'x-access-token': token, 'any_header': 'any_value'}, + ), + ).called(1); }); test('Should return same result as decoratee', () async { @@ -59,10 +72,11 @@ void main() { expect(response, httpResponse); }); - test('Should throw ForbiddenError if FetchSecureCacheStorage throws', () async { + test('Should throw ForbiddenError if FetchSecureCacheStorage throws', + () async { secureCacheStorage.mockFetchError(); - final future = sut.request(url: url, method: method, body: body); + final Future future = sut.request(url: url, method: method, body: body); expect(future, throwsA(HttpError.forbidden)); verify(() => secureCacheStorage.delete('token')).called(1); @@ -71,7 +85,7 @@ void main() { test('Should rethrow if decoratee throws', () async { httpClient.mockRequestError(HttpError.badRequest); - final future = sut.request(url: url, method: method, body: body); + final Future future = sut.request(url: url, method: method, body: body); expect(future, throwsA(HttpError.badRequest)); }); @@ -79,10 +93,10 @@ void main() { test('Should delete cache if request throws ForbiddenError', () async { httpClient.mockRequestError(HttpError.forbidden); - final future = sut.request(url: url, method: method, body: body); + final Future future = sut.request(url: url, method: method, body: body); await untilCalled(() => secureCacheStorage.delete('token')); expect(future, throwsA(HttpError.forbidden)); verify(() => secureCacheStorage.delete('token')).called(1); }); -} \ No newline at end of file +} diff --git a/test/main/factories/pages/login/login_validation_factory_test.dart b/test/main/factories/pages/login/login_validation_factory_test.dart index 7bf40d80..b1fffedd 100644 --- a/test/main/factories/pages/login/login_validation_factory_test.dart +++ b/test/main/factories/pages/login/login_validation_factory_test.dart @@ -1,17 +1,16 @@ -import 'package:fordev/validation/validators/validators.dart'; -import 'package:fordev/main/factories/factories.dart'; - +import 'package:fordev/main/main.dart'; +import 'package:fordev/validation/validation.dart'; import 'package:test/test.dart'; void main() { test('Should return the correct validations', () { - final validations = makeLoginValidations(); + final List validations = makeLoginValidations(); expect(validations, [ - RequiredFieldValidation('email'), - EmailValidation('email'), - RequiredFieldValidation('password'), - MinLengthValidation(field: 'password', size: 3) + const RequiredFieldValidation('email'), + const EmailValidation('email'), + const RequiredFieldValidation('password'), + const MinLengthValidation(field: 'password', size: 3) ]); }); -} \ No newline at end of file +} diff --git a/test/main/factories/pages/login/signup_validation_factory_test.dart b/test/main/factories/pages/login/signup_validation_factory_test.dart index 8a64ef71..dcda9089 100644 --- a/test/main/factories/pages/login/signup_validation_factory_test.dart +++ b/test/main/factories/pages/login/signup_validation_factory_test.dart @@ -1,21 +1,23 @@ -import 'package:fordev/validation/validators/validators.dart'; -import 'package:fordev/main/factories/factories.dart'; - +import 'package:fordev/main/main.dart'; +import 'package:fordev/validation/validation.dart'; import 'package:test/test.dart'; void main() { test('Should return the correct validations', () { - final validations = makeSignUpValidations(); + final List validations = makeSignUpValidations(); expect(validations, [ - RequiredFieldValidation('name'), - MinLengthValidation(field: 'name', size: 3), - RequiredFieldValidation('email'), - EmailValidation('email'), - RequiredFieldValidation('password'), - MinLengthValidation(field: 'password', size: 3), - RequiredFieldValidation('passwordConfirmation'), - CompareFieldsValidation(field: 'passwordConfirmation', fieldToCompare: 'password') + const RequiredFieldValidation('name'), + const MinLengthValidation(field: 'name', size: 3), + const RequiredFieldValidation('email'), + const EmailValidation('email'), + const RequiredFieldValidation('password'), + const MinLengthValidation(field: 'password', size: 3), + const RequiredFieldValidation('passwordConfirmation'), + const CompareFieldsValidation( + field: 'passwordConfirmation', + fieldToCompare: 'password', + ) ]); }); -} \ No newline at end of file +} diff --git a/test/presentation/mocks/mocks.dart b/test/presentation/mocks/mocks.dart index 4fcf2a1e..844c24df 100644 --- a/test/presentation/mocks/mocks.dart +++ b/test/presentation/mocks/mocks.dart @@ -1 +1 @@ -export './validation_spy.dart'; \ No newline at end of file +export './validation_spy.dart'; diff --git a/test/presentation/mocks/validation_spy.dart b/test/presentation/mocks/validation_spy.dart index e5fcdb79..75109d25 100644 --- a/test/presentation/mocks/validation_spy.dart +++ b/test/presentation/mocks/validation_spy.dart @@ -1,13 +1,20 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; +import 'package:fordev/presentation/presentation.dart'; import 'package:mocktail/mocktail.dart'; class ValidationSpy extends Mock implements Validation { ValidationSpy() { - this.mockValidation(); + mockValidation(); } - When mockValidationCall(String? field) => when(() => this.validate(field: field == null ? any(named: 'field') : field, input: any(named: 'input'))); - void mockValidation({ String? field }) => this.mockValidationCall(field).thenReturn(null); - void mockValidationError({ String? field, required ValidationError value }) => this.mockValidationCall(field).thenReturn(value); -} \ No newline at end of file + When mockValidationCall(String? field) => when( + () => validate( + field: field ?? any(named: 'field'), + input: any(named: 'input'), + ), + ); + void mockValidation({String? field}) => + mockValidationCall(field).thenReturn(null); + void mockValidationError({required ValidationError value, String? field}) => + mockValidationCall(field).thenReturn(value); +} diff --git a/test/presentation/presenters/getx_login_presenter_test.dart b/test/presentation/presenters/getx_login_presenter_test.dart index a6460491..fc1ae018 100644 --- a/test/presentation/presenters/getx_login_presenter_test.dart +++ b/test/presentation/presenters/getx_login_presenter_test.dart @@ -1,17 +1,13 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; -import 'package:fordev/presentation/presenters/presenters.dart'; -import 'package:fordev/presentation/protocols/protocols.dart'; - -import '../../domain/mocks/mocks.dart'; -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../domain/mocks/mocks.dart'; +import '../mocks/mocks.dart'; + void main() { late GetxLoginPresenter sut; late AuthenticationSpy authentication; @@ -32,7 +28,7 @@ void main() { sut = GetxLoginPresenter( validation: validation, authentication: authentication, - saveCurrentAccount: saveCurrentAccount + saveCurrentAccount: saveCurrentAccount, ); }); @@ -42,18 +38,22 @@ void main() { }); test('Should call Validation with correct email', () { - final formData = {'email': email, 'password': null}; + final Map formData = {'email': email, 'password': null}; sut.validateEmail(email); - verify(() => validation.validate(field: 'email', input: formData)).called(1); + verify(() => validation.validate(field: 'email', input: formData)) + .called(1); }); test('Should emit invalidFieldError if email is invalid', () { validation.mockValidationError(value: ValidationError.invalidField); - sut.emailErrorStream.listen(expectAsync1((error) => expect(error, UIError.invalidField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.emailErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.invalidField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validateEmail(email); @@ -62,51 +62,66 @@ void main() { test('Should emit requiredFieldError if email is empty', () { validation.mockValidationError(value: ValidationError.requiredField); - sut.emailErrorStream.listen(expectAsync1((error) => expect(error, UIError.requiredField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.emailErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.requiredField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validateEmail(email); }); test('Should emit null if validation succeeds', () { - sut.emailErrorStream.listen(expectAsync1((error) => expect(error, null))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.emailErrorStream + .listen(expectAsync1((UIError? error) => expect(error, null))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validateEmail(email); }); test('Should call Validation with correct password', () { - final formData = {'email': null, 'password': password}; + final Map formData = {'email': null, 'password': password}; sut.validatePassword(password); - verify(() => validation.validate(field: 'password', input: formData)).called(1); + verify(() => validation.validate(field: 'password', input: formData)) + .called(1); }); test('Should emit requiredFieldError if password is empty', () { validation.mockValidationError(value: ValidationError.requiredField); - sut.passwordErrorStream.listen(expectAsync1((error) => expect(error, UIError.requiredField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.requiredField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePassword(password); sut.validatePassword(password); }); test('Should emit null if validation succeeds', () { - sut.passwordErrorStream.listen(expectAsync1((error) => expect(error, null))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordErrorStream + .listen(expectAsync1((UIError? error) => expect(error, null))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePassword(password); sut.validatePassword(password); }); test('Should disable form button if any field is invalid', () { - validation.mockValidationError(field: 'email', value: ValidationError.invalidField); + validation.mockValidationError( + field: 'email', + value: ValidationError.invalidField, + ); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validatePassword(password); @@ -126,7 +141,10 @@ void main() { await sut.auth(); - verify(() => authentication.auth(AuthenticationParams(email: email, secret: password))).called(1); + verify( + () => authentication + .auth(AuthenticationParams(email: email, secret: password)), + ).called(1); }); test('Should call SaveCurrentAccount with correct value', () async { @@ -144,7 +162,10 @@ void main() { sut.validatePassword(password); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - expectLater(sut.mainErrorStream, emitsInOrder([null, UIError.unexpected])); + expectLater( + sut.mainErrorStream, + emitsInOrder([null, UIError.unexpected]), + ); await sut.auth(); }); @@ -163,7 +184,8 @@ void main() { sut.validateEmail(email); sut.validatePassword(password); - sut.navigateToStream.listen(expectAsync1((page) => expect(page, '/surveys'))); + sut.navigateToStream + .listen(expectAsync1((String? page) => expect(page, '/surveys'))); await sut.auth(); }); @@ -174,7 +196,10 @@ void main() { sut.validatePassword(password); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - expectLater(sut.mainErrorStream, emitsInOrder([null, UIError.invalidCredentials])); + expectLater( + sut.mainErrorStream, + emitsInOrder([null, UIError.invalidCredentials]), + ); await sut.auth(); }); @@ -185,14 +210,18 @@ void main() { sut.validatePassword(password); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - expectLater(sut.mainErrorStream, emitsInOrder([null, UIError.unexpected])); + expectLater( + sut.mainErrorStream, + emitsInOrder([null, UIError.unexpected]), + ); await sut.auth(); }); test('Should go to SignUpPage on link click', () async { - sut.navigateToStream.listen(expectAsync1((page) => expect(page, '/signup'))); + sut.navigateToStream + .listen(expectAsync1((String? page) => expect(page, '/signup'))); sut.goToSignUp(); }); -} \ No newline at end of file +} diff --git a/test/presentation/presenters/getx_signup_presenter_test.dart b/test/presentation/presenters/getx_signup_presenter_test.dart index ca030b53..8c020216 100644 --- a/test/presentation/presenters/getx_signup_presenter_test.dart +++ b/test/presentation/presenters/getx_signup_presenter_test.dart @@ -1,17 +1,13 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/usecases/usecases.dart'; -import 'package:fordev/presentation/presenters/presenters.dart'; -import 'package:fordev/presentation/protocols/protocols.dart'; - -import '../../domain/mocks/mocks.dart'; -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../domain/mocks/mocks.dart'; +import '../mocks/mocks.dart'; + void main() { late GetxSignUpPresenter sut; late ValidationSpy validation; @@ -36,7 +32,7 @@ void main() { sut = GetxSignUpPresenter( validation: validation, addAccount: addAccount, - saveCurrentAccount: saveCurrentAccount + saveCurrentAccount: saveCurrentAccount, ); }); @@ -46,18 +42,27 @@ void main() { }); test('Should call Validation with correct email', () { - final formData = {'name': null, 'email': email, 'password': null, 'passwordConfirmation': null}; + final Map formData = { + 'name': null, + 'email': email, + 'password': null, + 'passwordConfirmation': null + }; sut.validateEmail(email); - verify(() => validation.validate(field: 'email', input: formData)).called(1); + verify(() => validation.validate(field: 'email', input: formData)) + .called(1); }); test('Should emit invalidFieldError if email is invalid', () { validation.mockValidationError(value: ValidationError.invalidField); - sut.emailErrorStream.listen(expectAsync1((error) => expect(error, UIError.invalidField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.emailErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.invalidField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validateEmail(email); @@ -66,23 +71,33 @@ void main() { test('Should emit requiredFieldError if email is empty', () { validation.mockValidationError(value: ValidationError.requiredField); - sut.emailErrorStream.listen(expectAsync1((error) => expect(error, UIError.requiredField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.emailErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.requiredField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validateEmail(email); }); test('Should emit null if validation succeeds', () { - sut.emailErrorStream.listen(expectAsync1((error) => expect(error, null))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.emailErrorStream + .listen(expectAsync1((UIError? error) => expect(error, null))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateEmail(email); sut.validateEmail(email); }); test('Should call Validation with correct name', () { - final formData = {'name': name, 'email': null, 'password': null, 'passwordConfirmation': null}; + final Map formData = { + 'name': name, + 'email': null, + 'password': null, + 'passwordConfirmation': null + }; sut.validateName(name); @@ -92,8 +107,11 @@ void main() { test('Should emit invalidFieldError if name is invalid', () { validation.mockValidationError(value: ValidationError.invalidField); - sut.nameErrorStream.listen(expectAsync1((error) => expect(error, UIError.invalidField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.nameErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.invalidField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateName(name); sut.validateName(name); @@ -102,34 +120,48 @@ void main() { test('Should emit requiredFieldError if name is empty', () { validation.mockValidationError(value: ValidationError.requiredField); - sut.nameErrorStream.listen(expectAsync1((error) => expect(error, UIError.requiredField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.nameErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.requiredField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateName(name); sut.validateName(name); }); test('Should emit null if validation succeeds', () { - sut.nameErrorStream.listen(expectAsync1((error) => expect(error, null))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.nameErrorStream + .listen(expectAsync1((UIError? error) => expect(error, null))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validateName(name); sut.validateName(name); }); test('Should call Validation with correct password', () { - final formData = {'name': null, 'email': null, 'password': password, 'passwordConfirmation': null}; + final Map formData = { + 'name': null, + 'email': null, + 'password': password, + 'passwordConfirmation': null + }; sut.validatePassword(password); - verify(() => validation.validate(field: 'password', input: formData)).called(1); + verify(() => validation.validate(field: 'password', input: formData)) + .called(1); }); test('Should emit invalidFieldError if password is invalid', () { validation.mockValidationError(value: ValidationError.invalidField); - sut.passwordErrorStream.listen(expectAsync1((error) => expect(error, UIError.invalidField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.invalidField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePassword(password); sut.validatePassword(password); @@ -138,34 +170,49 @@ void main() { test('Should emit requiredFieldError if password is empty', () { validation.mockValidationError(value: ValidationError.requiredField); - sut.passwordErrorStream.listen(expectAsync1((error) => expect(error, UIError.requiredField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.requiredField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePassword(password); sut.validatePassword(password); }); test('Should emit null if validation succeeds', () { - sut.passwordErrorStream.listen(expectAsync1((error) => expect(error, null))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordErrorStream + .listen(expectAsync1((UIError? error) => expect(error, null))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePassword(password); sut.validatePassword(password); }); test('Should call Validation with correct passwordConfirmation', () { - final formData = {'name': null, 'email': null, 'password': null, 'passwordConfirmation': passwordConfirmation}; + final Map formData = { + 'name': null, + 'email': null, + 'password': null, + 'passwordConfirmation': passwordConfirmation + }; sut.validatePasswordConfirmation(passwordConfirmation); - verify(() => validation.validate(field: 'passwordConfirmation', input: formData)).called(1); + verify( + () => validation.validate(field: 'passwordConfirmation', input: formData), + ).called(1); }); test('Should emit invalidFieldError if passwordConfirmation is invalid', () { validation.mockValidationError(value: ValidationError.invalidField); - sut.passwordConfirmationErrorStream.listen(expectAsync1((error) => expect(error, UIError.invalidField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordConfirmationErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.invalidField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePasswordConfirmation(passwordConfirmation); sut.validatePasswordConfirmation(passwordConfirmation); @@ -174,33 +221,40 @@ void main() { test('Should emit requiredFieldError if passwordConfirmation is empty', () { validation.mockValidationError(value: ValidationError.requiredField); - sut.passwordConfirmationErrorStream.listen(expectAsync1((error) => expect(error, UIError.requiredField))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordConfirmationErrorStream.listen( + expectAsync1((UIError? error) => expect(error, UIError.requiredField)), + ); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePasswordConfirmation(passwordConfirmation); sut.validatePasswordConfirmation(passwordConfirmation); }); test('Should emit null if validation succeeds', () { - sut.passwordConfirmationErrorStream.listen(expectAsync1((error) => expect(error, null))); - sut.isFormValidStream.listen(expectAsync1((isValid) => expect(isValid, false))); + sut.passwordConfirmationErrorStream + .listen(expectAsync1((UIError? error) => expect(error, null))); + sut.isFormValidStream + .listen(expectAsync1((bool isValid) => expect(isValid, false))); sut.validatePasswordConfirmation(passwordConfirmation); sut.validatePasswordConfirmation(passwordConfirmation); }); - test('Should enable form button if all fields are valid', () async { - expectLater(sut.isFormValidStream, emitsInOrder([false, true])); - - sut.validateName(name); - await Future.delayed(Duration.zero); - sut.validateEmail(email); - await Future.delayed(Duration.zero); - sut.validatePassword(password); - await Future.delayed(Duration.zero); - sut.validatePasswordConfirmation(passwordConfirmation); - await Future.delayed(Duration.zero); - }); + test( + 'Should enable form button if all fields are valid', + () async { + expectLater(sut.isFormValidStream, emitsInOrder([false, true])); + sut.validateName(name); + await Future.delayed(Duration.zero); + sut.validateEmail(email); + await Future.delayed(Duration.zero); + sut.validatePassword(password); + await Future.delayed(Duration.zero); + sut.validatePasswordConfirmation(passwordConfirmation); + await Future.delayed(Duration.zero); + }, + ); test('Should call AddAccount with correct values', () async { sut.validateName(name); @@ -210,12 +264,16 @@ void main() { await sut.signUp(); - verify(() => addAccount.add(AddAccountParams( - name: name, - email: email, - password: password, - passwordConfirmation: passwordConfirmation - ))).called(1); + verify( + () => addAccount.add( + AddAccountParams( + name: name, + email: email, + password: password, + passwordConfirmation: passwordConfirmation, + ), + ), + ).called(1); }); test('Should call SaveCurrentAccount with correct value', () async { @@ -236,7 +294,10 @@ void main() { sut.validatePassword(password); sut.validatePasswordConfirmation(passwordConfirmation); - expectLater(sut.mainErrorStream, emitsInOrder([null, UIError.unexpected])); + expectLater( + sut.mainErrorStream, + emitsInOrder([null, UIError.unexpected]), + ); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); await sut.signUp(); @@ -262,7 +323,10 @@ void main() { sut.validatePasswordConfirmation(passwordConfirmation); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - expectLater(sut.mainErrorStream, emitsInOrder([null, UIError.emailInUse])); + expectLater( + sut.mainErrorStream, + emitsInOrder([null, UIError.emailInUse]), + ); await sut.signUp(); }); @@ -275,7 +339,10 @@ void main() { sut.validatePasswordConfirmation(passwordConfirmation); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - expectLater(sut.mainErrorStream, emitsInOrder([null, UIError.unexpected])); + expectLater( + sut.mainErrorStream, + emitsInOrder([null, UIError.unexpected]), + ); await sut.signUp(); }); @@ -286,14 +353,16 @@ void main() { sut.validatePassword(password); sut.validatePasswordConfirmation(passwordConfirmation); - sut.navigateToStream.listen(expectAsync1((page) => expect(page, '/surveys'))); + sut.navigateToStream + .listen(expectAsync1((String? page) => expect(page, '/surveys'))); await sut.signUp(); }); test('Should go to LoginPage on link click', () async { - sut.navigateToStream.listen(expectAsync1((page) => expect(page, '/login'))); + sut.navigateToStream + .listen(expectAsync1((String? page) => expect(page, '/login'))); sut.goToLogin(); }); -} \ No newline at end of file +} diff --git a/test/presentation/presenters/getx_splash_presenter_test.dart b/test/presentation/presenters/getx_splash_presenter_test.dart index c7ed15da..8e1d202e 100644 --- a/test/presentation/presenters/getx_splash_presenter_test.dart +++ b/test/presentation/presenters/getx_splash_presenter_test.dart @@ -1,10 +1,9 @@ -import 'package:fordev/presentation/presenters/presenters.dart'; - -import '../../domain/mocks/mocks.dart'; - +import 'package:fordev/presentation/presentation.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../domain/mocks/mocks.dart'; + void main() { late GetxSplashPresenter sut; late LoadCurrentAccountSpy loadCurrentAccount; @@ -26,7 +25,8 @@ void main() { }); test('Should go to surveys page on success', () async { - sut.navigateToStream.listen(expectAsync1((page) => expect(page, '/surveys'))); + sut.navigateToStream + .listen(expectAsync1((String? page) => expect(page, '/surveys'))); await sut.checkAccount(durationInSeconds: 0); }); @@ -34,8 +34,9 @@ void main() { test('Should go to login page on error', () async { loadCurrentAccount.mockLoadError(); - sut.navigateToStream.listen(expectAsync1((page) => expect(page, '/login'))); + sut.navigateToStream + .listen(expectAsync1((String? page) => expect(page, '/login'))); await sut.checkAccount(durationInSeconds: 0); }); -} \ No newline at end of file +} diff --git a/test/presentation/presenters/getx_survey_result_presenter_test.dart b/test/presentation/presenters/getx_survey_result_presenter_test.dart index 7471ce93..204ed787 100644 --- a/test/presentation/presenters/getx_survey_result_presenter_test.dart +++ b/test/presentation/presenters/getx_survey_result_presenter_test.dart @@ -1,16 +1,13 @@ -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; -import 'package:fordev/presentation/presenters/presenters.dart'; - -import '../../data/mocks/mocks.dart'; -import '../../domain/mocks/mocks.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; import 'package:test/test.dart'; +import '../../data/mocks/mocks.dart'; +import '../../domain/mocks/mocks.dart'; + void main() { late GetxSurveyResultPresenter sut; late LoadSurveyResultSpy loadSurveyResult; @@ -20,23 +17,24 @@ void main() { late String surveyId; late String answer; - SurveyResultViewModel mapToViewModel(SurveyResultEntity entity) => SurveyResultViewModel( - surveyId: entity.surveyId, - question: entity.question, - answers: [ - SurveyAnswerViewModel( - image: entity.answers[0].image, - answer: entity.answers[0].answer, - isCurrentAnswer: entity.answers[0].isCurrentAnswer, - percent: '${entity.answers[0].percent}%' - ), - SurveyAnswerViewModel( - answer: entity.answers[1].answer, - isCurrentAnswer: entity.answers[1].isCurrentAnswer, - percent: '${entity.answers[1].percent}%' - ) - ] - ); + SurveyResultViewModel mapToViewModel(SurveyResultEntity entity) => + SurveyResultViewModel( + surveyId: entity.surveyId, + question: entity.question, + answers: [ + SurveyAnswerViewModel( + image: entity.answers[0].image, + answer: entity.answers[0].answer, + isCurrentAnswer: entity.answers[0].isCurrentAnswer, + percent: '${entity.answers[0].percent}%', + ), + SurveyAnswerViewModel( + answer: entity.answers[1].answer, + isCurrentAnswer: entity.answers[1].isCurrentAnswer, + percent: '${entity.answers[1].percent}%', + ) + ], + ); setUp(() { saveResult = EntityFactory.makeSurveyResult(); @@ -50,7 +48,7 @@ void main() { sut = GetxSurveyResultPresenter( loadSurveyResult: loadSurveyResult, saveSurveyResult: saveSurveyResult, - surveyId: surveyId + surveyId: surveyId, ); }); @@ -63,7 +61,12 @@ void main() { test('Should emit correct events on success', () async { expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - sut.surveyResultStream.listen(expectAsync1((result) => expect(result, mapToViewModel(loadResult)))); + sut.surveyResultStream.listen( + expectAsync1( + (SurveyResultViewModel? result) => + expect(result, mapToViewModel(loadResult)), + ), + ); await sut.loadData(); }); @@ -72,7 +75,12 @@ void main() { loadSurveyResult.mockLoadError(DomainError.unexpected); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - sut.surveyResultStream.listen(null, onError: expectAsync1((error) => expect(error, UIError.unexpected.description))); + sut.surveyResultStream.listen( + null, + onError: expectAsync1( + (Object? error) => expect(error, UIError.unexpected.description), + ), + ); await sut.loadData(); }); @@ -96,10 +104,13 @@ void main() { test('Should emit correct events on success', () async { expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - expectLater(sut.surveyResultStream, emitsInOrder([ - mapToViewModel(loadResult), - mapToViewModel(saveResult), - ])); + expectLater( + sut.surveyResultStream, + emitsInOrder([ + mapToViewModel(loadResult), + mapToViewModel(saveResult), + ]), + ); await sut.loadData(); await sut.save(answer: answer); @@ -109,7 +120,12 @@ void main() { saveSurveyResult.mockSaveError(DomainError.unexpected); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - sut.surveyResultStream.listen(null, onError: expectAsync1((error) => expect(error, UIError.unexpected.description))); + sut.surveyResultStream.listen( + null, + onError: expectAsync1( + (Object? error) => expect(error, UIError.unexpected.description), + ), + ); await sut.save(answer: answer); }); @@ -123,4 +139,4 @@ void main() { await sut.save(answer: answer); }); }); -} \ No newline at end of file +} diff --git a/test/presentation/presenters/getx_surveys_presenter_test.dart b/test/presentation/presenters/getx_surveys_presenter_test.dart index 1a1a2753..4c39b872 100644 --- a/test/presentation/presenters/getx_surveys_presenter_test.dart +++ b/test/presentation/presenters/getx_surveys_presenter_test.dart @@ -1,15 +1,12 @@ -import 'package:fordev/domain/entities/entities.dart'; -import 'package:fordev/domain/helpers/helpers.dart'; -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; -import 'package:fordev/presentation/presenters/presenters.dart'; +import 'package:fordev/domain/domain.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/ui/ui.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:test/test.dart'; import '../../data/mocks/mocks.dart'; import '../../domain/mocks/mocks.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:test/test.dart'; - void main() { late GetxSurveysPresenter sut; late LoadSurveysSpy loadSurveys; @@ -30,10 +27,24 @@ void main() { test('Should emit correct events on success', () async { expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - sut.surveysStream.listen(expectAsync1((surveys) => expect(surveys, [ - SurveyViewModel(id: surveys[0].id, question: surveys[0].question, date: '02 Feb 2020', didAnswer: surveys[0].didAnswer), - SurveyViewModel(id: surveys[1].id, question: surveys[1].question, date: '20 Dec 2018', didAnswer: surveys[1].didAnswer), - ]))); + sut.surveysStream.listen( + expectAsync1( + (List surveys) => expect(surveys, [ + SurveyViewModel( + id: surveys[0].id, + question: surveys[0].question, + date: '02 Feb 2020', + didAnswer: surveys[0].didAnswer, + ), + SurveyViewModel( + id: surveys[1].id, + question: surveys[1].question, + date: '20 Dec 2018', + didAnswer: surveys[1].didAnswer, + ), + ]), + ), + ); await sut.loadData(); }); @@ -42,7 +53,12 @@ void main() { loadSurveys.mockLoadError(DomainError.unexpected); expectLater(sut.isLoadingStream, emitsInOrder([true, false])); - sut.surveysStream.listen(null, onError: expectAsync1((error) => expect(error, UIError.unexpected.description))); + sut.surveysStream.listen( + null, + onError: expectAsync1( + (Object? error) => expect(error, UIError.unexpected.description), + ), + ); await sut.loadData(); }); @@ -57,12 +73,12 @@ void main() { }); test('Should go to SurveyResultPage on survey click', () async { - expectLater(sut.navigateToStream, emitsInOrder([ - '/survey_result/any_route', - '/survey_result/any_route' - ])); + expectLater( + sut.navigateToStream, + emitsInOrder(['/survey_result/any_route', '/survey_result/any_route']), + ); sut.goToSurveyResult('any_route'); sut.goToSurveyResult('any_route'); }); -} \ No newline at end of file +} diff --git a/test/ui/helpers/helpers.dart b/test/ui/helpers/helpers.dart index 91794e31..8cdadf4e 100644 --- a/test/ui/helpers/helpers.dart +++ b/test/ui/helpers/helpers.dart @@ -2,12 +2,23 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; Widget makePage({required String path, required Widget Function() page}) { - final getPages = [ + final List getPages = [ GetPage(name: path, page: page), - GetPage(name: '/any_route', page: () => Scaffold(appBar: AppBar(title: Text('any title')), body: Text('fake page'))) + GetPage( + name: '/any_route', + page: () => Scaffold( + appBar: AppBar(title: const Text('any title')), + body: const Text('fake page'), + ), + ) ]; if (path != '/login') { - getPages.add(GetPage(name: '/login', page: () => Scaffold(body: Text('fake login')))); + getPages.add( + GetPage( + name: '/login', + page: () => const Scaffold(body: Text('fake login')), + ), + ); } return GetMaterialApp( initialRoute: path, @@ -16,4 +27,4 @@ Widget makePage({required String path, required Widget Function() page}) { ); } -String get currentRoute => Get.currentRoute; \ No newline at end of file +String get currentRoute => Get.currentRoute; diff --git a/test/ui/mocks/login_presenter_spy.dart b/test/ui/mocks/login_presenter_spy.dart index 8cac255f..579c42db 100644 --- a/test/ui/mocks/login_presenter_spy.dart +++ b/test/ui/mocks/login_presenter_spy.dart @@ -1,25 +1,30 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; - import 'dart:async'; + +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; class LoginPresenterSpy extends Mock implements LoginPresenter { - final emailErrorController = StreamController(); - final passwordErrorController = StreamController(); - final mainErrorController = StreamController(); - final navigateToController = StreamController(); - final isFormValidController = StreamController(); - final isLoadingController = StreamController(); + final StreamController emailErrorController = + StreamController(); + final StreamController passwordErrorController = + StreamController(); + final StreamController mainErrorController = + StreamController(); + final StreamController navigateToController = + StreamController(); + final StreamController isFormValidController = StreamController(); + final StreamController isLoadingController = StreamController(); LoginPresenterSpy() { - when(() => this.auth()).thenAnswer((_) async => _); - when(() => this.emailErrorStream).thenAnswer((_) => emailErrorController.stream); - when(() => this.passwordErrorStream).thenAnswer((_) => passwordErrorController.stream); - when(() => this.mainErrorStream).thenAnswer((_) => mainErrorController.stream); - when(() => this.navigateToStream).thenAnswer((_) => navigateToController.stream); - when(() => this.isFormValidStream).thenAnswer((_) => isFormValidController.stream); - when(() => this.isLoadingStream).thenAnswer((_) => isLoadingController.stream); + when(() => auth()).thenAnswer((_) async => _); + when(() => emailErrorStream).thenAnswer((_) => emailErrorController.stream); + when(() => passwordErrorStream) + .thenAnswer((_) => passwordErrorController.stream); + when(() => mainErrorStream).thenAnswer((_) => mainErrorController.stream); + when(() => navigateToStream).thenAnswer((_) => navigateToController.stream); + when(() => isFormValidStream) + .thenAnswer((_) => isFormValidController.stream); + when(() => isLoadingStream).thenAnswer((_) => isLoadingController.stream); } void emitEmailError(UIError error) => emailErrorController.add(error); @@ -40,4 +45,4 @@ class LoginPresenterSpy extends Mock implements LoginPresenter { isFormValidController.close(); isLoadingController.close(); } -} \ No newline at end of file +} diff --git a/test/ui/mocks/mocks.dart b/test/ui/mocks/mocks.dart index fd9a3cd0..c4a41ca3 100644 --- a/test/ui/mocks/mocks.dart +++ b/test/ui/mocks/mocks.dart @@ -1,6 +1,6 @@ -export './viewmodel_factory.dart'; export './login_presenter_spy.dart'; export './signup_presenter_spy.dart'; export './splash_presenter_spy.dart'; export './survey_result_presenter_spy.dart'; -export './surveys_presenter_spy.dart'; \ No newline at end of file +export './surveys_presenter_spy.dart'; +export './viewmodel_factory.dart'; diff --git a/test/ui/mocks/signup_presenter_spy.dart b/test/ui/mocks/signup_presenter_spy.dart index 6407738d..04b983f7 100644 --- a/test/ui/mocks/signup_presenter_spy.dart +++ b/test/ui/mocks/signup_presenter_spy.dart @@ -1,29 +1,37 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; - import 'dart:async'; + +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; class SignUpPresenterSpy extends Mock implements SignUpPresenter { - final nameErrorController = StreamController(); - final emailErrorController = StreamController(); - final passwordErrorController = StreamController(); - final passwordConfirmationErrorController = StreamController(); - final mainErrorController = StreamController(); - final navigateToController = StreamController(); - final isFormValidController = StreamController(); - final isLoadingController = StreamController(); + final StreamController nameErrorController = + StreamController(); + final StreamController emailErrorController = + StreamController(); + final StreamController passwordErrorController = + StreamController(); + final StreamController passwordConfirmationErrorController = + StreamController(); + final StreamController mainErrorController = + StreamController(); + final StreamController navigateToController = + StreamController(); + final StreamController isFormValidController = StreamController(); + final StreamController isLoadingController = StreamController(); SignUpPresenterSpy() { - when(() => this.signUp()).thenAnswer((_) async => _); - when(() => this.nameErrorStream).thenAnswer((_) => nameErrorController.stream); - when(() => this.emailErrorStream).thenAnswer((_) => emailErrorController.stream); - when(() => this.passwordErrorStream).thenAnswer((_) => passwordErrorController.stream); - when(() => this.passwordConfirmationErrorStream).thenAnswer((_) => passwordConfirmationErrorController.stream); - when(() => this.mainErrorStream).thenAnswer((_) => mainErrorController.stream); - when(() => this.navigateToStream).thenAnswer((_) => navigateToController.stream); - when(() => this.isFormValidStream).thenAnswer((_) => isFormValidController.stream); - when(() => this.isLoadingStream).thenAnswer((_) => isLoadingController.stream); + when(() => signUp()).thenAnswer((_) async => _); + when(() => nameErrorStream).thenAnswer((_) => nameErrorController.stream); + when(() => emailErrorStream).thenAnswer((_) => emailErrorController.stream); + when(() => passwordErrorStream) + .thenAnswer((_) => passwordErrorController.stream); + when(() => passwordConfirmationErrorStream) + .thenAnswer((_) => passwordConfirmationErrorController.stream); + when(() => mainErrorStream).thenAnswer((_) => mainErrorController.stream); + when(() => navigateToStream).thenAnswer((_) => navigateToController.stream); + when(() => isFormValidStream) + .thenAnswer((_) => isFormValidController.stream); + when(() => isLoadingStream).thenAnswer((_) => isLoadingController.stream); } void emitNameError(UIError error) => nameErrorController.add(error); @@ -32,8 +40,10 @@ class SignUpPresenterSpy extends Mock implements SignUpPresenter { void emitEmailValid() => emailErrorController.add(null); void emitPasswordError(UIError error) => passwordErrorController.add(error); void emitPasswordValid() => passwordErrorController.add(null); - void emitPasswordConfirmationError(UIError error) => passwordConfirmationErrorController.add(error); - void emitPasswordConfirmationValid() => passwordConfirmationErrorController.add(null); + void emitPasswordConfirmationError(UIError error) => + passwordConfirmationErrorController.add(error); + void emitPasswordConfirmationValid() => + passwordConfirmationErrorController.add(null); void emitFormError() => isFormValidController.add(false); void emitFormValid() => isFormValidController.add(true); void emitLoading([bool show = true]) => isLoadingController.add(show); @@ -50,4 +60,4 @@ class SignUpPresenterSpy extends Mock implements SignUpPresenter { isFormValidController.close(); isLoadingController.close(); } -} \ No newline at end of file +} diff --git a/test/ui/mocks/splash_presenter_spy.dart b/test/ui/mocks/splash_presenter_spy.dart index 59ebf65b..22c5925e 100644 --- a/test/ui/mocks/splash_presenter_spy.dart +++ b/test/ui/mocks/splash_presenter_spy.dart @@ -1,18 +1,20 @@ -import 'package:fordev/ui/pages/pages.dart'; - import 'dart:async'; + +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; class SplashPresenterSpy extends Mock implements SplashPresenter { - final navigateToController = StreamController(); + final StreamController navigateToController = + StreamController(); SplashPresenterSpy() { - when(() => this.checkAccount(durationInSeconds: any(named: 'durationInSeconds'))).thenAnswer((_) async => _); - when(() => this.navigateToStream).thenAnswer((_) => navigateToController.stream); + when(() => checkAccount(durationInSeconds: any(named: 'durationInSeconds'))) + .thenAnswer((_) async => _); + when(() => navigateToStream).thenAnswer((_) => navigateToController.stream); } void emitNavigateTo(String route) => navigateToController.add(route); void dispose() { navigateToController.close(); } -} \ No newline at end of file +} diff --git a/test/ui/mocks/survey_result_presenter_spy.dart b/test/ui/mocks/survey_result_presenter_spy.dart index 6fb7d551..1c65353a 100644 --- a/test/ui/mocks/survey_result_presenter_spy.dart +++ b/test/ui/mocks/survey_result_presenter_spy.dart @@ -1,29 +1,36 @@ -import 'package:fordev/ui/pages/pages.dart'; - import 'dart:async'; + +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; class SurveyResultPresenterSpy extends Mock implements SurveyResultPresenter { - final surveyResultController = StreamController(); - final isSessionExpiredController = StreamController(); - final isLoadingController = StreamController(); + final StreamController surveyResultController = + StreamController(); + final StreamController isSessionExpiredController = + StreamController(); + final StreamController isLoadingController = StreamController(); SurveyResultPresenterSpy() { - when(() => this.loadData()).thenAnswer((_) async => _); - when(() => this.save(answer: any(named: 'answer'))).thenAnswer((_) async => _); - when(() => this.surveyResultStream).thenAnswer((_) => surveyResultController.stream); - when(() => this.isSessionExpiredStream).thenAnswer((_) => isSessionExpiredController.stream); - when(() => this.isLoadingStream).thenAnswer((_) => isLoadingController.stream); + when(() => loadData()).thenAnswer((_) async => _); + when(() => save(answer: any(named: 'answer'))).thenAnswer((_) async => _); + when(() => surveyResultStream) + .thenAnswer((_) => surveyResultController.stream); + when(() => isSessionExpiredStream) + .thenAnswer((_) => isSessionExpiredController.stream); + when(() => isLoadingStream).thenAnswer((_) => isLoadingController.stream); } - void emitSurveyResult(SurveyResultViewModel? data) => surveyResultController.add(data); - void emitSurveyResultError(String error) => surveyResultController.addError(error); + void emitSurveyResult(SurveyResultViewModel? data) => + surveyResultController.add(data); + void emitSurveyResultError(String error) => + surveyResultController.addError(error); void emitLoading([bool show = true]) => isLoadingController.add(show); - void emitSessionExpired([bool show = true]) => isSessionExpiredController.add(show); + void emitSessionExpired([bool show = true]) => + isSessionExpiredController.add(show); void dispose() { surveyResultController.close(); isSessionExpiredController.close(); isLoadingController.close(); } -} \ No newline at end of file +} diff --git a/test/ui/mocks/surveys_presenter_spy.dart b/test/ui/mocks/surveys_presenter_spy.dart index 1de5d30a..cbaffbf1 100644 --- a/test/ui/mocks/surveys_presenter_spy.dart +++ b/test/ui/mocks/surveys_presenter_spy.dart @@ -1,26 +1,31 @@ -import 'package:fordev/ui/pages/pages.dart'; - import 'dart:async'; + +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; class SurveysPresenterSpy extends Mock implements SurveysPresenter { - final surveysController = StreamController>(); - final isSessionExpiredController = StreamController(); - final isLoadingController = StreamController(); - final navigateToController = StreamController(); + final StreamController> surveysController = + StreamController>(); + final StreamController isSessionExpiredController = + StreamController(); + final StreamController isLoadingController = StreamController(); + final StreamController navigateToController = + StreamController(); SurveysPresenterSpy() { - when(() => this.loadData()).thenAnswer((_) async => _); - when(() => this.surveysStream).thenAnswer((_) => surveysController.stream); - when(() => this.isSessionExpiredStream).thenAnswer((_) => isSessionExpiredController.stream); - when(() => this.isLoadingStream).thenAnswer((_) => isLoadingController.stream); - when(() => this.navigateToStream).thenAnswer((_) => navigateToController.stream); + when(() => loadData()).thenAnswer((_) async => _); + when(() => surveysStream).thenAnswer((_) => surveysController.stream); + when(() => isSessionExpiredStream) + .thenAnswer((_) => isSessionExpiredController.stream); + when(() => isLoadingStream).thenAnswer((_) => isLoadingController.stream); + when(() => navigateToStream).thenAnswer((_) => navigateToController.stream); } void emitSurveys(List data) => surveysController.add(data); void emitSurveysError(String error) => surveysController.addError(error); void emitLoading([bool show = true]) => isLoadingController.add(show); - void emitSessionExpired([bool show = true]) => isSessionExpiredController.add(show); + void emitSessionExpired([bool show = true]) => + isSessionExpiredController.add(show); void emitNavigateTo(String route) => navigateToController.add(route); void dispose() { @@ -29,4 +34,4 @@ class SurveysPresenterSpy extends Mock implements SurveysPresenter { isLoadingController.close(); navigateToController.close(); } -} \ No newline at end of file +} diff --git a/test/ui/mocks/viewmodel_factory.dart b/test/ui/mocks/viewmodel_factory.dart index a9f69425..773c82b4 100644 --- a/test/ui/mocks/viewmodel_factory.dart +++ b/test/ui/mocks/viewmodel_factory.dart @@ -1,26 +1,37 @@ -import 'package:fordev/ui/pages/pages.dart'; +import 'package:fordev/ui/ui.dart'; class ViewModelFactory { - static SurveyResultViewModel makeSurveyResult() => SurveyResultViewModel( - surveyId: 'Any id', - question: 'Question', - answers: [ - SurveyAnswerViewModel( - image: 'Image 0', - answer: 'Answer 0', - isCurrentAnswer: true, - percent: '60%' - ), - SurveyAnswerViewModel( - answer: 'Answer 1', - isCurrentAnswer: false, - percent: '40%' - ) - ] - ); + static SurveyResultViewModel makeSurveyResult() => + const SurveyResultViewModel( + surveyId: 'Any id', + question: 'Question', + answers: [ + SurveyAnswerViewModel( + image: 'Image 0', + answer: 'Answer 0', + isCurrentAnswer: true, + percent: '60%', + ), + SurveyAnswerViewModel( + answer: 'Answer 1', + isCurrentAnswer: false, + percent: '40%', + ) + ], + ); static List makeSurveyList() => [ - SurveyViewModel(id: '1', question: 'Question 1', date: 'Date 1', didAnswer: true), - SurveyViewModel(id: '2', question: 'Question 2', date: 'Date 2', didAnswer: false), - ]; -} \ No newline at end of file + const SurveyViewModel( + id: '1', + question: 'Question 1', + date: 'Date 1', + didAnswer: true, + ), + const SurveyViewModel( + id: '2', + question: 'Question 2', + date: 'Date 2', + didAnswer: false, + ), + ]; +} diff --git a/test/ui/pages/login_page_test.dart b/test/ui/pages/login_page_test.dart index 4b7e8d6f..9c8c0118 100644 --- a/test/ui/pages/login_page_test.dart +++ b/test/ui/pages/login_page_test.dart @@ -1,39 +1,40 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; - -import '../helpers/helpers.dart'; -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; +import '../helpers/helpers.dart'; +import '../mocks/mocks.dart'; + void main() { late LoginPresenterSpy presenter; Future loadPage(WidgetTester tester) async { presenter = LoginPresenterSpy(); - await tester.pumpWidget(makePage(path: '/login', page: () => LoginPage(presenter))); + await tester + .pumpWidget(makePage(path: '/login', page: () => LoginPage(presenter))); } tearDown(() { presenter.dispose(); }); - testWidgets('Should call validate with correct values', (WidgetTester tester) async { + testWidgets('Should call validate with correct values', + (WidgetTester tester) async { await loadPage(tester); - final email = faker.internet.email(); + final String email = faker.internet.email(); await tester.enterText(find.bySemanticsLabel('Email'), email); verify(() => presenter.validateEmail(email)); - final password = faker.internet.password(); + final String password = faker.internet.password(); await tester.enterText(find.bySemanticsLabel('Senha'), password); verify(() => presenter.validatePassword(password)); }); - testWidgets('Should present error if email is invalid', (WidgetTester tester) async { + testWidgets('Should present error if email is invalid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitEmailError(UIError.invalidField); @@ -42,7 +43,8 @@ void main() { expect(find.text('Campo inválido'), findsOneWidget); }); - testWidgets('Should present error if email is empty', (WidgetTester tester) async { + testWidgets('Should present error if email is empty', + (WidgetTester tester) async { await loadPage(tester); presenter.emitEmailError(UIError.requiredField); @@ -51,19 +53,24 @@ void main() { expect(find.text('Campo obrigatório'), findsOneWidget); }); - testWidgets('Should present no error if email is valid', (WidgetTester tester) async { + testWidgets('Should present no error if email is valid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitEmailValid(); await tester.pump(); expect( - find.descendant(of: find.bySemanticsLabel('Email'), matching: find.byType(Text)), - findsOneWidget + find.descendant( + of: find.bySemanticsLabel('Email'), + matching: find.byType(Text), + ), + findsOneWidget, ); }); - testWidgets('Should present error if password is empty', (WidgetTester tester) async { + testWidgets('Should present error if password is empty', + (WidgetTester tester) async { await loadPage(tester); presenter.emitPasswordError(UIError.requiredField); @@ -72,44 +79,53 @@ void main() { expect(find.text('Campo obrigatório'), findsOneWidget); }); - testWidgets('Should present no error if password is valid', (WidgetTester tester) async { + testWidgets('Should present no error if password is valid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitPasswordValid(); await tester.pump(); expect( - find.descendant(of: find.bySemanticsLabel('Senha'), matching: find.byType(Text)), - findsOneWidget + find.descendant( + of: find.bySemanticsLabel('Senha'), + matching: find.byType(Text), + ), + findsOneWidget, ); }); - testWidgets('Should enable button if form is valid', (WidgetTester tester) async { + testWidgets('Should enable button if form is valid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitFormValid(); await tester.pump(); - final button = tester.widget(find.byType(ElevatedButton)); + final ElevatedButton button = + tester.widget(find.byType(ElevatedButton)); expect(button.onPressed, isNotNull); }); - testWidgets('Should disable button if form is invalid', (WidgetTester tester) async { + testWidgets('Should disable button if form is invalid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitFormError(); await tester.pump(); - final button = tester.widget(find.byType(ElevatedButton)); + final ElevatedButton button = + tester.widget(find.byType(ElevatedButton)); expect(button.onPressed, null); }); - testWidgets('Should call authentication on form submit', (WidgetTester tester) async { + testWidgets('Should call authentication on form submit', + (WidgetTester tester) async { await loadPage(tester); presenter.emitFormValid(); await tester.pump(); - final button = find.byType(ElevatedButton); + final Finder button = find.byType(ElevatedButton); await tester.ensureVisible(button); await tester.tap(button); await tester.pump(); @@ -133,7 +149,8 @@ void main() { expect(find.byType(CircularProgressIndicator), findsOneWidget); }); - testWidgets('Should present error message if authentication fails', (WidgetTester tester) async { + testWidgets('Should present error message if authentication fails', + (WidgetTester tester) async { await loadPage(tester); presenter.emitMainError(UIError.invalidCredentials); @@ -142,13 +159,17 @@ void main() { expect(find.text('Credenciais inválidas.'), findsOneWidget); }); - testWidgets('Should present error message if authentication throws', (WidgetTester tester) async { + testWidgets('Should present error message if authentication throws', + (WidgetTester tester) async { await loadPage(tester); presenter.emitMainError(UIError.unexpected); await tester.pump(); - expect(find.text('Algo errado aconteceu. Tente novamente em breve.'), findsOneWidget); + expect( + find.text('Algo errado aconteceu. Tente novamente em breve.'), + findsOneWidget, + ); }); testWidgets('Should change page', (WidgetTester tester) async { @@ -169,14 +190,15 @@ void main() { expect(currentRoute, '/login'); }); - testWidgets('Should call gotoSignUp on link click', (WidgetTester tester) async { + testWidgets('Should call gotoSignUp on link click', + (WidgetTester tester) async { await loadPage(tester); - final button = find.text('Criar conta'); + final Finder button = find.text('Criar conta'); await tester.ensureVisible(button); await tester.tap(button); await tester.pump(); verify(() => presenter.goToSignUp()).called(1); }); -} \ No newline at end of file +} diff --git a/test/ui/pages/signup_page_test.dart b/test/ui/pages/signup_page_test.dart index e9f2e7ce..ca476af5 100644 --- a/test/ui/pages/signup_page_test.dart +++ b/test/ui/pages/signup_page_test.dart @@ -1,38 +1,39 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; - -import '../helpers/helpers.dart'; -import '../mocks/mocks.dart'; - import 'package:faker/faker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; +import '../helpers/helpers.dart'; +import '../mocks/mocks.dart'; + void main() { late SignUpPresenterSpy presenter; Future loadPage(WidgetTester tester) async { presenter = SignUpPresenterSpy(); - await tester.pumpWidget(makePage(path: '/signup', page: () => SignUpPage(presenter))); + await tester.pumpWidget( + makePage(path: '/signup', page: () => SignUpPage(presenter)), + ); } tearDown(() { presenter.dispose(); }); - testWidgets('Should call validate with correct values', (WidgetTester tester) async { + testWidgets('Should call validate with correct values', + (WidgetTester tester) async { await loadPage(tester); - final name = faker.person.name(); + final String name = faker.person.name(); await tester.enterText(find.bySemanticsLabel('Nome'), name); verify(() => presenter.validateName(name)); - final email = faker.internet.email(); + final String email = faker.internet.email(); await tester.enterText(find.bySemanticsLabel('Email'), email); verify(() => presenter.validateEmail(email)); - final password = faker.internet.password(); + final String password = faker.internet.password(); await tester.enterText(find.bySemanticsLabel('Senha'), password); verify(() => presenter.validatePassword(password)); @@ -54,8 +55,11 @@ void main() { presenter.emitEmailValid(); await tester.pump(); expect( - find.descendant(of: find.bySemanticsLabel('Email'), matching: find.byType(Text)), - findsOneWidget + find.descendant( + of: find.bySemanticsLabel('Email'), + matching: find.byType(Text), + ), + findsOneWidget, ); }); @@ -73,8 +77,11 @@ void main() { presenter.emitNameValid(); await tester.pump(); expect( - find.descendant(of: find.bySemanticsLabel('Nome'), matching: find.byType(Text)), - findsOneWidget + find.descendant( + of: find.bySemanticsLabel('Nome'), + matching: find.byType(Text), + ), + findsOneWidget, ); }); @@ -92,12 +99,16 @@ void main() { presenter.emitPasswordValid(); await tester.pump(); expect( - find.descendant(of: find.bySemanticsLabel('Senha'), matching: find.byType(Text)), - findsOneWidget + find.descendant( + of: find.bySemanticsLabel('Senha'), + matching: find.byType(Text), + ), + findsOneWidget, ); }); - testWidgets('Should present passwordConfirmation error', (WidgetTester tester) async { + testWidgets('Should present passwordConfirmation error', + (WidgetTester tester) async { await loadPage(tester); presenter.emitPasswordConfirmationError(UIError.invalidField); @@ -111,28 +122,35 @@ void main() { presenter.emitPasswordConfirmationValid(); await tester.pump(); expect( - find.descendant(of: find.bySemanticsLabel('Confirmar senha'), matching: find.byType(Text)), - findsOneWidget + find.descendant( + of: find.bySemanticsLabel('Confirmar senha'), + matching: find.byType(Text), + ), + findsOneWidget, ); }); - testWidgets('Should enable button if form is valid', (WidgetTester tester) async { + testWidgets('Should enable button if form is valid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitFormValid(); await tester.pump(); - final button = tester.widget(find.byType(ElevatedButton)); + final ElevatedButton button = + tester.widget(find.byType(ElevatedButton)); expect(button.onPressed, isNotNull); }); - testWidgets('Should disable button if form is invalid', (WidgetTester tester) async { + testWidgets('Should disable button if form is invalid', + (WidgetTester tester) async { await loadPage(tester); presenter.emitFormError(); await tester.pump(); - final button = tester.widget(find.byType(ElevatedButton)); + final ElevatedButton button = + tester.widget(find.byType(ElevatedButton)); expect(button.onPressed, null); }); @@ -141,7 +159,7 @@ void main() { presenter.emitFormValid(); await tester.pump(); - final button = find.byType(ElevatedButton); + final Finder button = find.byType(ElevatedButton); await tester.ensureVisible(button); await tester.tap(button); await tester.pump(); @@ -165,7 +183,8 @@ void main() { expect(find.byType(CircularProgressIndicator), findsOneWidget); }); - testWidgets('Should present error message if signUp fails', (WidgetTester tester) async { + testWidgets('Should present error message if signUp fails', + (WidgetTester tester) async { await loadPage(tester); presenter.emitMainError(UIError.emailInUse); @@ -174,13 +193,17 @@ void main() { expect(find.text('O email já está em uso.'), findsOneWidget); }); - testWidgets('Should present error message if signUp throws', (WidgetTester tester) async { + testWidgets('Should present error message if signUp throws', + (WidgetTester tester) async { await loadPage(tester); presenter.emitMainError(UIError.unexpected); await tester.pump(); - expect(find.text('Algo errado aconteceu. Tente novamente em breve.'), findsOneWidget); + expect( + find.text('Algo errado aconteceu. Tente novamente em breve.'), + findsOneWidget, + ); }); testWidgets('Should change page', (WidgetTester tester) async { @@ -201,14 +224,15 @@ void main() { expect(currentRoute, '/signup'); }); - testWidgets('Should call gotoLogin on link click', (WidgetTester tester) async { + testWidgets('Should call gotoLogin on link click', + (WidgetTester tester) async { await loadPage(tester); - final button = find.text('Login'); + final Finder button = find.text('Login'); await tester.ensureVisible(button); await tester.tap(button); await tester.pump(); verify(() => presenter.goToLogin()).called(1); }); -} \ No newline at end of file +} diff --git a/test/ui/pages/splash_page_test.dart b/test/ui/pages/splash_page_test.dart index 70fb2ef5..de7d0065 100644 --- a/test/ui/pages/splash_page_test.dart +++ b/test/ui/pages/splash_page_test.dart @@ -1,31 +1,34 @@ -import 'package:fordev/ui/pages/pages.dart'; - -import '../helpers/helpers.dart'; -import '../mocks/mocks.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; +import '../helpers/helpers.dart'; +import '../mocks/mocks.dart'; + void main() { late SplashPresenterSpy presenter; Future loadPage(WidgetTester tester) async { presenter = SplashPresenterSpy(); - await tester.pumpWidget(makePage(path: '/', page: () => SplashPage(presenter: presenter))); + await tester.pumpWidget( + makePage(path: '/', page: () => SplashPage(presenter: presenter)), + ); } tearDown(() { presenter.dispose(); }); - testWidgets('Should present spinner on page load', (WidgetTester tester) async { + testWidgets('Should present spinner on page load', + (WidgetTester tester) async { await loadPage(tester); expect(find.byType(CircularProgressIndicator), findsOneWidget); }); - testWidgets('Should call loadCurrentAccount on page load', (WidgetTester tester) async { + testWidgets('Should call loadCurrentAccount on page load', + (WidgetTester tester) async { await loadPage(tester); verify(() => presenter.checkAccount()).called(1); @@ -48,4 +51,4 @@ void main() { await tester.pump(); expect(currentRoute, '/'); }); -} \ No newline at end of file +} diff --git a/test/ui/pages/survey_result_page_test.dart b/test/ui/pages/survey_result_page_test.dart index 5840228a..65514eb0 100644 --- a/test/ui/pages/survey_result_page_test.dart +++ b/test/ui/pages/survey_result_page_test.dart @@ -1,14 +1,11 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; -import 'package:fordev/ui/pages/survey_result/components/components.dart'; - -import '../helpers/helpers.dart'; -import '../mocks/mocks.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:network_image_mock/network_image_mock.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:network_image_mock/network_image_mock.dart'; + +import '../helpers/helpers.dart'; +import '../mocks/mocks.dart'; void main() { late SurveyResultPresenterSpy presenter; @@ -16,7 +13,12 @@ void main() { Future loadPage(WidgetTester tester) async { presenter = SurveyResultPresenterSpy(); await mockNetworkImagesFor(() async { - await tester.pumpWidget(makePage(path: '/survey_result/any_survey_id', page: () => SurveyResultPage(presenter))); + await tester.pumpWidget( + makePage( + path: '/survey_result/any_survey_id', + page: () => SurveyResultPage(presenter), + ), + ); }); } @@ -24,7 +26,8 @@ void main() { presenter.dispose(); }); - testWidgets('Should call LoadSurveyResult on page load', (WidgetTester tester) async { + testWidgets('Should call LoadSurveyResult on page load', + (WidgetTester tester) async { await loadPage(tester); verify(() => presenter.loadData()).called(1); @@ -46,18 +49,23 @@ void main() { expect(find.byType(CircularProgressIndicator), findsOneWidget); }); - testWidgets('Should present error if surveyResultStream fails', (WidgetTester tester) async { + testWidgets('Should present error if surveyResultStream fails', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveyResultError(UIError.unexpected.description); await tester.pump(); - expect(find.text('Algo errado aconteceu. Tente novamente em breve.'), findsOneWidget); + expect( + find.text('Algo errado aconteceu. Tente novamente em breve.'), + findsOneWidget, + ); expect(find.text('Recarregar'), findsOneWidget); expect(find.text('Question'), findsNothing); }); - testWidgets('Should call LoadSurveyResult on reload button click', (WidgetTester tester) async { + testWidgets('Should call LoadSurveyResult on reload button click', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveyResultError(UIError.unexpected.description); @@ -67,7 +75,8 @@ void main() { verify(() => presenter.loadData()).called(2); }); - testWidgets('Should present valid data if surveyResultStream succeeds', (WidgetTester tester) async { + testWidgets('Should present valid data if surveyResultStream succeeds', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveyResult(ViewModelFactory.makeSurveyResult()); @@ -75,7 +84,10 @@ void main() { await tester.pump(); }); - expect(find.text('Algo errado aconteceu. Tente novamente em breve.'), findsNothing); + expect( + find.text('Algo errado aconteceu. Tente novamente em breve.'), + findsNothing, + ); expect(find.text('Recarregar'), findsNothing); expect(find.text('Question'), findsOneWidget); expect(find.text('Answer 0'), findsOneWidget); @@ -84,7 +96,8 @@ void main() { expect(find.text('40%'), findsOneWidget); expect(find.byType(ActiveIcon), findsOneWidget); expect(find.byType(DisabledIcon), findsOneWidget); - final image = tester.widget(find.byType(Image)).image as NetworkImage; + final NetworkImage image = + tester.widget(find.byType(Image)).image as NetworkImage; expect(image.url, 'Image 0'); }); @@ -106,7 +119,8 @@ void main() { expect(currentRoute, '/survey_result/any_survey_id'); }); - testWidgets('Should call save on list item click', (WidgetTester tester) async { + testWidgets('Should call save on list item click', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveyResult(ViewModelFactory.makeSurveyResult()); @@ -118,7 +132,8 @@ void main() { verify(() => presenter.save(answer: 'Answer 1')).called(1); }); - testWidgets('Should not call save on current answer click', (WidgetTester tester) async { + testWidgets('Should not call save on current answer click', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveyResult(ViewModelFactory.makeSurveyResult()); @@ -129,4 +144,4 @@ void main() { verifyNever(() => presenter.save(answer: 'Answer 0')); }); -} \ No newline at end of file +} diff --git a/test/ui/pages/surveys_page_test.dart b/test/ui/pages/surveys_page_test.dart index f2c6fb6d..5fc50af5 100644 --- a/test/ui/pages/surveys_page_test.dart +++ b/test/ui/pages/surveys_page_test.dart @@ -1,26 +1,27 @@ -import 'package:fordev/ui/helpers/helpers.dart'; -import 'package:fordev/ui/pages/pages.dart'; - -import '../helpers/helpers.dart'; -import '../mocks/mocks.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:fordev/ui/ui.dart'; import 'package:mocktail/mocktail.dart'; +import '../helpers/helpers.dart'; +import '../mocks/mocks.dart'; + void main() { late SurveysPresenterSpy presenter; Future loadPage(WidgetTester tester) async { presenter = SurveysPresenterSpy(); - await tester.pumpWidget(makePage(path: '/surveys', page: () => SurveysPage(presenter))); + await tester.pumpWidget( + makePage(path: '/surveys', page: () => SurveysPage(presenter)), + ); } tearDown(() { presenter.dispose(); }); - testWidgets('Should call LoadSurveys on page load', (WidgetTester tester) async { + testWidgets('Should call LoadSurveys on page load', + (WidgetTester tester) async { await loadPage(tester); verify(() => presenter.loadData()).called(1); @@ -52,24 +53,32 @@ void main() { expect(find.byType(CircularProgressIndicator), findsOneWidget); }); - testWidgets('Should present error if surveysStream fails', (WidgetTester tester) async { + testWidgets('Should present error if surveysStream fails', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveysError(UIError.unexpected.description); await tester.pump(); - expect(find.text('Algo errado aconteceu. Tente novamente em breve.'), findsOneWidget); + expect( + find.text('Algo errado aconteceu. Tente novamente em breve.'), + findsOneWidget, + ); expect(find.text('Recarregar'), findsOneWidget); expect(find.text('Question 1'), findsNothing); }); - testWidgets('Should present list if surveysStream succeeds', (WidgetTester tester) async { + testWidgets('Should present list if surveysStream succeeds', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveys(ViewModelFactory.makeSurveyList()); await tester.pump(); - expect(find.text('Algo errado aconteceu. Tente novamente em breve.'), findsNothing); + expect( + find.text('Algo errado aconteceu. Tente novamente em breve.'), + findsNothing, + ); expect(find.text('Recarregar'), findsNothing); expect(find.text('Question 1'), findsWidgets); expect(find.text('Question 2'), findsWidgets); @@ -77,7 +86,8 @@ void main() { expect(find.text('Date 2'), findsWidgets); }); - testWidgets('Should call LoadSurveys on reload button click', (WidgetTester tester) async { + testWidgets('Should call LoadSurveys on reload button click', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveysError(UIError.unexpected.description); @@ -87,7 +97,8 @@ void main() { verify(() => presenter.loadData()).called(2); }); - testWidgets('Should call gotoSurveyResult on survey click', (WidgetTester tester) async { + testWidgets('Should call gotoSurveyResult on survey click', + (WidgetTester tester) async { await loadPage(tester); presenter.emitSurveys(ViewModelFactory.makeSurveyList()); @@ -134,4 +145,4 @@ void main() { await tester.pumpAndSettle(); expect(currentRoute, '/surveys'); }); -} \ No newline at end of file +} diff --git a/test/validation/mocks/field_validation_spy.dart b/test/validation/mocks/field_validation_spy.dart index ebb6d1ee..8f7e5827 100644 --- a/test/validation/mocks/field_validation_spy.dart +++ b/test/validation/mocks/field_validation_spy.dart @@ -1,17 +1,19 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; +import 'package:fordev/presentation/presentation.dart'; import 'package:fordev/validation/protocols/protocols.dart'; import 'package:mocktail/mocktail.dart'; class FieldValidationSpy extends Mock implements FieldValidation { FieldValidationSpy() { - this.mockValidation(); - this.mockFieldName('any_field'); + mockValidation(); + mockFieldName('any_field'); } - When mockValidationCall() => when(() => this.validate(any())); - void mockValidation() => this.mockValidationCall().thenReturn(null); - void mockValidationError(ValidationError error) => this.mockValidationCall().thenReturn(error); + When mockValidationCall() => when(() => validate(any())); + void mockValidation() => mockValidationCall().thenReturn(null); + void mockValidationError(ValidationError error) => + mockValidationCall().thenReturn(error); - void mockFieldName(String fieldName) => when(() => this.field).thenReturn(fieldName); -} \ No newline at end of file + void mockFieldName(String fieldName) => + when(() => field).thenReturn(fieldName); +} diff --git a/test/validation/mocks/mocks.dart b/test/validation/mocks/mocks.dart index ee43b685..8303a024 100644 --- a/test/validation/mocks/mocks.dart +++ b/test/validation/mocks/mocks.dart @@ -1 +1 @@ -export './field_validation_spy.dart'; \ No newline at end of file +export './field_validation_spy.dart'; diff --git a/test/validation/validators/compare_fields_validation_test.dart b/test/validation/validators/compare_fields_validation_test.dart index 29ca01b7..9a7774e1 100644 --- a/test/validation/validators/compare_fields_validation_test.dart +++ b/test/validation/validators/compare_fields_validation_test.dart @@ -1,5 +1,5 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; -import 'package:fordev/validation/validators/validators.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/validation/validation.dart'; import 'package:test/test.dart'; @@ -7,7 +7,10 @@ void main() { late CompareFieldsValidation sut; setUp(() { - sut = CompareFieldsValidation(field: 'any_field', fieldToCompare: 'other_field'); + sut = const CompareFieldsValidation( + field: 'any_field', + fieldToCompare: 'other_field', + ); }); test('Should return null on invalid cases', () { @@ -20,12 +23,18 @@ void main() { }); test('Should return error if values are not equal', () { - final formData = {'any_field': 'any_value', 'other_field': 'other_value'}; + final Map formData = { + 'any_field': 'any_value', + 'other_field': 'other_value' + }; expect(sut.validate(formData), ValidationError.invalidField); }); test('Should return null if values are equal', () { - final formData = {'any_field': 'any_value', 'other_field': 'any_value'}; + final Map formData = { + 'any_field': 'any_value', + 'other_field': 'any_value' + }; expect(sut.validate(formData), null); }); -} \ No newline at end of file +} diff --git a/test/validation/validators/email_validation_test.dart b/test/validation/validators/email_validation_test.dart index ac149b34..d943008a 100644 --- a/test/validation/validators/email_validation_test.dart +++ b/test/validation/validators/email_validation_test.dart @@ -1,5 +1,5 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; -import 'package:fordev/validation/validators/validators.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/validation/validation.dart'; import 'package:test/test.dart'; @@ -7,7 +7,7 @@ void main() { late EmailValidation sut; setUp(() { - sut = EmailValidation('any_field'); + sut = const EmailValidation('any_field'); }); test('Should return null if email is empty', () { @@ -24,6 +24,9 @@ void main() { }); test('Should return error if email is invalid', () { - expect(sut.validate({'any_field': 'rodrigo.manguinho'}), ValidationError.invalidField); + expect( + sut.validate({'any_field': 'rodrigo.manguinho'}), + ValidationError.invalidField, + ); }); -} \ No newline at end of file +} diff --git a/test/validation/validators/min_length_validation_test.dart b/test/validation/validators/min_length_validation_test.dart index a1ba40ac..d7ee5237 100644 --- a/test/validation/validators/min_length_validation_test.dart +++ b/test/validation/validators/min_length_validation_test.dart @@ -1,14 +1,13 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; -import 'package:fordev/validation/validators/validators.dart'; - import 'package:faker/faker.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/validation/validation.dart'; import 'package:test/test.dart'; void main() { late MinLengthValidation sut; setUp(() { - sut = MinLengthValidation(field: 'any_field', size: 5); + sut = const MinLengthValidation(field: 'any_field', size: 5); }); test('Should return error if value is empty', () { @@ -21,14 +20,23 @@ void main() { }); test('Should return error if value is less than min size', () { - expect(sut.validate({'any_field': faker.randomGenerator.string(4, min: 1)}), ValidationError.invalidField); + expect( + sut.validate({'any_field': faker.randomGenerator.string(4, min: 1)}), + ValidationError.invalidField, + ); }); test('Should return null if value is equal than min size', () { - expect(sut.validate({'any_field': faker.randomGenerator.string(5, min: 5)}), null); + expect( + sut.validate({'any_field': faker.randomGenerator.string(5, min: 5)}), + null, + ); }); test('Should return null if value is bigger than min size', () { - expect(sut.validate({'any_field': faker.randomGenerator.string(10, min: 6)}), null); + expect( + sut.validate({'any_field': faker.randomGenerator.string(10, min: 6)}), + null, + ); }); -} \ No newline at end of file +} diff --git a/test/validation/validators/required_field_validation_test.dart b/test/validation/validators/required_field_validation_test.dart index df9822e2..c24e71a7 100644 --- a/test/validation/validators/required_field_validation_test.dart +++ b/test/validation/validators/required_field_validation_test.dart @@ -1,5 +1,5 @@ -import 'package:fordev/presentation/protocols/protocols.dart'; -import 'package:fordev/validation/validators/validators.dart'; +import 'package:fordev/presentation/presentation.dart'; +import 'package:fordev/validation/validation.dart'; import 'package:test/test.dart'; @@ -7,7 +7,7 @@ void main() { late RequiredFieldValidation sut; setUp(() { - sut = RequiredFieldValidation('any_field'); + sut = const RequiredFieldValidation('any_field'); }); test('Should return null if value is not empty', () { @@ -22,4 +22,4 @@ void main() { expect(sut.validate({}), ValidationError.requiredField); expect(sut.validate({'any_field': null}), ValidationError.requiredField); }); -} \ No newline at end of file +}