fixed buggy getContactSupportCapability: some servers advertize it as a DefaultCapability and a cast is necessary

This commit is contained in:
Florent Azavant
2025-01-31 13:26:07 +01:00
committed by Dat H. Pham
parent 772ac66d3b
commit e7e89789c7
2 changed files with 126 additions and 7 deletions
@@ -10,6 +10,7 @@ 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/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/capability/default_capability.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';
@@ -84,12 +85,26 @@ extension SessionExtensions on Session {
ContactSupportCapability? getContactSupportCapability(AccountId accountId) {
try {
final contactSupportCapability = getCapabilityProperties<ContactSupportCapability>(
accountId,
linagoraContactSupportCapability,
);
log('SessionExtensions::getContactSupportCapability:contactSupportCapability = $contactSupportCapability');
return contactSupportCapability;
final contactSupportCapability = getCapabilityProperties<ContactSupportCapability>(accountId, linagoraContactSupportCapability);
if (contactSupportCapability != null) {
if (contactSupportCapability != ContactSupportCapability(httpLink: null, supportMailAddress: null)) {
log('SessionExtensions::getContactSupportCapability:contactSupportCapability = $contactSupportCapability');
return contactSupportCapability;
} else {
log('SessionExtensions::getContactSupportCapability:contactSupportCapability = null');
return null;
}
} else {
final defaultCapability = getCapabilityProperties<DefaultCapability>(accountId, linagoraContactSupportCapability);
if (defaultCapability != null && defaultCapability != DefaultCapability({})) {
final contactSupportCapability = ContactSupportCapability.deserialize(defaultCapability.properties!);
log('SessionExtensions::getContactSupportCapability:contactSupportCapability = $contactSupportCapability');
return contactSupportCapability;
} else {
log('SessionExtensions::getContactSupportCapability:contactSupportCapability = null');
return null;
}
}
} catch (e) {
logError('SessionExtensions::getContactSupportCapability():[Exception] $e');
return null;
@@ -1,6 +1,7 @@
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/default_capability.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';
@@ -142,7 +143,46 @@ void main() {
expect(result?.httpLink, equals(contactSupportCapability.httpLink));
});
test('SHOULD return null WHEN ContactSupportCapability is not available', () {
test('SHOULD return ContactSupportCapability WHEN DefaultCapability is available ', () {
// Arrange
const supportMailAddress = 'contact.support@example.com';
const httpLink = 'https://contact.support';
final defaultCapability = DefaultCapability({
'supportMailAddress': supportMailAddress,
'httpLink': httpLink,
});
final session = Session(
{
SessionExtensions.linagoraContactSupportCapability: defaultCapability
},
{
AccountFixtures.aliceAccountId: Account(
AccountName('Alice'),
true,
false,
{
SessionExtensions.linagoraContactSupportCapability: defaultCapability
},
)
},
{},
UserName(''),
Uri(),
Uri(),
Uri(),
Uri(),
State(''),
);
// Act
final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId);
// Assert
expect(result?.supportMailAddress, equals(supportMailAddress));
expect(result?.httpLink, equals(httpLink));
});
test('SHOULD return null WHEN ContactSupportCapability is not available (EmptyCapability)', () {
// Arrange
final session = Session(
{
@@ -174,6 +214,70 @@ void main() {
expect(result, isNull);
});
test('SHOULD return null WHEN ContactSupportCapability is not available (empty ContactSupportCapability)', () {
// Arrange
final session = Session(
{
SessionExtensions.linagoraContactSupportCapability: ContactSupportCapability()
},
{
AccountFixtures.aliceAccountId: Account(
AccountName('Alice'),
true,
false,
{
SessionExtensions.linagoraContactSupportCapability: EmptyCapability()
},
)
},
{},
UserName(''),
Uri(),
Uri(),
Uri(),
Uri(),
State(''),
);
// Act
final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId);
// Assert
expect(result, isNull);
});
test('SHOULD return null WHEN ContactSupportCapability is not available (empty DefaultCapability)', () {
// Arrange
final session = Session(
{
SessionExtensions.linagoraContactSupportCapability: DefaultCapability({})
},
{
AccountFixtures.aliceAccountId: Account(
AccountName('Alice'),
true,
false,
{
SessionExtensions.linagoraContactSupportCapability: EmptyCapability()
},
)
},
{},
UserName(''),
Uri(),
Uri(),
Uri(),
Uri(),
State(''),
);
// Act
final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId);
// Assert
expect(result, isNull);
});
test('SHOULD return null WHEN ContactSupportCapability is not supported', () {
// Arrange
final session = Session(