TF-3226 Parsing minInputLength from Autocomplete capability in session
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
import 'package:jmap_dart_client/http/converter/unsigned_int_nullable_converter.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'autocomplete_capability.g.dart';
|
||||
|
||||
@JsonSerializable(
|
||||
explicitToJson: true,
|
||||
includeIfNull: false,
|
||||
converters: [
|
||||
UnsignedIntNullableConverter()
|
||||
]
|
||||
)
|
||||
class AutocompleteCapability extends CapabilityProperties {
|
||||
final UnsignedInt? minInputLength;
|
||||
|
||||
AutocompleteCapability({this.minInputLength});
|
||||
|
||||
factory AutocompleteCapability.fromJson(Map<String, dynamic> json)
|
||||
=> _$AutocompleteCapabilityFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$AutocompleteCapabilityToJson(this);
|
||||
|
||||
static AutocompleteCapability deserialize(Map<String, dynamic> json) {
|
||||
return AutocompleteCapability.fromJson(json);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [minInputLength];
|
||||
}
|
||||
@@ -12,3 +12,4 @@ export 'contact/autocomplete/autocomplete_tmail_contact_method.dart';
|
||||
export 'contact/autocomplete/autocomplete_tmail_contact_response.dart';
|
||||
|
||||
export 'contact/model/capability_contact.dart';
|
||||
export 'contact/model/autocomplete_capability.dart';
|
||||
@@ -32,6 +32,7 @@ import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.da
|
||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/bindings/mdn_interactor_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/network/interceptors/authorization_interceptors.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
|
||||
@@ -516,4 +517,12 @@ abstract class BaseController extends GetxController
|
||||
authorizationInterceptors.clear();
|
||||
await cachingManager.closeHive();
|
||||
}
|
||||
|
||||
int getMinInputLengthAutocomplete({
|
||||
required Session session,
|
||||
required AccountId accountId,
|
||||
}) {
|
||||
final minInputLength = session.getMinInputLengthAutocomplete(accountId);
|
||||
return minInputLength?.value.toInt() ?? AppConfig.defaultMinInputLengthAutocomplete;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:contact/contact/model/autocomplete_capability.dart';
|
||||
import 'package:contact/contact/model/capability_contact.dart';
|
||||
import 'package:core/presentation/extensions/uri_extension.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/http/converter/state_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/user_name_converter.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart';
|
||||
import 'package:tmail_ui_user/features/home/domain/converter/session_account_converter.dart';
|
||||
@@ -61,4 +65,18 @@ extension SessionExtensions on Session {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
UnsignedInt? getMinInputLengthAutocomplete(AccountId accountId) {
|
||||
try {
|
||||
final autocompleteCapability = getCapabilityProperties<AutocompleteCapability>(
|
||||
accountId,
|
||||
tmailContactCapabilityIdentifier);
|
||||
final minInputLength = autocompleteCapability?.minInputLength;
|
||||
log('SessionExtensions::getMinInputLengthAutocomplete:minInputLength = $minInputLength');
|
||||
return minInputLength;
|
||||
} catch (e) {
|
||||
logError('SessionExtensions::getMinInputLengthAutocomplete():[Exception] $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import 'package:tmail_ui_user/features/login/data/network/config/oidc_constant.d
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
class AppConfig {
|
||||
static const int limitCharToStartSearch = 3;
|
||||
static const int defaultMinInputLengthAutocomplete = 3;
|
||||
static const int warningAttachmentFileSizeInMegabytes = 10;
|
||||
|
||||
static const String appDashboardConfigurationPath = "configurations/app_dashboard.json";
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'package:contact/contact/model/autocomplete_capability.dart';
|
||||
import 'package:contact/contact/model/capability_contact.dart';
|
||||
import 'package:core/data/network/config/dynamic_url_interceptors.dart';
|
||||
import 'package:core/presentation/resources/image_paths.dart';
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
@@ -6,6 +8,12 @@ import 'package:core/presentation/utils/responsive_utils.dart';
|
||||
import 'package:core/utils/application_manager.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/account/account.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/capability/empty_capability.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/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
||||
@@ -16,9 +24,11 @@ import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
|
||||
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||
import 'package:tmail_ui_user/main/utils/toast_manager.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
import '../../fixtures/account_fixtures.dart';
|
||||
import 'base_controller_test.mocks.dart';
|
||||
|
||||
class MockBaseController extends BaseController {
|
||||
@@ -201,4 +211,121 @@ void main() {
|
||||
expect(mockBaseController.isUrgentExceptionEnable, false);
|
||||
});
|
||||
});
|
||||
|
||||
group('BaseController::getMinInputLengthAutocomplete::test', () {
|
||||
late MockBaseController mockBaseController;
|
||||
|
||||
setUp(() {
|
||||
mockBaseController = MockBaseController();
|
||||
});
|
||||
|
||||
test('SHOULD return session min input length WHEN AutocompleteCapability available', () {
|
||||
// Arrange
|
||||
const expectedMinInputLength = 5;
|
||||
final session = Session(
|
||||
{
|
||||
tmailContactCapabilityIdentifier: AutocompleteCapability(
|
||||
minInputLength: UnsignedInt(expectedMinInputLength)
|
||||
)
|
||||
},
|
||||
{
|
||||
AccountFixtures.aliceAccountId: Account(
|
||||
AccountName('Alice'),
|
||||
true,
|
||||
false,
|
||||
{
|
||||
tmailContactCapabilityIdentifier: AutocompleteCapability(
|
||||
minInputLength: UnsignedInt(expectedMinInputLength)
|
||||
)
|
||||
},
|
||||
)
|
||||
},
|
||||
{},
|
||||
UserName(''),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
State(''));
|
||||
|
||||
// Act
|
||||
final result = mockBaseController.getMinInputLengthAutocomplete(
|
||||
session: session,
|
||||
accountId: AccountFixtures.aliceAccountId,
|
||||
);
|
||||
|
||||
// Assert
|
||||
expect(result, expectedMinInputLength);
|
||||
});
|
||||
|
||||
test('SHOULD return session min input length WHEN AutocompleteCapability available, but no minInputLength', () {
|
||||
// Arrange
|
||||
const expectedMinInputLength = AppConfig.defaultMinInputLengthAutocomplete;
|
||||
final session = Session(
|
||||
{
|
||||
tmailContactCapabilityIdentifier: AutocompleteCapability()
|
||||
},
|
||||
{
|
||||
AccountFixtures.aliceAccountId: Account(
|
||||
AccountName('Alice'),
|
||||
true,
|
||||
false,
|
||||
{
|
||||
tmailContactCapabilityIdentifier: AutocompleteCapability()
|
||||
},
|
||||
)
|
||||
},
|
||||
{},
|
||||
UserName(''),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
State(''),
|
||||
);
|
||||
|
||||
// Act
|
||||
final result = mockBaseController.getMinInputLengthAutocomplete(
|
||||
session: session,
|
||||
accountId: AccountFixtures.aliceAccountId,
|
||||
);
|
||||
|
||||
// Assert
|
||||
expect(result, expectedMinInputLength);
|
||||
});
|
||||
|
||||
test('SHOULD return default min input length WHEN AutocompleteCapability is not available', () {
|
||||
// Arrange
|
||||
final session = Session(
|
||||
{
|
||||
tmailContactCapabilityIdentifier: EmptyCapability()
|
||||
},
|
||||
{
|
||||
AccountFixtures.aliceAccountId: Account(
|
||||
AccountName('Alice'),
|
||||
true,
|
||||
false,
|
||||
{
|
||||
tmailContactCapabilityIdentifier: EmptyCapability()
|
||||
},
|
||||
)
|
||||
},
|
||||
{},
|
||||
UserName(''),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
State(''));
|
||||
|
||||
// Act
|
||||
final result = mockBaseController.getMinInputLengthAutocomplete(
|
||||
session: session,
|
||||
accountId: AccountFixtures.aliceAccountId,
|
||||
);
|
||||
|
||||
// Assert
|
||||
expect(result, AppConfig.defaultMinInputLengthAutocomplete);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
import 'package:contact/contact_module.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/account/account.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/capability/empty_capability.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/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
||||
|
||||
import '../../fixtures/account_fixtures.dart';
|
||||
|
||||
void main() {
|
||||
group('getMinInputLengthAutocomplete::test', () {
|
||||
test('SHOULD return minInputLength WHEN AutocompleteCapability is available', () {
|
||||
// Arrange
|
||||
final autocompleteCapability = AutocompleteCapability(minInputLength: UnsignedInt(3));
|
||||
final session = Session(
|
||||
{
|
||||
tmailContactCapabilityIdentifier: autocompleteCapability
|
||||
},
|
||||
{
|
||||
AccountFixtures.aliceAccountId: Account(
|
||||
AccountName('Alice'),
|
||||
true,
|
||||
false,
|
||||
{
|
||||
tmailContactCapabilityIdentifier: autocompleteCapability
|
||||
},
|
||||
)
|
||||
},
|
||||
{},
|
||||
UserName(''),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
State(''));
|
||||
|
||||
// Act
|
||||
final result = session.getMinInputLengthAutocomplete(AccountFixtures.aliceAccountId);
|
||||
|
||||
// Assert
|
||||
expect(result, autocompleteCapability.minInputLength);
|
||||
});
|
||||
|
||||
test('SHOULD return null WHEN AutocompleteCapability is not available', () {
|
||||
// Arrange
|
||||
final session = Session(
|
||||
{
|
||||
tmailContactCapabilityIdentifier: EmptyCapability()
|
||||
},
|
||||
{
|
||||
AccountFixtures.aliceAccountId: Account(
|
||||
AccountName('Alice'),
|
||||
true,
|
||||
false,
|
||||
{
|
||||
tmailContactCapabilityIdentifier: EmptyCapability()
|
||||
},
|
||||
)
|
||||
},
|
||||
{},
|
||||
UserName(''),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
State(''));
|
||||
|
||||
// Act
|
||||
final result = session.getMinInputLengthAutocomplete(AccountFixtures.aliceAccountId);
|
||||
|
||||
// Assert
|
||||
expect(result, isNull);
|
||||
});
|
||||
|
||||
test('SHOULD return null WHEN autocomplete capability is not supported', () {
|
||||
// Arrange
|
||||
final session = Session(
|
||||
{},
|
||||
{
|
||||
AccountFixtures.aliceAccountId: Account(
|
||||
AccountName('Alice'),
|
||||
true,
|
||||
false,
|
||||
{},
|
||||
)
|
||||
},
|
||||
{},
|
||||
UserName(''),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
Uri(),
|
||||
State(''));
|
||||
|
||||
// Act
|
||||
final result = session.getMinInputLengthAutocomplete(AccountFixtures.aliceAccountId);
|
||||
|
||||
// Assert
|
||||
expect(result, isNull);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user