diff --git a/test/features/public_asset/domain/extensions/string_to_public_asset_extension_test.dart b/test/features/public_asset/domain/extensions/string_to_public_asset_extension_test.dart
new file mode 100644
index 000000000..7dd13794e
--- /dev/null
+++ b/test/features/public_asset/domain/extensions/string_to_public_asset_extension_test.dart
@@ -0,0 +1,105 @@
+import 'package:flutter_test/flutter_test.dart';
+import 'package:jmap_dart_client/jmap/core/id.dart';
+import 'package:tmail_ui_user/features/public_asset/domain/extensions/string_to_public_asset_extension.dart';
+
+void main() {
+ group('string to public asset extension test:', () {
+ test(
+ 'should convert string to public assets '
+ 'when image tags have public-asset-id attribute',
+ () {
+ // arrange
+ const publicAssetIdValue1 = 'public-asset-1';
+ const publicAssetIdValue2 = 'public-asset-2';
+ const htmlString = '
'
+ '
';
+
+ // act
+ final publicAssetIds = htmlString.publicAssetIdsFromHtmlContent;
+
+ // assert
+ expect(publicAssetIds, equals([Id(publicAssetIdValue1), Id(publicAssetIdValue2)]));
+ });
+
+ test(
+ 'should convert string to nothing '
+ 'when image tags do not have public-asset-id attribute',
+ () {
+ // arrange
+ const htmlString = '
';
+
+ // act
+ final publicAssetIds = htmlString.publicAssetIdsFromHtmlContent;
+
+ // assert
+ expect(publicAssetIds, isEmpty);
+ });
+
+ test(
+ 'should only convert string to public assets '
+ 'when image tags have public-asset-id attribute',
+ () {
+ // arrange
+ const publicAssetIdValue1 = 'public-asset-1';
+ const htmlString = '
'
+ '
';
+
+ // act
+ final publicAssetIds = htmlString.publicAssetIdsFromHtmlContent;
+
+ // assert
+ expect(publicAssetIds, equals([Id(publicAssetIdValue1)]));
+ });
+
+ group('should convert string to public assets in various edge cases:', () {
+ test(
+ 'when there are two "public-asset-id" attributes in the same image tag',
+ () {
+ // arrange
+ const publicAssetIdValue1 = 'public-asset-1';
+ const publicAssetIdValue2 = 'public-asset-2';
+ const htmlString = '
';
+
+ // act
+ final publicAssetIds = htmlString.publicAssetIdsFromHtmlContent;
+
+ // assert
+ expect(publicAssetIds, equals([Id(publicAssetIdValue1)]));
+ });
+
+ test(
+ 'only with the "public-asset-id" attribute name',
+ () {
+ // arrange
+ const publicAssetIdValue1 = 'public-asset-1';
+ const publicAssetIdValue2 = 'public-asset-2';
+ const htmlString = '
';
+
+ // act
+ final publicAssetIds = htmlString.publicAssetIdsFromHtmlContent;
+
+ // assert
+ expect(publicAssetIds, equals([Id(publicAssetIdValue2)]));
+ });
+ });
+
+ test(
+ 'should throw invalid argument exception '
+ 'when the public asset id contains invalid characters',
+ () {
+ // arrange
+ const publicAssetIdValue1 = r'#$52323';
+ const htmlString = '
';
+
+ // assert
+ expect(
+ () => htmlString.publicAssetIdsFromHtmlContent,
+ throwsA(isA())
+ );
+ });
+ });
+}
\ No newline at end of file