TF-4178 Add test for parsing error
This commit is contained in:
@@ -0,0 +1,336 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||
import 'package:labels/method/set/set_label_response.dart';
|
||||
import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart';
|
||||
|
||||
class TestSetErrorHandler with HandleSetErrorMixin {}
|
||||
|
||||
void main() {
|
||||
late TestSetErrorHandler testHandler;
|
||||
|
||||
setUp(() {
|
||||
testHandler = TestSetErrorHandler();
|
||||
});
|
||||
|
||||
group('HandleSetErrorMixin::parseErrorForSetResponse', () {
|
||||
final requestId = Id('request-123');
|
||||
final accountId = AccountId(Id('account-1'));
|
||||
|
||||
test('should throw InvalidArgumentsMethodResponse when error type is invalidArguments in notCreated', () {
|
||||
// Arrange
|
||||
final setError = SetError(ErrorMethodResponse.invalidArguments);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<InvalidArgumentsMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw InvalidArgumentsMethodResponse with description when provided', () {
|
||||
// Arrange
|
||||
final setError = SetError(
|
||||
ErrorMethodResponse.invalidArguments,
|
||||
description: 'Label name cannot be empty',
|
||||
);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(
|
||||
isA<InvalidArgumentsMethodResponse>().having(
|
||||
(e) => e.description,
|
||||
'description',
|
||||
'Label name cannot be empty',
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw InvalidArgumentsMethodResponse when error type is invalidArguments in notUpdated', () {
|
||||
// Arrange
|
||||
final setError = SetError(ErrorMethodResponse.invalidArguments);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notUpdated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<InvalidArgumentsMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw InvalidArgumentsMethodResponse when error type is invalidArguments in notDestroyed', () {
|
||||
// Arrange
|
||||
final setError = SetError(ErrorMethodResponse.invalidArguments);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notDestroyed: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<InvalidArgumentsMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw InvalidResultReferenceMethodResponse when error type is invalidResultReference', () {
|
||||
// Arrange
|
||||
final setError = SetError(ErrorMethodResponse.invalidResultReference);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<InvalidResultReferenceMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw InvalidResultReferenceMethodResponse with description when provided', () {
|
||||
// Arrange
|
||||
final setError = SetError(
|
||||
ErrorMethodResponse.invalidResultReference,
|
||||
description: 'Invalid reference to previous result',
|
||||
);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(
|
||||
isA<InvalidResultReferenceMethodResponse>().having(
|
||||
(e) => e.description,
|
||||
'description',
|
||||
'Invalid reference to previous result',
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw UnknownMethodResponse when error type is not recognized', () {
|
||||
// Arrange
|
||||
final setError = SetError(ErrorMethodResponse.serverFail);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<UnknownMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw UnknownMethodResponse with description when error type is unknown', () {
|
||||
// Arrange
|
||||
final setError = SetError(
|
||||
ErrorMethodResponse.serverFail,
|
||||
description: 'Internal server error',
|
||||
);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(
|
||||
isA<UnknownMethodResponse>().having(
|
||||
(e) => e.description,
|
||||
'description',
|
||||
'Internal server error',
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw UnknownMethodResponse when requestId is not found in error map', () {
|
||||
// Arrange
|
||||
final differentId = Id('different-request');
|
||||
final setError = SetError(ErrorMethodResponse.invalidArguments);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {differentId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<UnknownMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should throw UnknownMethodResponse without description when requestId not found', () {
|
||||
// Arrange
|
||||
final response = SetLabelResponse(accountId);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(
|
||||
isA<UnknownMethodResponse>().having(
|
||||
(e) => e.description,
|
||||
'description',
|
||||
isNull,
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
test('should check all error maps (notCreated, notUpdated, notDestroyed)', () {
|
||||
// Arrange - error in notUpdated
|
||||
final setError = SetError(ErrorMethodResponse.invalidArguments);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notUpdated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<InvalidArgumentsMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should handle response with multiple errors and find the correct one', () {
|
||||
// Arrange
|
||||
final targetError = SetError(
|
||||
ErrorMethodResponse.invalidArguments,
|
||||
description: 'Target error',
|
||||
);
|
||||
final otherError = SetError(
|
||||
ErrorMethodResponse.serverFail,
|
||||
description: 'Other error',
|
||||
);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {
|
||||
Id('other-1'): otherError,
|
||||
requestId: targetError,
|
||||
Id('other-2'): otherError,
|
||||
},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(
|
||||
isA<InvalidArgumentsMethodResponse>().having(
|
||||
(e) => e.description,
|
||||
'description',
|
||||
'Target error',
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
test('should handle null SetResponse', () {
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(null, requestId),
|
||||
throwsA(isA<UnknownMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should handle SetError with notFound type', () {
|
||||
// Arrange
|
||||
final setError = SetError(SetError.notFound);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<UnknownMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should handle SetError with forbidden type', () {
|
||||
// Arrange
|
||||
final setError = SetError(SetError.forbidden);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<UnknownMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should handle response when error in notDestroyed only', () {
|
||||
// Arrange
|
||||
final setError = SetError(ErrorMethodResponse.invalidArguments);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notDestroyed: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<InvalidArgumentsMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should handle empty response correctly', () {
|
||||
// Arrange
|
||||
final response = SetLabelResponse(accountId);
|
||||
|
||||
// Act & Assert
|
||||
expect(
|
||||
() => testHandler.parseErrorForSetResponse(response, requestId),
|
||||
throwsA(isA<UnknownMethodResponse>()),
|
||||
);
|
||||
});
|
||||
|
||||
test('should preserve error descriptions correctly', () {
|
||||
// Arrange
|
||||
const testDescription = 'Duplicate label name exists';
|
||||
final setError = SetError(
|
||||
ErrorMethodResponse.invalidArguments,
|
||||
description: testDescription,
|
||||
);
|
||||
final response = SetLabelResponse(
|
||||
accountId,
|
||||
notCreated: {requestId: setError},
|
||||
);
|
||||
|
||||
// Act
|
||||
try {
|
||||
testHandler.parseErrorForSetResponse(response, requestId);
|
||||
fail('Should have thrown exception');
|
||||
} catch (e) {
|
||||
// Assert
|
||||
expect(e, isA<InvalidArgumentsMethodResponse>());
|
||||
expect((e as InvalidArgumentsMethodResponse).description, testDescription);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user