diff --git a/core/lib/presentation/extensions/uri_extension.dart b/core/lib/presentation/extensions/uri_extension.dart new file mode 100644 index 000000000..9c65a6e36 --- /dev/null +++ b/core/lib/presentation/extensions/uri_extension.dart @@ -0,0 +1,21 @@ +import 'package:core/presentation/extensions/url_extension.dart'; +import 'package:core/utils/app_logger.dart'; + +extension URIExtension on Uri { + + Uri toQualifiedUrl({required Uri baseUrl}) { + log('SessionUtils::toQualifiedUrl():baseUrl: $baseUrl | sourceUrl: $this'); + if (toString().startsWith(baseUrl.toString())) { + final qualifiedUrl = toString().removeLastSlashOfUrl(); + log('SessionUtils::toQualifiedUrl():qualifiedUrl: $qualifiedUrl'); + return Uri.parse(qualifiedUrl); + } else { + final baseUrlValid = baseUrl.toString().removeLastSlashOfUrl(); + final sourceUrlValid = toString().addFirstSlashOfUrl().removeLastSlashOfUrl(); + log('SessionUtils::toQualifiedUrl():baseUrlValid: $baseUrlValid | sourceUrlValid: $sourceUrlValid'); + final qualifiedUrl = baseUrlValid + sourceUrlValid; + log('SessionUtils::toQualifiedUrl():qualifiedUrl: $qualifiedUrl'); + return Uri.parse(qualifiedUrl); + } + } +} \ No newline at end of file diff --git a/core/lib/presentation/extensions/url_extension.dart b/core/lib/presentation/extensions/url_extension.dart index f1b2ebbc3..7211a7280 100644 --- a/core/lib/presentation/extensions/url_extension.dart +++ b/core/lib/presentation/extensions/url_extension.dart @@ -28,4 +28,22 @@ extension URLExtension on String { } bool isValid() => startsWith(prefixUrlHttps) || startsWith(prefixUrlHttp); + + String removeLastSlashOfUrl() { + final lastSlash = lastIndexOf('/'); + if (lastSlash == length - 1) { + return substring(0, lastSlash); + } else { + return this; + } + } + + String addFirstSlashOfUrl() { + final firstSlash = indexOf('/'); + if (firstSlash == 0) { + return this; + } else { + return '/$this'; + } + } } \ No newline at end of file diff --git a/core/test/presentation/extensions/uri_extension_test.dart b/core/test/presentation/extensions/uri_extension_test.dart new file mode 100644 index 000000000..87e492149 --- /dev/null +++ b/core/test/presentation/extensions/uri_extension_test.dart @@ -0,0 +1,59 @@ + +import 'package:core/presentation/extensions/uri_extension.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + + group('method convertToQualifiedUrl test', () { + + test('convertToQualifiedUrl() should return qualified url when baseUrl is `https://domain.com` and sourceUrl is `https://domain.com/jmap`', () async { + final baseUrl = Uri.parse('https://domain.com'); + final sourceUrl = Uri.parse('https://domain.com/jmap'); + + final qualifiedUrlExpected = Uri.parse('https://domain.com/jmap'); + final qualifiedUrlResult = sourceUrl.toQualifiedUrl(baseUrl: baseUrl); + + expect(qualifiedUrlResult, equals(qualifiedUrlExpected)); + }); + + test('convertToQualifiedUrl() should return qualified url when baseUrl is `https://domain.com` and sourceUrl is `/jmap/`', () async { + final baseUrl = Uri.parse('https://domain.com'); + final sourceUrl = Uri.parse('/jmap/'); + + final qualifiedUrlExpected = Uri.parse('https://domain.com/jmap'); + final qualifiedUrlResult = sourceUrl.toQualifiedUrl(baseUrl: baseUrl); + + expect(qualifiedUrlResult, equals(qualifiedUrlExpected)); + }); + + test('convertToQualifiedUrl() should return qualified url when baseUrl is `https://domain.com` and sourceUrl is `/jmap`', () async { + final baseUrl = Uri.parse('https://domain.com'); + final sourceUrl = Uri.parse('/jmap'); + + final qualifiedUrlExpected = Uri.parse('https://domain.com/jmap'); + final qualifiedUrlResult = sourceUrl.toQualifiedUrl(baseUrl: baseUrl); + + expect(qualifiedUrlResult, equals(qualifiedUrlExpected)); + }); + + test('convertToQualifiedUrl() should return qualified url when baseUrl is `https://domain.com/jmap` and sourceUrl is empty', () async { + final baseUrl = Uri.parse('https://domain.com/jmap'); + final sourceUrl = Uri.parse(''); + + final qualifiedUrlExpected = Uri.parse('https://domain.com/jmap'); + final qualifiedUrlResult = sourceUrl.toQualifiedUrl(baseUrl: baseUrl); + + expect(qualifiedUrlResult, equals(qualifiedUrlExpected)); + }); + + test('convertToQualifiedUrl() should return qualified url when baseUrl is `https://domain.com/jmap` and sourceUrl is `/`', () async { + final baseUrl = Uri.parse('https://domain.com/jmap'); + final sourceUrl = Uri.parse('/'); + + final qualifiedUrlExpected = Uri.parse('https://domain.com/jmap'); + final qualifiedUrlResult = sourceUrl.toQualifiedUrl(baseUrl: baseUrl); + + expect(qualifiedUrlResult, equals(qualifiedUrlExpected)); + }); + }); +} \ No newline at end of file