From 6bd48aef7bd419e4ef5bc745c4b0406ffa85ebdb Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 20 Mar 2023 16:15:59 +0700 Subject: [PATCH] TF-1606 Add method `toQualifiedUrl()`` handle relative url (cherry picked from commit 865055f063391a5f2ae3ad7d9c82b6e45578cb48) --- .../extensions/uri_extension.dart | 21 +++++++ .../extensions/url_extension.dart | 18 ++++++ .../extensions/uri_extension_test.dart | 59 +++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 core/lib/presentation/extensions/uri_extension.dart create mode 100644 core/test/presentation/extensions/uri_extension_test.dart 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