From d523628d7fe12d8ec754010288bc700197ec57ff Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Mon, 23 May 2022 18:04:50 +0100 Subject: [PATCH] Saxonite v1.2.6.2 --- .../SacsDataValidationHelper_Tester.cs | 110 ++++++++++++++++++ .../Base/Helpers/SacsDataValidationHelper.cs | 108 +++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100644 SacsCoreUnitTests/Standard/Base/Helpers/SacsDataValidationHelper_Tester.cs diff --git a/SacsCoreUnitTests/Standard/Base/Helpers/SacsDataValidationHelper_Tester.cs b/SacsCoreUnitTests/Standard/Base/Helpers/SacsDataValidationHelper_Tester.cs new file mode 100644 index 0000000..cbcd539 --- /dev/null +++ b/SacsCoreUnitTests/Standard/Base/Helpers/SacsDataValidationHelper_Tester.cs @@ -0,0 +1,110 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Sarand.Net.Standard.Base.Helpers; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Sacs.UnitTests.Net.Standard.Base.Helpers +{ + //======================================================================= + [TestClass] + public class SacsDataValidationHelper_Tester + { + //------------------------------------------------------------------- + // Email addresses. + //------------------------------------------------------------------- + [TestMethod] + public void IsValidEmailAddress() + { + // Valid addresses. + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("joe@bloggs.com")); + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("joe@bloggs.xx")); + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("joe@bloggs.co.uk")); + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("jb@bloggs.co.uk")); + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("joe.bloggs@bloggs.co.uk")); + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("joe-bloggs@bloggs.co.uk")); + Assert.IsTrue(SacsDataValidationHelper.IsValidEmailAddress("joe_bloggs@bloggs.co.uk")); + + // Invalid addresses. + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress(null)); + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress("")); + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress(" ")); + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress("joe")); + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress("joe.bloggs.com")); + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress("joe@bloggs")); + Assert.IsFalse(SacsDataValidationHelper.IsValidEmailAddress("joe@blo ggs.com")); + } + + //------------------------------------------------------------------- + // URLs. + //------------------------------------------------------------------- + [TestMethod] + public void IsValidUrl() + { + // Valid addresses. + Assert.IsTrue(SacsDataValidationHelper.IsValidUrl("http://joe.bloggs")); + Assert.IsTrue(SacsDataValidationHelper.IsValidUrl("https://joe.bloggs")); + Assert.IsTrue(SacsDataValidationHelper.IsValidUrl("//joe.bloggs")); + Assert.IsTrue(SacsDataValidationHelper.IsValidUrl("joe.bloggs")); + + // Invalid addresses. + Assert.IsFalse(SacsDataValidationHelper.IsValidUrl(null)); + Assert.IsFalse(SacsDataValidationHelper.IsValidUrl("")); + Assert.IsFalse(SacsDataValidationHelper.IsValidUrl(" ")); + Assert.IsFalse(SacsDataValidationHelper.IsValidUrl("joe")); + Assert.IsFalse(SacsDataValidationHelper.IsValidUrl("joe@bloggs.com")); + } + + //------------------------------------------------------------------- + [TestMethod] + public void IsValidWikipediaUrl() + { + // Valid addresses. + Assert.IsTrue(SacsDataValidationHelper.IsValidWikipediaUrl("en.wikipedia.org/wiki/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidWikipediaUrl("//en.wikipedia.org/wiki/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidWikipediaUrl("https://en.wikipedia.org/wiki/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidWikipediaUrl("en.wikipedia.org/w/index.php?etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidWikipediaUrl("//en.wikipedia.org/w/index.php?etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidWikipediaUrl("https://en.wikipedia.org/w/index.php?etc")); + + // Invalid addresses. + Assert.IsFalse(SacsDataValidationHelper.IsValidWikipediaUrl(null)); + Assert.IsFalse(SacsDataValidationHelper.IsValidWikipediaUrl("")); + Assert.IsFalse(SacsDataValidationHelper.IsValidWikipediaUrl(" ")); + Assert.IsFalse(SacsDataValidationHelper.IsValidWikipediaUrl("http://en.wikipedia.org/wiki/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidWikipediaUrl("http://en.wikipedia.org/w/index.php")); + Assert.IsFalse(SacsDataValidationHelper.IsValidWikipediaUrl("htps://www.bbc.co.uk")); + } + + //------------------------------------------------------------------- + [TestMethod] + public void IsValidLinkedInUrl() + { + // Valid addresses. + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("www.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("//www.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("https://www.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("en.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("//en.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("https://en.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("xx.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("//xx.linkedin.com/in/etc")); + Assert.IsTrue(SacsDataValidationHelper.IsValidLinkedInUrl("https://xx.linkedin.com/in/etc")); + + // Invalid addresses. + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl(null)); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl(" ")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("http://www.linkedin.com/in/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("http://xx.linkedin.com/in/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("http://xx.linkedin.com/in/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("linkedin.com/in/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("x.linkedin.com/in/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("xxx.linkedin.com/in/")); + Assert.IsFalse(SacsDataValidationHelper.IsValidLinkedInUrl("htps://www.bbc.co.uk")); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SacsStandardBase/Base/Helpers/SacsDataValidationHelper.cs b/SacsStandardBase/Base/Helpers/SacsDataValidationHelper.cs index 8e83458..4318f7f 100644 --- a/SacsStandardBase/Base/Helpers/SacsDataValidationHelper.cs +++ b/SacsStandardBase/Base/Helpers/SacsDataValidationHelper.cs @@ -11,6 +11,8 @@ namespace Sarand.Net.Standard.Base.Helpers //======================================================================= public static class SacsDataValidationHelper { + //------------------------------------------------------------------- + // Email address. //------------------------------------------------------------------- /// /// Validate the email address. @@ -33,6 +35,112 @@ namespace Sarand.Net.Standard.Base.Helpers return true; } + //------------------------------------------------------------------- + // URL. + //------------------------------------------------------------------- + /// + /// Validate the URL, including protocol and leading slashes ('//'). + /// + public static bool IsCompleteUrl(String value) + { + if (StringUtil.IsEmpty(value)) return false; + if (!new UrlAttribute().IsValid(value)) + return false; + return true; + } + + /// + /// Validate the URL. + /// NB AllowsURL to start with leading slashes ('//'), ie. no protocol ('https:') or to start with the domain (no protocol or slashes). + /// NB Use IsCompleteUrl to validate that protocol and slashes are also present. + /// + public static bool IsValidUrl(String value) + { + if (StringUtil.IsEmpty((value ?? "").Trim())) return false; + + // Ensure that value has at least one dot. + if (Regex.Matches(value, "\\.").Count == 0) return false; + + // Ensure that value has no '@ symbols (unless encoded). + if (Regex.Matches(value, "\\@").Count > 0) return false; + + // URL validation. + if (!new UrlAttribute().IsValid(value)) + { + // URL validation insists on the full URL. + if (!new UrlAttribute().IsValid("//" + value)) + { + if (!new UrlAttribute().IsValid("http://" + value)) + return false; + } + } + return true; + } + + // Wikipedia URLs. [[https:]//]xx.wikipedia.org... + private static readonly Regex reWikipediaUrl = new Regex("^(?:(?:http(?:s)?:)?//)?\\w{2}" + Regex.Escape(".wikipedia.org/wiki/") + ".+", RegexOptions.IgnoreCase); + private static readonly Regex reWikipediaUrl_Alt = new Regex("^(?:(?:http(?:s)?:)?//)?\\w{2}" + Regex.Escape(".wikipedia.org/w/index.php?") + ".+", RegexOptions.IgnoreCase); + public static bool IsValidWikipediaUrl(String value) + { + if (!IsValidUrl(value)) return false; + if (reWikipediaUrl.Matches(value).Count > 0) return true; + if (reWikipediaUrl_Alt.Matches(value).Count > 0) return true; + return false; + } + + // LinkedIn URLs. [[https:]//][www|xx].linkedin.com/in... + private static readonly Regex reLinkedInUrl = new Regex("^(?:(?:http(?:s)?:)?//)?(?:(?:www|\\w{2})\\.)?" + Regex.Escape("linkedin.com/in/") + ".+", RegexOptions.IgnoreCase); + private static readonly Regex reLinkedInUrl_Company = new Regex("^(?:(?:http(?:s)?:)?//)?(?:(?:www|\\w{2})\\.)?" + Regex.Escape("linkedin.com/company/") + ".+", RegexOptions.IgnoreCase); + public static bool IsValidLinkedInUrl(String value) + { + if (!IsValidUrl(value)) return false; + if (reLinkedInUrl.Matches(value).Count > 0) return true; + if (reLinkedInUrl_Company.Matches(value).Count > 0) return true; + return false; + } + + // Twitter URLs. [[http[s]:]//][wwww.]twitter.com/... + private static readonly Regex reTwitterUrl = new Regex("^(?:(?:http(?:s)?:)?//)?(?:www\\.)?" + Regex.Escape("twitter.com/") + ".+", RegexOptions.IgnoreCase); + public static bool IsValidTwitterUrl(String value) + { + if (!IsValidUrl(value)) return false; + if (reTwitterUrl.Matches(value).Count > 0) return true; + return false; + } + + // Facebook URLs. [[https:]//][www.|xx.|xx-xx.]facebook.com/in... + private static readonly Regex reFacebookUrl = new Regex("^(?:(?:http(?:s)?:)?//)?(?:(?:www|\\w{2}|\\w{2}-\\w{2})\\.)?" + Regex.Escape("facebook.com/") + ".+", RegexOptions.IgnoreCase); + public static bool IsValidFacebookUrl(String value) + { + if (!IsValidUrl(value)) return false; + if (reFacebookUrl.Matches(value).Count > 0) return true; + return false; + } + + // Instagram URLs. [[https:]//][www.]instagram.com/... + private static readonly Regex reInstagramUrl = new Regex("^(?:(?:http(?:s)?:)?//)?(?:www\\.)?" + Regex.Escape("instagram.com/") + ".+", RegexOptions.IgnoreCase); + public static bool IsValidInstagramUrl(String value) + { + if (!IsValidUrl(value)) return false; + if (reInstagramUrl.Matches(value).Count > 0) return true; + return false; + } + + //------------------------------------------------------------------- + /// + /// Ensure that the website address is a valid URL, ie. at least starts with '//'. + /// To allow the value to be used in an anchor element href attribute. + /// + public static String QualifyAbsoluteUrl(String url) + { + if (!IsValidUrl(url)) return url; + if (IsCompleteUrl(url)) return url; + if (IsCompleteUrl("https:" + url)) return url; + return "//" + url; + } + + //------------------------------------------------------------------- + // Phone number. //------------------------------------------------------------------- /// /// Validate the phone number.