From f117f37a9243b78b0686e635499bc30ded0b1ac5 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 10 Sep 2025 14:08:44 +0700 Subject: [PATCH] TF-3985 Write unit test for `isPremiumAvailable` method --- .../presentation/mailbox_view_web.dart | 7 +- .../mailbox_dashboard_controller.dart | 7 +- ...ion.dart => handle_paywall_extension.dart} | 11 +- .../presentation/saas_premium_mixin.dart | 13 ++ .../paywall/is_premium_available_test.dart | 148 ++++++++++++++++++ 5 files changed, 174 insertions(+), 12 deletions(-) rename lib/features/mailbox_dashboard/presentation/extensions/{validate_saas_premium_available_extension.dart => handle_paywall_extension.dart} (85%) create mode 100644 lib/features/paywall/presentation/saas_premium_mixin.dart create mode 100644 test/features/paywall/is_premium_available_test.dart diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index d0100d26e..b60d3354b 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -8,7 +8,7 @@ import 'package:tmail_ui_user/features/base/widget/application_version_widget.da import 'package:tmail_ui_user/features/base/widget/premium/increase_space_button_widget.dart'; import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_saas_premium_available_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; import 'package:tmail_ui_user/features/quotas/presentation/quotas_view.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -38,8 +38,9 @@ class MailboxView extends BaseMailboxView { ), const QuotasView(), Obx(() { - final isPremiumAvailable = - controller.mailboxDashBoardController.isPremiumAvailable; + final isPremiumAvailable = controller + .mailboxDashBoardController + .validatePremiumIsAvailable(); final isDesktop = controller.responsiveUtils.isDesktop(context); if (isPremiumAvailable) { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index b6da6e069..5a0181ab0 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -127,7 +127,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/reopen_composer_cache_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/validate_saas_premium_available_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/web_auth_redirect_processor_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; @@ -155,6 +155,7 @@ import 'package:tmail_ui_user/features/network_connection/presentation/network_c if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/features/paywall/domain/model/paywall_url_pattern.dart'; import 'package:tmail_ui_user/features/paywall/domain/state/get_paywall_url_state.dart'; +import 'package:tmail_ui_user/features/paywall/presentation/saas_premium_mixin.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/controller/web_socket_controller.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/services/fcm_service.dart'; @@ -206,7 +207,9 @@ import 'package:server_settings/server_settings/tmail_server_settings_extension. import 'package:uuid/uuid.dart'; class MailboxDashBoardController extends ReloadableController - with ContactSupportMixin, OwnEmailAddressMixin { + with ContactSupportMixin, + OwnEmailAddressMixin, + SaaSPremiumMixin { final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find(); final EmailReceiveManager _emailReceiveManager = Get.find(); diff --git a/lib/features/mailbox_dashboard/presentation/extensions/validate_saas_premium_available_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart similarity index 85% rename from lib/features/mailbox_dashboard/presentation/extensions/validate_saas_premium_available_extension.dart rename to lib/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart index de4043ac0..4657ddd82 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/validate_saas_premium_available_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/handle_paywall_extension.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/paywall/domain/model/paywall_url_pattern.dart'; import 'package:tmail_ui_user/features/paywall/domain/usecases/get_paywall_url_interactor.dart'; @@ -8,16 +7,14 @@ import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart'; extension ValidateSaasPremiumAvailableExtension on MailboxDashBoardController { - bool get isPremiumAvailable { + bool validatePremiumIsAvailable() { if (accountId.value == null || sessionCurrent == null) { return false; } - - final saasAccount = sessionCurrent?.getSaaSAccountCapability( - accountId.value!, + return isPremiumAvailable( + accountId: accountId.value, + session: sessionCurrent, ); - - return saasAccount?.isPremiumAvailable ?? false; } void loadPaywallUrl() { diff --git a/lib/features/paywall/presentation/saas_premium_mixin.dart b/lib/features/paywall/presentation/saas_premium_mixin.dart new file mode 100644 index 000000000..d3db21b55 --- /dev/null +++ b/lib/features/paywall/presentation/saas_premium_mixin.dart @@ -0,0 +1,13 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; + +mixin SaaSPremiumMixin { + bool isPremiumAvailable({Session? session, AccountId? accountId}) { + if (accountId == null || session == null) { + return false; + } + final saasAccount = session.getSaaSAccountCapability(accountId); + return saasAccount?.isPremiumAvailable ?? false; + } +} diff --git a/test/features/paywall/is_premium_available_test.dart b/test/features/paywall/is_premium_available_test.dart new file mode 100644 index 000000000..b9ca5130d --- /dev/null +++ b/test/features/paywall/is_premium_available_test.dart @@ -0,0 +1,148 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:jmap_dart_client/jmap/core/account/account.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; +import 'package:tmail_ui_user/features/paywall/presentation/saas_premium_mixin.dart'; + +import '../../fixtures/account_fixtures.dart'; + +class TestClass with SaaSPremiumMixin {} + +void main() { + late TestClass testClass; + + setUp(() { + testClass = TestClass(); + }); + + group('SaaSPremiumMixin.isPremiumAvailable', () { + test('should return false when accountId is null', () { + final session = Session( + {SessionExtensions.linagoraSaaSCapability: SaaSAccountCapability()}, + {}, + {}, + UserName('alice@domain.tld'), + Uri.parse('http://domain.com/jmap'), + Uri.parse( + 'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'), + Uri.parse('http://domain.com/upload/{accountId}'), + Uri.parse( + 'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'), + State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'), + ); + final result = testClass.isPremiumAvailable( + session: session, + accountId: null, + ); + expect(result, isFalse); + }); + + test('should return false when session is null', () { + final accountId = AccountFixtures.aliceAccountId; + final result = testClass.isPremiumAvailable(accountId: accountId); + expect(result, isFalse); + }); + + test('should return false when session without SaaS capability', () { + final accountId = AccountFixtures.aliceAccountId; + final session = Session( + {}, + { + AccountFixtures.aliceAccountId: + Account(AccountName('alice@domain.tld'), true, false, {}) + }, + {}, + UserName('alice@domain.tld'), + Uri.parse('http://domain.com/jmap'), + Uri.parse( + 'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'), + Uri.parse('http://domain.com/upload/{accountId}'), + Uri.parse( + 'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'), + State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'), + ); + final result = testClass.isPremiumAvailable( + session: session, + accountId: accountId, + ); + + expect(result, isFalse); + }); + + test('should return false when SaaS capability has canUpgrade is false', + () { + final accountId = AccountFixtures.aliceAccountId; + final session = Session( + { + SessionExtensions.linagoraSaaSCapability: + SaaSAccountCapability(canUpgrade: false) + }, + { + AccountFixtures.aliceAccountId: + Account(AccountName('alice@domain.tld'), true, false, { + SessionExtensions.linagoraSaaSCapability: + SaaSAccountCapability(canUpgrade: false), + }) + }, + { + SessionExtensions.linagoraSaaSCapability: + AccountFixtures.aliceAccountId, + }, + UserName('alice@domain.tld'), + Uri.parse('http://domain.com/jmap'), + Uri.parse( + 'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'), + Uri.parse('http://domain.com/upload/{accountId}'), + Uri.parse( + 'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'), + State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'), + ); + + final result = testClass.isPremiumAvailable( + session: session, + accountId: accountId, + ); + + expect(result, isFalse); + }); + + test('should return true when SaaS capability has canUpgrade is true', () { + final accountId = AccountFixtures.aliceAccountId; + final session = Session( + { + SessionExtensions.linagoraSaaSCapability: + SaaSAccountCapability(canUpgrade: true) + }, + { + AccountFixtures.aliceAccountId: + Account(AccountName('alice@domain.tld'), true, false, { + SessionExtensions.linagoraSaaSCapability: + SaaSAccountCapability(canUpgrade: true), + }) + }, + { + SessionExtensions.linagoraSaaSCapability: + AccountFixtures.aliceAccountId, + }, + UserName('alice@domain.tld'), + Uri.parse('http://domain.com/jmap'), + Uri.parse( + 'http://domain.com/download/{accountId}/{blobId}/?type={type}&name={name}'), + Uri.parse('http://domain.com/upload/{accountId}'), + Uri.parse( + 'http://domain.com/eventSource?types={types}&closeAfter={closeafter}&ping={ping}'), + State('2c9f1b12-b35a-43e6-9af2-0106fb53a943'), + ); + + final result = testClass.isPremiumAvailable( + session: session, + accountId: accountId, + ); + + expect(result, isTrue); + }); + }); +}