From 5d8147a080451ccfb546cd55c1043947925820eb Mon Sep 17 00:00:00 2001 From: Daniel Aguilera Date: Sat, 1 Aug 2020 19:46:12 -0300 Subject: [PATCH 01/32] DNN-28527: prevent Role Groups dropdown expand on delete --- .../Roles.Web/src/components/roles/FiltersBar/index.jsx | 4 +++- .../components/roles/RoleEditor/RoleGroupEditor/index.jsx | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/FiltersBar/index.jsx b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/FiltersBar/index.jsx index 8d3dad595bb..39cb8d7d35b 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/FiltersBar/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/FiltersBar/index.jsx @@ -26,7 +26,9 @@ class FiltersBar extends Component { }; canEdit = util.settings.isHost || util.settings.isAdmin || util.settings.permissions.EDIT; } - onDeleteGroup() { + onDeleteGroup(e) { + e.stopPropagation(); + const {props} = this; this.closeDropDown(); util.utilities.confirm(resx.get("DeleteRoleGroup.Confirm"), resx.get("Delete"), resx.get("Cancel"), () => { diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/RoleGroupEditor/index.jsx b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/RoleGroupEditor/index.jsx index 6acb47d00d5..e91a9df1772 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/RoleGroupEditor/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/src/components/roles/RoleEditor/RoleGroupEditor/index.jsx @@ -58,7 +58,9 @@ class RoleGroupEditor extends Component { }); } - onCancel() { + onCancel(e) { + e.stopPropagation(); + this.setState({ group: {} }, () => { @@ -68,7 +70,9 @@ class RoleGroupEditor extends Component { }); } - onSave() { + onSave(e) { + e.stopPropagation(); + const {props, state} = this; this.submitted = true; if (this.validateForm()) { From 07a3e511aaf02b300d0019547cc8532a5f6f4f6a Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Mon, 3 Aug 2020 17:56:51 +0300 Subject: [PATCH 02/32] Issue-3953 - Site alias URL edit fix --- .../Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx index 9e1e035e11e..55d52656d4e 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/Seo/PageUrls/EditUrl.jsx @@ -75,7 +75,10 @@ class EditUrl extends Component { const {url, saving, pageHasParent, siteAliases, primaryAliasId, isOpened, onSave, onCancel} = this.props; const aliases = this.getOptions(siteAliases); const siteAliasUsageOptions = this.getSiteAliasUsageOptions(pageHasParent); - if (!this.state.hasChanges && url.siteAlias.Key !== primaryAliasId) + if ( + !this.state.hasChanges && + url.siteAlias.Key !== primaryAliasId && + url.id == null) { this.props.onChange("siteAlias", primaryAliasId); } From 541755b4d78b3be1490909de201f42980064a429 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Wed, 5 Aug 2020 15:51:58 +0300 Subject: [PATCH 03/32] Issue-3956 - Selected alias usage is respected now in SEO Url page --- .../Website/DotNetNuke.Website.csproj | 1 + .../SqlDataProvider/09.07.00.SqlDataProvider | 80 +++++++++++++++++++ .../Components/Pages/PageUrlsController.cs | 6 +- 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.00.SqlDataProvider diff --git a/DNN Platform/Website/DotNetNuke.Website.csproj b/DNN Platform/Website/DotNetNuke.Website.csproj index 24b17cb499d..4c753c02ffe 100644 --- a/DNN Platform/Website/DotNetNuke.Website.csproj +++ b/DNN Platform/Website/DotNetNuke.Website.csproj @@ -3345,6 +3345,7 @@ + diff --git a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.00.SqlDataProvider b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.00.SqlDataProvider new file mode 100644 index 00000000000..08b221c4b57 --- /dev/null +++ b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.00.SqlDataProvider @@ -0,0 +1,80 @@ +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{databaseOwner}{objectQualifier}SaveTabUrl') AND type in (N'P', N'PC')) +DROP PROCEDURE {databaseOwner}{objectQualifier}SaveTabUrl +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +CREATE PROCEDURE {databaseOwner}{objectQualifier}SaveTabUrl + @TabID int, + @SeqNum int, + @PortalAliasID int, + @PortalAliasUsage int, + @Url nvarchar(200), + @QueryString nvarchar(200), + @CultureCode nvarchar(50), + @HttpStatus nvarchar(50), + @IsSystem bit, + @ModifiedByUserID int +AS + IF @HttpStatus = '200' + BEGIN + UPDATE {databaseOwner}{objectQualifier}TabUrls + SET HttpStatus = '301', + [LastModifiedByUserID]= @ModifiedByUserID, + [LastModifiedOnDate]= getdate() + WHERE TabID = @TabID + AND CultureCode = @CultureCode + AND (@PortalAliasID = @PortalAliasID OR (PortalAliasId IS NULL AND @PortalAliasID IS NULL)) + AND HttpStatus = '200' + END + IF EXISTS (SELECT * FROM {databaseOwner}{objectQualifier}TabUrls WHERE TabId = @TabID AND SeqNum = @SeqNum) + BEGIN + UPDATE {databaseOwner}{objectQualifier}TabUrls + SET + PortalAliasId = @PortalAliasID, + PortalAliasUsage = @PortalAliasUsage, + Url = @Url, + QueryString = @QueryString, + CultureCode = @CultureCode, + HttpStatus = @HttpStatus, + IsSystem = @IsSystem, + [LastModifiedByUserID]= @ModifiedByUserID, + [LastModifiedOnDate]= getdate() + WHERE TabId = @TabID AND SeqNum = @SeqNum + END + ELSE + BEGIN + INSERT INTO {databaseOwner}{objectQualifier}TabUrls + ( TabId , + SeqNum , + Url , + QueryString , + HttpStatus , + CultureCode , + IsSystem, + PortalAliasId , + PortalAliasUsage, + [CreatedByUserID], + [CreatedOnDate], + [LastModifiedByUserID], + [LastModifiedOnDate] + ) + VALUES ( @TabID , + @SeqNum , + @Url , + @QueryString , + @HttpStatus , + @CultureCode , + @IsSystem, + @PortalAliasID , + @PortalAliasUsage, + @ModifiedByUserID, + getdate(), + @ModifiedByUserID, + getdate() + ) + END +GO \ No newline at end of file diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs index 68aba659c4b..612e06dbc16 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs @@ -431,7 +431,7 @@ private IEnumerable GetSortedUrls(TabInfo tab, int portalId, Lazy p.PortalAliasID == url.PortalAliasId); if (alias != null) { - this.AddUrlToList(tabs, portalId, url.SeqNum, alias, urlLocale, url.Url, url.QueryString, statusCode, isSystem, friendlyUrlSettings, url.LastModifiedByUserId); + this.AddUrlToList(tabs, portalId, url.SeqNum, alias, urlLocale, url.Url, url.QueryString, statusCode, isSystem, friendlyUrlSettings, url.LastModifiedByUserId, url.PortalAliasUsage); } } } @@ -459,7 +459,7 @@ private IEnumerable GetSortedUrls(TabInfo tab, int portalId, Lazy tabs, int portalId, int id, PortalAliasInfo alias, Locale urlLocale, string path, string queryString, int statusCode, bool isSystem, FriendlyUrlSettings friendlyUrlSettings, int? lastModifiedByUserId) + private void AddUrlToList(List tabs, int portalId, int id, PortalAliasInfo alias, Locale urlLocale, string path, string queryString, int statusCode, bool isSystem, FriendlyUrlSettings friendlyUrlSettings, int? lastModifiedByUserId, PortalAliasUsageType? portalAliasUsage = null) { var userName = ""; if (lastModifiedByUserId.HasValue) @@ -477,7 +477,7 @@ private void AddUrlToList(List tabs, int portalId, int id, PortalAliasInfo Locale = (urlLocale != null) ? new KeyValuePair(urlLocale.KeyID, urlLocale.EnglishName) : new KeyValuePair(-1, ""), StatusCode = this.StatusCodes.SingleOrDefault(kv => kv.Key == statusCode), - SiteAliasUsage = (int)PortalAliasUsageType.ChildPagesInherit, + SiteAliasUsage = portalAliasUsage != null ? (int)portalAliasUsage : (int)PortalAliasUsageType.ChildPagesInherit, IsSystem = isSystem, UserName = userName }); From 5c7d2b3929040ce1e42af17cb5035f6dfaef50d9 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Wed, 5 Aug 2020 16:32:44 +0300 Subject: [PATCH 04/32] Issue-3956 - SQL file rename --- DNN Platform/Website/DotNetNuke.Website.csproj | 2 +- .../{09.07.00.SqlDataProvider => 09.07.01.SqlDataProvider} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename DNN Platform/Website/Providers/DataProviders/SqlDataProvider/{09.07.00.SqlDataProvider => 09.07.01.SqlDataProvider} (100%) diff --git a/DNN Platform/Website/DotNetNuke.Website.csproj b/DNN Platform/Website/DotNetNuke.Website.csproj index 4c753c02ffe..5c561545de8 100644 --- a/DNN Platform/Website/DotNetNuke.Website.csproj +++ b/DNN Platform/Website/DotNetNuke.Website.csproj @@ -3345,7 +3345,7 @@ - + diff --git a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.00.SqlDataProvider b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.01.SqlDataProvider similarity index 100% rename from DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.00.SqlDataProvider rename to DNN Platform/Website/Providers/DataProviders/SqlDataProvider/09.07.01.SqlDataProvider From 7e165b6c5788f08fd41cf75f7c3de8504e86f3a8 Mon Sep 17 00:00:00 2001 From: Daniel Aguilera Date: Fri, 7 Aug 2020 12:53:22 -0300 Subject: [PATCH 05/32] DNN-42754: added retry to CompressionUtil.OpenCreate --- .../Components/Common/CompressionUtil.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/DNN Platform/Modules/DnnExportImport/Components/Common/CompressionUtil.cs b/DNN Platform/Modules/DnnExportImport/Components/Common/CompressionUtil.cs index 540b3d5aa2c..836beb8a93a 100644 --- a/DNN Platform/Modules/DnnExportImport/Components/Common/CompressionUtil.cs +++ b/DNN Platform/Modules/DnnExportImport/Components/Common/CompressionUtil.cs @@ -12,6 +12,7 @@ namespace Dnn.ExportImport.Components.Common using System.IO.MemoryMappedFiles; using System.Linq; using System.Text; + using DotNetNuke.Common.Utilities.Internal; public static class CompressionUtil { @@ -199,6 +200,27 @@ public static bool AddFileToArchive(ZipArchive archive, string file, int folderO /// /// public static ZipArchive OpenCreate(string archiveFileName) + { + if (string.IsNullOrWhiteSpace(archiveFileName)) + { + throw new ArgumentNullException(nameof(archiveFileName)); + } + + ZipArchive zip = null; + + RetryableAction.RetryEverySecondFor30Seconds( + () => zip = OpenCreateUnsafe(archiveFileName), + $"{nameof(OpenCreateUnsafe)}(\"{archiveFileName}\")"); + + return zip; + } + + /// + /// Open the archive file for read and write (no retry). + /// + /// The full zip file path. + /// A instance. + internal static ZipArchive OpenCreateUnsafe(string archiveFileName) { return File.Exists(archiveFileName) ? ZipFile.Open(archiveFileName, ZipArchiveMode.Update, Encoding.UTF8) From 59f5810168ba1b96a5cb90ec0156478535bd8f33 Mon Sep 17 00:00:00 2001 From: Berk Arslan Date: Fri, 14 Aug 2020 15:53:28 +0300 Subject: [PATCH 06/32] Issue-3982 - SEO Url redirect fix --- .../Components/Pages/PageUrlsController.cs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs index 612e06dbc16..459d087d3d4 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PageUrlsController.cs @@ -106,17 +106,30 @@ public PageUrlResult CreateCustomUrl(SaveUrlDto dto, TabInfo tab) } var seqNum = (tab.TabUrls.Count > 0) ? tab.TabUrls.Max(t => t.SeqNum) + 1 : 1; - var portalLocales = LocaleController.Instance.GetLocales(portalSettings.PortalId); - var cultureCode = portalLocales.Where(l => l.Value.KeyID == dto.LocaleKey) - .Select(l => l.Value.Code) - .SingleOrDefault() ?? portalSettings.CultureCode; + var portalLocales = LocaleController.Instance.GetLocales(portalSettings.PortalId); + + // Get the culture code of selected portal alias + var alias = PortalAliasController.Instance + .GetPortalAliasesByPortalId(portalSettings.PortalId) + .SingleOrDefault(a => a.PortalAliasID == dto.SiteAliasKey); + Func, bool> localeFilter = null; + if (alias != null && + !string.IsNullOrWhiteSpace(alias.CultureCode)) + { + localeFilter = l => l.Key == alias.CultureCode; + } + else + { + localeFilter = l => l.Value.KeyID == dto.LocaleKey; + } + + var cultureCode = portalLocales.Where(localeFilter) + .Select(l => l.Value.Code) + .SingleOrDefault() ?? portalSettings.CultureCode; var portalAliasUsage = (PortalAliasUsageType)dto.SiteAliasUsage; if (portalAliasUsage == PortalAliasUsageType.Default) { - var alias = PortalAliasController.Instance.GetPortalAliasesByPortalId(portalSettings.PortalId) - .SingleOrDefault(a => a.PortalAliasID == dto.SiteAliasKey); - if (string.IsNullOrEmpty(cultureCode) || alias == null) { return new PageUrlResult From a2317ae6f3e0fe73d36b230861245d2d796d3acb Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Wed, 19 Aug 2020 11:45:59 -0400 Subject: [PATCH 07/32] Created IApplicationInfo and IApplicationStatusInfo for Dependency Injection (#3988) * Created IApplicationInfo and IApplicationStatusInfo interfaces and marked related global apis as deprecated * Adjusted global methods that needed to use new way of handling application status via IApplicationStatusInfo * Added INotifyPropertyChanged to the LazyServiceProvider this allow Globals to listen for when the provider is set and update any dependencies in the Globals class * Updated global to immediately resolve dependencies if it doesn't implement INotifyPropertyChanged (useful for unit testing). Updated unit tests to mock out IApplicationStatusInfo * Updated navigation manager to follow same pattern as ApplicationStatusInfo and resolve it only once Co-authored-by: Brian Dukes --- .../Application/IApplicationInfo.cs | 113 ++ .../Application/IApplicationStatusInfo.cs | 78 + .../Application/IDnnContext.cs | 17 + .../Application/ReleaseMode.cs | 50 + .../Application/UpgradeStatus.cs | 38 + .../Common/LazyServiceProvider.cs | 22 +- .../Library/Application/Application.cs | 414 +++-- .../Application/ApplicationStatusInfo.cs | 318 ++++ .../Application/AssemblyStatusAttribute.cs | 10 +- .../Library/Application/DotNetNukeContext.cs | 198 +-- DNN Platform/Library/Common/Globals.cs | 369 +---- .../Library/DotNetNuke.Library.csproj | 1 + DNN Platform/Library/Startup.cs | 52 +- .../AttachmentControllerTests.cs | 21 +- .../ContentControllerTests.cs | 21 +- .../ContentTypeControllerTests.cs | 18 +- .../DotNetNuke.Tests.Content.csproj | 10 + .../ScopeTypeControllerTests.cs | 18 +- .../TermControllerTests.cs | 18 +- .../VocabularyControllerTests.cs | 18 +- .../Controllers/Host/HostControllerTest.cs | 20 +- .../Messaging/MessagingControllerTests.cs | 21 +- .../Messaging/NotificationsControllerTests.cs | 20 +- .../Search/InternalSearchControllerTests.cs | 15 +- .../Search/LuceneControllerTests.cs | 11 +- .../Search/SearchControllerTests.cs | 15 +- .../Controllers/Search/SearchHelperTests.cs | 25 +- .../Social/RelationshipControllerTests.cs | 22 +- .../DotNetNuke.Tests.Core.csproj | 6 + .../Portals/PortalSettingsControllerTests.cs | 17 +- .../FileSystemUtilsTests.cs | 34 +- .../JavaScriptLibraries/JavaScriptTests.cs | 26 +- .../Framework/ServicesFrameworkTests.cs | 21 +- .../Folder/FileContentTypeManagerTests.cs | 36 +- .../Folder/StandardFolderProviderTests.cs | 30 +- .../Mobile/RedirectionControllerTests.cs | 26 +- .../DotNetNuke.Tests.Core/packages.config | 2 + .../DotNetNuke.Tests.Web.Mvc.csproj | 4 + .../ModuleDelegatingViewEngineTests.cs | 16 +- .../Modules/ModuleApplicationTests.cs | 16 +- .../Api/PortalAliasRouteManagerTests.cs | 23 +- .../Api/ServiceRoutingManagerTests.cs | 451 ++--- .../SearchServiceControllerTests.cs | 1451 +++++++++-------- 43 files changed, 2397 insertions(+), 1715 deletions(-) create mode 100644 DNN Platform/DotNetNuke.Abstractions/Application/IApplicationInfo.cs create mode 100644 DNN Platform/DotNetNuke.Abstractions/Application/IApplicationStatusInfo.cs create mode 100644 DNN Platform/DotNetNuke.Abstractions/Application/IDnnContext.cs create mode 100644 DNN Platform/DotNetNuke.Abstractions/Application/ReleaseMode.cs create mode 100644 DNN Platform/DotNetNuke.Abstractions/Application/UpgradeStatus.cs create mode 100644 DNN Platform/Library/Application/ApplicationStatusInfo.cs diff --git a/DNN Platform/DotNetNuke.Abstractions/Application/IApplicationInfo.cs b/DNN Platform/DotNetNuke.Abstractions/Application/IApplicationInfo.cs new file mode 100644 index 00000000000..f60c655a2c0 --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Application/IApplicationInfo.cs @@ -0,0 +1,113 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Application +{ + using System; + + /// + /// The Application class contains properties that describe the DotNetNuke Application. + /// + public interface IApplicationInfo + { + /// + /// Gets the company to which the DotNetNuke application is related. + /// + /// Fixed result: DotNetNuke Corporation. + string Company { get; } + + /// + /// Gets the version of the currently installed DotNetNuke framework/application + /// Can be prior to Version, if the application is pending to be upgraded. + /// + /// The version as retreieved from the database version table. + Version CurrentVersion { get; } + + /// + /// Gets the description of the application. + /// + /// Fixed result: DNN Platform. + string Description { get; } + + /// + /// Gets the help URL related to the DotNetNuke application. + /// + /// Fixed result: https://dnndocs.com/. + string HelpUrl { get; } + + /// + /// Gets the legal copyright. + /// + /// Dynamic: DNN Platform is copyright 2002-todays year by .NET Foundation". + string LegalCopyright { get; } + + /// + /// Gets the name of the application. + /// + /// Fixed result: DNNCORP.CE. + string Name { get; } + + /// + /// Gets the SKU (Stock Keeping Unit). + /// + /// Fixed result: DNN. + string SKU { get; } + + /// + /// Gets the status of the DotnetNuke application. + /// + /// + /// If the value is not be Stable, you will see the exactly status and version in page's title if allow display beta message in host setting. + /// + /// + /// The value can be: None, Alpha, Beta, RC, Stable. + /// + ReleaseMode Status { get; } + + /// + /// Gets the title of the application. + /// + /// Fixed value: DotNetNuke. + string Title { get; } + + /// + /// Gets the trademark. + /// + /// Fixed value: DotNetNuke,DNN. + string Trademark { get; } + + /// + /// Gets the type of the application. + /// + /// Fixed value: Framework. + string Type { get; } + + /// + /// Gets the upgrade URL. + /// + /// Fixed value: https://dnnplatform.io. + string UpgradeUrl { get; } + + /// + /// Gets the URL of the application. + /// + /// Fixed value: https://dnncommunity.org. + string Url { get; } + + /// + /// Gets the version of the DotNetNuke framework/application. + /// + /// The version as retreieved from the Executing assembly. + Version Version { get; } + + /// + /// Determine whether a product specific change is to be applied. + /// + /// list of product names. + /// true if product is within list of names. + /// + /// + bool ApplyToProduct(string productNames); + } +} diff --git a/DNN Platform/DotNetNuke.Abstractions/Application/IApplicationStatusInfo.cs b/DNN Platform/DotNetNuke.Abstractions/Application/IApplicationStatusInfo.cs new file mode 100644 index 00000000000..a1a1b7d9f18 --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Application/IApplicationStatusInfo.cs @@ -0,0 +1,78 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Application +{ + using System; + + /// + /// The Application Status Info, includes information about installation + /// and database version. + /// + public interface IApplicationStatusInfo + { + /// + /// Gets the status of application. + /// + UpgradeStatus Status { get; } + + /// + /// Gets the application map path. + /// + /// + /// The application map path. + /// + string ApplicationMapPath { get; } + + /// + /// Gets the database version. + /// + Version DatabaseVersion { get; } + + /// + /// IsInstalled looks at various file artifacts to determine if DotNetNuke has already been installed. + /// + /// true if installed else false. + /// + /// If DotNetNuke has been installed, then we should treat database connection errors as real errors. + /// If DotNetNuke has not been installed, then we should expect to have database connection problems + /// since the connection string may not have been configured yet, which can occur during the installation + /// wizard. + /// + bool IsInstalled(); + + /// + /// Sets the status. + /// + /// The status. + void SetStatus(UpgradeStatus status); + + /// + /// Updates the database version. + /// + /// The version. + void UpdateDatabaseVersion(Version version); + + /// + /// Updates the database version. + /// + /// The version. + /// The increment. + void UpdateDatabaseVersionIncrement(Version version, int increment); + + /// + /// Needs documentation. + /// + /// The version. + /// true is success else false. + bool IncrementalVersionExists(Version version); + + /// + /// Get the last application iteration. + /// + /// The version. + /// The result. + int GetLastAppliedIteration(Version version); + } +} diff --git a/DNN Platform/DotNetNuke.Abstractions/Application/IDnnContext.cs b/DNN Platform/DotNetNuke.Abstractions/Application/IDnnContext.cs new file mode 100644 index 00000000000..c65e6a9e66e --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Application/IDnnContext.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Application +{ + /// + /// Defines the context for the environment of the DotNetNuke application. + /// + public interface IDnnContext + { + /// + /// Gets get the application. + /// + IApplicationInfo Application { get; } + } +} diff --git a/DNN Platform/DotNetNuke.Abstractions/Application/ReleaseMode.cs b/DNN Platform/DotNetNuke.Abstractions/Application/ReleaseMode.cs new file mode 100644 index 00000000000..c0d337ff250 --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Application/ReleaseMode.cs @@ -0,0 +1,50 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Application +{ + /// + /// The enumeration of release mode. + /// + /// + /// + /// None: Not specified for the current release. + /// Alpha:Alpha release is an opportunity for customers to get an early look at a particular software feature. + /// Beta: Beta release is a mostly completed release, + /// At this point we will have implemented most of the major features planned for a specific release. + /// RC: RC release will be the Stable release if there is no major show-stopping bugs, + /// We have gone through all the major test scenarios and are just running through a final set of regression + /// tests and verifying the packaging. + /// Stable: Stable release is believed to be ready for use, + /// remember that only stable release can be used in production environment. + /// + /// + public enum ReleaseMode + { + /// + /// Not asssigned + /// + None = 0, + + /// + /// Alpha release + /// + Alpha = 1, + + /// + /// Beta release + /// + Beta = 2, + + /// + /// Release candidate + /// + RC = 3, + + /// + /// Stable release version + /// + Stable = 4, + } +} diff --git a/DNN Platform/DotNetNuke.Abstractions/Application/UpgradeStatus.cs b/DNN Platform/DotNetNuke.Abstractions/Application/UpgradeStatus.cs new file mode 100644 index 00000000000..b9304d4ad5b --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Application/UpgradeStatus.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Application +{ + /// + /// Enumeration Of Application upgrade status. + /// + public enum UpgradeStatus + { + /// + /// The application need update to a higher version. + /// + Upgrade = 0, + + /// + /// The application need to install itself. + /// + Install = 1, + + /// + /// The application is normal running. + /// + None = 2, + + /// + /// The application occur error when running. + /// + Error = 3, + + /// + /// The application status is unknown, + /// + /// This status should never be returned. its is only used as a flag that Status hasn't been determined. + Unknown = 4, + } +} diff --git a/DNN Platform/DotNetNuke.Web/Common/LazyServiceProvider.cs b/DNN Platform/DotNetNuke.Web/Common/LazyServiceProvider.cs index 9c65cea9926..bb29fbd71f0 100644 --- a/DNN Platform/DotNetNuke.Web/Common/LazyServiceProvider.cs +++ b/DNN Platform/DotNetNuke.Web/Common/LazyServiceProvider.cs @@ -5,28 +5,30 @@ namespace DotNetNuke.Web.Common { using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - using System.Threading.Tasks; + using System.ComponentModel; - public class LazyServiceProvider : IServiceProvider + public class LazyServiceProvider : IServiceProvider, INotifyPropertyChanged { - private IServiceProvider _serviceProvider; - + private IServiceProvider serviceProvider; + + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// public object GetService(Type serviceType) { - if (this._serviceProvider is null) + if (this.serviceProvider is null) { throw new Exception("Cannot resolve services until the service provider is built."); } - return this._serviceProvider.GetService(serviceType); + return this.serviceProvider.GetService(serviceType); } internal void SetProvider(IServiceProvider serviceProvider) { - this._serviceProvider = serviceProvider; + this.serviceProvider = serviceProvider; + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(serviceProvider))); } } } diff --git a/DNN Platform/Library/Application/Application.cs b/DNN Platform/Library/Application/Application.cs index 194b44e673c..e1d0f12c589 100644 --- a/DNN Platform/Library/Application/Application.cs +++ b/DNN Platform/Library/Application/Application.cs @@ -1,233 +1,193 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Application -{ - using System; - using System.Diagnostics; - using System.Reflection; +namespace DotNetNuke.Application +{ + using System; + using System.Diagnostics; + using System.Reflection; - using DotNetNuke.Common.Utilities; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common.Utilities; using DotNetNuke.Data; - /// - /// The Application class contains properties that describe the DotNetNuke Application. - /// - /// - /// - public class Application - { - private static ReleaseMode _status = ReleaseMode.None; - - protected internal Application() - { - } - - /// - /// Gets the company to which the DotNetNuke application is related. - /// - /// Fixed result: DotNetNuke Corporation. - public string Company - { - get - { - return "DNN Corporation"; - } - } - - /// - /// Gets the version of the currently installed DotNetNuke framework/application - /// Can be prior to Version, if the application is pending to be upgraded. - /// - /// The version as retreieved from the database version table. - public virtual Version CurrentVersion - { - get - { - return DataProvider.Instance().GetVersion(); - } - } - - /// - /// Gets the description of the application. - /// - /// Fixed result: DNN Platform. - public virtual string Description - { - get - { - return "DNN Platform"; - } - } - - /// - /// Gets the help URL related to the DotNetNuke application. - /// - /// Fixed result: https://dnndocs.com/. - public string HelpUrl - { - get - { - return "https://dnndocs.com/"; - } - } - - /// - /// Gets the legal copyright. - /// - /// Dynamic: DNN Platform is copyright 2002-todays year by .NET Foundation". - public string LegalCopyright - { - get - { - return string.Concat("DNN Platform is copyright 2002-", DateTime.Today.ToString("yyyy"), " by .NET Foundation"); - } - } - - /// - /// Gets the name of the application. - /// - /// Fixed result: DNNCORP.CE. - public virtual string Name - { - get - { - return "DNNCORP.CE"; - } - } - - /// - /// Gets the SKU (Stock Keeping Unit). - /// - /// Fixed result: DNN. - public virtual string SKU - { - get - { - return "DNN"; - } - } - - /// - /// Gets the status of the DotnetNuke application. - /// - /// - /// If the value is not be Stable, you will see the exactly status and version in page's title if allow display beta message in host setting. - /// - /// - /// The value can be: None, Alpha, Beta, RC, Stable. - /// - public ReleaseMode Status - { - get - { - if (_status == ReleaseMode.None) - { - Assembly assy = Assembly.GetExecutingAssembly(); - if (Attribute.IsDefined(assy, typeof(AssemblyStatusAttribute))) - { - Attribute attr = Attribute.GetCustomAttribute(assy, typeof(AssemblyStatusAttribute)); - if (attr != null) - { - _status = ((AssemblyStatusAttribute)attr).Status; - } - } - } - - return _status; - } - } - - /// - /// Gets the title of the application. - /// - /// Fixed value: DotNetNuke. - public string Title - { - get - { - return "DotNetNuke"; - } - } - - /// - /// Gets the trademark. - /// - /// Fixed value: DotNetNuke,DNN. - public string Trademark - { - get - { - return "DotNetNuke,DNN"; - } - } - - /// - /// Gets the type of the application. - /// - /// Fixed value: Framework. - public string Type - { - get - { - return "Framework"; - } - } - - /// - /// Gets the upgrade URL. - /// - /// Fixed value: https://dnnplatform.io. - public string UpgradeUrl - { - get - { - var url = Config.GetSetting("UpdateServiceUrl"); - if (string.IsNullOrEmpty(url)) - { - return "https://dnnplatform.io"; - } - - return url; - } - } - - /// - /// Gets the URL of the application. - /// - /// Fixed value: https://dnncommunity.org. - public string Url - { - get - { - return "https://dnncommunity.org"; - } - } - - /// - /// Gets the version of the DotNetNuke framework/application. - /// - /// The version as retreieved from the Executing assembly. - public virtual Version Version - { - get - { - var assemblyLocation = Assembly.GetExecutingAssembly().Location; - var fileVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).FileVersion; - return new Version(fileVersion); - } - } - - /// - /// Determine whether a product specific change is to be applied. - /// - /// list of product names. - /// true if product is within list of names. - /// - /// - public virtual bool ApplyToProduct(string productNames) - { - return productNames.Contains(this.Name); - } - } -} + using NewReleaseMode = DotNetNuke.Abstractions.Application.ReleaseMode; + + /// + public class Application : IApplicationInfo + { + private static NewReleaseMode status = NewReleaseMode.None; + + /// + /// Initializes a new instance of the class. + /// + public Application() + { + } + + /// + public string Company + { + get + { + return "DNN Corporation"; + } + } + + /// + public virtual Version CurrentVersion + { + get + { + return DataProvider.Instance().GetVersion(); + } + } + + /// + public virtual string Description + { + get + { + return "DNN Platform"; + } + } + + /// + public string HelpUrl + { + get + { + return "https://dnndocs.com/"; + } + } + + /// + public string LegalCopyright + { + get + { + return string.Concat("DNN Platform is copyright 2002-", DateTime.Today.ToString("yyyy"), " by .NET Foundation"); + } + } + + /// + public virtual string Name + { + get + { + return "DNNCORP.CE"; + } + } + + /// + public virtual string SKU + { + get + { + return "DNN"; + } + } + + /// + /// Gets the status of the DotnetNuke application. + /// + /// + /// If the value is not be Stable, you will see the exactly status and version in page's title if allow display beta message in host setting. + /// + /// + /// The value can be: None, Alpha, Beta, RC, Stable. + /// + [Obsolete("Deprecated in Platform 9.7.0. Use 'DotNetNuke.Abstractions.Application.IApplicationInfo' with Dependency Injection instead. Scheduled for removal in v11.0.0.")] + public ReleaseMode Status { get => (ReleaseMode)(this as IApplicationInfo).Status; } + + /// + NewReleaseMode IApplicationInfo.Status + { + get + { + if (status == NewReleaseMode.None) + { + Assembly assy = Assembly.GetExecutingAssembly(); + if (Attribute.IsDefined(assy, typeof(AssemblyStatusAttribute))) + { + Attribute attr = Attribute.GetCustomAttribute(assy, typeof(AssemblyStatusAttribute)); + if (attr != null) + { + status = (NewReleaseMode)((AssemblyStatusAttribute)attr).Status; + } + } + } + + return status; + } + } + + /// + public string Title + { + get + { + return "DotNetNuke"; + } + } + + /// + public string Trademark + { + get + { + return "DotNetNuke,DNN"; + } + } + + /// + public string Type + { + get + { + return "Framework"; + } + } + + /// + public string UpgradeUrl + { + get + { + var url = Config.GetSetting("UpdateServiceUrl"); + if (string.IsNullOrEmpty(url)) + { + return "https://dnnplatform.io"; + } + + return url; + } + } + + /// + public string Url + { + get + { + return "https://dnncommunity.org"; + } + } + + /// + public virtual Version Version + { + get + { + var assemblyLocation = Assembly.GetExecutingAssembly().Location; + var fileVersion = FileVersionInfo.GetVersionInfo(assemblyLocation).FileVersion; + return new Version(fileVersion); + } + } + + /// + public virtual bool ApplyToProduct(string productNames) + { + return productNames.Contains(this.Name); + } + } +} diff --git a/DNN Platform/Library/Application/ApplicationStatusInfo.cs b/DNN Platform/Library/Application/ApplicationStatusInfo.cs new file mode 100644 index 00000000000..ebfb3feac00 --- /dev/null +++ b/DNN Platform/Library/Application/ApplicationStatusInfo.cs @@ -0,0 +1,318 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Application +{ + using System; + using System.IO; + using System.Web; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Data; + using DotNetNuke.Framework.Providers; + using DotNetNuke.Instrumentation; + using DotNetNuke.Services.Upgrade; + + + /// + public class ApplicationStatusInfo : IApplicationStatusInfo + { + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ApplicationStatusInfo)); + + private UpgradeStatus status = UpgradeStatus.Unknown; + private string applicationMapPath; + + private IApplicationInfo applicationInfo; + + /// + /// Initializes a new instance of the class. + /// + /// The application info. + /// + /// This constructor is designed to be used with Dependency Injection. + /// + public ApplicationStatusInfo(IApplicationInfo applicationInfo) + { + this.applicationInfo = applicationInfo; + } + + /// + public UpgradeStatus Status + { + get + { + if (this.status != UpgradeStatus.Unknown && this.status != UpgradeStatus.Error) + { + return this.status; + } + + Logger.Trace("Getting application status"); + var tempStatus = UpgradeStatus.None; + + // first call GetProviderPath - this insures that the Database is Initialised correctly + // and also generates the appropriate error message if it cannot be initialised correctly + string strMessage = DataProvider.Instance().GetProviderPath(); + + // get current database version from DB + if (!strMessage.StartsWith("ERROR:")) + { + try + { + this.DatabaseVersion = DataProvider.Instance().GetVersion(); + } + catch (Exception ex) + { + Logger.Error(ex); + strMessage = "ERROR:" + ex.Message; + } + } + + if (strMessage.StartsWith("ERROR")) + { + if (this.IsInstalled()) + { + // Errors connecting to the database after an initial installation should be treated as errors. + tempStatus = UpgradeStatus.Error; + } + else + { + // An error that occurs before the database has been installed should be treated as a new install + tempStatus = UpgradeStatus.Install; + } + } + else if (this.DatabaseVersion == null) + { + // No Db Version so Install + tempStatus = UpgradeStatus.Install; + } + else + { + var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + if (version.Major > this.DatabaseVersion.Major) + { + // Upgrade Required (Major Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + else if (version.Major == this.DatabaseVersion.Major && version.Minor > this.DatabaseVersion.Minor) + { + // Upgrade Required (Minor Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + else if (version.Major == this.DatabaseVersion.Major && version.Minor == this.DatabaseVersion.Minor && + version.Build > this.DatabaseVersion.Build) + { + // Upgrade Required (Build Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + else if (version.Major == this.DatabaseVersion.Major && version.Minor == this.DatabaseVersion.Minor && + version.Build == this.DatabaseVersion.Build && this.IncrementalVersionExists(version)) + { + // Upgrade Required (Build Version Upgrade) + tempStatus = UpgradeStatus.Upgrade; + } + } + + this.status = tempStatus; + + Logger.Trace(string.Format("result of getting providerpath: {0}", strMessage)); + Logger.Trace("Application status is " + this.status); + + return this.status; + } + } + + /// + public Version DatabaseVersion { get; private set; } + + /// + public string ApplicationMapPath { get => this.applicationMapPath ?? (this.applicationMapPath = this.GetCurrentDomainDirectory()); } + + /// + public bool IsInstalled() + { + const int c_PassingScore = 4; + int installationdatefactor = Convert.ToInt32(this.HasInstallationDate() ? 1 : 0); + int dataproviderfactor = Convert.ToInt32(this.HasDataProviderLogFiles() ? 3 : 0); + int htmlmodulefactor = Convert.ToInt32(this.ModuleDirectoryExists("html") ? 2 : 0); + int portaldirectoryfactor = Convert.ToInt32(this.HasNonDefaultPortalDirectory() ? 2 : 0); + int localexecutionfactor = Convert.ToInt32(HttpContext.Current.Request.IsLocal ? c_PassingScore - 1 : 0); + + // This calculation ensures that you have a more than one item that indicates you have already installed DNN. + // While it is possible that you might not have an installation date or that you have deleted log files + // it is unlikely that you have removed every trace of an installation and yet still have a working install + bool isInstalled = (!this.IsInstallationURL()) && ((installationdatefactor + dataproviderfactor + htmlmodulefactor + portaldirectoryfactor + localexecutionfactor) >= c_PassingScore); + + // we need to tighten this check. We now are enforcing the existence of the InstallVersion value in web.config. If + // this value exists, then DNN was previously installed, and we should never try to re-install it + return isInstalled || this.HasInstallVersion(); + } + + /// + /// Sets the status. + /// + /// The status. + public void SetStatus(UpgradeStatus status) + { + this.status = status; + } + + /// + public void UpdateDatabaseVersion(Version version) + { + // update the version + DataProvider.Instance().UpdateDatabaseVersion(version.Major, version.Minor, version.Build, this.applicationInfo.Name); + this.DatabaseVersion = version; + } + + /// + public void UpdateDatabaseVersionIncrement(Version version, int increment) + { + // update the version and increment + DataProvider.Instance().UpdateDatabaseVersionIncrement(version.Major, version.Minor, version.Build, increment, DotNetNukeContext.Current.Application.Name); + this.DatabaseVersion = version; + } + + /// + public bool IncrementalVersionExists(Version version) + { + Provider currentdataprovider = Config.GetDefaultProvider("data"); + string providerpath = currentdataprovider.Attributes["providerPath"]; + + // If the provider path does not exist, then there can't be any log files + if (!string.IsNullOrEmpty(providerpath)) + { + providerpath = HttpRuntime.AppDomainAppPath + providerpath.Replace("~", string.Empty); + if (Directory.Exists(providerpath)) + { + var incrementalcount = Directory.GetFiles(providerpath, Upgrade.GetStringVersion(version) + ".*." + Upgrade.DefaultProvider).Length; + + if (incrementalcount > this.GetLastAppliedIteration(version)) + { + return true; + } + } + } + + return false; + } + + /// + public int GetLastAppliedIteration(Version version) + { + try + { + return DataProvider.Instance().GetLastAppliedIteration(version.Major, version.Minor, version.Build); + } + catch (Exception) + { + return 0; + } + } + + /// + /// Determines whether current request is for install. + /// + /// + /// true if current request is for install; otherwise, false. + /// + private bool IsInstallationURL() + { + string requestURL = HttpContext.Current.Request.RawUrl.ToLowerInvariant().Replace("\\", "/"); + return requestURL.Contains("/install.aspx") || requestURL.Contains("/installwizard.aspx"); + } + + /// + /// Determines whether has installation date. + /// + /// + /// true if has installation date; otherwise, false. + /// + private bool HasInstallationDate() + { + return Config.GetSetting("InstallationDate") != null; + } + + /// + /// Determines whether has data provider log files. + /// + /// + /// true if has data provider log files; otherwise, false. + /// + private bool HasDataProviderLogFiles() + { + Provider currentdataprovider = Config.GetDefaultProvider("data"); + string providerpath = currentdataprovider.Attributes["providerPath"]; + + // If the provider path does not exist, then there can't be any log files + if (!string.IsNullOrEmpty(providerpath)) + { + providerpath = HttpContext.Current.Server.MapPath(providerpath); + if (Directory.Exists(providerpath)) + { + return Directory.GetFiles(providerpath, "*.log.resources").Length > 0; + } + } + + return false; + } + + /// + /// Check whether the modules directory is exists. + /// + /// Name of the module. + /// + /// true if the module directory exist, otherwise, false. + /// + private bool ModuleDirectoryExists(string moduleName) + { + string dir = this.ApplicationMapPath + "\\desktopmodules\\" + moduleName; + return Directory.Exists(dir); + } + + /// + /// Determines whether has portal directory except default portal directory in portal path. + /// + /// + /// true if has portal directory except default portal directory in portal path; otherwise, false. + /// + private bool HasNonDefaultPortalDirectory() + { + string dir = this.ApplicationMapPath + "\\portals"; + if (Directory.Exists(dir)) + { + return Directory.GetDirectories(dir).Length > 1; + } + + return false; + } + + /// + /// Determines whether has InstallVersion set. + /// + /// + /// true if has installation date; otherwise, false. + /// + private bool HasInstallVersion() + { + return Config.GetSetting("InstallVersion") != null; + } + + /// + /// Get the current domain directory. + /// + /// returns the domain directory. + private string GetCurrentDomainDirectory() + { + var dir = AppDomain.CurrentDomain.BaseDirectory.Replace("/", "\\"); + if (dir.Length > 3 && dir.EndsWith("\\")) + { + dir = dir.Substring(0, dir.Length - 1); + } + + return dir; + } + } +} diff --git a/DNN Platform/Library/Application/AssemblyStatusAttribute.cs b/DNN Platform/Library/Application/AssemblyStatusAttribute.cs index ad09d72bd6b..3eb927c25ce 100644 --- a/DNN Platform/Library/Application/AssemblyStatusAttribute.cs +++ b/DNN Platform/Library/Application/AssemblyStatusAttribute.cs @@ -26,27 +26,27 @@ public enum ReleaseMode /// /// Not asssigned /// - None, + None = 0, /// /// Alpha release /// - Alpha, + Alpha = 1, /// /// Beta release /// - Beta, + Beta = 2, /// /// Release candidate /// - RC, + RC = 3, /// /// Stable release version /// - Stable, + Stable = 4, } /// diff --git a/DNN Platform/Library/Application/DotNetNukeContext.cs b/DNN Platform/Library/Application/DotNetNukeContext.cs index ef2ac0dd2c6..d39b34c09b6 100644 --- a/DNN Platform/Library/Application/DotNetNukeContext.cs +++ b/DNN Platform/Library/Application/DotNetNukeContext.cs @@ -1,105 +1,105 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Application -{ - using System.Collections.Generic; - using DotNetNuke.Collections.Internal; - using DotNetNuke.UI.Containers.EventListeners; +namespace DotNetNuke.Application +{ + using System; + using System.Collections.Generic; + + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Collections.Internal; + using DotNetNuke.Common; + using DotNetNuke.UI.Containers.EventListeners; using DotNetNuke.UI.Skins.EventListeners; - /// - /// Defines the context for the environment of the DotNetNuke application. - /// - public class DotNetNukeContext - { - private static DotNetNukeContext _current; - private readonly Application _application; - private readonly IList _containerEventListeners; - private readonly IList _skinEventListeners; - - /// - /// Initializes a new instance of the class. - /// - protected DotNetNukeContext() - : this(new Application()) - { - } - - /// - /// Initializes a new instance of the class using the provided application as base. - /// - /// The application. - protected DotNetNukeContext(Application application) - { - this._application = application; - this._containerEventListeners = new NaiveLockingList(); - this._skinEventListeners = new NaiveLockingList(); - } - - /// - /// Gets or sets the current app context. - /// - public static DotNetNukeContext Current - { - get - { - if (_current == null) - { - _current = new DotNetNukeContext(); - } - - return _current; - } - - set - { - _current = value; - } - } - - /// - /// Gets get the application. - /// - public Application Application - { - get - { - return this._application; - } - } - - /// - /// Gets the container event listeners. The listeners will be called in each life cycle of load container. - /// - /// - /// - /// - /// - /// - public IList ContainerEventListeners - { - get - { - return this._containerEventListeners; - } - } - - /// - /// Gets the skin event listeners. The listeners will be called in each life cycle of load skin. - /// - /// - /// - /// - /// - /// - public IList SkinEventListeners - { - get - { - return this._skinEventListeners; - } - } - } -} + using Microsoft.Extensions.DependencyInjection; + + /// + /// Defines the context for the environment of the DotNetNuke application. + /// + public class DotNetNukeContext : IDnnContext + { + private static IDnnContext current; + private readonly IApplicationInfo applicationInfo; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Initialize using the public constructor for Dependency Injection, this method will be removed. + /// + [Obsolete("Deprecated in DotNetNuke 9.7.1. This constructor has been replaced by parameterized public constructor which is designed to be used with Dependency Injection. Resolve the new interface 'DotNetNuke.Abstractions.IDnnContext' instead. Scheduled removal in v11.0.0.")] + protected DotNetNukeContext() + : this(Globals.DependencyProvider.GetRequiredService()) + { } + + [Obsolete("Deprecated in DotNetNuke 9.7.1. This constructor has been replaced by the overload taking an IApplicationInfo, which should be resolved via Dependency Injection. Scheduled removal in v11.0.0.")] + protected DotNetNukeContext(Application application) + : this((IApplicationInfo)application) + { } + + /// + /// Initializes a new instance of the class using the provided application as base. + /// + /// The application. + /// + /// This constructor is designed to be used with Dependency Injection. + /// + public DotNetNukeContext(IApplicationInfo applicationInfo) + { + this.applicationInfo = applicationInfo; + this.ContainerEventListeners = new NaiveLockingList(); + this.SkinEventListeners = new NaiveLockingList(); + } + + /// + /// Gets or sets the current app context. + /// + public static DotNetNukeContext Current + { + get + { + if (current == null) + { + current = Globals.DependencyProvider.GetRequiredService(); + } + + return current is DotNetNukeContext context ? context : default(DotNetNukeContext); + } + + set + { + current = value; + } + } + + /// + /// Gets get the application. + /// + public Application Application { get => this.applicationInfo is Application app ? app : new Application(); } + + /// + IApplicationInfo IDnnContext.Application { get => this.applicationInfo; } + + /// + /// Gets the container event listeners. The listeners will be called in each life cycle of load container. + /// + /// + /// + /// + /// + /// + public IList ContainerEventListeners { get; } + + /// + /// Gets the skin event listeners. The listeners will be called in each life cycle of load skin. + /// + /// + /// + /// + /// + /// + public IList SkinEventListeners { get; } + } +} diff --git a/DNN Platform/Library/Common/Globals.cs b/DNN Platform/Library/Common/Globals.cs index 2fd0d408c82..98be4cf4119 100644 --- a/DNN Platform/Library/Common/Globals.cs +++ b/DNN Platform/Library/Common/Globals.cs @@ -5,7 +5,6 @@ namespace DotNetNuke.Common { using System; using System.Collections; - using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; @@ -25,15 +24,13 @@ namespace DotNetNuke.Common using System.Xml; using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Abstractions.Portals; - using DotNetNuke.Application; using DotNetNuke.Collections.Internal; using DotNetNuke.Common.Internal; using DotNetNuke.Common.Lists; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; - using DotNetNuke.Entities; - using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Host; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Modules.Actions; @@ -46,13 +43,10 @@ namespace DotNetNuke.Common using DotNetNuke.Security; using DotNetNuke.Security.Permissions; using DotNetNuke.Security.Roles; - using DotNetNuke.Services.Cache; using DotNetNuke.Services.Exceptions; using DotNetNuke.Services.FileSystem; using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Upgrade; using DotNetNuke.Services.Url.FriendlyUrl; - using DotNetNuke.UI.Skins; using DotNetNuke.UI.Utilities; using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualBasic.CompilerServices; @@ -215,19 +209,20 @@ public sealed class Globals private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(Globals)); private static string _applicationPath; - private static string _applicationMapPath; private static string _desktopModulePath; private static string _imagePath; private static string _hostMapPath; private static string _hostPath; private static string _installMapPath; private static string _installPath; - private static Version _dataBaseVersion; - private static UpgradeStatus _status = UpgradeStatus.Unknown; private static readonly Regex TabPathInvalidCharsRx = new Regex(_tabPathInvalidCharsEx, RegexOptions.Compiled); private static readonly Stopwatch AppStopwatch = Stopwatch.StartNew(); + private static IServiceProvider dependencyProvider; + private static IApplicationStatusInfo applicationStatusInfo; + private static INavigationManager navigationManager; + // global constants for the life of the application ( set in Application_Start ) @@ -316,28 +311,28 @@ public enum UpgradeStatus /// /// The application need update to a higher version. /// - Upgrade, + Upgrade = 0, /// /// The application need to install itself. /// - Install, + Install = 1, /// /// The application is normal running. /// - None, + None = 2, /// /// The application occur error when running. /// - Error, + Error = 3, /// /// The application status is unknown, /// /// This status should never be returned. its is only used as a flag that Status hasn't been determined. - Unknown, + Unknown = 4, } /// @@ -369,13 +364,8 @@ public static string ApplicationPath /// /// The application map path. /// - public static string ApplicationMapPath - { - get - { - return _applicationMapPath ?? (_applicationMapPath = GetCurrentDomainDirectory()); - } - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static string ApplicationMapPath => applicationStatusInfo.ApplicationMapPath; /// /// Gets the desktop module path. @@ -414,13 +404,8 @@ public static string ImagePath /// /// Gets the database version. /// - public static Version DataBaseVersion - { - get - { - return _dataBaseVersion; - } - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static Version DataBaseVersion { get => applicationStatusInfo.DatabaseVersion; } /// /// Gets the host map path. @@ -494,89 +479,8 @@ public static string InstallPath /// Gets the status of application. /// /// - public static UpgradeStatus Status - { - get - { - if (_status != UpgradeStatus.Unknown && _status != UpgradeStatus.Error) - { - return _status; - } - - Logger.Trace("Getting application status"); - var tempStatus = UpgradeStatus.None; - - // first call GetProviderPath - this insures that the Database is Initialised correctly - // and also generates the appropriate error message if it cannot be initialised correctly - string strMessage = DataProvider.Instance().GetProviderPath(); - - // get current database version from DB - if (!strMessage.StartsWith("ERROR:")) - { - try - { - _dataBaseVersion = DataProvider.Instance().GetVersion(); - } - catch (Exception ex) - { - Logger.Error(ex); - strMessage = "ERROR:" + ex.Message; - } - } - - if (strMessage.StartsWith("ERROR")) - { - if (IsInstalled()) - { - // Errors connecting to the database after an initial installation should be treated as errors. - tempStatus = UpgradeStatus.Error; - } - else - { - // An error that occurs before the database has been installed should be treated as a new install - tempStatus = UpgradeStatus.Install; - } - } - else if (DataBaseVersion == null) - { - // No Db Version so Install - tempStatus = UpgradeStatus.Install; - } - else - { - var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; - if (version.Major > DataBaseVersion.Major) - { - // Upgrade Required (Major Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - else if (version.Major == DataBaseVersion.Major && version.Minor > DataBaseVersion.Minor) - { - // Upgrade Required (Minor Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - else if (version.Major == DataBaseVersion.Major && version.Minor == DataBaseVersion.Minor && - version.Build > DataBaseVersion.Build) - { - // Upgrade Required (Build Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - else if (version.Major == DataBaseVersion.Major && version.Minor == DataBaseVersion.Minor && - version.Build == DataBaseVersion.Build && IncrementalVersionExists(version)) - { - // Upgrade Required (Build Version Upgrade) - tempStatus = UpgradeStatus.Upgrade; - } - } - - _status = tempStatus; - - Logger.Trace(string.Format("result of getting providerpath: {0}", strMessage)); - Logger.Trace("Application status is " + _status); - - return _status; - } - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static UpgradeStatus Status { get => (UpgradeStatus)applicationStatusInfo.Status; } /// /// Gets image file types. @@ -637,6 +541,7 @@ public static TimeSpan ElapsedSinceAppStart /// public static Version NETFrameworkVersion { get; set; } + /// /// Gets or sets the database engine version. /// @@ -651,7 +556,22 @@ public static TimeSpan ElapsedSinceAppStart /// /// The Dependency Service. /// - internal static IServiceProvider DependencyProvider { get; set; } + internal static IServiceProvider DependencyProvider + { + get => dependencyProvider; + set + { + dependencyProvider = value; + if (dependencyProvider is INotifyPropertyChanged hasPropertyChanged) + { + hasPropertyChanged.PropertyChanged += OnDependencyProviderChanged; + } + else + { + OnDependencyProviderChanged(null, null); + } + } + } /// /// Redirects the specified URL. @@ -675,28 +595,8 @@ public static void Redirect(string url, bool endResponse) } } - public static bool IncrementalVersionExists(Version version) - { - Provider currentdataprovider = Config.GetDefaultProvider("data"); - string providerpath = currentdataprovider.Attributes["providerPath"]; - - // If the provider path does not exist, then there can't be any log files - if (!string.IsNullOrEmpty(providerpath)) - { - providerpath = HttpRuntime.AppDomainAppPath + providerpath.Replace("~", string.Empty); - if (Directory.Exists(providerpath)) - { - var incrementalcount = Directory.GetFiles(providerpath, Upgrade.GetStringVersion(version) + ".*." + Upgrade.DefaultProvider).Length; - - if (incrementalcount > Globals.GetLastAppliedIteration(version)) - { - return true; - } - } - } - - return false; - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static bool IncrementalVersionExists(Version version) => applicationStatusInfo.IncrementalVersionExists(version); /// /// Builds the cross tab dataset. @@ -1073,36 +973,21 @@ public static bool FindDatabaseVersion(int Major, int Minor, int Build) /// Updates the database version. /// /// The version. - public static void UpdateDataBaseVersion(Version version) - { - // update the version - DataProvider.Instance().UpdateDatabaseVersion(version.Major, version.Minor, version.Build, DotNetNukeContext.Current.Application.Name); - _dataBaseVersion = version; - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static void UpdateDataBaseVersion(Version version) => applicationStatusInfo.UpdateDatabaseVersion(version); /// /// Updates the database version. /// /// The version. /// The increment. - public static void UpdateDataBaseVersionIncrement(Version version, int increment) - { - // update the version and increment - DataProvider.Instance().UpdateDatabaseVersionIncrement(version.Major, version.Minor, version.Build, increment, DotNetNukeContext.Current.Application.Name); - _dataBaseVersion = version; - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static void UpdateDataBaseVersionIncrement(Version version, int increment) => + applicationStatusInfo.UpdateDatabaseVersionIncrement(version, increment); - public static int GetLastAppliedIteration(Version version) - { - try - { - return DataProvider.Instance().GetLastAppliedIteration(version.Major, version.Minor, version.Build); - } - catch (Exception) - { - return 0; - } - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static int GetLastAppliedIteration(Version version) => + applicationStatusInfo.GetLastAppliedIteration(version); /// /// Adds the port. @@ -1446,10 +1331,9 @@ public static int GetTotalRecords(ref IDataReader dr) /// Sets the status. /// /// The status. - public static void SetStatus(UpgradeStatus status) - { - _status = status; - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + public static void SetStatus(UpgradeStatus status) => + applicationStatusInfo.SetStatus((DotNetNuke.Abstractions.Application.UpgradeStatus)status); /// ----------------------------------------------------------------------------- /// @@ -2425,7 +2309,6 @@ public static string AccessDeniedURL() /// URL to access denied view. public static string AccessDeniedURL(string Message) { - var navigationManager = DependencyProvider.GetRequiredService(); string strURL = string.Empty; PortalSettings _portalSettings = PortalController.Instance.GetCurrentPortalSettings(); if (HttpContext.Current.Request.IsAuthenticated) @@ -2802,7 +2685,6 @@ public static string LoginURL(string returnUrl, bool overrideSetting) /// Formatted URL. public static string LoginURL(string returnUrl, bool overrideSetting, PortalSettings portalSettings) { - var navigationManager = DependencyProvider.GetRequiredService(); string loginUrl; if (!string.IsNullOrEmpty(returnUrl)) { @@ -2854,7 +2736,7 @@ public static string UserProfileURL(int userId) string strURL = string.Empty; PortalSettings portalSettings = PortalController.Instance.GetCurrentPortalSettings(); - strURL = DependencyProvider.GetRequiredService().NavigateURL(portalSettings.UserTabId, string.Empty, string.Format("userId={0}", userId)); + strURL = navigationManager.NavigateURL(portalSettings.UserTabId, string.Empty, string.Format("userId={0}", userId)); return strURL; } @@ -2868,7 +2750,7 @@ public static string UserProfileURL(int userId) [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL() { - return DependencyProvider.GetRequiredService().NavigateURL(); + return navigationManager.NavigateURL(); } /// @@ -2881,7 +2763,7 @@ public static string NavigateURL() [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID); + return navigationManager.NavigateURL(tabID); } /// @@ -2895,7 +2777,7 @@ public static string NavigateURL(int tabID) [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, bool isSuperTab) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, isSuperTab); + return navigationManager.NavigateURL(tabID, isSuperTab); } /// @@ -2908,7 +2790,7 @@ public static string NavigateURL(int tabID, bool isSuperTab) [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(string controlKey) { - return DependencyProvider.GetRequiredService().NavigateURL(controlKey); + return navigationManager.NavigateURL(controlKey); } /// @@ -2922,7 +2804,7 @@ public static string NavigateURL(string controlKey) [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(string controlKey, params string[] additionalParameters) { - return DependencyProvider.GetRequiredService().NavigateURL(controlKey, additionalParameters); + return navigationManager.NavigateURL(controlKey, additionalParameters); } /// @@ -2936,7 +2818,7 @@ public static string NavigateURL(string controlKey, params string[] additionalPa [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, string controlKey) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, controlKey); + return navigationManager.NavigateURL(tabID, controlKey); } /// @@ -2951,7 +2833,7 @@ public static string NavigateURL(int tabID, string controlKey) [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, string controlKey, params string[] additionalParameters) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, controlKey, additionalParameters); + return navigationManager.NavigateURL(tabID, controlKey, additionalParameters); } /// @@ -2967,7 +2849,7 @@ public static string NavigateURL(int tabID, string controlKey, params string[] a [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, PortalSettings settings, string controlKey, params string[] additionalParameters) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, settings, controlKey, additionalParameters); + return navigationManager.NavigateURL(tabID, settings, controlKey, additionalParameters); } /// @@ -2984,7 +2866,7 @@ public static string NavigateURL(int tabID, PortalSettings settings, string cont [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, bool isSuperTab, PortalSettings settings, string controlKey, params string[] additionalParameters) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, isSuperTab, settings, controlKey, additionalParameters); + return navigationManager.NavigateURL(tabID, isSuperTab, settings, controlKey, additionalParameters); } /// @@ -3000,7 +2882,7 @@ public static string NavigateURL(int tabID, bool isSuperTab, PortalSettings sett [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, bool isSuperTab, PortalSettings settings, string controlKey, string language, params string[] additionalParameters) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, isSuperTab, settings, controlKey, language, additionalParameters); + return navigationManager.NavigateURL(tabID, isSuperTab, settings, controlKey, language, additionalParameters); } /// @@ -3017,7 +2899,7 @@ public static string NavigateURL(int tabID, bool isSuperTab, PortalSettings sett [Obsolete("Deprecated in Platform 9.4.2. Scheduled removal in v11.0.0.")] public static string NavigateURL(int tabID, bool isSuperTab, PortalSettings settings, string controlKey, string language, string pageName, params string[] additionalParameters) { - return DependencyProvider.GetRequiredService().NavigateURL(tabID, isSuperTab, settings, controlKey, language, pageName, additionalParameters); + return navigationManager.NavigateURL(tabID, isSuperTab, settings, controlKey, language, pageName, additionalParameters); } /// @@ -3066,7 +2948,6 @@ public static string QueryStringDecode(string QueryString) /// Formatted url. public static string RegisterURL(string returnURL, string originalURL) { - var navigationManager = DependencyProvider.GetRequiredService(); string strURL; PortalSettings _portalSettings = PortalController.Instance.GetCurrentPortalSettings(); string extraParams = string.Empty; @@ -3345,7 +3226,7 @@ public static string LinkClick(string Link, int TabID, int ModuleID, bool TrackC switch (UrlType) { case TabType.Tab: - strLink = DependencyProvider.GetRequiredService().NavigateURL(int.Parse(Link)); + strLink = navigationManager.NavigateURL(int.Parse(Link)); break; default: strLink = Link; @@ -3836,31 +3717,15 @@ public static string PreventSQLInjection(string strSQL) /// /// IsInstalled looks at various file artifacts to determine if DotNetNuke has already been installed. /// - /// + /// true if installed else false. /// /// If DotNetNuke has been installed, then we should treat database connection errors as real errors. /// If DotNetNuke has not been installed, then we should expect to have database connection problems /// since the connection string may not have been configured yet, which can occur during the installation /// wizard. /// - internal static bool IsInstalled() - { - const int c_PassingScore = 4; - int installationdatefactor = Convert.ToInt32(HasInstallationDate() ? 1 : 0); - int dataproviderfactor = Convert.ToInt32(HasDataProviderLogFiles() ? 3 : 0); - int htmlmodulefactor = Convert.ToInt32(ModuleDirectoryExists("html") ? 2 : 0); - int portaldirectoryfactor = Convert.ToInt32(HasNonDefaultPortalDirectory() ? 2 : 0); - int localexecutionfactor = Convert.ToInt32(HttpContext.Current.Request.IsLocal ? c_PassingScore - 1 : 0); - - // This calculation ensures that you have a more than one item that indicates you have already installed DNN. - // While it is possible that you might not have an installation date or that you have deleted log files - // it is unlikely that you have removed every trace of an installation and yet still have a working install - bool isInstalled = (!IsInstallationURL()) && ((installationdatefactor + dataproviderfactor + htmlmodulefactor + portaldirectoryfactor + localexecutionfactor) >= c_PassingScore); - - // we need to tighten this check. We now are enforcing the existence of the InstallVersion value in web.config. If - // this value exists, then DNN was previously installed, and we should never try to re-install it - return isInstalled || HasInstallVersion(); - } + [Obsolete("Deprecated in 9.7.1. Use Dependency Injection to resolve 'DotNetNuke.Abstractions.IApplicationStatusInfo' instead. Scheduled for removal in v11.0.0.")] + internal static bool IsInstalled() => applicationStatusInfo.IsInstalled(); /// /// Gets the culture code of the tab. @@ -3894,105 +3759,6 @@ internal static void ResetAppStartElapseTime() AppStopwatch.Restart(); } - private static string GetCurrentDomainDirectory() - { - var dir = AppDomain.CurrentDomain.BaseDirectory.Replace("/", "\\"); - if (dir.Length > 3 && dir.EndsWith("\\")) - { - dir = dir.Substring(0, dir.Length - 1); - } - - return dir; - } - - /// - /// Determines whether has data provider log files. - /// - /// - /// true if has data provider log files; otherwise, false. - /// - private static bool HasDataProviderLogFiles() - { - Provider currentdataprovider = Config.GetDefaultProvider("data"); - string providerpath = currentdataprovider.Attributes["providerPath"]; - - // If the provider path does not exist, then there can't be any log files - if (!string.IsNullOrEmpty(providerpath)) - { - providerpath = HttpContext.Current.Server.MapPath(providerpath); - if (Directory.Exists(providerpath)) - { - return Directory.GetFiles(providerpath, "*.log.resources").Length > 0; - } - } - - return false; - } - - /// - /// Determines whether has installation date. - /// - /// - /// true if has installation date; otherwise, false. - /// - private static bool HasInstallationDate() - { - return Config.GetSetting("InstallationDate") != null; - } - - /// - /// Determines whether has InstallVersion set. - /// - /// - /// true if has installation date; otherwise, false. - /// - private static bool HasInstallVersion() - { - return Config.GetSetting("InstallVersion") != null; - } - - /// - /// Check whether the modules directory is exists. - /// - /// Name of the module. - /// - /// true if the module directory exist, otherwise, false. - /// - private static bool ModuleDirectoryExists(string moduleName) - { - string dir = ApplicationMapPath + "\\desktopmodules\\" + moduleName; - return Directory.Exists(dir); - } - - /// - /// Determines whether has portal directory except default portal directory in portal path. - /// - /// - /// true if has portal directory except default portal directory in portal path; otherwise, false. - /// - private static bool HasNonDefaultPortalDirectory() - { - string dir = ApplicationMapPath + "\\portals"; - if (Directory.Exists(dir)) - { - return Directory.GetDirectories(dir).Length > 1; - } - - return false; - } - - /// - /// Determines whether current request is for install. - /// - /// - /// true if current request is for install; otherwise, false. - /// - private static bool IsInstallationURL() - { - string requestURL = HttpContext.Current.Request.RawUrl.ToLowerInvariant().Replace("\\", "/"); - return requestURL.Contains("/install.aspx") || requestURL.Contains("/installwizard.aspx"); - } - private static void DeleteFile(string filePath) { try @@ -4061,5 +3827,16 @@ private static bool FilenameMatchesExtensions(string filename, string strExtensi return result; } + + /// + /// Resolves dependencies after the + /// has been initialized. This should only be called once to resolve all + /// dependencies used by the object. + /// + private static void OnDependencyProviderChanged(object sender, PropertyChangedEventArgs eventArguments) + { + applicationStatusInfo = DependencyProvider?.GetRequiredService(); + navigationManager = DependencyProvider?.GetRequiredService(); + } } } diff --git a/DNN Platform/Library/DotNetNuke.Library.csproj b/DNN Platform/Library/DotNetNuke.Library.csproj index f095e188971..607abd82722 100644 --- a/DNN Platform/Library/DotNetNuke.Library.csproj +++ b/DNN Platform/Library/DotNetNuke.Library.csproj @@ -192,6 +192,7 @@ + diff --git a/DNN Platform/Library/Startup.cs b/DNN Platform/Library/Startup.cs index e458f14da66..a56986c5434 100644 --- a/DNN Platform/Library/Startup.cs +++ b/DNN Platform/Library/Startup.cs @@ -2,26 +2,34 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke -{ - using DotNetNuke.Abstractions; - using DotNetNuke.Common; - using DotNetNuke.DependencyInjection; - using DotNetNuke.Entities.Portals; - using DotNetNuke.UI.Modules; - using DotNetNuke.UI.Modules.Html5; - using Microsoft.Extensions.DependencyInjection; +namespace DotNetNuke +{ + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Application; + using DotNetNuke.Common; + using DotNetNuke.DependencyInjection; + using DotNetNuke.Entities.Portals; + using DotNetNuke.UI.Modules; + using DotNetNuke.UI.Modules.Html5; + using Microsoft.Extensions.DependencyInjection; - public class Startup : IDnnStartup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - services.AddTransient(x => PortalController.Instance); - services.AddTransient(); - } - } -} + /// + public class Startup : IDnnStartup + { + /// + public void ConfigureServices(IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + services.AddTransient(x => PortalController.Instance); + services.AddScoped(); + + services.AddScoped(); + services.AddScoped(); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs index 1aef2da49e7..1e2f7f3bc49 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs @@ -4,22 +4,25 @@ namespace DotNetNuke.Tests.Content { - using System; using System.Collections.Generic; - using System.Data; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Common; using DotNetNuke.Entities.Content.Data; using DotNetNuke.Services.Cache; using DotNetNuke.Services.FileSystem; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using FileController = DotNetNuke.Entities.Content.AttachmentController; @@ -33,6 +36,11 @@ public class AttachmentControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + // Register MockCachingProvider this.mockCache = MockComponentProvider.CreateNew(); MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); @@ -41,6 +49,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs index eba6e40c52e..f2d3bbc3131 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs @@ -7,8 +7,10 @@ namespace DotNetNuke.Tests.Content using System; using System.Collections.Generic; using System.Collections.Specialized; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; @@ -18,8 +20,12 @@ namespace DotNetNuke.Tests.Content using DotNetNuke.Services.Search.Entities; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -45,11 +51,20 @@ public void SetUp() this._mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns( (string searchTypeName) => new SearchType { SearchTypeName = searchTypeName, SearchTypeId = ModuleSearchTypeId }); + + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs index 44f600e3935..88f624fcfc8 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs @@ -5,16 +5,22 @@ namespace DotNetNuke.Tests.Content { using System; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content; using DotNetNuke.Entities.Content.Data; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -28,6 +34,11 @@ public class ContentTypeControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + // Register MockCachingProvider this.mockCache = MockComponentProvider.CreateNew(); MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); @@ -36,6 +47,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj index 702d7839a45..626c6fdfa68 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj @@ -64,6 +64,12 @@ False ..\..\DotNetNuke.Log4net\bin\dotnetnuke.log4net.dll + + ..\..\..\packages\Microsoft.Extensions.DependencyInjection.2.1.1\lib\net461\Microsoft.Extensions.DependencyInjection.dll + + + ..\..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + ..\..\..\Packages\Moq.4.2.1502.0911\lib\net40\Moq.dll @@ -100,6 +106,10 @@ + + {6928A9B1-F88A-4581-A132-D3EB38669BB0} + DotNetNuke.Abstractions + {04f77171-0634-46e0-a95e-d7477c88712e} DotNetNuke.Log4Net diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs index e7b5f87d385..01f104f9c10 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs @@ -5,16 +5,22 @@ namespace DotNetNuke.Tests.Content { using System; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content.Data; using DotNetNuke.Entities.Content.Taxonomy; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -28,6 +34,11 @@ public class ScopeTypeControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + // Register MockCachingProvider this.mockCache = MockComponentProvider.CreateNew(); MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); @@ -36,6 +47,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs index 32a80100d0e..0aeb25a7cd9 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs @@ -5,8 +5,10 @@ namespace DotNetNuke.Tests.Content { using System; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content; using DotNetNuke.Entities.Content.Data; @@ -15,8 +17,12 @@ namespace DotNetNuke.Tests.Content using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -30,6 +36,11 @@ public class TermControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + Mock vocabularyController = MockHelper.CreateMockVocabularyController(); MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); @@ -40,6 +51,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs index 86a1ad450f9..82e483e1941 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs @@ -5,16 +5,22 @@ namespace DotNetNuke.Tests.Content { using System; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content.Data; using DotNetNuke.Entities.Content.Taxonomy; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -28,6 +34,11 @@ public class VocabularyControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + // Register MockCachingProvider this.mockCache = MockComponentProvider.CreateNew(); MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); @@ -36,6 +47,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs index 8e4f59968bf..4da0b21a1c8 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs @@ -7,15 +7,21 @@ namespace DotNetNuke.Tests.Core.Controllers.Host using System; using System.Collections.Generic; using System.Data; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; using DotNetNuke.Entities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -28,6 +34,13 @@ public class HostControllerTest [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockCache = MockComponentProvider.CreateDataCacheProvider(); MockComponentProvider.CreateEventLogController(); @@ -59,6 +72,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/MessagingControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/MessagingControllerTests.cs index 5b7987e546c..f1d3419fb81 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/MessagingControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/MessagingControllerTests.cs @@ -9,13 +9,14 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using System.Collections.Generic; using System.Data; using System.Globalization; - using System.Text; - + using System.Text; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Portals.Internal; using DotNetNuke.Entities.Users; using DotNetNuke.Security.Permissions; using DotNetNuke.Security.Roles; @@ -27,8 +28,12 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using DotNetNuke.Services.Social.Messaging.Exceptions; using DotNetNuke.Services.Social.Messaging.Internal; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -66,6 +71,13 @@ public class MessagingControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.Container = new SimpleContainer(); this._mockDataService = new Mock(); this._dataProvider = MockComponentProvider.CreateDataProvider(); @@ -109,6 +121,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; ComponentFactory.Container = null; PortalController.ClearInstance(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs index e7a78e589a3..2f9341d0b38 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs @@ -9,8 +9,10 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using System.Collections.Generic; using System.Data; using System.Globalization; - using System.Text; - + using System.Text; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; @@ -24,8 +26,12 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using DotNetNuke.Services.Social.Notifications; using DotNetNuke.Services.Social.Notifications.Data; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -48,6 +54,13 @@ public class NotificationsControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.Container = new SimpleContainer(); this._mockDataService = new Mock(); @@ -79,6 +92,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; ComponentFactory.Container = null; MessagingController.ClearInstance(); PortalController.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs index 5066e44103b..709036f7cdb 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs @@ -8,8 +8,10 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.Collections.Generic; using System.Data; using System.IO; - using System.Threading; - + using System.Threading; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; @@ -18,7 +20,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using DotNetNuke.Services.Localization; using DotNetNuke.Services.Search.Entities; using DotNetNuke.Services.Search.Internals; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; @@ -95,6 +98,11 @@ public void SetUp() ComponentFactory.Container = new SimpleContainer(); MockComponentProvider.ResetContainer(); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockDataProvider = MockComponentProvider.CreateDataProvider(); this._mockLocaleController = MockComponentProvider.CreateLocaleController(); this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); @@ -125,6 +133,7 @@ public void TearDown() SearchHelper.ClearInstance(); LuceneController.ClearInstance(); this._luceneController = null; + Globals.DependencyProvider = null; } [Test] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs index 5b26371f73f..58311a9a1c2 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs @@ -9,7 +9,9 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.IO; using System.Linq; using System.Threading; - + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; @@ -21,6 +23,7 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using Lucene.Net.Index; using Lucene.Net.QueryParsers; using Lucene.Net.Search; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; @@ -65,6 +68,11 @@ public void SetUp() ComponentFactory.Container = new SimpleContainer(); this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockHostController = new Mock(); this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this._readerStaleTimeSpan); @@ -92,6 +100,7 @@ public void TearDown() this._luceneController.Dispose(); this.DeleteIndexFolder(); SearchHelper.ClearInstance(); + Globals.DependencyProvider = null; } [Test] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs index c01cf4703ac..c8f6ce90b60 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs @@ -9,8 +9,10 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.Data; using System.IO; using System.Linq; - using System.Threading; - + using System.Threading; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; @@ -21,7 +23,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using DotNetNuke.Services.Search.Entities; using DotNetNuke.Services.Search.Internals; using DotNetNuke.Tests.Utilities.Mocks; - using Lucene.Net.Documents; + using Lucene.Net.Documents; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; @@ -139,6 +142,11 @@ public void SetUp() ComponentFactory.Container = new SimpleContainer(); MockComponentProvider.ResetContainer(); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockDataProvider = MockComponentProvider.CreateDataProvider(); this._mockLocaleController = MockComponentProvider.CreateLocaleController(); this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); @@ -168,6 +176,7 @@ public void TearDown() SearchHelper.ClearInstance(); LuceneController.ClearInstance(); this._luceneController = null; + Globals.DependencyProvider = null; } [Test] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs index 8bc61cc7896..65d0ba2247a 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs @@ -6,15 +6,21 @@ namespace DotNetNuke.Tests.Core.Controllers.Search { using System; using System.Data; - using System.Linq; - + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Services.Cache; using DotNetNuke.Services.Search.Internals; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -40,6 +46,13 @@ public class SearchHelperTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.Container = new SimpleContainer(); this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); this._dataProvider = MockComponentProvider.CreateDataProvider(); @@ -48,6 +61,12 @@ public void SetUp() DataCache.ClearCache(); } + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + } + [Test] public void SearchHelper_GetSynonyms_Two_Terms_Returns_Correct_Results() { diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs index 0b764808687..1cedf9e940f 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs @@ -6,22 +6,26 @@ namespace DotNetNuke.Tests.Core.Controllers.Social { using System; using System.Collections.Generic; - using System.Data; - + using System.Data; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; - using DotNetNuke.Entities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; using DotNetNuke.Entities.Users.Social; using DotNetNuke.Entities.Users.Social.Data; - using DotNetNuke.Entities.Users.Social.Internal; using DotNetNuke.Services.Cache; using DotNetNuke.Services.Log.EventLog; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; /// @@ -42,6 +46,13 @@ public class RelationshipControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.Container = new SimpleContainer(); var mockDataProvider = MockComponentProvider.CreateDataProvider(); mockDataProvider.Setup(dp => dp.GetProviderPath()).Returns(string.Empty); @@ -71,6 +82,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; ComponentFactory.Container = null; PortalController.ClearInstance(); UserController.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj index af23f23244f..0e86957af68 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/DotNetNuke.Tests.Core.csproj @@ -83,6 +83,12 @@ ..\..\Components\Lucene.Net.Contrib\bin\Lucene.Net.Contrib.FastVectorHighlighter.dll + + ..\..\..\packages\Microsoft.Extensions.DependencyInjection.2.1.1\lib\net461\Microsoft.Extensions.DependencyInjection.dll + + + ..\..\..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll + ..\..\..\packages\Moq.4.2.1502.0911\lib\net40\Moq.dll diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs index d2ce2d91fe9..dc91cadca39 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs @@ -7,8 +7,9 @@ namespace DotNetNuke.Tests.Core.Entities.Portals using System; using System.Collections.Generic; using System.Reflection; - using System.Runtime.Serialization; - + using System.Runtime.Serialization; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; @@ -16,7 +17,8 @@ namespace DotNetNuke.Tests.Core.Entities.Portals using DotNetNuke.Entities.Tabs; using DotNetNuke.Services.Localization; using DotNetNuke.Tests.Utilities.Mocks; - using DotNetNuke.UI.Skins; + using DotNetNuke.UI.Skins; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; @@ -44,6 +46,13 @@ public class PortalSettingsControllerTests public void SetUp() { MockComponentProvider.ResetContainer(); + + var serviceCollection = new ServiceCollection(); + var mockApplicationInfo = new Mock(); + mockApplicationInfo.Setup(info => info.ApplicationMapPath).Returns("path/to/application"); + serviceCollection.AddTransient(container => mockApplicationInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [TearDown] @@ -51,6 +60,8 @@ public void TearDown() { PortalController.ClearInstance(); TabController.ClearInstance(); + Globals.DependencyProvider = null; + } [Test] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/FileSystemUtilsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/FileSystemUtilsTests.cs index 2b183e8f691..daf3e6a847c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/FileSystemUtilsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/FileSystemUtilsTests.cs @@ -7,14 +7,17 @@ namespace DotNetNuke.Tests.Core using System; using System.IO; using System.Linq; - using System.Reflection; - + using System.Reflection; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Tabs; using DotNetNuke.Tests.Utilities.Mocks; - using ICSharpCode.SharpZipLib.Zip; + using ICSharpCode.SharpZipLib.Zip; + using Microsoft.Extensions.DependencyInjection; + using Moq; using NUnit.Framework; /// @@ -26,13 +29,22 @@ public class FileSystemUtilsTests [SetUp] public void SetUp() { - var field = typeof(Globals).GetField("_applicationMapPath", BindingFlags.Static | BindingFlags.NonPublic); - field.SetValue(null, null); - - var rootPath = Path.Combine(Globals.ApplicationMapPath, "FileSystemUtilsTest"); - this.PrepareRootPath(rootPath); + var applicationStatusInfo = new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of()); + var rootPath = Path.Combine(applicationStatusInfo.ApplicationMapPath, "FileSystemUtilsTest"); + this.PrepareRootPath(rootPath, applicationStatusInfo.ApplicationMapPath); + + var serviceCollection = new ServiceCollection(); + var mock = new Mock(); + mock.Setup(info => info.ApplicationMapPath).Returns(rootPath); + serviceCollection.AddTransient(container => mock.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } - field.SetValue(null, rootPath); + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; } [TestCase("/")] @@ -147,14 +159,14 @@ public void FixPath_Should_Change_Slashes_And_Trim(string input) } } - private void PrepareRootPath(string rootPath) + private void PrepareRootPath(string rootPath, string applicationMapPath) { if (!Directory.Exists(rootPath)) { Directory.CreateDirectory(rootPath); } - foreach (var file in Directory.GetFiles(Globals.ApplicationMapPath, "*.*", SearchOption.TopDirectoryOnly)) + foreach (var file in Directory.GetFiles(applicationMapPath, "*.*", SearchOption.TopDirectoryOnly)) { File.Copy(file, Path.Combine(rootPath, Path.GetFileName(file)), true); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/JavaScriptLibraries/JavaScriptTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/JavaScriptLibraries/JavaScriptTests.cs index 63a2d0ca75b..fccd54a6765 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/JavaScriptLibraries/JavaScriptTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/JavaScriptLibraries/JavaScriptTests.cs @@ -9,13 +9,18 @@ namespace DotNetNuke.Tests.Core.Framework.JavaScriptLibraries using System.Linq; using System.Reflection; using System.Web; - + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Application; using DotNetNuke.Common; using DotNetNuke.Framework.JavaScriptLibraries; using DotNetNuke.Tests.Instance.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; public class JavaScriptTests @@ -29,9 +34,21 @@ public class JavaScriptTests [SetUp] public void Setup() { - // fix Globals.Status - var status = typeof(Globals).GetField("_status", BindingFlags.Static | BindingFlags.NonPublic); - status.SetValue(null, Globals.UpgradeStatus.None); + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.None); + + var mockApplication = new Mock(); + mockApplication.Setup(app => app.Version).Returns(new Version("1.0.0.0")); + + var dnnContext = new DotNetNukeContext(mockApplication.Object); + + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => mockApplication.Object); + serviceCollection.AddTransient(container => dnnContext); + serviceCollection.AddTransient(container => Mock.Of()); + + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); var httpContextMock = new Mock { DefaultValue = DefaultValue.Mock, }; httpContextMock.Setup(c => c.Items).Returns(new Dictionary()); @@ -49,6 +66,7 @@ public void TearDown() { UnitTestHelper.ClearHttpContext(); JavaScriptLibraryController.ClearInstance(); + Globals.DependencyProvider = null; } [Test] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ServicesFrameworkTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ServicesFrameworkTests.cs index 08b3d132a8f..e2cd03159fd 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ServicesFrameworkTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Framework/ServicesFrameworkTests.cs @@ -4,11 +4,18 @@ namespace DotNetNuke.Tests.Core.Framework { - using System; - + using System; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Framework; using DotNetNuke.Tests.Instance.Utilities; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Tests.Utilities; + + using Microsoft.Extensions.DependencyInjection; + + using Moq; + using NUnit.Framework; public class ServicesFrameworkTests @@ -16,6 +23,13 @@ public class ServicesFrameworkTests [SetUp] public void Setup() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + HttpContextHelper.RegisterMockHttpContext(); var simulator = new Instance.Utilities.HttpSimulator.HttpSimulator("/", "c:\\"); simulator.SimulateRequest(new Uri("http://localhost/dnn/Default.aspx")); @@ -24,6 +38,7 @@ public void Setup() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; UnitTestHelper.ClearHttpContext(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs index 2179f2b26ed..5b917da70d9 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs @@ -3,29 +3,19 @@ // See the LICENSE file in the project root for more information namespace DotNetNuke.Tests.Core.Providers.Folder -{ - using System; - using System.Collections.Generic; - using System.Data; - using System.Drawing; - using System.IO; - using System.Reflection; - using System.Text; - +{ + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; - using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Workflow; - using DotNetNuke.Entities.Content.Workflow.Entities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.Cache; using DotNetNuke.Services.FileSystem; - using DotNetNuke.Services.FileSystem.Internal; - using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -34,6 +24,13 @@ public class FileContentTypeManagerTests [SetUp] public void Setup() { + var serviceCollection = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + var _mockData = MockComponentProvider.CreateDataProvider(); var _mockCache = MockComponentProvider.CreateDataCacheProvider(); var _globals = new Mock(); @@ -48,6 +45,7 @@ public void Setup() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; TestableGlobals.ClearInstance(); CBO.ClearInstance(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/StandardFolderProviderTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/StandardFolderProviderTests.cs index efee9d35458..2b2a8848238 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/StandardFolderProviderTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/StandardFolderProviderTests.cs @@ -9,7 +9,8 @@ namespace DotNetNuke.Tests.Core.Providers.Folder using System.IO; using System.Linq; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; @@ -20,8 +21,12 @@ namespace DotNetNuke.Tests.Core.Providers.Folder using DotNetNuke.Services.FileSystem.Internal; using DotNetNuke.Services.Localization; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -42,10 +47,23 @@ public class StandardFolderProviderTests [TestFixtureSetUp] public void FixtureSetup() { - var navigationManagerMock = new Mock(); - var containerMock = new Mock(); - containerMock.Setup(x => x.GetService(typeof(INavigationManager))).Returns(navigationManagerMock.Object); - Globals.DependencyProvider = containerMock.Object; + var serviceCollection = new ServiceCollection(); + + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + + var navigationManagerMock = new Mock(); + + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(container => navigationManagerMock.Object); + + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TestFixtureTearDown] + public void FixtureTearDown() + { + Globals.DependencyProvider = null; } [SetUp] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs index 1e76702fa13..e4cd277731a 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs @@ -11,7 +11,8 @@ namespace DotNetNuke.Tests.Core.Services.Mobile using System.Reflection; using System.Web; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.ComponentModel; @@ -25,7 +26,8 @@ namespace DotNetNuke.Tests.Core.Services.Mobile using DotNetNuke.Services.Mobile; using DotNetNuke.Tests.Core.Services.ClientCapability; using DotNetNuke.Tests.Instance.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; @@ -109,11 +111,14 @@ public void SetUp() { dataProviderField.SetValue(tabController, this._dataProvider.Object); } + + } [TearDown] public void TearDown() { + Globals.DependencyProvider = null; TestableGlobals.ClearInstance(); PortalController.ClearInstance(); CachingProvider.Instance().PurgeCache(); @@ -476,11 +481,18 @@ public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Para private void SetupContianer() { - var navigationManagerMock = new Mock(); - navigationManagerMock.Setup(x => x.NavigateURL(It.IsAny())).Returns(x => this.NavigateUrl(x)); - var containerMock = new Mock(); - containerMock.Setup(x => x.GetService(typeof(INavigationManager))).Returns(navigationManagerMock.Object); - Globals.DependencyProvider = containerMock.Object; + var serviceCollection = new ServiceCollection(); + + var mockNavigationManager = new Mock(); + mockNavigationManager.Setup(x => x.NavigateURL(It.IsAny())).Returns(x => this.NavigateUrl(x)); + + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + + serviceCollection.AddTransient(container => mockNavigationManager.Object); + serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } private void SetupDataProvider() diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config b/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config index fc659db1e84..a74abce4b51 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/packages.config @@ -1,5 +1,7 @@  + + diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj index 238a681f5fb..14034c7b66d 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/DotNetNuke.Tests.Web.Mvc.csproj @@ -120,6 +120,10 @@ + + {6928A9B1-F88A-4581-A132-D3EB38669BB0} + DotNetNuke.Abstractions + {0fca217a-5f9a-4f5b-a31b-86d64ae65198} DotNetNuke.DependencyInjection diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/ModuleDelegatingViewEngineTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/ModuleDelegatingViewEngineTests.cs index 38b77160d60..d655c04d491 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/ModuleDelegatingViewEngineTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/ModuleDelegatingViewEngineTests.cs @@ -5,15 +5,19 @@ namespace DotNetNuke.Tests.Web.Mvc.Framework { using System.Linq; - using System.Web.Mvc; - + using System.Web.Mvc; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Web.Mvc.Framework; using DotNetNuke.Web.Mvc.Framework.Controllers; using DotNetNuke.Web.Mvc.Framework.Modules; using DotNetNuke.Web.Mvc.Routing; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -23,7 +27,13 @@ public class ModuleDelegatingViewEngineTests public void Setup() { var services = new ServiceCollection(); - services.AddSingleton(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + + services.AddTransient(container => mockApplicationStatusInfo.Object); + services.AddTransient(container => Mock.Of()); + services.AddSingleton(); + Globals.DependencyProvider = services.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Modules/ModuleApplicationTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Modules/ModuleApplicationTests.cs index af71811a030..286e158174a 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Modules/ModuleApplicationTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web.Mvc/Framework/Modules/ModuleApplicationTests.cs @@ -5,17 +5,21 @@ namespace DotNetNuke.Tests.Web.Mvc.Framework.Modules { using System; - using System.Web; + using System.Web.Mvc; - using System.Web.Routing; - + using System.Web.Routing; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Entities.Modules; using DotNetNuke.UI.Modules; using DotNetNuke.Web.Mvc.Framework.Controllers; using DotNetNuke.Web.Mvc.Framework.Modules; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -28,7 +32,13 @@ public class ModuleApplicationTests public void Setup() { var services = new ServiceCollection(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + + services.AddTransient(container => mockApplicationStatusInfo.Object); + services.AddTransient(container => Mock.Of()); services.AddSingleton(); + Globals.DependencyProvider = services.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/PortalAliasRouteManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/PortalAliasRouteManagerTests.cs index 064c87384f2..15a2a50c38d 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/PortalAliasRouteManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/PortalAliasRouteManagerTests.cs @@ -9,12 +9,17 @@ namespace DotNetNuke.Tests.Web.Api using System.Collections.Generic; using System.Linq; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.Entities.Portals; - using DotNetNuke.Web.Api; + using DotNetNuke.Web.Api; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; [TestFixture] @@ -23,15 +28,21 @@ public class PortalAliasRouteManagerTests [SetUp] public void SetUp() { - var navigationManagerMock = new Mock(); - var containerMock = new Mock(); - containerMock.Setup(x => x.GetService(typeof(INavigationManager))).Returns(navigationManagerMock.Object); - Globals.DependencyProvider = containerMock.Object; + var services = new ServiceCollection(); + var navigationManagerMock = new Mock(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + + services.AddTransient(container => mockApplicationStatusInfo.Object); + services.AddScoped(typeof(INavigationManager), (x) => navigationManagerMock.Object); + + Globals.DependencyProvider = services.BuildServiceProvider(); } [TearDown] public void TearDown() { + Globals.DependencyProvider = null; PortalController.ClearInstance(); PortalAliasController.ClearInstance(); TestableGlobals.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/ServiceRoutingManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/ServiceRoutingManagerTests.cs index 2a5d8921ba8..a38296883e1 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/ServiceRoutingManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/Api/ServiceRoutingManagerTests.cs @@ -2,227 +2,230 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Web.Api -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Linq; - using System.Web.Routing; - - using DotNetNuke.Abstractions; - using DotNetNuke.Common; - using DotNetNuke.DependencyInjection; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Framework.Internal.Reflection; - using DotNetNuke.Framework.Reflections; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using ServicesRoutingManager = DotNetNuke.Web.Api.Internal.ServicesRoutingManager; - - [TestFixture] - public class ServiceRoutingManagerTests - { - // ReSharper disable UnusedMember.Local - private readonly List _emptyStringArrays = new List - { null, new string[0], new[] { string.Empty }, new string[] { null } }; - - // ReSharper restore UnusedMember.Local - private Mock _mockPortalController; - private IPortalController _portalController; - - [SetUp] - public void Setup() - { - FakeServiceRouteMapper.RegistrationCalls = 0; - - this._mockPortalController = new Mock(); - this._portalController = this._mockPortalController.Object; - PortalController.SetTestableInstance(this._portalController); - - var navigationManagerMock = new Mock(); - var services = new ServiceCollection(); - services.AddScoped(typeof(INavigationManager), (x) => navigationManagerMock.Object); - Globals.DependencyProvider = services.BuildServiceProvider(); - } - - [TearDown] - public void TearDown() - { - PortalController.ClearInstance(); - - if (Globals.DependencyProvider is IDisposable disposable) - { - disposable.Dispose(); - } - - Globals.DependencyProvider = null; - } - - [Test] - public void LocatesAllServiceRouteMappers() - { - var assemblyLocator = new Mock(); - - // including the assembly with object ensures that the assignabliity is done correctly - var assembliesToReflect = new IAssembly[2]; - assembliesToReflect[0] = new AssemblyWrapper(this.GetType().Assembly); - assembliesToReflect[1] = new AssemblyWrapper(typeof(object).Assembly); - - assemblyLocator.Setup(x => x.Assemblies).Returns(assembliesToReflect); - - var locator = new TypeLocator { AssemblyLocator = assemblyLocator.Object }; - - List types = locator.GetAllMatchingTypes(ServicesRoutingManager.IsValidServiceRouteMapper).ToList(); - - // if new ServiceRouteMapper classes are added to the assembly they willl likely need to be added here - CollectionAssert.AreEquivalent( - new[] - { - typeof(FakeServiceRouteMapper), - typeof(ReflectedServiceRouteMappers.EmbeddedServiceRouteMapper), - typeof(ExceptionOnCreateInstanceServiceRouteMapper), - typeof(ExceptionOnRegisterServiceRouteMapper), - }, types); - } - - [Test] - public void NameSpaceRequiredOnMapRouteCalls([ValueSource("_emptyStringArrays")] string[] namespaces) - { - var srm = new ServicesRoutingManager(new RouteCollection()); - - Assert.Throws(() => srm.MapHttpRoute("usm", "default", "url", null, namespaces)); - } - - [Test] - public void RegisterRoutesIsCalledOnAllServiceRouteMappersEvenWhenSomeThrowExceptions() - { - FakeServiceRouteMapper.RegistrationCalls = 0; - var assembly = new Mock(); - assembly.Setup(x => x.GetTypes()).Returns(new[] - { - typeof(ExceptionOnRegisterServiceRouteMapper), - typeof(ExceptionOnCreateInstanceServiceRouteMapper), - typeof(FakeServiceRouteMapper), - }); - var al = new Mock(); - al.Setup(x => x.Assemblies).Returns(new[] { assembly.Object }); - var tl = new TypeLocator { AssemblyLocator = al.Object }; - var srm = new ServicesRoutingManager(new RouteCollection()) { TypeLocator = tl }; - - srm.RegisterRoutes(); - - Assert.AreEqual(1, FakeServiceRouteMapper.RegistrationCalls); - } - - [Test] - public void RegisterRoutesIsCalledOnServiceRouteMappers() - { - FakeServiceRouteMapper.RegistrationCalls = 0; - var assembly = new Mock(); - assembly.Setup(x => x.GetTypes()).Returns(new[] { typeof(FakeServiceRouteMapper) }); - var al = new Mock(); - al.Setup(x => x.Assemblies).Returns(new[] { assembly.Object }); - var tl = new TypeLocator { AssemblyLocator = al.Object }; - var srm = new ServicesRoutingManager(new RouteCollection()) { TypeLocator = tl }; - - srm.RegisterRoutes(); - - Assert.AreEqual(1, FakeServiceRouteMapper.RegistrationCalls); - } - - [Test] - [TestCase("")] - [TestCase(null)] - public void UniqueNameRequiredOnMapRouteCalls(string uniqueName) - { - var srm = new ServicesRoutingManager(new RouteCollection()); - - Assert.Throws(() => srm.MapHttpRoute(uniqueName, "default", "url", null, new[] { "foo" })); - } - - [Test] - public void UrlCanStartWithSlash() - { - // Arrange - this._mockPortalController.Setup(x => x.GetPortals()).Returns(new ArrayList()); - - // Act - var srm = new ServicesRoutingManager(new RouteCollection()); - - // Assert - Assert.DoesNotThrow(() => srm.MapHttpRoute("name", "default", "/url", null, new[] { "foo" })); - } - - [Test] - public void NameIsInsertedInRouteDataTokens() - { - // Arrange - var portalInfo = new ArrayList { new PortalInfo { PortalID = 0 } }; - this._mockPortalController.Setup(x => x.GetPortals()).Returns(portalInfo); - var mockPac = new Mock(); - mockPac.Setup(x => x.GetPortalAliasesByPortalId(0)).Returns(new[] { new PortalAliasInfo { HTTPAlias = "www.foo.com" } }); - PortalAliasController.SetTestableInstance(mockPac.Object); - - var routeCollection = new RouteCollection(); - var srm = new ServicesRoutingManager(routeCollection); - - // Act - srm.MapHttpRoute("folder", "default", "url", new[] { "foo" }); - - // Assert - var route = (Route)routeCollection[0]; - Assert.AreEqual("folder-default-0", route.DataTokens["Name"]); - } - - [Test] - public void TwoRoutesOnTheSameFolderHaveSimilarNames() - { - // Arrange - var portalInfo = new ArrayList { new PortalInfo { PortalID = 0 } }; - this._mockPortalController.Setup(x => x.GetPortals()).Returns(portalInfo); - var mockPac = new Mock(); - mockPac.Setup(x => x.GetPortalAliasesByPortalId(0)).Returns(new[] { new PortalAliasInfo { HTTPAlias = "www.foo.com" } }); - PortalAliasController.SetTestableInstance(mockPac.Object); - - var routeCollection = new RouteCollection(); - var srm = new ServicesRoutingManager(routeCollection); - - // Act - srm.MapHttpRoute("folder", "default", "url", new[] { "foo" }); - srm.MapHttpRoute("folder", "another", "alt/url", new[] { "foo" }); - - // Assert - var route = (Route)routeCollection[0]; - Assert.AreEqual("folder-default-0", route.DataTokens["Name"]); - route = (Route)routeCollection[1]; - Assert.AreEqual("folder-default-0-old", route.DataTokens["Name"]); - } - - [Test] - public void RoutesShouldHaveBackwardCompability() - { - // Arrange - var portalInfo = new ArrayList { new PortalInfo { PortalID = 0 } }; - this._mockPortalController.Setup(x => x.GetPortals()).Returns(portalInfo); - var mockPac = new Mock(); - mockPac.Setup(x => x.GetPortalAliasesByPortalId(0)).Returns(new[] { new PortalAliasInfo { HTTPAlias = "www.foo.com" } }); - PortalAliasController.SetTestableInstance(mockPac.Object); - - var routeCollection = new RouteCollection(); - var srm = new ServicesRoutingManager(routeCollection); - - // Act - srm.MapHttpRoute("folder", "default", "url", new[] { "foo" }); - - // Assert - var route = (Route)routeCollection[0]; - Assert.AreEqual("folder-default-0", route.DataTokens["Name"]); - route = (Route)routeCollection[1]; - Assert.AreEqual("folder-default-0-old", route.DataTokens["Name"]); - Assert.IsTrue(route.Url.StartsWith("DesktopModules")); - } - } -} +namespace DotNetNuke.Tests.Web.Api +{ + using System; + using System.Collections; + using System.Collections.Generic; + using System.Linq; + using System.Web.Routing; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Framework.Internal.Reflection; + using DotNetNuke.Framework.Reflections; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; + + using ServicesRoutingManager = DotNetNuke.Web.Api.Internal.ServicesRoutingManager; + + [TestFixture] + public class ServiceRoutingManagerTests + { + // ReSharper disable UnusedMember.Local + private readonly List _emptyStringArrays = new List + { null, new string[0], new[] { string.Empty }, new string[] { null } }; + + // ReSharper restore UnusedMember.Local + private Mock _mockPortalController; + private IPortalController _portalController; + + [SetUp] + public void Setup() + { + FakeServiceRouteMapper.RegistrationCalls = 0; + + this._mockPortalController = new Mock(); + this._portalController = this._mockPortalController.Object; + PortalController.SetTestableInstance(this._portalController); + + var services = new ServiceCollection(); + var navigationManagerMock = new Mock(); + var mockApplicationStatusInfo = new Mock(); + mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); + services.AddTransient(container => mockApplicationStatusInfo.Object); + services.AddScoped(typeof(INavigationManager), (x) => navigationManagerMock.Object); + Globals.DependencyProvider = services.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + PortalController.ClearInstance(); + + if (Globals.DependencyProvider is IDisposable disposable) + { + disposable.Dispose(); + } + + Globals.DependencyProvider = null; + } + + [Test] + public void LocatesAllServiceRouteMappers() + { + var assemblyLocator = new Mock(); + + // including the assembly with object ensures that the assignabliity is done correctly + var assembliesToReflect = new IAssembly[2]; + assembliesToReflect[0] = new AssemblyWrapper(this.GetType().Assembly); + assembliesToReflect[1] = new AssemblyWrapper(typeof(object).Assembly); + + assemblyLocator.Setup(x => x.Assemblies).Returns(assembliesToReflect); + + var locator = new TypeLocator { AssemblyLocator = assemblyLocator.Object }; + + List types = locator.GetAllMatchingTypes(ServicesRoutingManager.IsValidServiceRouteMapper).ToList(); + + // if new ServiceRouteMapper classes are added to the assembly they willl likely need to be added here + CollectionAssert.AreEquivalent( + new[] + { + typeof(FakeServiceRouteMapper), + typeof(ReflectedServiceRouteMappers.EmbeddedServiceRouteMapper), + typeof(ExceptionOnCreateInstanceServiceRouteMapper), + typeof(ExceptionOnRegisterServiceRouteMapper), + }, types); + } + + [Test] + public void NameSpaceRequiredOnMapRouteCalls([ValueSource("_emptyStringArrays")] string[] namespaces) + { + var srm = new ServicesRoutingManager(new RouteCollection()); + + Assert.Throws(() => srm.MapHttpRoute("usm", "default", "url", null, namespaces)); + } + + [Test] + public void RegisterRoutesIsCalledOnAllServiceRouteMappersEvenWhenSomeThrowExceptions() + { + FakeServiceRouteMapper.RegistrationCalls = 0; + var assembly = new Mock(); + assembly.Setup(x => x.GetTypes()).Returns(new[] + { + typeof(ExceptionOnRegisterServiceRouteMapper), + typeof(ExceptionOnCreateInstanceServiceRouteMapper), + typeof(FakeServiceRouteMapper), + }); + var al = new Mock(); + al.Setup(x => x.Assemblies).Returns(new[] { assembly.Object }); + var tl = new TypeLocator { AssemblyLocator = al.Object }; + var srm = new ServicesRoutingManager(new RouteCollection()) { TypeLocator = tl }; + + srm.RegisterRoutes(); + + Assert.AreEqual(1, FakeServiceRouteMapper.RegistrationCalls); + } + + [Test] + public void RegisterRoutesIsCalledOnServiceRouteMappers() + { + FakeServiceRouteMapper.RegistrationCalls = 0; + var assembly = new Mock(); + assembly.Setup(x => x.GetTypes()).Returns(new[] { typeof(FakeServiceRouteMapper) }); + var al = new Mock(); + al.Setup(x => x.Assemblies).Returns(new[] { assembly.Object }); + var tl = new TypeLocator { AssemblyLocator = al.Object }; + var srm = new ServicesRoutingManager(new RouteCollection()) { TypeLocator = tl }; + + srm.RegisterRoutes(); + + Assert.AreEqual(1, FakeServiceRouteMapper.RegistrationCalls); + } + + [Test] + [TestCase("")] + [TestCase(null)] + public void UniqueNameRequiredOnMapRouteCalls(string uniqueName) + { + var srm = new ServicesRoutingManager(new RouteCollection()); + + Assert.Throws(() => srm.MapHttpRoute(uniqueName, "default", "url", null, new[] { "foo" })); + } + + [Test] + public void UrlCanStartWithSlash() + { + // Arrange + this._mockPortalController.Setup(x => x.GetPortals()).Returns(new ArrayList()); + + // Act + var srm = new ServicesRoutingManager(new RouteCollection()); + + // Assert + Assert.DoesNotThrow(() => srm.MapHttpRoute("name", "default", "/url", null, new[] { "foo" })); + } + + [Test] + public void NameIsInsertedInRouteDataTokens() + { + // Arrange + var portalInfo = new ArrayList { new PortalInfo { PortalID = 0 } }; + this._mockPortalController.Setup(x => x.GetPortals()).Returns(portalInfo); + var mockPac = new Mock(); + mockPac.Setup(x => x.GetPortalAliasesByPortalId(0)).Returns(new[] { new PortalAliasInfo { HTTPAlias = "www.foo.com" } }); + PortalAliasController.SetTestableInstance(mockPac.Object); + + var routeCollection = new RouteCollection(); + var srm = new ServicesRoutingManager(routeCollection); + + // Act + srm.MapHttpRoute("folder", "default", "url", new[] { "foo" }); + + // Assert + var route = (Route)routeCollection[0]; + Assert.AreEqual("folder-default-0", route.DataTokens["Name"]); + } + + [Test] + public void TwoRoutesOnTheSameFolderHaveSimilarNames() + { + // Arrange + var portalInfo = new ArrayList { new PortalInfo { PortalID = 0 } }; + this._mockPortalController.Setup(x => x.GetPortals()).Returns(portalInfo); + var mockPac = new Mock(); + mockPac.Setup(x => x.GetPortalAliasesByPortalId(0)).Returns(new[] { new PortalAliasInfo { HTTPAlias = "www.foo.com" } }); + PortalAliasController.SetTestableInstance(mockPac.Object); + + var routeCollection = new RouteCollection(); + var srm = new ServicesRoutingManager(routeCollection); + + // Act + srm.MapHttpRoute("folder", "default", "url", new[] { "foo" }); + srm.MapHttpRoute("folder", "another", "alt/url", new[] { "foo" }); + + // Assert + var route = (Route)routeCollection[0]; + Assert.AreEqual("folder-default-0", route.DataTokens["Name"]); + route = (Route)routeCollection[1]; + Assert.AreEqual("folder-default-0-old", route.DataTokens["Name"]); + } + + [Test] + public void RoutesShouldHaveBackwardCompability() + { + // Arrange + var portalInfo = new ArrayList { new PortalInfo { PortalID = 0 } }; + this._mockPortalController.Setup(x => x.GetPortals()).Returns(portalInfo); + var mockPac = new Mock(); + mockPac.Setup(x => x.GetPortalAliasesByPortalId(0)).Returns(new[] { new PortalAliasInfo { HTTPAlias = "www.foo.com" } }); + PortalAliasController.SetTestableInstance(mockPac.Object); + + var routeCollection = new RouteCollection(); + var srm = new ServicesRoutingManager(routeCollection); + + // Act + srm.MapHttpRoute("folder", "default", "url", new[] { "foo" }); + + // Assert + var route = (Route)routeCollection[0]; + Assert.AreEqual("folder-default-0", route.DataTokens["Name"]); + route = (Route)routeCollection[1]; + Assert.AreEqual("folder-default-0-old", route.DataTokens["Name"]); + Assert.IsTrue(route.Url.StartsWith("DesktopModules")); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs index 9c7ce458aff..875786e47d6 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs @@ -2,724 +2,733 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Web.InternalServices -{ - using System; - using System.Collections.Generic; - using System.Data; - using System.IO; - using System.Linq; - using System.Net.Http; - using System.Web.Http; - using System.Web.Http.Hosting; - - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; - using DotNetNuke.Data; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Portals.Data; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Search.Entities; - using DotNetNuke.Services.Search.Internals; - using DotNetNuke.Tests.Utilities.Mocks; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.InternalServices; - using DotNetNuke.Web.InternalServices.Views.Search; - using Moq; - using NUnit.Framework; - - using Constants = DotNetNuke.Services.Search.Internals.Constants; - - /// - /// Testing grouping logic of GetGroupedBasicView and GetGroupedDetailView (SearchServiceController methods). - /// - [TestFixture] - public class SearchServiceControllerTests - { - private const int ModuleSearchTypeId = 1; - private const int TabSearchTypeId = 2; - private const int UserSearchTypeId = 3; - private const int UrlSearchTypeId = 5; - private const int PortalId0 = 0; - private const int HtmlModuleDefId = 20; - private const int HtmlModuleId = 25; - private const int RoleId731 = 731; - private const int RoleId0 = 0; - private const int HtmlModDefId = 116; - private const int TabId1 = 56; - private const int HtmlModuleId1 = 367; - private const int HtmlModuleId2 = 368; - private const int HtmlModuleId3 = 370; - private const string HtmlModuleTitle1 = "TitleWelcome"; - private const string HtmlModuleTitle2 = "TitleProducts"; - private const string HtmlModuleTitle3 = "TitleServices"; - private const int TabId2 = 57; - private const string HtmlModuleTitle4 = "TitleAboutUs"; - private const int HtmlModuleId4 = 378; - private const int UserId1 = 1; - private const string UserName1 = "User1"; - - private const string UserSearchTypeName = "user"; - private const string TabSearchTypeName = "tab"; - private const string UrlSearchTypeName = "url"; - - private const string FakeResultControllerClass = "DotNetNuke.Tests.Web.InternalServices.FakeResultController, DotNetNuke.Tests.Web"; - - private const string CultureEnUs = "en-US"; - - private const string SearchIndexFolder = @"App_Data\SearchTests"; - private const int DefaultSearchRetryTimes = 5; - - private readonly double _readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; - private Mock _mockCBO; - private Mock _mockHostController; - private Mock _mockCachingProvider; - private Mock _mockDataProvider; - private Mock _mockLocaleController; - private Mock _mockDataService; - private Mock _mockUserController; - private Mock _mockModuleController; - private Mock _mockTabController; - private SearchServiceController _searchServiceController; - private IInternalSearchController _internalSearchController; - private LuceneControllerImpl _luceneController; - - [SetUp] - public void SetUp() - { - // Arrange - ComponentFactory.Container = new SimpleContainer(); - MockComponentProvider.ResetContainer(); - - this._mockDataProvider = MockComponentProvider.CreateDataProvider(); - this._mockLocaleController = MockComponentProvider.CreateLocaleController(); - this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); - this._mockDataService = new Mock(); - this._mockUserController = new Mock(); - this._mockModuleController = new Mock(); - this._mockTabController = new Mock(); - this._mockHostController = new Mock(); - - this.SetupDataProvider(); - this.SetupHostController(); - this.SetupUserController(); - this.SetupPortalSettings(); - this.SetupModuleController(); - this.DeleteIndexFolder(); - - TabController.SetTestableInstance(this._mockTabController.Object); - this._internalSearchController = InternalSearchController.Instance; - - this._mockCBO = new Mock(); - var tabKey = string.Format("{0}-{1}", TabSearchTypeId, 0); - var userKey = string.Format("{0}-{1}", UserSearchTypeId, 0); - this._mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new Dictionary() { { tabKey, TabSearchTypeName }, { userKey, UserSearchTypeName } }); - CBO.SetTestableInstance(this._mockCBO.Object); - - // create instance of the SearchServiceController - var request = new HttpRequestMessage(); - var configuration = new HttpConfiguration(); - var provider = new Mock(); - ModuleInfo expectedModule; - provider.Setup(x => x.TryFindModuleInfo(request, out expectedModule)).Returns(true); - configuration.AddTabAndModuleInfoProvider(provider.Object); - request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; - this._searchServiceController = new SearchServiceController(HtmlModDefId) { Request = request }; - - this.CreateNewLuceneControllerInstance(); - } - - [TearDown] - public void TearDown() - { - this._luceneController.Dispose(); - this.DeleteIndexFolder(); - CBO.ClearInstance(); - TabController.ClearInstance(); - InternalSearchController.ClearInstance(); - UserController.ClearInstance(); - PortalController.ClearInstance(); - ModuleController.ClearInstance(); - } - - [Test] - public void GetSearchResultsDetailed() - { - const string keyword = "super"; - const string moduleBody = "super content is here"; - const string userUrl = "mysite/userid/1"; - const string tabUrl1 = "mysite/Home"; - const string tabUrl2 = "mysite/AboutUs"; - - // first tab with 2 modules - var doc1 = new SearchDocument { UniqueKey = "key01", TabId = TabId1, Url = tabUrl1, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - var doc2 = new SearchDocument { UniqueKey = "key02", TabId = TabId1, Title = keyword, Url = tabUrl1, SearchTypeId = ModuleSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, ModuleDefId = HtmlModuleDefId, ModuleId = HtmlModuleId2, Body = moduleBody, RoleId = 731 }; - var doc3 = new SearchDocument { UniqueKey = "key03", TabId = TabId1, Title = keyword, Url = tabUrl1, SearchTypeId = ModuleSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, ModuleDefId = HtmlModuleDefId, ModuleId = HtmlModuleId1, Body = moduleBody, RoleId = 731 }; - - // second tab with 1 module - var doc4 = new SearchDocument { UniqueKey = "key04", TabId = TabId2, Url = tabUrl2, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, RoleId = RoleId0 }; - var doc5 = new SearchDocument { UniqueKey = "key05", TabId = TabId2, Title = keyword, Url = tabUrl2, SearchTypeId = ModuleSearchTypeId, ModuleDefId = HtmlModuleId, ModuleId = HtmlModuleId3, ModifiedTimeUtc = DateTime.UtcNow, Body = moduleBody, RoleId = 731 }; - - // user doc - var userdoc = new SearchDocument { UniqueKey = "key06", Url = userUrl, Title = keyword, SearchTypeId = UserSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, RoleId = RoleId731 }; - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.AddSearchDocument(doc4); - this._internalSearchController.AddSearchDocument(doc5); - this._internalSearchController.AddSearchDocument(userdoc); - - var query = new SearchQuery - { - KeyWords = keyword, - SearchTypeIds = new[] { ModuleSearchTypeId, TabSearchTypeId, UserSearchTypeId }, - RoleId = 731, - }; - - // Run - var search = this.GetGroupedDetailViewResults(query); - - // Assert - var groupedDetailViews = search as List ?? search.ToList(); - - // Overall 3 groups - tab1, tab2 and user - Assert.AreEqual(3, groupedDetailViews.Count()); - - // Tab 1 has 2 DetailViews - Assert.AreEqual(2, groupedDetailViews.Single(x => x.DocumentUrl == tabUrl1).Results.Count()); - - // Tab 2 has 1 DetailViews - Assert.AreEqual(1, groupedDetailViews.Single(x => x.DocumentUrl == tabUrl2).Results.Count()); - - // UserUrl has 1 DetailViews - Assert.AreEqual(1, groupedDetailViews.Single(x => x.DocumentUrl == userUrl).Results.Count()); - } - - [Test] - public void GetSearchResultsBasic() - { - const string keyword = "awesome"; - const string userUrl = "mysite/userid/1"; - const string tabUrl1 = "mysite/Home"; - const string tabUrl2 = "mysite/AboutUs"; - - var now = DateTime.UtcNow; - var doc1 = new SearchDocument { UniqueKey = "key01", TabId = TabId1, Url = tabUrl1, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId731 }; - var doc2 = new SearchDocument { UniqueKey = "key02", TabId = TabId2, Url = tabUrl2, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId0 }; - var userdoc = new SearchDocument { UniqueKey = "key03", Url = userUrl, Title = keyword, SearchTypeId = UserSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId0 }; - - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(userdoc); - this._internalSearchController.Commit(); - - var query = new SearchQuery - { - KeyWords = keyword, - PortalIds = new List { PortalId0 }, - SearchTypeIds = new[] { ModuleSearchTypeId, TabSearchTypeId, UserSearchTypeId }, - BeginModifiedTimeUtc = now.AddMinutes(-1), - EndModifiedTimeUtc = now.AddMinutes(+1), - PageIndex = 1, - PageSize = 15, - SortField = 0, - TitleSnippetLength = 120, - BodySnippetLength = 300, - WildCardSearch = true, - }; - - // Run - var search = this.GetGroupBasicViewResults(query); - - // Assert - overall 2 groups: tabs and users - var groupedBasicViews = search as List ?? search.ToList(); - Assert.AreEqual(2, groupedBasicViews.Count()); - - // 1 User results - Assert.AreEqual(1, groupedBasicViews.Single(x => x.DocumentTypeName == "user").Results.Count()); - - // User result should have 1 attribute(avatar) - Assert.AreEqual(1, groupedBasicViews.Single(x => x.DocumentTypeName == "user").Results.ElementAt(0).Attributes.Count()); - - // 2 Tabs results - Assert.AreEqual(2, groupedBasicViews.Single(x => x.DocumentTypeName == "tab").Results.Count()); - } - - [Test] - public void ModifyingDocumentsDoesNotCreateDuplicates() - { - // Arrange - const string tabUrl = "mysite/ContentUrl"; - const string title = "content title"; - const string contentBody = "content body"; - const string titleModified = title + " modified"; - var uniqueKey = Guid.NewGuid().ToString(); - var now = DateTime.UtcNow; - - var originalDocument = new SearchDocument - { - UniqueKey = uniqueKey, - TabId = TabId1, - Url = tabUrl, - Title = title, - Body = contentBody, - SearchTypeId = TabSearchTypeId, - ModifiedTimeUtc = now, - PortalId = PortalId0, - RoleId = RoleId731, - Keywords = { { "description", "mycontent" } }, - NumericKeys = { { "points", 5 } }, - }; - - this._internalSearchController.AddSearchDocument(originalDocument); - this._internalSearchController.Commit(); - - var modifiedDocument = new SearchDocument - { - UniqueKey = uniqueKey, - TabId = TabId1, - Url = tabUrl, - Title = titleModified, - Body = contentBody + " modified", - SearchTypeId = TabSearchTypeId, - ModifiedTimeUtc = now, - PortalId = PortalId0, - RoleId = RoleId731, - Keywords = { { "description", "mycontent_modified" }, { "description2", "mycontent_modified" } }, - NumericKeys = { { "points", 8 }, { "point2", 7 } }, - }; - - this._internalSearchController.AddSearchDocument(modifiedDocument); - this._internalSearchController.Commit(); - - var query = new SearchQuery - { - KeyWords = title, - PortalIds = new List { PortalId0 }, - SearchTypeIds = new[] { ModuleSearchTypeId, TabSearchTypeId, UserSearchTypeId }, - BeginModifiedTimeUtc = now.AddMinutes(-1), - EndModifiedTimeUtc = now.AddMinutes(+1), - PageIndex = 1, - PageSize = 15, - SortField = 0, - TitleSnippetLength = 120, - BodySnippetLength = 300, - WildCardSearch = true, - }; - - // Run - var searchResults = this.GetGroupedDetailViewResults(query).ToList(); - - // Assert - Assert.AreEqual(1, searchResults.Count()); - Assert.AreEqual(1, searchResults.First().Results.Count); - Assert.AreEqual(tabUrl, searchResults.First().Results.First().DocumentUrl); - Assert.AreEqual(titleModified, searchResults.First().Results.First().Title); - } - - private void CreateNewLuceneControllerInstance() - { - if (this._luceneController != null) - { - LuceneController.ClearInstance(); - this._luceneController.Dispose(); - } - - this._luceneController = new LuceneControllerImpl(); - LuceneController.SetTestableInstance(this._luceneController); - } - - private void SetupUserController() - { - this._mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())).Returns( - new UserInfo { UserID = UserId1, Username = UserName1, Profile = new UserProfile { } }); - UserController.SetTestableInstance(this._mockUserController.Object); - } - - private void SetupHostController() - { - this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns( - SearchIndexFolder); - this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())). - Returns(this._readerStaleTimeSpan); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns( - Constants.DefaultSearchTitleBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns( - Constants.DefaultSearchTagBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns( - Constants.DefaultSearchKeywordBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())). - Returns(Constants.DefaultSearchDescriptionBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns( - Constants.DefaultSearchAuthorBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns( - Constants.DefaultMinLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns( - Constants.DefaultMaxLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns( - DefaultSearchRetryTimes); - HostController.RegisterInstance(this._mockHostController.Object); - } - - private void SetupDataProvider() - { - // Standard DataProvider Path for Logging - this._mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - - this._mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); - this._mockDataProvider.Setup(d => d.GetSearchModules(It.IsAny())).Returns(this.GetSearchModules); - this._mockDataProvider.Setup(d => d.GetModuleDefinitions()).Returns(this.GetModuleDefinitions); - this._mockDataProvider.Setup(d => d.GetAllSearchTypes()).Returns(this.GetAllSearchTypes); - this._mockDataProvider.Setup(d => d.GetUser(It.IsAny(), It.IsAny())).Returns(this.GetUser); - this._mockDataProvider.Setup(d => d.GetTabs(It.IsAny())).Returns(this.GetTabs); - this._mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(this.GetPortalGroups); - - DataService.RegisterInstance(this._mockDataService.Object); - } - - private void SetupPortalSettings() - { - var mockPortalController = new Mock(); - mockPortalController.Setup(x => x.GetPortal(It.IsAny())).Returns(new PortalInfo { PortalID = PortalId0, PortalGroupID = -1, UserTabId = TabId1, }); - PortalController.SetTestableInstance(mockPortalController.Object); - } - - private void SetupModuleController() - { - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId1), It.Is(p => p == PortalId0), false)).Returns( - new ModuleInfo { ModuleID = HtmlModuleId1, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle1 }); - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId2), It.Is(p => p == PortalId0), false)).Returns( - new ModuleInfo { ModuleID = HtmlModuleId2, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle2 }); - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId3), It.Is(p => p == PortalId0), false)).Returns( - new ModuleInfo { ModuleID = HtmlModuleId3, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle3 }); - - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId4), It.Is(p => p == PortalId0), false)).Returns( - new ModuleInfo { ModuleID = HtmlModuleId4, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle4 }); - ModuleController.SetTestableInstance(this._mockModuleController.Object); - } - - private void DeleteIndexFolder() - { - try - { - if (Directory.Exists(SearchIndexFolder)) - { - Directory.Delete(SearchIndexFolder, true); - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } - - private IDataReader GetUser() - { - var table = new DataTable("Users"); - table.Columns.Add("UserID", typeof(int)); - table.Columns.Add("PortalId", typeof(int)); - table.Columns.Add("UserName", typeof(string)); - table.Columns.Add("FirstName", typeof(string)); - table.Columns.Add("LastName", typeof(string)); - table.Columns.Add("DisplayName", typeof(string)); - table.Columns.Add("IsSuperUser", typeof(byte)); - table.Columns.Add("Email", typeof(string)); - table.Columns.Add("VanityUrl", typeof(string)); - table.Columns.Add("AffiliateId", typeof(int)); - table.Columns.Add("IsDeleted", typeof(byte)); - table.Columns.Add("RefreshRoles", typeof(byte)); - table.Columns.Add("LastIPAddress", typeof(string)); - table.Columns.Add("UpdatePassword", typeof(byte)); - table.Columns.Add("PasswordResetToken", typeof(Guid)); - table.Columns.Add("PasswordResetExpiration", typeof(DateTime)); - table.Columns.Add("Authorised", typeof(byte)); - - table.Columns.Add("CreatedByUserID", typeof(int)); - table.Columns.Add("CreatedOnDate", typeof(DateTime)); - table.Columns.Add("LastModifiedByUserID", typeof(int)); - table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - - table.Rows.Add(1, null, UserName1, UserName1, UserName1, UserName1, 1, "host@changeme.invalid", null, null, 0, null, - "127.0.0.1", 0, "8D3C800F-7A40-45D6-BA4D-E59A393F9800", DateTime.Now, null, -1, DateTime.Now, - -1, DateTime.Now); - return table.CreateDataReader(); - } - - private IDataReader GetPortalGroups() - { - var table = new DataTable("ModuleDefinitions"); - var pkId = table.Columns.Add("PortalGroupID", typeof(int)); - table.Columns.Add("MasterPortalID", typeof(int)); - table.Columns.Add("PortalGroupName", typeof(string)); - table.Columns.Add("PortalGroupDescription", typeof(string)); - table.Columns.Add("AuthenticationDomain", typeof(string)); - table.Columns.Add("CreatedByUserID", typeof(int)); - table.Columns.Add("CreatedOnDate", typeof(DateTime)); - table.Columns.Add("LastModifiedByUserID", typeof(int)); - table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - table.PrimaryKey = new[] { pkId }; - - table.Rows.Add(0, 0, "test", "descr", "domain", -1, DateTime.Now, -1, DateTime.Now); - return table.CreateDataReader(); - } - - // return 2 test tabs(TabId 56 - Home, TabId 57 - AboutUs) - private IDataReader GetTabs() - { - var table = new DataTable("Tabs"); - table.Columns.Add("TabID", typeof(int)); - table.Columns.Add("TabOrder", typeof(int)); - table.Columns.Add("PortalID", typeof(int)); - table.Columns.Add("TabName", typeof(string)); - table.Columns.Add("ParentID", typeof(int)); - table.Columns.Add("Level", typeof(int)); - table.Columns.Add("TabPath", typeof(string)); - table.Columns.Add("UniqueId", typeof(Guid)); - table.Columns.Add("VersionGuid", typeof(Guid)); - table.Columns.Add("DefaultLanguageGuid", typeof(Guid)); - table.Columns.Add("LocalizedVersionGuid", typeof(Guid)); - table.Columns.Add("IsVisible", typeof(byte)); - table.Columns.Add("IconFile", typeof(string)); - table.Columns.Add("IconFileLarge", typeof(string)); - table.Columns.Add("DisableLink", typeof(byte)); - table.Columns.Add("Title", typeof(string)); - table.Columns.Add("Description", typeof(string)); - table.Columns.Add("KeyWords", typeof(string)); - table.Columns.Add("IsDeleted", typeof(byte)); - table.Columns.Add("SkinSrc", typeof(string)); - table.Columns.Add("ContainerSrc", typeof(string)); - table.Columns.Add("StartDate", typeof(DateTime)); - table.Columns.Add("EndDate", typeof(DateTime)); - table.Columns.Add("Url", typeof(string)); - table.Columns.Add("HasChildren", typeof(string)); - table.Columns.Add("RefreshInterval", typeof(int)); - table.Columns.Add("PageHeadText", typeof(string)); - table.Columns.Add("IsSecure", typeof(byte)); - table.Columns.Add("PermanentRedirect", typeof(byte)); - table.Columns.Add("SiteMapPriority", typeof(float)); - table.Columns.Add("ContentItemId", typeof(int)); - table.Columns.Add("Content", typeof(string)); - table.Columns.Add("ContentTypeID", typeof(int)); - table.Columns.Add("ModuleID", typeof(int)); - table.Columns.Add("ContentKey", typeof(string)); - table.Columns.Add("Indexed", typeof(byte)); - table.Columns.Add("StateID", typeof(int)); - table.Columns.Add("CultureCode", typeof(string)); - table.Columns.Add("CreatedByUserID", typeof(int)); - table.Columns.Add("CreatedOnDate", typeof(DateTime)); - table.Columns.Add("LastModifiedByUserID", typeof(int)); - table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - - table.Rows.Add(56, 5, 0, "Home", null, 0, "//Home", "C3174A2E-374D-4779-BE5F-BCDFF410E097", "A111A742-C18F-495D-8A23-BD0ECC70BBFE", null, "3A34424A-3CCA-4934-AE15-B9A80EB6D259", 1, null, null, 0, null, null, null, 0, "[G]Skins/Xcillion/Inner.ascx", "[G]Containers/Xcillion/NoTitle.ascx", null, null, null, "false", null, null, 0, 0, 0.5, 86, "Home", 1, -1, null, 0, null, null, -1, DateTime.Now, -1, DateTime.Now); - table.Rows.Add(57, 13, 0, "About Us", null, 0, "//AboutUs", "26A4236F-3AAA-4E15-8908-45D35675C677", "8426D3BC-E930-49CA-BDEB-4D41F194B6AC", null, "1461572D-97E8-41F8-BB1A-916DCA48890A", 1, null, null, 0, null, null, null, 0, "[G]Skins/Xcillion/Inner.ascx", "[G]Containers/Xcillion/NoTitle.ascx", null, null, null, "true", null, null, 0, 0, 0.5, 97, "About Us", 1, -1, null, 0, null, null, -1, DateTime.Now, -1, DateTime.Now); - - return table.CreateDataReader(); - } - - // return 4 html modules (TabId 56 - Home: ModuleIDs:367, 368, 370 TabId 57 - AboutUs: 378//) - private IDataReader GetSearchModules() - { - var table = new DataTable("SearchModules"); - table.Columns.Add("OwnerPortalID", typeof(int)); - table.Columns.Add("PortalID", typeof(int)); - table.Columns.Add("TabID", typeof(int)); - table.Columns.Add("TabModuleID", typeof(int)); - table.Columns.Add("ModuleID", typeof(int)); - table.Columns.Add("ModuleDefID", typeof(int)); - table.Columns.Add("ModuleOrder", typeof(int)); - table.Columns.Add("PaneName", typeof(string)); - table.Columns.Add("ModuleTitle", typeof(string)); - table.Columns.Add("CacheTime", typeof(int)); - table.Columns.Add("CacheMethod", typeof(string)); - table.Columns.Add("Alignment", typeof(string)); - table.Columns.Add("Color", typeof(string)); - table.Columns.Add("Border", typeof(string)); - table.Columns.Add("IconFile", typeof(string)); - table.Columns.Add("AllTabs", typeof(byte)); - table.Columns.Add("Visibility", typeof(int)); - table.Columns.Add("IsDeleted", typeof(byte)); - table.Columns.Add("Header", typeof(string)); - table.Columns.Add("Footer", typeof(string)); - table.Columns.Add("StartDate", typeof(DateTime)); - table.Columns.Add("EndDate", typeof(DateTime)); - table.Columns.Add("ContainerSrc", typeof(string)); - table.Columns.Add("DisplayTitle", typeof(byte)); - table.Columns.Add("DisplayPrint", typeof(byte)); - table.Columns.Add("DisplaySyndicate", typeof(byte)); - table.Columns.Add("IsWebSlice", typeof(byte)); - table.Columns.Add("WebSliceTitle", typeof(string)); - table.Columns.Add("WebSliceExpiryDate", typeof(DateTime)); - table.Columns.Add("WebSliceTTL", typeof(int)); - table.Columns.Add("InheritViewPermissions", typeof(int)); - table.Columns.Add("IsShareable", typeof(int)); - table.Columns.Add("IsShareableViewOnly", typeof(int)); - table.Columns.Add("DesktopModuleID", typeof(int)); - table.Columns.Add("DefaultCacheTime", typeof(int)); - table.Columns.Add("ModuleControlID", typeof(int)); - table.Columns.Add("BusinessControllerClass", typeof(string)); - table.Columns.Add("IsAdmin", typeof(byte)); - table.Columns.Add("SupportedFeatures", typeof(int)); - table.Columns.Add("ContentItemID", typeof(int)); - table.Columns.Add("Content", typeof(string)); - table.Columns.Add("ContentTypeID", typeof(int)); - table.Columns.Add("ContentKey", typeof(string)); - table.Columns.Add("Indexed", typeof(byte)); - table.Columns.Add("StateID", typeof(int)); - table.Columns.Add("CreatedByUserID", typeof(int)); - table.Columns.Add("CreatedOnDate", typeof(DateTime)); - table.Columns.Add("LastModifiedByUserID", typeof(int)); - table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - table.Columns.Add("LastContentModifiedOnDate", typeof(DateTime)); - table.Columns.Add("UniqueId", typeof(Guid)); - table.Columns.Add("VersionGuid", typeof(Guid)); - table.Columns.Add("defaultLanguageGuid", typeof(Guid)); - table.Columns.Add("localizedVersionGuid", typeof(Guid)); - table.Columns.Add("CultureCode", typeof(string)); - - table.Rows.Add(0, 0, 56, 57, 368, 116, 1, "contentpane", "Text/HTML", 1200, - "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, - "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, - 74, 1200, 238, - "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 92, - "Text/HTML", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, - "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", - "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, - "664BAA98-7E24-461F-8180-36527619D042", string.Empty); - - table.Rows.Add(0, 0, 56, 56, 367, 116, 1, "contentpane", "Header Images", 1200, - "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, - "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, - 74, 1200, 238, - "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 91, - "Header Images", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, - "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", - "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, - "664BAA98-7E24-461F-8180-36527619D042", string.Empty); - - table.Rows.Add(0, 0, 56, 59, 370, 116, 1, "contentpane", "Customer Support", 1200, - "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, - "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, - 74, 1200, 238, - "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 94, - "Customer Support", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, - "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", - "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, - "664BAA98-7E24-461F-8180-36527619D042", string.Empty); - - table.Rows.Add(0, 0, 57, 67, 378, 116, 1, "contentpane", "About Us", 1200, - "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, - "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, - 74, 1200, 238, - "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 103, - "Text/HTML", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, - "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", - "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, - "664BAA98-7E24-461F-8180-36527619D042", string.Empty); - return table.CreateDataReader(); - } - - // returns 2 moduledefinitions - Text/HTML and Journal - private IDataReader GetModuleDefinitions() - { - var table = new DataTable("ModuleDefinitions"); - var pkId = table.Columns.Add("ModuleDefID", typeof(int)); - table.Columns.Add("FriendlyName", typeof(string)); - table.Columns.Add("DesktopModuleID", typeof(int)); - table.Columns.Add("DefaultCacheTime", typeof(int)); - table.Columns.Add("CreatedByUserID", typeof(int)); - table.Columns.Add("CreatedOnDate", typeof(DateTime)); - table.Columns.Add("LastModifiedByUserID", typeof(int)); - table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - table.Columns.Add("DefinitionName", typeof(string)); - table.PrimaryKey = new[] { pkId }; - - table.Rows.Add(116, "Text/HTML", 74, 1200, -1, DateTime.Now, -1, DateTime.Now, "Text/HTML"); - table.Rows.Add(117, "Journal", 75, 0, -1, DateTime.Now, -1, DateTime.Now, "Journal"); - - return table.CreateDataReader(); - } - - // returns all search types - 3 SearchTypes - module, tab, user - private IDataReader GetAllSearchTypes() - { - var table = new DataTable("SearchTypes"); - var pkId = table.Columns.Add("SearchTypeId", typeof(int)); - table.Columns.Add("SearchTypeName", typeof(string)); - table.Columns.Add("SearchResultClass", typeof(string)); - table.Columns.Add("IsPrivate", typeof(byte)); - table.PrimaryKey = new[] { pkId }; - - table.Rows.Add(1, "module", FakeResultControllerClass, 0); - table.Rows.Add(2, "tab", FakeResultControllerClass, 0); - table.Rows.Add(3, "user", FakeResultControllerClass, 0); - return table.CreateDataReader(); - } - - private IDataReader GetPortalsCallBack(string culture) - { - return this.GetPortalCallBack(PortalId0, CultureEnUs); - } - - private IDataReader GetPortalCallBack(int portalId, string culture) - { - DataTable table = new DataTable("Portal"); - - var cols = new string[] - { - "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", - "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", - "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", - "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", - "ProcessorUserId", - "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", - "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", - "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", - "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", - "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - var homePage = 1; - table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, - "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", - "DotNetNuke, DNN, Content, Management, CMS", null, "1057AC7A-3C08-4849-A3A6-3D2AB4662020", - null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", null, - homePage.ToString(), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", - "-1", "2011-08-25 07:34:29", culture); - - return table.CreateDataReader(); - } - - private IEnumerable GetGroupBasicViewResults(SearchQuery query) - { - var userSearchContentSource = new SearchContentSource - { - SearchTypeId = UrlSearchTypeId, - SearchTypeName = UrlSearchTypeName, - SearchResultClass = FakeResultControllerClass, - LocalizedName = UserSearchTypeName, - ModuleDefinitionId = 0, - }; - var results = this._searchServiceController.GetGroupedBasicViews(query, userSearchContentSource, PortalId0); - return results; - } - - private IEnumerable GetGroupedDetailViewResults(SearchQuery searchQuery) - { - bool more = false; - int totalHits = 0; - var results = this._searchServiceController.GetGroupedDetailViews(searchQuery, UserSearchTypeId, out totalHits, out more); - return results; - } - } -} +namespace DotNetNuke.Tests.Web.InternalServices +{ + using System; + using System.Collections.Generic; + using System.Data; + using System.IO; + using System.Linq; + using System.Net.Http; + using System.Web.Http; + using System.Web.Http.Hosting; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Modules; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Portals.Data; + using DotNetNuke.Entities.Tabs; + using DotNetNuke.Entities.Users; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Localization; + using DotNetNuke.Services.Search.Entities; + using DotNetNuke.Services.Search.Internals; + using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Web.Api; + using DotNetNuke.Web.InternalServices; + using DotNetNuke.Web.InternalServices.Views.Search; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; + + using Constants = DotNetNuke.Services.Search.Internals.Constants; + + /// + /// Testing grouping logic of GetGroupedBasicView and GetGroupedDetailView (SearchServiceController methods). + /// + [TestFixture] + public class SearchServiceControllerTests + { + private const int ModuleSearchTypeId = 1; + private const int TabSearchTypeId = 2; + private const int UserSearchTypeId = 3; + private const int UrlSearchTypeId = 5; + private const int PortalId0 = 0; + private const int HtmlModuleDefId = 20; + private const int HtmlModuleId = 25; + private const int RoleId731 = 731; + private const int RoleId0 = 0; + private const int HtmlModDefId = 116; + private const int TabId1 = 56; + private const int HtmlModuleId1 = 367; + private const int HtmlModuleId2 = 368; + private const int HtmlModuleId3 = 370; + private const string HtmlModuleTitle1 = "TitleWelcome"; + private const string HtmlModuleTitle2 = "TitleProducts"; + private const string HtmlModuleTitle3 = "TitleServices"; + private const int TabId2 = 57; + private const string HtmlModuleTitle4 = "TitleAboutUs"; + private const int HtmlModuleId4 = 378; + private const int UserId1 = 1; + private const string UserName1 = "User1"; + + private const string UserSearchTypeName = "user"; + private const string TabSearchTypeName = "tab"; + private const string UrlSearchTypeName = "url"; + + private const string FakeResultControllerClass = "DotNetNuke.Tests.Web.InternalServices.FakeResultController, DotNetNuke.Tests.Web"; + + private const string CultureEnUs = "en-US"; + + private const string SearchIndexFolder = @"App_Data\SearchTests"; + private const int DefaultSearchRetryTimes = 5; + + private readonly double _readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; + private Mock _mockCBO; + private Mock _mockHostController; + private Mock _mockCachingProvider; + private Mock _mockDataProvider; + private Mock _mockLocaleController; + private Mock _mockDataService; + private Mock _mockUserController; + private Mock _mockModuleController; + private Mock _mockTabController; + private SearchServiceController _searchServiceController; + private IInternalSearchController _internalSearchController; + private LuceneControllerImpl _luceneController; + + [SetUp] + public void SetUp() + { + // Arrange + ComponentFactory.Container = new SimpleContainer(); + MockComponentProvider.ResetContainer(); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + this._mockDataProvider = MockComponentProvider.CreateDataProvider(); + this._mockLocaleController = MockComponentProvider.CreateLocaleController(); + this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); + this._mockDataService = new Mock(); + this._mockUserController = new Mock(); + this._mockModuleController = new Mock(); + this._mockTabController = new Mock(); + this._mockHostController = new Mock(); + + this.SetupDataProvider(); + this.SetupHostController(); + this.SetupUserController(); + this.SetupPortalSettings(); + this.SetupModuleController(); + this.DeleteIndexFolder(); + + TabController.SetTestableInstance(this._mockTabController.Object); + this._internalSearchController = InternalSearchController.Instance; + + this._mockCBO = new Mock(); + var tabKey = string.Format("{0}-{1}", TabSearchTypeId, 0); + var userKey = string.Format("{0}-{1}", UserSearchTypeId, 0); + this._mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(new Dictionary() { { tabKey, TabSearchTypeName }, { userKey, UserSearchTypeName } }); + CBO.SetTestableInstance(this._mockCBO.Object); + + // create instance of the SearchServiceController + var request = new HttpRequestMessage(); + var configuration = new HttpConfiguration(); + var provider = new Mock(); + ModuleInfo expectedModule; + provider.Setup(x => x.TryFindModuleInfo(request, out expectedModule)).Returns(true); + configuration.AddTabAndModuleInfoProvider(provider.Object); + request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; + this._searchServiceController = new SearchServiceController(HtmlModDefId) { Request = request }; + + this.CreateNewLuceneControllerInstance(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + this._luceneController.Dispose(); + this.DeleteIndexFolder(); + CBO.ClearInstance(); + TabController.ClearInstance(); + InternalSearchController.ClearInstance(); + UserController.ClearInstance(); + PortalController.ClearInstance(); + ModuleController.ClearInstance(); + } + + [Test] + public void GetSearchResultsDetailed() + { + const string keyword = "super"; + const string moduleBody = "super content is here"; + const string userUrl = "mysite/userid/1"; + const string tabUrl1 = "mysite/Home"; + const string tabUrl2 = "mysite/AboutUs"; + + // first tab with 2 modules + var doc1 = new SearchDocument { UniqueKey = "key01", TabId = TabId1, Url = tabUrl1, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + var doc2 = new SearchDocument { UniqueKey = "key02", TabId = TabId1, Title = keyword, Url = tabUrl1, SearchTypeId = ModuleSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, ModuleDefId = HtmlModuleDefId, ModuleId = HtmlModuleId2, Body = moduleBody, RoleId = 731 }; + var doc3 = new SearchDocument { UniqueKey = "key03", TabId = TabId1, Title = keyword, Url = tabUrl1, SearchTypeId = ModuleSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, ModuleDefId = HtmlModuleDefId, ModuleId = HtmlModuleId1, Body = moduleBody, RoleId = 731 }; + + // second tab with 1 module + var doc4 = new SearchDocument { UniqueKey = "key04", TabId = TabId2, Url = tabUrl2, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, RoleId = RoleId0 }; + var doc5 = new SearchDocument { UniqueKey = "key05", TabId = TabId2, Title = keyword, Url = tabUrl2, SearchTypeId = ModuleSearchTypeId, ModuleDefId = HtmlModuleId, ModuleId = HtmlModuleId3, ModifiedTimeUtc = DateTime.UtcNow, Body = moduleBody, RoleId = 731 }; + + // user doc + var userdoc = new SearchDocument { UniqueKey = "key06", Url = userUrl, Title = keyword, SearchTypeId = UserSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, RoleId = RoleId731 }; + this._internalSearchController.AddSearchDocument(doc1); + this._internalSearchController.AddSearchDocument(doc2); + this._internalSearchController.AddSearchDocument(doc3); + this._internalSearchController.AddSearchDocument(doc4); + this._internalSearchController.AddSearchDocument(doc5); + this._internalSearchController.AddSearchDocument(userdoc); + + var query = new SearchQuery + { + KeyWords = keyword, + SearchTypeIds = new[] { ModuleSearchTypeId, TabSearchTypeId, UserSearchTypeId }, + RoleId = 731, + }; + + // Run + var search = this.GetGroupedDetailViewResults(query); + + // Assert + var groupedDetailViews = search as List ?? search.ToList(); + + // Overall 3 groups - tab1, tab2 and user + Assert.AreEqual(3, groupedDetailViews.Count()); + + // Tab 1 has 2 DetailViews + Assert.AreEqual(2, groupedDetailViews.Single(x => x.DocumentUrl == tabUrl1).Results.Count()); + + // Tab 2 has 1 DetailViews + Assert.AreEqual(1, groupedDetailViews.Single(x => x.DocumentUrl == tabUrl2).Results.Count()); + + // UserUrl has 1 DetailViews + Assert.AreEqual(1, groupedDetailViews.Single(x => x.DocumentUrl == userUrl).Results.Count()); + } + + [Test] + public void GetSearchResultsBasic() + { + const string keyword = "awesome"; + const string userUrl = "mysite/userid/1"; + const string tabUrl1 = "mysite/Home"; + const string tabUrl2 = "mysite/AboutUs"; + + var now = DateTime.UtcNow; + var doc1 = new SearchDocument { UniqueKey = "key01", TabId = TabId1, Url = tabUrl1, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId731 }; + var doc2 = new SearchDocument { UniqueKey = "key02", TabId = TabId2, Url = tabUrl2, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId0 }; + var userdoc = new SearchDocument { UniqueKey = "key03", Url = userUrl, Title = keyword, SearchTypeId = UserSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId0 }; + + this._internalSearchController.AddSearchDocument(doc1); + this._internalSearchController.AddSearchDocument(doc2); + this._internalSearchController.AddSearchDocument(userdoc); + this._internalSearchController.Commit(); + + var query = new SearchQuery + { + KeyWords = keyword, + PortalIds = new List { PortalId0 }, + SearchTypeIds = new[] { ModuleSearchTypeId, TabSearchTypeId, UserSearchTypeId }, + BeginModifiedTimeUtc = now.AddMinutes(-1), + EndModifiedTimeUtc = now.AddMinutes(+1), + PageIndex = 1, + PageSize = 15, + SortField = 0, + TitleSnippetLength = 120, + BodySnippetLength = 300, + WildCardSearch = true, + }; + + // Run + var search = this.GetGroupBasicViewResults(query); + + // Assert - overall 2 groups: tabs and users + var groupedBasicViews = search as List ?? search.ToList(); + Assert.AreEqual(2, groupedBasicViews.Count()); + + // 1 User results + Assert.AreEqual(1, groupedBasicViews.Single(x => x.DocumentTypeName == "user").Results.Count()); + + // User result should have 1 attribute(avatar) + Assert.AreEqual(1, groupedBasicViews.Single(x => x.DocumentTypeName == "user").Results.ElementAt(0).Attributes.Count()); + + // 2 Tabs results + Assert.AreEqual(2, groupedBasicViews.Single(x => x.DocumentTypeName == "tab").Results.Count()); + } + + [Test] + public void ModifyingDocumentsDoesNotCreateDuplicates() + { + // Arrange + const string tabUrl = "mysite/ContentUrl"; + const string title = "content title"; + const string contentBody = "content body"; + const string titleModified = title + " modified"; + var uniqueKey = Guid.NewGuid().ToString(); + var now = DateTime.UtcNow; + + var originalDocument = new SearchDocument + { + UniqueKey = uniqueKey, + TabId = TabId1, + Url = tabUrl, + Title = title, + Body = contentBody, + SearchTypeId = TabSearchTypeId, + ModifiedTimeUtc = now, + PortalId = PortalId0, + RoleId = RoleId731, + Keywords = { { "description", "mycontent" } }, + NumericKeys = { { "points", 5 } }, + }; + + this._internalSearchController.AddSearchDocument(originalDocument); + this._internalSearchController.Commit(); + + var modifiedDocument = new SearchDocument + { + UniqueKey = uniqueKey, + TabId = TabId1, + Url = tabUrl, + Title = titleModified, + Body = contentBody + " modified", + SearchTypeId = TabSearchTypeId, + ModifiedTimeUtc = now, + PortalId = PortalId0, + RoleId = RoleId731, + Keywords = { { "description", "mycontent_modified" }, { "description2", "mycontent_modified" } }, + NumericKeys = { { "points", 8 }, { "point2", 7 } }, + }; + + this._internalSearchController.AddSearchDocument(modifiedDocument); + this._internalSearchController.Commit(); + + var query = new SearchQuery + { + KeyWords = title, + PortalIds = new List { PortalId0 }, + SearchTypeIds = new[] { ModuleSearchTypeId, TabSearchTypeId, UserSearchTypeId }, + BeginModifiedTimeUtc = now.AddMinutes(-1), + EndModifiedTimeUtc = now.AddMinutes(+1), + PageIndex = 1, + PageSize = 15, + SortField = 0, + TitleSnippetLength = 120, + BodySnippetLength = 300, + WildCardSearch = true, + }; + + // Run + var searchResults = this.GetGroupedDetailViewResults(query).ToList(); + + // Assert + Assert.AreEqual(1, searchResults.Count()); + Assert.AreEqual(1, searchResults.First().Results.Count); + Assert.AreEqual(tabUrl, searchResults.First().Results.First().DocumentUrl); + Assert.AreEqual(titleModified, searchResults.First().Results.First().Title); + } + + private void CreateNewLuceneControllerInstance() + { + if (this._luceneController != null) + { + LuceneController.ClearInstance(); + this._luceneController.Dispose(); + } + + this._luceneController = new LuceneControllerImpl(); + LuceneController.SetTestableInstance(this._luceneController); + } + + private void SetupUserController() + { + this._mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())).Returns( + new UserInfo { UserID = UserId1, Username = UserName1, Profile = new UserProfile { } }); + UserController.SetTestableInstance(this._mockUserController.Object); + } + + private void SetupHostController() + { + this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns( + SearchIndexFolder); + this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())). + Returns(this._readerStaleTimeSpan); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns( + Constants.DefaultSearchTitleBoost); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns( + Constants.DefaultSearchTagBoost); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns( + Constants.DefaultSearchKeywordBoost); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())). + Returns(Constants.DefaultSearchDescriptionBoost); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns( + Constants.DefaultSearchAuthorBoost); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns( + Constants.DefaultMinLen); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns( + Constants.DefaultMaxLen); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns( + DefaultSearchRetryTimes); + HostController.RegisterInstance(this._mockHostController.Object); + } + + private void SetupDataProvider() + { + // Standard DataProvider Path for Logging + this._mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + + this._mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); + this._mockDataProvider.Setup(d => d.GetSearchModules(It.IsAny())).Returns(this.GetSearchModules); + this._mockDataProvider.Setup(d => d.GetModuleDefinitions()).Returns(this.GetModuleDefinitions); + this._mockDataProvider.Setup(d => d.GetAllSearchTypes()).Returns(this.GetAllSearchTypes); + this._mockDataProvider.Setup(d => d.GetUser(It.IsAny(), It.IsAny())).Returns(this.GetUser); + this._mockDataProvider.Setup(d => d.GetTabs(It.IsAny())).Returns(this.GetTabs); + this._mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(this.GetPortalGroups); + + DataService.RegisterInstance(this._mockDataService.Object); + } + + private void SetupPortalSettings() + { + var mockPortalController = new Mock(); + mockPortalController.Setup(x => x.GetPortal(It.IsAny())).Returns(new PortalInfo { PortalID = PortalId0, PortalGroupID = -1, UserTabId = TabId1, }); + PortalController.SetTestableInstance(mockPortalController.Object); + } + + private void SetupModuleController() + { + this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId1), It.Is(p => p == PortalId0), false)).Returns( + new ModuleInfo { ModuleID = HtmlModuleId1, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle1 }); + this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId2), It.Is(p => p == PortalId0), false)).Returns( + new ModuleInfo { ModuleID = HtmlModuleId2, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle2 }); + this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId3), It.Is(p => p == PortalId0), false)).Returns( + new ModuleInfo { ModuleID = HtmlModuleId3, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle3 }); + + this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId4), It.Is(p => p == PortalId0), false)).Returns( + new ModuleInfo { ModuleID = HtmlModuleId4, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle4 }); + ModuleController.SetTestableInstance(this._mockModuleController.Object); + } + + private void DeleteIndexFolder() + { + try + { + if (Directory.Exists(SearchIndexFolder)) + { + Directory.Delete(SearchIndexFolder, true); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + private IDataReader GetUser() + { + var table = new DataTable("Users"); + table.Columns.Add("UserID", typeof(int)); + table.Columns.Add("PortalId", typeof(int)); + table.Columns.Add("UserName", typeof(string)); + table.Columns.Add("FirstName", typeof(string)); + table.Columns.Add("LastName", typeof(string)); + table.Columns.Add("DisplayName", typeof(string)); + table.Columns.Add("IsSuperUser", typeof(byte)); + table.Columns.Add("Email", typeof(string)); + table.Columns.Add("VanityUrl", typeof(string)); + table.Columns.Add("AffiliateId", typeof(int)); + table.Columns.Add("IsDeleted", typeof(byte)); + table.Columns.Add("RefreshRoles", typeof(byte)); + table.Columns.Add("LastIPAddress", typeof(string)); + table.Columns.Add("UpdatePassword", typeof(byte)); + table.Columns.Add("PasswordResetToken", typeof(Guid)); + table.Columns.Add("PasswordResetExpiration", typeof(DateTime)); + table.Columns.Add("Authorised", typeof(byte)); + + table.Columns.Add("CreatedByUserID", typeof(int)); + table.Columns.Add("CreatedOnDate", typeof(DateTime)); + table.Columns.Add("LastModifiedByUserID", typeof(int)); + table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + + table.Rows.Add(1, null, UserName1, UserName1, UserName1, UserName1, 1, "host@changeme.invalid", null, null, 0, null, + "127.0.0.1", 0, "8D3C800F-7A40-45D6-BA4D-E59A393F9800", DateTime.Now, null, -1, DateTime.Now, + -1, DateTime.Now); + return table.CreateDataReader(); + } + + private IDataReader GetPortalGroups() + { + var table = new DataTable("ModuleDefinitions"); + var pkId = table.Columns.Add("PortalGroupID", typeof(int)); + table.Columns.Add("MasterPortalID", typeof(int)); + table.Columns.Add("PortalGroupName", typeof(string)); + table.Columns.Add("PortalGroupDescription", typeof(string)); + table.Columns.Add("AuthenticationDomain", typeof(string)); + table.Columns.Add("CreatedByUserID", typeof(int)); + table.Columns.Add("CreatedOnDate", typeof(DateTime)); + table.Columns.Add("LastModifiedByUserID", typeof(int)); + table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + table.PrimaryKey = new[] { pkId }; + + table.Rows.Add(0, 0, "test", "descr", "domain", -1, DateTime.Now, -1, DateTime.Now); + return table.CreateDataReader(); + } + + // return 2 test tabs(TabId 56 - Home, TabId 57 - AboutUs) + private IDataReader GetTabs() + { + var table = new DataTable("Tabs"); + table.Columns.Add("TabID", typeof(int)); + table.Columns.Add("TabOrder", typeof(int)); + table.Columns.Add("PortalID", typeof(int)); + table.Columns.Add("TabName", typeof(string)); + table.Columns.Add("ParentID", typeof(int)); + table.Columns.Add("Level", typeof(int)); + table.Columns.Add("TabPath", typeof(string)); + table.Columns.Add("UniqueId", typeof(Guid)); + table.Columns.Add("VersionGuid", typeof(Guid)); + table.Columns.Add("DefaultLanguageGuid", typeof(Guid)); + table.Columns.Add("LocalizedVersionGuid", typeof(Guid)); + table.Columns.Add("IsVisible", typeof(byte)); + table.Columns.Add("IconFile", typeof(string)); + table.Columns.Add("IconFileLarge", typeof(string)); + table.Columns.Add("DisableLink", typeof(byte)); + table.Columns.Add("Title", typeof(string)); + table.Columns.Add("Description", typeof(string)); + table.Columns.Add("KeyWords", typeof(string)); + table.Columns.Add("IsDeleted", typeof(byte)); + table.Columns.Add("SkinSrc", typeof(string)); + table.Columns.Add("ContainerSrc", typeof(string)); + table.Columns.Add("StartDate", typeof(DateTime)); + table.Columns.Add("EndDate", typeof(DateTime)); + table.Columns.Add("Url", typeof(string)); + table.Columns.Add("HasChildren", typeof(string)); + table.Columns.Add("RefreshInterval", typeof(int)); + table.Columns.Add("PageHeadText", typeof(string)); + table.Columns.Add("IsSecure", typeof(byte)); + table.Columns.Add("PermanentRedirect", typeof(byte)); + table.Columns.Add("SiteMapPriority", typeof(float)); + table.Columns.Add("ContentItemId", typeof(int)); + table.Columns.Add("Content", typeof(string)); + table.Columns.Add("ContentTypeID", typeof(int)); + table.Columns.Add("ModuleID", typeof(int)); + table.Columns.Add("ContentKey", typeof(string)); + table.Columns.Add("Indexed", typeof(byte)); + table.Columns.Add("StateID", typeof(int)); + table.Columns.Add("CultureCode", typeof(string)); + table.Columns.Add("CreatedByUserID", typeof(int)); + table.Columns.Add("CreatedOnDate", typeof(DateTime)); + table.Columns.Add("LastModifiedByUserID", typeof(int)); + table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + + table.Rows.Add(56, 5, 0, "Home", null, 0, "//Home", "C3174A2E-374D-4779-BE5F-BCDFF410E097", "A111A742-C18F-495D-8A23-BD0ECC70BBFE", null, "3A34424A-3CCA-4934-AE15-B9A80EB6D259", 1, null, null, 0, null, null, null, 0, "[G]Skins/Xcillion/Inner.ascx", "[G]Containers/Xcillion/NoTitle.ascx", null, null, null, "false", null, null, 0, 0, 0.5, 86, "Home", 1, -1, null, 0, null, null, -1, DateTime.Now, -1, DateTime.Now); + table.Rows.Add(57, 13, 0, "About Us", null, 0, "//AboutUs", "26A4236F-3AAA-4E15-8908-45D35675C677", "8426D3BC-E930-49CA-BDEB-4D41F194B6AC", null, "1461572D-97E8-41F8-BB1A-916DCA48890A", 1, null, null, 0, null, null, null, 0, "[G]Skins/Xcillion/Inner.ascx", "[G]Containers/Xcillion/NoTitle.ascx", null, null, null, "true", null, null, 0, 0, 0.5, 97, "About Us", 1, -1, null, 0, null, null, -1, DateTime.Now, -1, DateTime.Now); + + return table.CreateDataReader(); + } + + // return 4 html modules (TabId 56 - Home: ModuleIDs:367, 368, 370 TabId 57 - AboutUs: 378//) + private IDataReader GetSearchModules() + { + var table = new DataTable("SearchModules"); + table.Columns.Add("OwnerPortalID", typeof(int)); + table.Columns.Add("PortalID", typeof(int)); + table.Columns.Add("TabID", typeof(int)); + table.Columns.Add("TabModuleID", typeof(int)); + table.Columns.Add("ModuleID", typeof(int)); + table.Columns.Add("ModuleDefID", typeof(int)); + table.Columns.Add("ModuleOrder", typeof(int)); + table.Columns.Add("PaneName", typeof(string)); + table.Columns.Add("ModuleTitle", typeof(string)); + table.Columns.Add("CacheTime", typeof(int)); + table.Columns.Add("CacheMethod", typeof(string)); + table.Columns.Add("Alignment", typeof(string)); + table.Columns.Add("Color", typeof(string)); + table.Columns.Add("Border", typeof(string)); + table.Columns.Add("IconFile", typeof(string)); + table.Columns.Add("AllTabs", typeof(byte)); + table.Columns.Add("Visibility", typeof(int)); + table.Columns.Add("IsDeleted", typeof(byte)); + table.Columns.Add("Header", typeof(string)); + table.Columns.Add("Footer", typeof(string)); + table.Columns.Add("StartDate", typeof(DateTime)); + table.Columns.Add("EndDate", typeof(DateTime)); + table.Columns.Add("ContainerSrc", typeof(string)); + table.Columns.Add("DisplayTitle", typeof(byte)); + table.Columns.Add("DisplayPrint", typeof(byte)); + table.Columns.Add("DisplaySyndicate", typeof(byte)); + table.Columns.Add("IsWebSlice", typeof(byte)); + table.Columns.Add("WebSliceTitle", typeof(string)); + table.Columns.Add("WebSliceExpiryDate", typeof(DateTime)); + table.Columns.Add("WebSliceTTL", typeof(int)); + table.Columns.Add("InheritViewPermissions", typeof(int)); + table.Columns.Add("IsShareable", typeof(int)); + table.Columns.Add("IsShareableViewOnly", typeof(int)); + table.Columns.Add("DesktopModuleID", typeof(int)); + table.Columns.Add("DefaultCacheTime", typeof(int)); + table.Columns.Add("ModuleControlID", typeof(int)); + table.Columns.Add("BusinessControllerClass", typeof(string)); + table.Columns.Add("IsAdmin", typeof(byte)); + table.Columns.Add("SupportedFeatures", typeof(int)); + table.Columns.Add("ContentItemID", typeof(int)); + table.Columns.Add("Content", typeof(string)); + table.Columns.Add("ContentTypeID", typeof(int)); + table.Columns.Add("ContentKey", typeof(string)); + table.Columns.Add("Indexed", typeof(byte)); + table.Columns.Add("StateID", typeof(int)); + table.Columns.Add("CreatedByUserID", typeof(int)); + table.Columns.Add("CreatedOnDate", typeof(DateTime)); + table.Columns.Add("LastModifiedByUserID", typeof(int)); + table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + table.Columns.Add("LastContentModifiedOnDate", typeof(DateTime)); + table.Columns.Add("UniqueId", typeof(Guid)); + table.Columns.Add("VersionGuid", typeof(Guid)); + table.Columns.Add("defaultLanguageGuid", typeof(Guid)); + table.Columns.Add("localizedVersionGuid", typeof(Guid)); + table.Columns.Add("CultureCode", typeof(string)); + + table.Rows.Add(0, 0, 56, 57, 368, 116, 1, "contentpane", "Text/HTML", 1200, + "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, + "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, + 74, 1200, 238, + "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 92, + "Text/HTML", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, + "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", + "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, + "664BAA98-7E24-461F-8180-36527619D042", string.Empty); + + table.Rows.Add(0, 0, 56, 56, 367, 116, 1, "contentpane", "Header Images", 1200, + "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, + "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, + 74, 1200, 238, + "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 91, + "Header Images", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, + "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", + "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, + "664BAA98-7E24-461F-8180-36527619D042", string.Empty); + + table.Rows.Add(0, 0, 56, 59, 370, 116, 1, "contentpane", "Customer Support", 1200, + "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, + "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, + 74, 1200, 238, + "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 94, + "Customer Support", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, + "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", + "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, + "664BAA98-7E24-461F-8180-36527619D042", string.Empty); + + table.Rows.Add(0, 0, 57, 67, 378, 116, 1, "contentpane", "About Us", 1200, + "FileModuleCachingProvider", null, null, null, string.Empty, 0, 0, 0, null, null, null, null, + "[G]Containers/Xcillion/NoTitle.ascx", 1, 0, 0, 0, null, null, 0, 1, 1, 1, + 74, 1200, 238, + "DotNetNuke.Modules.Html.HtmlTextController, DotNetNuke.Modules.Html", 0, 7, 103, + "Text/HTML", 2, null, 0, null, -1, "2014-02-18 10:39:45.170", -1, + "2014-02-18 10:39:45.170", "2014-02-18 10:39:45.190", + "A0B23459-676C-4DE4-BCA1-33E222F8405A", "85AF4947-EB80-475D-9D8D-0BAD6B026A2B", null, + "664BAA98-7E24-461F-8180-36527619D042", string.Empty); + return table.CreateDataReader(); + } + + // returns 2 moduledefinitions - Text/HTML and Journal + private IDataReader GetModuleDefinitions() + { + var table = new DataTable("ModuleDefinitions"); + var pkId = table.Columns.Add("ModuleDefID", typeof(int)); + table.Columns.Add("FriendlyName", typeof(string)); + table.Columns.Add("DesktopModuleID", typeof(int)); + table.Columns.Add("DefaultCacheTime", typeof(int)); + table.Columns.Add("CreatedByUserID", typeof(int)); + table.Columns.Add("CreatedOnDate", typeof(DateTime)); + table.Columns.Add("LastModifiedByUserID", typeof(int)); + table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + table.Columns.Add("DefinitionName", typeof(string)); + table.PrimaryKey = new[] { pkId }; + + table.Rows.Add(116, "Text/HTML", 74, 1200, -1, DateTime.Now, -1, DateTime.Now, "Text/HTML"); + table.Rows.Add(117, "Journal", 75, 0, -1, DateTime.Now, -1, DateTime.Now, "Journal"); + + return table.CreateDataReader(); + } + + // returns all search types - 3 SearchTypes - module, tab, user + private IDataReader GetAllSearchTypes() + { + var table = new DataTable("SearchTypes"); + var pkId = table.Columns.Add("SearchTypeId", typeof(int)); + table.Columns.Add("SearchTypeName", typeof(string)); + table.Columns.Add("SearchResultClass", typeof(string)); + table.Columns.Add("IsPrivate", typeof(byte)); + table.PrimaryKey = new[] { pkId }; + + table.Rows.Add(1, "module", FakeResultControllerClass, 0); + table.Rows.Add(2, "tab", FakeResultControllerClass, 0); + table.Rows.Add(3, "user", FakeResultControllerClass, 0); + return table.CreateDataReader(); + } + + private IDataReader GetPortalsCallBack(string culture) + { + return this.GetPortalCallBack(PortalId0, CultureEnUs); + } + + private IDataReader GetPortalCallBack(int portalId, string culture) + { + DataTable table = new DataTable("Portal"); + + var cols = new string[] + { + "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", + "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", + "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", + "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", + "ProcessorUserId", + "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", + "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", + "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", + "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", + "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + var homePage = 1; + table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, + "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", + "DotNetNuke, DNN, Content, Management, CMS", null, "1057AC7A-3C08-4849-A3A6-3D2AB4662020", + null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", null, + homePage.ToString(), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", + "-1", "2011-08-25 07:34:29", culture); + + return table.CreateDataReader(); + } + + private IEnumerable GetGroupBasicViewResults(SearchQuery query) + { + var userSearchContentSource = new SearchContentSource + { + SearchTypeId = UrlSearchTypeId, + SearchTypeName = UrlSearchTypeName, + SearchResultClass = FakeResultControllerClass, + LocalizedName = UserSearchTypeName, + ModuleDefinitionId = 0, + }; + var results = this._searchServiceController.GetGroupedBasicViews(query, userSearchContentSource, PortalId0); + return results; + } + + private IEnumerable GetGroupedDetailViewResults(SearchQuery searchQuery) + { + bool more = false; + int totalHits = 0; + var results = this._searchServiceController.GetGroupedDetailViews(searchQuery, UserSearchTypeId, out totalHits, out more); + return results; + } + } +} From 28ca797e5f91f43cf8510acd213fccff0ccbd1fa Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 19 Aug 2020 11:56:08 -0500 Subject: [PATCH 08/32] Standardize on CR/LF line endings Closes #3995 --- .editorconfig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 788149656b8..66a6ee2814c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,8 +4,10 @@ # top-most EditorConfig file root = true +# Standardize on CR/LF (Windows) line endings # Don't use tabs for indentation. [*] +end_of_line = crlf indent_style = space # (Please don't specify an indent_size here; that has too many unintended consequences.) @@ -182,4 +184,4 @@ csharp_space_between_parentheses = false # Blocks are allowed csharp_prefer_braces = true:silent csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = true \ No newline at end of file +csharp_preserve_single_line_statements = true From 1c80c0666b4073640a4a866a2ee13ece7226b3a1 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Wed, 19 Aug 2020 21:45:53 +0200 Subject: [PATCH 09/32] Provide administrators role id to the test url page so it can be used to populate the page picker properly PR #3996 --- Dnn.AdminExperience/ClientSide/Seo.Web/src/actions/seo.js | 3 ++- .../ClientSide/Seo.Web/src/components/testUrl/index.jsx | 8 +++++--- .../ClientSide/Seo.Web/src/reducers/seoReducer.js | 3 ++- .../Dnn.PersonaBar.Extensions/Services/SeoController.cs | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/src/actions/seo.js b/Dnn.AdminExperience/ClientSide/Seo.Web/src/actions/seo.js index 245367ef32c..5b40f6f5864 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/src/actions/seo.js +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/src/actions/seo.js @@ -10,7 +10,8 @@ const siteInfoActions = { generalSettings: data.Settings, replacementCharacterList: data.ReplacementCharacterList, deletedPageHandlingTypes: data.DeletedPageHandlingTypes, - clientModified: false + clientModified: false, + adminRoleId: data.AdminRoleId } }); if (callback) { diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/testUrl/index.jsx b/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/testUrl/index.jsx index b3868e24204..7d1f5d7cbe3 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/testUrl/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/src/components/testUrl/index.jsx @@ -86,7 +86,7 @@ class TestUrlPanelBody extends Component { isMultiLanguage: false, excludeAdminTabs: false, disabledNotSelectable: false, - roles: "0", + roles: props.adminRoleId ? props.adminRoleId.toString() : "0", sortOrder: 0 }; @@ -257,7 +257,8 @@ TestUrlPanelBody.propTypes = { identifiedPage: PropTypes.string, redirectionReason: PropTypes.string, redirectionResult: PropTypes.string, - operationMessages: PropTypes.string + operationMessages: PropTypes.string, + adminRoleId: PropTypes.number }; function mapStateToProps(state) { @@ -269,7 +270,8 @@ function mapStateToProps(state) { identifiedPage: state.seo.identifiedPage, redirectionReason: state.seo.redirectionReason, redirectionResult: state.seo.redirectionResult, - operationMessages: state.seo.operationMessages + operationMessages: state.seo.operationMessages, + adminRoleId: state.seo.adminRoleId }; } diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/src/reducers/seoReducer.js b/Dnn.AdminExperience/ClientSide/Seo.Web/src/reducers/seoReducer.js index d2889464200..cedfbc64700 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/src/reducers/seoReducer.js +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/src/reducers/seoReducer.js @@ -8,7 +8,8 @@ export default function seoSettings(state = { generalSettings: action.data.generalSettings, replacementCharacterList: action.data.replacementCharacterList, deletedPageHandlingTypes: action.data.deletedPageHandlingTypes, - clientModified: action.data.clientModified + clientModified: action.data.clientModified, + adminRoleId: action.data.adminRoleId }; case ActionTypes.SEO_GENERAL_SETTINS_CLIENT_MODIFIED: return { ...state, diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SeoController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SeoController.cs index 48c867cdccb..b649197c276 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SeoController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SeoController.cs @@ -84,7 +84,8 @@ public HttpResponseMessage GetGeneralSettings() urlSettings.RedirectWrongCase }, ReplacementCharacterList = replacementCharacterList, - DeletedPageHandlingTypes = deletedPageHandlingTypes + DeletedPageHandlingTypes = deletedPageHandlingTypes, + AdminRoleId = PortalSettings.AdministratorRoleId }; return this.Request.CreateResponse(HttpStatusCode.OK, response); From 7d4c9f4540ed702338c345c128940d5089edc6eb Mon Sep 17 00:00:00 2001 From: David Poindexter Date: Wed, 19 Aug 2020 19:05:55 -0400 Subject: [PATCH 10/32] Update mergeable to check for Status: On Hold label --- .github/mergeable.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/mergeable.yml b/.github/mergeable.yml index 6f530d5968e..0785e3f3d76 100644 --- a/.github/mergeable.yml +++ b/.github/mergeable.yml @@ -10,3 +10,7 @@ mergeable: begins_with: match: 'Type:' # or array of strings message: 'A `Type:` label must be assigned to this pull request' + must_exclude: + regex: 'On Hold' + regex_flag: 'none' # Optional. Specify the flag for Regex. default is 'i', to disable default use 'none' + message: 'This PR is `On Hold`' \ No newline at end of file From a11540a9913ea2fda3e600cf8877244f3396f370 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Sun, 16 Aug 2020 20:36:00 -0400 Subject: [PATCH 11/32] Created IHostController & IConfigurationSetting abstraction --- .../Entities/Controllers/IHostController.cs | 165 ++++++++++++++++++ .../Entities/IConfigurationSetting.cs | 27 +++ .../Library/DotNetNuke.Library.csproj | 1 + .../Library/Entities/ConfigurationSetting.cs | 28 +-- .../Entities/Controllers/HostController.cs | 162 ++++------------- .../Entities/Controllers/IHostController.cs | 23 ++- .../Library/Obsolete/HostController.cs | 61 +++++++ DNN Platform/Library/Startup.cs | 5 + 8 files changed, 332 insertions(+), 140 deletions(-) create mode 100644 DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs create mode 100644 DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs create mode 100644 DNN Platform/Library/Obsolete/HostController.cs diff --git a/DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs b/DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs new file mode 100644 index 00000000000..2cd53b82520 --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs @@ -0,0 +1,165 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Entities.Controllers +{ + using System.Collections.Generic; + + /// + /// HostController provides business layer of host settings. + /// + /// + /// + /// + /// public class MySampleClass + /// { + /// IHostController controller; + /// public MySampleClass(IHostController controller) + /// { + /// this.controller = controller; + /// } + /// + /// public bool CheckUpgrade { get => this.controller.GetBoolean("CheckUpgrade", true); + /// } + /// + /// + public interface IHostController + { + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// host setting's value. + /// key is empty. + bool GetBoolean(string key); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// this value will be return if setting's value is empty. + /// host setting's value. + /// key is empty. + bool GetBoolean(string key, bool defaultValue); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// host setting's value. + /// key is empty. + double GetDouble(string key); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// this value will be return if setting's value is empty. + /// host setting's value. + /// key is empty. + double GetDouble(string key, double defaultValue); + + /// + /// takes in a text value, decrypts it with a FIPS compliant algorithm and returns the value. + /// + /// the host setting to read. + /// the pass phrase used for encryption/decryption. + /// The setting value as a . + string GetEncryptedString(string key, string passPhrase); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// host setting's value. + /// key is empty. + int GetInteger(string key); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// this value will be return if setting's value is empty. + /// host setting's value. + /// key is empty. + int GetInteger(string key, int defaultValue); + + /// + /// Gets all host settings. + /// + /// host setting. + Dictionary GetSettings(); + + /// + /// Gets all host settings as dictionary. + /// + /// host setting's value. + Dictionary GetSettingsDictionary(); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// host setting's value. + /// key is empty. + string GetString(string key); + + /// + /// Gets the setting value by the specific key. + /// + /// The key. + /// this value will be return if setting's value is empty. + /// host setting's value. + /// key is empty. + string GetString(string key, string defaultValue); + + /// + /// Increments the Client Resource Manager (CRM) version to bust local cache. + /// + /// If true also forces a CRM version increment on portals that have non-default settings for CRM. + void IncrementCrmVersion(bool includeOverridingPortals); + + /// + /// Updates the specified config. + /// + /// The config. + void Update(IConfigurationSetting config); + + /// + /// Updates the specified config. + /// + /// The config. + /// if set to true will clear cache after updating the setting. + void Update(IConfigurationSetting config, bool clearCache); + + /// + /// Updates the specified settings. + /// + /// The settings. + void Update(Dictionary settings); + + /// + /// Updates the setting for a specified key. + /// + /// The key. + /// The value. + void Update(string key, string value); + + /// + /// Updates the specified key. + /// + /// The key. + /// The value. + /// if set to true will clear cache after update settings. + void Update(string key, string value, bool clearCache); + + /// + /// Takes in a value, encrypts it with a FIPS compliant algorithm and stores it. + /// + /// host settings key. + /// host settings value. + /// pass phrase to allow encryption/decryption. + void UpdateEncryptedString(string key, string value, string passPhrase); + } +} diff --git a/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs b/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs new file mode 100644 index 00000000000..19c2e6d76aa --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Entities +{ + /// + /// The configuration setting. + /// + public interface IConfigurationSetting + { + /// + /// Gets or sets a value indicating whether if the configuration setting is secure. + /// + bool IsSecure { get; set; } + + /// + /// Gets or sets the configuration key. + /// + string Key { get; set; } + + /// + /// gets or sets configuraiton value. + /// + string Value { get; set; } + } +} diff --git a/DNN Platform/Library/DotNetNuke.Library.csproj b/DNN Platform/Library/DotNetNuke.Library.csproj index 607abd82722..1cb62a5bbc7 100644 --- a/DNN Platform/Library/DotNetNuke.Library.csproj +++ b/DNN Platform/Library/DotNetNuke.Library.csproj @@ -251,6 +251,7 @@ Code + diff --git a/DNN Platform/Library/Entities/ConfigurationSetting.cs b/DNN Platform/Library/Entities/ConfigurationSetting.cs index 77fbd81d5db..bc3c50e8642 100644 --- a/DNN Platform/Library/Entities/ConfigurationSetting.cs +++ b/DNN Platform/Library/Entities/ConfigurationSetting.cs @@ -2,14 +2,20 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Entities -{ - public class ConfigurationSetting - { - public bool IsSecure { get; set; } - - public string Key { get; set; } - - public string Value { get; set; } - } -} +namespace DotNetNuke.Entities +{ + using DotNetNuke.Abstractions.Entities; + + /// + public class ConfigurationSetting : IConfigurationSetting + { + /// + public bool IsSecure { get; set; } + + /// + public string Key { get; set; } + + /// + public string Value { get; set; } + } +} diff --git a/DNN Platform/Library/Entities/Controllers/HostController.cs b/DNN Platform/Library/Entities/Controllers/HostController.cs index 5a634996629..f664bdc8f1d 100644 --- a/DNN Platform/Library/Entities/Controllers/HostController.cs +++ b/DNN Platform/Library/Entities/Controllers/HostController.cs @@ -8,10 +8,9 @@ namespace DotNetNuke.Entities.Controllers using System.Data; using System.Globalization; using System.Linq; - + using DotNetNuke.Abstractions.Entities; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; @@ -20,49 +19,27 @@ namespace DotNetNuke.Entities.Controllers using DotNetNuke.Services.Log.EventLog; using DotNetNuke.Web.Client; - /// - /// HostController provides business layer of host settings. - /// - /// - /// - /// public static bool CheckUpgrade - /// { - /// get - /// { - /// return HostController.Instance.GetBoolean("CheckUpgrade", true); - /// } - /// } - /// - /// - public class HostController : ComponentBase, IHostController + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + + /// + public partial class HostController : INewHostController { private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(HostController)); /// /// Initializes a new instance of the class. /// - internal HostController() + public HostController() { } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// host setting's value. - /// key is empty. + /// public bool GetBoolean(string key) { return this.GetBoolean(key, Null.NullBoolean); } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// this value will be return if setting's value is empty. - /// host setting's value. - /// key is empty. + /// public bool GetBoolean(string key, bool defaultValue) { Requires.NotNullOrEmpty("key", key); @@ -95,24 +72,13 @@ public bool GetBoolean(string key, bool defaultValue) return retValue; } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// host setting's value. - /// key is empty. + /// public double GetDouble(string key) { return this.GetDouble(key, Null.NullDouble); } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// this value will be return if setting's value is empty. - /// host setting's value. - /// key is empty. + /// public double GetDouble(string key, double defaultValue) { Requires.NotNullOrEmpty("key", key); @@ -127,24 +93,13 @@ public double GetDouble(string key, double defaultValue) return retValue; } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// host setting's value. - /// key is empty. + /// public int GetInteger(string key) { return this.GetInteger(key, Null.NullInteger); } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// this value will be return if setting's value is empty. - /// host setting's value. - /// key is empty. + /// public int GetInteger(string key, int defaultValue) { Requires.NotNullOrEmpty("key", key); @@ -159,36 +114,25 @@ public int GetInteger(string key, int defaultValue) return retValue; } - /// - /// Gets all host settings. - /// - /// host setting. - public Dictionary GetSettings() + /// + Dictionary INewHostController.GetSettings() { - return CBO.GetCachedObject>( + return CBO.GetCachedObject>( new CacheItemArgs( DataCache.HostSettingsCacheKey, DataCache.HostSettingsCacheTimeOut, DataCache.HostSettingsCachePriority), - GetSettingsDictionaryCallBack, + this.GetSettingsDictionaryCallBack, true); } - /// - /// Gets all host settings as dictionary. - /// - /// host setting's value. + /// public Dictionary GetSettingsDictionary() { return this.GetSettings().ToDictionary(c => c.Key, c => c.Value.Value); } - /// - /// takes in a text value, decrypts it with a FIPS compliant algorithm and returns the value. - /// - /// the host setting to read. - /// the pass phrase used for encryption/decryption. - /// The setting value as a . + /// public string GetEncryptedString(string key, string passPhrase) { Requires.NotNullOrEmpty("key", key); @@ -197,24 +141,13 @@ public string GetEncryptedString(string key, string passPhrase) return Security.FIPSCompliant.DecryptAES(cipherText, passPhrase, Entities.Host.Host.GUID); } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// host setting's value. - /// key is empty. + /// public string GetString(string key) { return this.GetString(key, string.Empty); } - /// - /// Gets the setting value by the specific key. - /// - /// The key. - /// this value will be return if setting's value is empty. - /// host setting's value. - /// key is empty. + /// public string GetString(string key, string defaultValue) { Requires.NotNullOrEmpty("key", key); @@ -227,10 +160,7 @@ public string GetString(string key, string defaultValue) return this.GetSettings()[key].Value; } - /// - /// Updates the specified settings. - /// - /// The settings. + /// public void Update(Dictionary settings) { foreach (KeyValuePair settingKvp in settings) @@ -241,21 +171,14 @@ public void Update(Dictionary settings) DataCache.ClearHostCache(false); } - /// - /// Updates the specified config. - /// - /// The config. - public void Update(ConfigurationSetting config) + /// + public void Update(IConfigurationSetting config) { this.Update(config, true); } - /// - /// Updates the specified config. - /// - /// The config. - /// if set to true will clear cache after updating the setting. - public void Update(ConfigurationSetting config, bool clearCache) + /// + public void Update(IConfigurationSetting config, bool clearCache) { try { @@ -265,7 +188,7 @@ public void Update(ConfigurationSetting config, bool clearCache) var settings = GetSettingsFromDatabase(); if (settings.ContainsKey(config.Key)) { - ConfigurationSetting currentconfig; + IConfigurationSetting currentconfig; settings.TryGetValue(config.Key, out currentconfig); if (currentconfig != null && currentconfig.Value != config.Value) { @@ -300,33 +223,19 @@ public void Update(ConfigurationSetting config, bool clearCache) } } - /// - /// Updates the specified key. - /// - /// The key. - /// The value. - /// if set to true will clear cache after update settings. + /// public void Update(string key, string value, bool clearCache) { this.Update(new ConfigurationSetting { Key = key, Value = value }, clearCache); } - /// - /// Updates the setting for a specified key. - /// - /// The key. - /// The value. + /// public void Update(string key, string value) { this.Update(key, value, true); } - /// - /// Takes in a value, encrypts it with a FIPS compliant algorithm and stores it. - /// - /// host settings key. - /// host settings value. - /// pass phrase to allow encryption/decryption. + /// public void UpdateEncryptedString(string key, string value, string passPhrase) { Requires.NotNullOrEmpty("key", key); @@ -336,10 +245,7 @@ public void UpdateEncryptedString(string key, string value, string passPhrase) this.Update(key, cipherText); } - /// - /// Increments the Client Resource Manager (CRM) version to bust local cache. - /// - /// If true also forces a CRM version increment on portals that have non-default settings for CRM. + /// public void IncrementCrmVersion(bool includeOverridingPortals) { var currentVersion = Host.Host.CrmVersion; @@ -356,9 +262,9 @@ public void IncrementCrmVersion(bool includeOverridingPortals) /// Gets all settings from the databse. /// /// - private static Dictionary GetSettingsFromDatabase() + private Dictionary GetSettingsFromDatabase() { - var dicSettings = new Dictionary(); + var dicSettings = new Dictionary(); IDataReader dr = null; try { @@ -388,9 +294,9 @@ private static Dictionary GetSettingsFromDatabase( return dicSettings; } - private static object GetSettingsDictionaryCallBack(CacheItemArgs cacheItemArgs) + private object GetSettingsDictionaryCallBack(CacheItemArgs cacheItemArgs) { - return GetSettingsFromDatabase(); + return this.GetSettingsFromDatabase(); } } } diff --git a/DNN Platform/Library/Entities/Controllers/IHostController.cs b/DNN Platform/Library/Entities/Controllers/IHostController.cs index ad1d48b8a55..2c4fde9682b 100644 --- a/DNN Platform/Library/Entities/Controllers/IHostController.cs +++ b/DNN Platform/Library/Entities/Controllers/IHostController.cs @@ -1,8 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information + namespace DotNetNuke.Entities.Controllers -{ +{ + using System; using System.Collections.Generic; /// @@ -20,6 +22,7 @@ namespace DotNetNuke.Entities.Controllers /// /// /// + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] public interface IHostController { /// @@ -27,6 +30,7 @@ public interface IHostController /// /// The setting key string. /// host setting as a boolean. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] bool GetBoolean(string key); /// @@ -35,6 +39,7 @@ public interface IHostController /// The setting key string. /// Default value returned if the setting is not found or not compatible with the requested type. /// host setting or the provided default value as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] bool GetBoolean(string key, bool defaultValue); /// @@ -43,6 +48,7 @@ public interface IHostController /// The setting key string. /// Default value returned if the setting is not found or not compatible with the requested type. /// Host setting or the provided default value as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] double GetDouble(string key, double defaultValue); /// @@ -50,6 +56,7 @@ public interface IHostController /// /// The setting key string. /// Host setting as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] double GetDouble(string key); /// @@ -57,6 +64,7 @@ public interface IHostController /// /// The setting key string. /// Host setting as an . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] int GetInteger(string key); /// @@ -65,18 +73,21 @@ public interface IHostController /// The setting key string. /// Default value returned if the setting is not found or not compatible with the requested type. /// Host setting or provided default value as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] int GetInteger(string key, int defaultValue); /// /// Gets the host settings. /// /// Host settings as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] Dictionary GetSettings(); /// /// Gets the host settings. /// /// Host settings as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] Dictionary GetSettingsDictionary(); /// @@ -85,6 +96,7 @@ public interface IHostController /// The setting key string. /// The passPhrase used to decrypt the setting value. /// The setting value as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] string GetEncryptedString(string key, string passPhrase); /// @@ -92,6 +104,7 @@ public interface IHostController /// /// The setting key string. /// The setting value as a . + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] string GetString(string key); /// @@ -100,18 +113,21 @@ public interface IHostController /// The seeting key string. /// /// Default value returned if the setting is not found. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] string GetString(string key, string defaultValue); /// /// Updates the specified settings. /// /// The settings to update. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void Update(Dictionary settings); /// /// Updates the specified config. /// /// The configuration setting. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void Update(ConfigurationSetting config); /// @@ -119,6 +135,7 @@ public interface IHostController /// /// The configuaration setting. /// If set to true, will clear the cache after updating the setting. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void Update(ConfigurationSetting config, bool clearCache); /// @@ -127,6 +144,7 @@ public interface IHostController /// The setting key string. /// The value to update. /// If set to true, will clear the cache after updating the setting. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void Update(string key, string value, bool clearCache); /// @@ -134,6 +152,7 @@ public interface IHostController /// /// The setting key string. /// The value to update. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void Update(string key, string value); /// @@ -142,12 +161,14 @@ public interface IHostController /// host settings key. /// host settings value. /// pass phrase to allow encryption/decryption. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void UpdateEncryptedString(string key, string value, string passPhrase); /// /// Increments the Client Resource Manager (CRM) version to bust local cache. /// /// If true also forces a CRM version increment on portals that have non-default settings for CRM. + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] void IncrementCrmVersion(bool includeOverridingPortals); } } diff --git a/DNN Platform/Library/Obsolete/HostController.cs b/DNN Platform/Library/Obsolete/HostController.cs new file mode 100644 index 00000000000..1cbd1d8c328 --- /dev/null +++ b/DNN Platform/Library/Obsolete/HostController.cs @@ -0,0 +1,61 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Entities.Controllers +{ + using System; + using System.Collections.Generic; + using System.Linq; + + using DotNetNuke.Common; + using DotNetNuke.ComponentModel; + + using Microsoft.Extensions.DependencyInjection; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + + /// + public partial class HostController : ComponentBase, IHostController + { + // None of the APIs are deprecated, but the IHostController + // is deprecated and moved to the abstractions project. When + // it is time to remove APIs we should remove the parent + // classes listed here + + private static IHostController currentInstance; + + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + public static new IHostController Instance + { + get + { + if (currentInstance != null) + { + return currentInstance; + } + + var newHostController = Globals.DependencyProvider.GetRequiredService(); + return newHostController is IHostController castedController ? currentInstance = castedController : new HostController(); + } + } + + /// + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + public Dictionary GetSettings() => + (this as INewHostController).GetSettings() + .Where(setting => setting.Value is ConfigurationSetting) + .Select(setting => new KeyValuePair(setting.Key, (ConfigurationSetting)setting.Value)) + .ToDictionary(setting => setting.Key, setting => setting.Value); + + /// + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + public void Update(ConfigurationSetting config) => + (this as INewHostController).Update(config); + + /// + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + public void Update(ConfigurationSetting config, bool clearCache) => + (this as INewHostController).Update(config, clearCache); + } +} diff --git a/DNN Platform/Library/Startup.cs b/DNN Platform/Library/Startup.cs index a56986c5434..b737c7e7e9a 100644 --- a/DNN Platform/Library/Startup.cs +++ b/DNN Platform/Library/Startup.cs @@ -9,11 +9,15 @@ namespace DotNetNuke using DotNetNuke.Application; using DotNetNuke.Common; using DotNetNuke.DependencyInjection; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.UI.Modules; using DotNetNuke.UI.Modules.Html5; + using Microsoft.Extensions.DependencyInjection; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + /// public class Startup : IDnnStartup { @@ -26,6 +30,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddTransient(x => PortalController.Instance); + services.AddTransient(); services.AddScoped(); services.AddScoped(); From fc51e4a452b238f6643d471e666158614ef22fc0 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Sun, 16 Aug 2020 22:12:31 -0400 Subject: [PATCH 12/32] Added unit tests --- .../Library/Obsolete/HostController.cs | 9 +- .../AttachmentControllerTests.cs | 13 +- .../ContentControllerTests.cs | 14 +- .../ContentTypeControllerTests.cs | 11 +- .../DotNetNuke.Tests.Content.csproj | 1 + .../ScopeTypeControllerTests.cs | 11 +- .../TermControllerTests.cs | 11 +- .../VocabularyControllerTests.cs | 646 ++++----- .../Common/NavigationManagerTests.cs | 13 +- .../Controllers/Host/HostControllerTest.cs | 8 +- .../Messaging/NotificationsControllerTests.cs | 11 +- .../SubscriptionTypeControllerTests.cs | 14 +- .../Portal/PortalGroupControllerTests.cs | 17 +- .../Search/InternalSearchControllerTests.cs | 12 +- .../Search/LuceneControllerTests.cs | 37 +- .../Search/SearchControllerTests.cs | 8 +- .../Controllers/Search/SearchHelperTests.cs | 11 +- .../Social/RelationshipControllerTests.cs | 8 +- .../Modules/Settings/ModuleSettingsTests.cs | 24 +- .../Modules/Settings/NullableSettingsTests.cs | 26 +- .../Modules/Settings/PortalSettingsTests.cs | 26 +- .../Settings/TabModuleSettingsTests.cs | 24 +- .../Portals/PortalSettingsControllerTests.cs | 1213 +++++++++-------- .../Folder/FileContentTypeManagerTests.cs | 9 +- .../Providers/Folder/FileManagerTests.cs | 13 +- .../Mobile/PreviewProfileControllerTests.cs | 22 +- .../Mobile/RedirectionControllerTests.cs | 7 +- .../Services/Tokens/TokenReplaceTests.cs | 13 +- .../UserRequestIPAddressControllerTest.cs | 14 +- 29 files changed, 1212 insertions(+), 1034 deletions(-) diff --git a/DNN Platform/Library/Obsolete/HostController.cs b/DNN Platform/Library/Obsolete/HostController.cs index 1cbd1d8c328..db7b40e571e 100644 --- a/DNN Platform/Library/Obsolete/HostController.cs +++ b/DNN Platform/Library/Obsolete/HostController.cs @@ -15,14 +15,13 @@ namespace DotNetNuke.Entities.Controllers using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + // None of the APIs are deprecated, but the IHostController + // is deprecated and moved to the abstractions project. When + // it is time to remove APIs we should remove the parent + // classes listed here /// public partial class HostController : ComponentBase, IHostController { - // None of the APIs are deprecated, but the IHostController - // is deprecated and moved to the abstractions project. When - // it is time to remove APIs we should remove the parent - // classes listed here - private static IHostController currentInstance; [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs index 1e2f7f3bc49..ebf1e4a44ab 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs @@ -5,10 +5,10 @@ namespace DotNetNuke.Tests.Content { using System.Collections.Generic; - using System.Linq; using DotNetNuke.Abstractions; + using System.Linq; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Content; @@ -18,15 +18,15 @@ namespace DotNetNuke.Tests.Content using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; using FileController = DotNetNuke.Entities.Content.AttachmentController; - using Util = DotNetNuke.Entities.Content.Common.Util; + using Util = DotNetNuke.Entities.Content.Common.Util; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Common; [TestFixture] public class AttachmentControllerTests @@ -39,6 +39,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); // Register MockCachingProvider diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs index f2d3bbc3131..46142e1fe2c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs @@ -9,24 +9,24 @@ namespace DotNetNuke.Tests.Content using System.Collections.Specialized; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; using DotNetNuke.Services.Search.Entities; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Summary description for ContentItemTests. @@ -43,6 +43,10 @@ public class ContentControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockCache = MockComponentProvider.CreateNew(); this._mockDataProvider = MockComponentProvider.CreateDataProvider(); this._mockSearchHelper = new Mock(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs index 88f624fcfc8..d90f1708941 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs @@ -7,21 +7,21 @@ namespace DotNetNuke.Tests.Content using System; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Summary description for ContentTypeTests. @@ -37,6 +37,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); // Register MockCachingProvider diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj index 626c6fdfa68..603e0919c82 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj @@ -108,6 +108,7 @@ {6928A9B1-F88A-4581-A132-D3EB38669BB0} + {6928a9b1-f88a-4581-a132-d3eb38669bb0} DotNetNuke.Abstractions diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs index 01f104f9c10..8a33c4e9552 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs @@ -7,21 +7,21 @@ namespace DotNetNuke.Tests.Content using System; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content.Data; - using DotNetNuke.Entities.Content.Taxonomy; + using DotNetNuke.Entities.Content.Taxonomy; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Summary description for ScopeTypeTests. @@ -37,6 +37,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); // Register MockCachingProvider diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs index 0aeb25a7cd9..c42ce8e0211 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs @@ -7,23 +7,23 @@ namespace DotNetNuke.Tests.Content using System; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Content; using DotNetNuke.Entities.Content.Data; - using DotNetNuke.Entities.Content.Taxonomy; + using DotNetNuke.Entities.Content.Taxonomy; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Users; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Content.Mocks; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Summary description for TermTests. @@ -39,6 +39,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); Mock vocabularyController = MockHelper.CreateMockVocabularyController(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs index 82e483e1941..7a9c6e52b80 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs @@ -2,334 +2,338 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Content -{ - using System; +namespace DotNetNuke.Tests.Content +{ + using System; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Content.Data; - using DotNetNuke.Entities.Content.Taxonomy; - using DotNetNuke.Services.Cache; - using DotNetNuke.Tests.Content.Mocks; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Entities.Content.Taxonomy; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Services.Cache; + using DotNetNuke.Tests.Content.Mocks; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - /// - /// Summary description for VocabularyTests. - /// - [TestFixture] - public class VocabularyControllerTests - { - private Mock mockCache; - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + + /// + /// Summary description for VocabularyTests. + /// + [TestFixture] + public class VocabularyControllerTests + { + private Mock mockCache; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - // Register MockCachingProvider - this.mockCache = MockComponentProvider.CreateNew(); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void VocabularyController_AddVocabulary_Throws_On_Null_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => vocabularyController.AddVocabulary(null)); - } - - [Test] - public void VocabularyController_AddVocabulary_Throws_On_Invalid_Name() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.Name = Constants.VOCABULARY_InValidName; - - // Act, Arrange - Assert.Throws(() => vocabularyController.AddVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_AddVocabulary_Throws_On_Negative_ScopeTypeID() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.ScopeTypeId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => vocabularyController.AddVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_AddVocabulary_Calls_DataService_On_Valid_Arguments() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - - // Act - int vocabularyId = vocabularyController.AddVocabulary(vocabulary); - - // Assert - mockDataService.Verify(ds => ds.AddVocabulary(vocabulary, It.IsAny())); - } - - [Test] - public void VocabularyController_AddVocabulary_Returns_ValidId_On_Valid_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddVocabulary(It.IsAny(), It.IsAny())).Returns(Constants.VOCABULARY_AddVocabularyId); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - - // Act - int vocabularyId = vocabularyController.AddVocabulary(vocabulary); - - // Assert - Assert.AreEqual(Constants.VOCABULARY_AddVocabularyId, vocabularyId); - } - - [Test] - public void VocabularyController_AddVocabulary_Sets_ValidId_On_Valid_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddVocabulary(It.IsAny(), It.IsAny())).Returns(Constants.VOCABULARY_AddVocabularyId); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - - // Act - vocabularyController.AddVocabulary(vocabulary); - - // Assert - Assert.AreEqual(Constants.VOCABULARY_AddVocabularyId, vocabulary.VocabularyId); - } - - [Test] - public void VocabularyController_AddVocabulary_Clears_Vocabulary_Cache_On_Valid_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - - // Act - vocabularyController.AddVocabulary(vocabulary); - - // Assert - this.mockCache.Verify(cache => cache.Remove(Constants.VOCABULARY_CacheKey)); - } - - [Test] - public void VocabularyController_DeleteVocabulary_Throws_On_Null_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => vocabularyController.DeleteVocabulary(null)); - } - - [Test] - public void VocabularyController_DeleteVocabulary_Throws_On_Negative_VocabularyId() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = new Vocabulary(); - vocabulary.VocabularyId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => vocabularyController.DeleteVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_DeleteVocabulary_Calls_DataService_On_Valid_Arguments() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.VocabularyId = Constants.VOCABULARY_ValidVocabularyId; - - // Act - vocabularyController.DeleteVocabulary(vocabulary); - - // Assert - mockDataService.Verify(ds => ds.DeleteVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_DeleteVocabulary_Clears_Vocabulary_Cache_On_Valid_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.VocabularyId = Constants.VOCABULARY_ValidVocabularyId; - - // Act - vocabularyController.DeleteVocabulary(vocabulary); - - // Assert - this.mockCache.Verify(cache => cache.Remove(Constants.VOCABULARY_CacheKey)); - } - - [Test] - public void VocabularyController_GetVocabularies_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetVocabularies()).Returns(MockHelper.CreateValidVocabulariesReader(Constants.VOCABULARY_ValidCount)); - var vocabularyController = new VocabularyController(mockDataService.Object); - - // Act - IQueryable vocabularys = vocabularyController.GetVocabularies(); - - // Assert - mockDataService.Verify(ds => ds.GetVocabularies()); - } - - [Test] - public void VocabularyController_GetVocabularies_Returns_List_Of_Vocabularies() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetVocabularies()).Returns(MockHelper.CreateValidVocabulariesReader(Constants.VOCABULARY_ValidCount)); - var vocabularyController = new VocabularyController(mockDataService.Object); - - // Act - IQueryable vocabularys = vocabularyController.GetVocabularies(); - - // Assert - Assert.AreEqual(Constants.VOCABULARY_ValidCount, vocabularys.Count()); - } - - [Test] - public void VocabularyController_UpdateVocabulary_Throws_On_Null_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => vocabularyController.UpdateVocabulary(null)); - } - - [Test] - public void VocabularyController_UpdateVocabulary_Throws_On_Negative_VocabularyId() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.VocabularyId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => vocabularyController.UpdateVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_UpdateVocabulary_Throws_On_Invalid_Name() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.Name = Constants.VOCABULARY_InValidName; - - // Act, Arrange - Assert.Throws(() => vocabularyController.UpdateVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_UpdateVocabulary_Throws_On_Negative_ScopeTypeID() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.ScopeTypeId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => vocabularyController.UpdateVocabulary(vocabulary)); - } - - [Test] - public void VocabularyController_UpdateVocabulary_Calls_DataService_On_Valid_Arguments() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.VocabularyId = Constants.VOCABULARY_UpdateVocabularyId; - - // Act - vocabularyController.UpdateVocabulary(vocabulary); - - // Assert - mockDataService.Verify(ds => ds.UpdateVocabulary(vocabulary, It.IsAny())); - } - - [Test] - public void VocabularyController__UpdateVocabulary_Clears_Vocabulary_Cache_On_Valid_Vocabulary() - { - // Arrange - var mockDataService = new Mock(); - var vocabularyController = new VocabularyController(mockDataService.Object); - - Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); - vocabulary.VocabularyId = Constants.VOCABULARY_UpdateVocabularyId; - - // Act - vocabularyController.UpdateVocabulary(vocabulary); - - // Assert - this.mockCache.Verify(cache => cache.Remove(Constants.VOCABULARY_CacheKey)); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + // Register MockCachingProvider + this.mockCache = MockComponentProvider.CreateNew(); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); } - } -} + + [Test] + public void VocabularyController_AddVocabulary_Throws_On_Null_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => vocabularyController.AddVocabulary(null)); + } + + [Test] + public void VocabularyController_AddVocabulary_Throws_On_Invalid_Name() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.Name = Constants.VOCABULARY_InValidName; + + // Act, Arrange + Assert.Throws(() => vocabularyController.AddVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_AddVocabulary_Throws_On_Negative_ScopeTypeID() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.ScopeTypeId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => vocabularyController.AddVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_AddVocabulary_Calls_DataService_On_Valid_Arguments() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + + // Act + int vocabularyId = vocabularyController.AddVocabulary(vocabulary); + + // Assert + mockDataService.Verify(ds => ds.AddVocabulary(vocabulary, It.IsAny())); + } + + [Test] + public void VocabularyController_AddVocabulary_Returns_ValidId_On_Valid_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddVocabulary(It.IsAny(), It.IsAny())).Returns(Constants.VOCABULARY_AddVocabularyId); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + + // Act + int vocabularyId = vocabularyController.AddVocabulary(vocabulary); + + // Assert + Assert.AreEqual(Constants.VOCABULARY_AddVocabularyId, vocabularyId); + } + + [Test] + public void VocabularyController_AddVocabulary_Sets_ValidId_On_Valid_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddVocabulary(It.IsAny(), It.IsAny())).Returns(Constants.VOCABULARY_AddVocabularyId); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + + // Act + vocabularyController.AddVocabulary(vocabulary); + + // Assert + Assert.AreEqual(Constants.VOCABULARY_AddVocabularyId, vocabulary.VocabularyId); + } + + [Test] + public void VocabularyController_AddVocabulary_Clears_Vocabulary_Cache_On_Valid_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + + // Act + vocabularyController.AddVocabulary(vocabulary); + + // Assert + this.mockCache.Verify(cache => cache.Remove(Constants.VOCABULARY_CacheKey)); + } + + [Test] + public void VocabularyController_DeleteVocabulary_Throws_On_Null_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => vocabularyController.DeleteVocabulary(null)); + } + + [Test] + public void VocabularyController_DeleteVocabulary_Throws_On_Negative_VocabularyId() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = new Vocabulary(); + vocabulary.VocabularyId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => vocabularyController.DeleteVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_DeleteVocabulary_Calls_DataService_On_Valid_Arguments() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.VocabularyId = Constants.VOCABULARY_ValidVocabularyId; + + // Act + vocabularyController.DeleteVocabulary(vocabulary); + + // Assert + mockDataService.Verify(ds => ds.DeleteVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_DeleteVocabulary_Clears_Vocabulary_Cache_On_Valid_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.VocabularyId = Constants.VOCABULARY_ValidVocabularyId; + + // Act + vocabularyController.DeleteVocabulary(vocabulary); + + // Assert + this.mockCache.Verify(cache => cache.Remove(Constants.VOCABULARY_CacheKey)); + } + + [Test] + public void VocabularyController_GetVocabularies_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetVocabularies()).Returns(MockHelper.CreateValidVocabulariesReader(Constants.VOCABULARY_ValidCount)); + var vocabularyController = new VocabularyController(mockDataService.Object); + + // Act + IQueryable vocabularys = vocabularyController.GetVocabularies(); + + // Assert + mockDataService.Verify(ds => ds.GetVocabularies()); + } + + [Test] + public void VocabularyController_GetVocabularies_Returns_List_Of_Vocabularies() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetVocabularies()).Returns(MockHelper.CreateValidVocabulariesReader(Constants.VOCABULARY_ValidCount)); + var vocabularyController = new VocabularyController(mockDataService.Object); + + // Act + IQueryable vocabularys = vocabularyController.GetVocabularies(); + + // Assert + Assert.AreEqual(Constants.VOCABULARY_ValidCount, vocabularys.Count()); + } + + [Test] + public void VocabularyController_UpdateVocabulary_Throws_On_Null_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => vocabularyController.UpdateVocabulary(null)); + } + + [Test] + public void VocabularyController_UpdateVocabulary_Throws_On_Negative_VocabularyId() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.VocabularyId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => vocabularyController.UpdateVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_UpdateVocabulary_Throws_On_Invalid_Name() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.Name = Constants.VOCABULARY_InValidName; + + // Act, Arrange + Assert.Throws(() => vocabularyController.UpdateVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_UpdateVocabulary_Throws_On_Negative_ScopeTypeID() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.ScopeTypeId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => vocabularyController.UpdateVocabulary(vocabulary)); + } + + [Test] + public void VocabularyController_UpdateVocabulary_Calls_DataService_On_Valid_Arguments() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.VocabularyId = Constants.VOCABULARY_UpdateVocabularyId; + + // Act + vocabularyController.UpdateVocabulary(vocabulary); + + // Assert + mockDataService.Verify(ds => ds.UpdateVocabulary(vocabulary, It.IsAny())); + } + + [Test] + public void VocabularyController__UpdateVocabulary_Clears_Vocabulary_Cache_On_Valid_Vocabulary() + { + // Arrange + var mockDataService = new Mock(); + var vocabularyController = new VocabularyController(mockDataService.Object); + + Vocabulary vocabulary = ContentTestHelper.CreateValidVocabulary(); + vocabulary.VocabularyId = Constants.VOCABULARY_UpdateVocabularyId; + + // Act + vocabularyController.UpdateVocabulary(vocabulary); + + // Assert + this.mockCache.Verify(cache => cache.Remove(Constants.VOCABULARY_CacheKey)); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs index b8a9326f001..e81ef3d5892 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs @@ -10,13 +10,17 @@ namespace DotNetNuke.Tests.Core.Common using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Portals; using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Tabs; - using DotNetNuke.Services.Localization; + using DotNetNuke.Services.Localization; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + [TestFixture] public class NavigationManagerTests { @@ -31,6 +35,10 @@ public class NavigationManagerTests [TestFixtureSetUp] public void Setup() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._navigationManager = new NavigationManager(PortalControllerMock()); TabController.SetTestableInstance(TabControllerMock()); LocaleController.SetTestableInstance(LocaleControllerMock()); @@ -96,6 +104,7 @@ ILocaleController LocaleControllerMock() [TestFixtureTearDown] public void TearDown() { + Globals.DependencyProvider = null; this._navigationManager = null; TabController.ClearInstance(); LocaleController.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs index 4da0b21a1c8..b9b965a0931 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs @@ -9,20 +9,19 @@ namespace DotNetNuke.Tests.Core.Controllers.Host using System.Data; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; using DotNetNuke.Entities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class HostControllerTest @@ -39,6 +38,7 @@ public void SetUp() mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); this._mockCache = MockComponentProvider.CreateDataCacheProvider(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs index 2f9341d0b38..a5416ec1434 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs @@ -11,11 +11,12 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using System.Globalization; using System.Text; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; - using DotNetNuke.Data; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Users; using DotNetNuke.Security.Roles; @@ -27,12 +28,11 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using DotNetNuke.Services.Social.Notifications.Data; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class NotificationsControllerTests @@ -59,6 +59,7 @@ public void SetUp() mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); ComponentFactory.Container = new SimpleContainer(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs index 81022007ee8..06b1616c97a 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs @@ -4,8 +4,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging { - using System; - + using System; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; @@ -13,9 +13,12 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using DotNetNuke.Services.Social.Subscriptions.Data; using DotNetNuke.Tests.Core.Controllers.Messaging.Builders; using DotNetNuke.Tests.Core.Controllers.Messaging.Mocks; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class SubscriptionTypeControllerTests @@ -29,6 +32,10 @@ public class SubscriptionTypeControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + // Setup Mocks and Stub this.mockDataService = new Mock(); this.mockCacheProvider = MockComponentProvider.CreateDataCacheProvider(); @@ -174,6 +181,7 @@ public void DeleteSubscriptionType_ShouldCleanCache_WhenNoError() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; DataService.ClearInstance(); MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs index 824af839ab3..eee92bcf65b 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs @@ -7,17 +7,21 @@ namespace DotNetNuke.Tests.Core.Controllers.Portal using System; using System.Collections.Generic; using System.Data; - using System.Linq; - + using System.Linq; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Portals.Data; using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; // ReSharper disable InconsistentNaming [TestFixture] @@ -31,6 +35,10 @@ public class PortalGroupControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockData = MockComponentProvider.CreateDataProvider(); DataTable hostSettingsTable = new DataTable("HostSettings"); @@ -46,6 +54,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs index 709036f7cdb..736c2414fae 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs @@ -10,8 +10,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.IO; using System.Threading; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; @@ -24,6 +24,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of SearchController. @@ -120,12 +122,18 @@ public void SetUp() .Returns((int portalId, int userId) => this.GetUserByIdCallback(portalId, userId)); UserController.SetTestableInstance(this._mockUserController.Object); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => (INewHostController)_mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this.CreateNewLuceneControllerInstance(); } [TearDown] public void TearDown() { + this._mockHostController = null; + Globals.DependencyProvider = null; this._luceneController.Dispose(); this.DeleteIndexFolder(); InternalSearchController.ClearInstance(); @@ -511,7 +519,7 @@ private void SetupHostController() this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchAuthorBoost); this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); - HostController.RegisterInstance(this._mockHostController.Object); + this._mockHostController.As(); } private void SetupLocaleController() diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs index 58311a9a1c2..6043cac7d3c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs @@ -10,8 +10,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.Linq; using System.Threading; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; @@ -28,6 +28,7 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using NUnit.Framework; using Directory = System.IO.Directory; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of LuceneController. @@ -65,21 +66,12 @@ public class LuceneControllerTests [SetUp] public void SetUp() { + + ComponentFactory.Container = new SimpleContainer(); this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._mockHostController = new Mock(); - this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); - this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this._readerStaleTimeSpan); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); - HostController.RegisterInstance(this._mockHostController.Object); + this.MockHostController(); this._mockSearchHelper = new Mock(); this._mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.GetSynonymsCallBack); @@ -88,6 +80,12 @@ public void SetUp() this._mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); SearchHelper.SetTestableInstance(this._mockSearchHelper.Object); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(container => (INewHostController)this._mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockSearchQuery = new Mock(); this.DeleteIndexFolder(); @@ -97,12 +95,25 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; this._luceneController.Dispose(); this.DeleteIndexFolder(); SearchHelper.ClearInstance(); Globals.DependencyProvider = null; } + private void MockHostController() + { + this._mockHostController = new Mock(); + this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); + this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this._readerStaleTimeSpan); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); + this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); + + this._mockHostController.As(); + } + [Test] public void LuceneController_SearchFolderIsAsExpected() { diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs index c8f6ce90b60..8e0be409804 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs @@ -11,8 +11,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.Linq; using System.Threading; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; @@ -29,6 +29,7 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using NUnit.Framework; using Constants = DotNetNuke.Services.Search.Internals.Constants; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of SearchController. @@ -139,6 +140,10 @@ public enum SearchTypeIds [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.Container = new SimpleContainer(); MockComponentProvider.ResetContainer(); @@ -169,6 +174,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; this._luceneController.Dispose(); this.DeleteIndexFolder(); InternalSearchController.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs index 65d0ba2247a..68b06309561 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs @@ -8,20 +8,20 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.Data; using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; - using DotNetNuke.Data; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; using DotNetNuke.Services.Search.Internals; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of SearchController. @@ -51,6 +51,7 @@ public void SetUp() mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); ComponentFactory.Container = new SimpleContainer(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs index 1cedf9e940f..c59d2a9bb99 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs @@ -8,8 +8,8 @@ namespace DotNetNuke.Tests.Core.Controllers.Social using System.Collections.Generic; using System.Data; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Controllers; @@ -21,12 +21,11 @@ namespace DotNetNuke.Tests.Core.Controllers.Social using DotNetNuke.Services.Log.EventLog; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of RelationshipController. @@ -51,6 +50,7 @@ public void SetUp() mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); ComponentFactory.Container = new SimpleContainer(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs index fba4752988a..0f51ebcec31 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs @@ -7,16 +7,34 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using System; using System.Collections; using System.Collections.Generic; - using System.Globalization; - + using System.Globalization; + using DotNetNuke.Common; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Modules.Settings; + using DotNetNuke.Entities.Modules.Settings; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class ModuleSettingsTests : BaseSettingsTests { + [SetUp] + public void Setup() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + } + [Test] [TestCaseSource(nameof(SettingsCases))] [SetCulture("ar-JO")] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs index 51e46f6689d..a11264aa558 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs @@ -7,11 +7,15 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using System; using System.Collections; using System.Collections.Generic; - using System.Globalization; - - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Modules.Settings; + using System.Globalization; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Modules.Settings; + using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class NullableSettingsTests : BaseSettingsTests @@ -23,6 +27,20 @@ public class NullableSettingsTests : BaseSettingsTests new object[] { "lorem ipsum", 456, DateTime.Now, DateTime.Today - DateTime.Now, }, }; + [SetUp] + public void Setup() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + } + [Test] [TestCaseSource(nameof(NullableCases))] [SetCulture("ar-JO")] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs index 725631066b8..a8294aba924 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs @@ -6,17 +6,35 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings { using System; using System.Collections.Generic; - using System.Globalization; - - using DotNetNuke.Common.Utilities; + using System.Globalization; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules.Settings; - using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Portals; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class PortalSettingsTests : BaseSettingsTests { + [SetUp] + public void Setup() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + } + [Test] [TestCaseSource(nameof(SettingsCases))] [SetCulture("ar-JO")] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs index 5d7ed767a43..061ee1a9cb4 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs @@ -7,16 +7,34 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using System; using System.Collections; using System.Collections.Generic; - using System.Globalization; - + using System.Globalization; + using DotNetNuke.Common; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Modules.Settings; + using DotNetNuke.Entities.Modules.Settings; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class TabModuleSettingsTests : BaseSettingsTests { + [SetUp] + public void Setup() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + } + [Test] [TestCaseSource(nameof(SettingsCases))] [SetCulture("ar-JO")] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs index dc91cadca39..d5743a4e7a8 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs @@ -2,45 +2,46 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Entities.Portals -{ - using System; - using System.Collections.Generic; - using System.Reflection; +namespace DotNetNuke.Tests.Core.Entities.Portals +{ + using System; + using System.Collections.Generic; + using System.Reflection; using System.Runtime.Serialization; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Services.Localization; - using DotNetNuke.Tests.Utilities.Mocks; + + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Tabs; + using DotNetNuke.Services.Localization; + using DotNetNuke.Tests.Utilities.Mocks; using DotNetNuke.UI.Skins; using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - [TestFixture] - public class PortalSettingsControllerTests - { - private const int HostPortalId = -1; - private const int HostTabId = 24; - private const int ValidPortalId = 0; - private const int ValidTabId = 42; - private const int ParentTabId = 55; - private const int SplashTabId = 41; - private const int HomeTabId = 40; - private const int InValidTabId = -1; - - private const string DefaultSkin = "DefaultSkin"; - private const string TabSkin = "TabSkin"; - private const string GlobalTabSkin = "[g]TabSkin"; - - private const string DefaultContainer = "DefaultContainer"; - private const string TabContainer = "TabContainer"; - private const string GlobalTabContainer = "[g]TabContainer"; + using Moq; + using NUnit.Framework; + + [TestFixture] + public class PortalSettingsControllerTests + { + private const int HostPortalId = -1; + private const int HostTabId = 24; + private const int ValidPortalId = 0; + private const int ValidTabId = 42; + private const int ParentTabId = 55; + private const int SplashTabId = 41; + private const int HomeTabId = 40; + private const int InValidTabId = -1; + + private const string DefaultSkin = "DefaultSkin"; + private const string TabSkin = "TabSkin"; + private const string GlobalTabSkin = "[g]TabSkin"; + + private const string DefaultContainer = "DefaultContainer"; + private const string TabContainer = "TabContainer"; + private const string GlobalTabContainer = "[g]TabContainer"; [SetUp] public void SetUp() @@ -63,575 +64,575 @@ public void TearDown() Globals.DependencyProvider = null; } - - [Test] - [TestCaseSource(typeof(PortalSettingsControllerTestFactory), "LoadPortalSettings_Loads_Default_Value")] - public void LoadPortalSettings_Loads_Default_Value(Dictionary testFields) - { - // Arrange - var propertyName = testFields["PropertyName"]; - var settingName = testFields["SettingName"]; - var isHostDefault = bool.Parse(testFields["IsHostDefault"]); - var defaultValue = testFields["DefaultValue"]; - var controller = new PortalSettingsController(); - var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var hostSettings = PortalSettingsControllerTestFactory.GetHostSettings(); - - var mockPortalController = new Mock(); - mockPortalController - .Setup(c => c.GetPortalSettings(It.IsAny())) - .Returns(new Dictionary()); - PortalController.SetTestableInstance(mockPortalController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString(It.IsAny())) - .Returns((string s) => hostSettings[s]); - mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) - .Returns((string s1, string s2) => hostSettings[s1]); - mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) - .Returns((string s, bool b) => bool.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) - .Returns((string s, int i) => int.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny())) - .Returns((string s) => int.Parse(hostSettings[s])); - HostController.RegisterInstance(mockHostController.Object); - - if (isHostDefault) - { - defaultValue = hostSettings[settingName]; - } - - // Act - controller.LoadPortalSettings(settings); - - // Assert - var property = settings.GetType().GetProperty(propertyName); - var actualValue = property.GetValue(settings, null); - if (actualValue is bool) - { - Assert.AreEqual(defaultValue, actualValue.ToString().ToLowerInvariant()); - } - else - { - Assert.AreEqual(defaultValue, actualValue.ToString()); - } - } - - [Test] - [TestCaseSource(typeof(PortalSettingsControllerTestFactory), "LoadPortalSettings_Loads_Setting_Value")] - public void LoadPortalSettings_Loads_Setting_Value(Dictionary testFields) - { - // Arrange - var propertyName = testFields["PropertyName"]; - var settingName = testFields["SettingName"]; - var settingValue = testFields["SettingValue"]; - var propertyValue = testFields.ContainsKey("PropertyValue") ? testFields["PropertyValue"] : settingValue; - var controller = new PortalSettingsController(); - var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var hostSettings = PortalSettingsControllerTestFactory.GetHostSettings(); - - var mockPortalController = new Mock(); - mockPortalController - .Setup(c => c.GetPortalSettings(It.IsAny())) - .Returns(new Dictionary { { settingName, settingValue } }); - PortalController.SetTestableInstance(mockPortalController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString(It.IsAny())) - .Returns((string s) => hostSettings[s]); - mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) - .Returns((string s1, string s2) => hostSettings[s1]); - mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) - .Returns((string s, bool b) => bool.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) - .Returns((string s, int i) => int.Parse(hostSettings[s])); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.LoadPortalSettings(settings); - - // Assert - var property = settings.GetType().GetProperty(propertyName); - var actualValue = property.GetValue(settings, null); - if (actualValue is bool) - { - Assert.AreEqual(propertyValue, actualValue.ToString().ToLowerInvariant()); - } - else - { - Assert.AreEqual(propertyValue, actualValue.ToString()); - } - } - - [Test] - public void LoadPortalSettings_Sets_TimeZone_Property_To_Local_TimeZone() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var hostSettings = PortalSettingsControllerTestFactory.GetHostSettings(); - - var mockPortalController = new Mock(); - mockPortalController - .Setup(c => c.GetPortalSettings(It.IsAny())) - .Returns(new Dictionary()); - PortalController.SetTestableInstance(mockPortalController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString(It.IsAny())) - .Returns((string s) => hostSettings[s]); - mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) - .Returns((string s1, string s2) => hostSettings[s1]); - mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) - .Returns((string s, bool b) => bool.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) - .Returns((string s, int i) => int.Parse(hostSettings[s])); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.LoadPortalSettings(settings); - - // Assert - Assert.AreEqual(TimeZoneInfo.Local, settings.TimeZone); - } - - [Test] - public void LoadPortal_Loads_Portal_Property_Values() - { - // Arrange - var controller = new PortalSettingsController(); - var portal = new PortalInfo() - { - Users = 2, - Pages = 5, - DefaultLanguage = Localization.SystemLocale, - HomeDirectory = "Portals/0", - }; - var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; - - // Act - controller.LoadPortal(portal, settings); - - // Assert - Assert.AreEqual(portal.AdminTabId, settings.AdminTabId); - Assert.AreEqual(portal.AdministratorId, settings.AdministratorId); - Assert.AreEqual(portal.AdministratorRoleId, settings.AdministratorRoleId); - Assert.AreEqual(portal.AdministratorRoleName, settings.AdministratorRoleName); - Assert.AreEqual(portal.BackgroundFile, settings.BackgroundFile); - Assert.AreEqual(portal.BannerAdvertising, settings.BannerAdvertising); - Assert.AreEqual(portal.CultureCode, settings.CultureCode); - Assert.AreEqual(portal.Currency, settings.Currency); - Assert.AreEqual(portal.Custom404TabId, settings.ErrorPage404); - Assert.AreEqual(portal.Custom500TabId, settings.ErrorPage500); - Assert.AreEqual(portal.TermsTabId, settings.TermsTabId); - Assert.AreEqual(portal.PrivacyTabId, settings.PrivacyTabId); - Assert.AreEqual(portal.DefaultLanguage, settings.DefaultLanguage); - Assert.AreEqual(portal.Description, settings.Description); - Assert.AreEqual(portal.Email, settings.Email); - Assert.AreEqual(portal.ExpiryDate, settings.ExpiryDate); - Assert.AreEqual(portal.FooterText, settings.FooterText); - Assert.AreEqual(portal.GUID, settings.GUID); - Assert.AreEqual(Globals.ApplicationPath + "/" + portal.HomeDirectory + "/", settings.HomeDirectory); - Assert.AreEqual(portal.HomeDirectoryMapPath, settings.HomeDirectoryMapPath); - Assert.AreEqual(Globals.ApplicationPath + "/" + portal.HomeSystemDirectory + "/", settings.HomeSystemDirectory); - Assert.AreEqual(portal.HomeSystemDirectoryMapPath, settings.HomeSystemDirectoryMapPath); - Assert.AreEqual(portal.HomeTabId, settings.HomeTabId); - Assert.AreEqual(portal.HostFee, settings.HostFee); - Assert.AreEqual(portal.HostSpace, settings.HostSpace); - Assert.AreEqual(portal.KeyWords, settings.KeyWords); - Assert.AreEqual(portal.LoginTabId, settings.LoginTabId); - Assert.AreEqual(portal.LogoFile, settings.LogoFile); - Assert.AreEqual(portal.PageQuota, settings.PageQuota); - Assert.AreEqual(portal.Pages, settings.Pages); - Assert.AreEqual(portal.PortalName, settings.PortalName); - Assert.AreEqual(portal.RegisterTabId, settings.RegisterTabId); - Assert.AreEqual(portal.RegisteredRoleId, settings.RegisteredRoleId); - Assert.AreEqual(portal.RegisteredRoleName, settings.RegisteredRoleName); - Assert.AreEqual(portal.SearchTabId, settings.SearchTabId); - Assert.AreEqual(portal.SplashTabId, settings.SplashTabId); - Assert.AreEqual(portal.SuperTabId, settings.SuperTabId); - Assert.AreEqual(portal.UserQuota, settings.UserQuota); - Assert.AreEqual(portal.UserRegistration, settings.UserRegistration); - Assert.AreEqual(portal.UserTabId, settings.UserTabId); - Assert.AreEqual(portal.Users, settings.Users); - } - - [Test] - public void GetActiveTab_Gets_Correct_Tab_If_Valid_Portal_TabId() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - var tab = controller.GetActiveTab(ValidTabId, settings); - - // Assert - Assert.AreEqual(validTab.TabID, tab.TabID); - } - - [Test] - public void GetActiveTab_Gets_Correct_Tab_If_Valid_Host_TabId() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = HostTabId, PortalID = HostPortalId }; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - var tab = controller.GetActiveTab(HostTabId, settings); - - // Assert - Assert.AreEqual(validTab.TabID, tab.TabID); - } - - [Test] - public void GetActiveTab_Gets_Splash_Tab_If_InValid_TabId_And_SplashTab_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, SplashTabId = SplashTabId, CultureCode = Null.NullString }; - var splashTabId = new TabInfo { TabID = SplashTabId, PortalID = ValidPortalId }; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(ValidPortalId)).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { splashTabId })); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - var tab = controller.GetActiveTab(InValidTabId, settings); - - // Assert - Assert.AreEqual(SplashTabId, tab.TabID); - } - - [Test] - public void GetActiveTab_Gets_Home_Tab_If_InValid_TabId_And_Home_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, HomeTabId = HomeTabId, CultureCode = Null.NullString }; - var homeTabId = new TabInfo { TabID = HomeTabId, PortalID = ValidPortalId }; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(ValidPortalId)).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { homeTabId })); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - var tab = controller.GetActiveTab(InValidTabId, settings); - - // Assert - Assert.AreEqual(HomeTabId, tab.TabID); - } - - [Test] - public void GetActiveTab_Gets_Splash_Tab_If_InValid_TabId_And_Both_HomeTab_And_SplashTab_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, SplashTabId = SplashTabId, HomeTabId = HomeTabId, CultureCode = Null.NullString }; - var splashTabId = new TabInfo { TabID = SplashTabId, PortalID = ValidPortalId }; - var homeTabId = new TabInfo { TabID = HomeTabId, PortalID = ValidPortalId }; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(ValidPortalId)).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { splashTabId, homeTabId })); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - var tab = controller.GetActiveTab(InValidTabId, settings); - - // Assert - Assert.AreEqual(SplashTabId, tab.TabID); - } - - [Test] - public void GetActiveTab_Sets_StartDate_And_EndDate_Of_Tab_If_Not_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - var tab = controller.GetActiveTab(ValidTabId, settings); - - // Assert - Assert.AreEqual(DateTime.MinValue, tab.StartDate); - Assert.AreEqual(DateTime.MaxValue, tab.EndDate); - } - - [Test] - public void ConfigureTab_Uses_PortalSettings_DefaultSkin_If_SkinSrc_Not_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalSkin = DefaultSkin, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; - settings.ActiveTab = validTab; - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalSkin")).Returns(DefaultSkin); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.AreEqual(DefaultSkin, settings.ActiveTab.SkinSrc); - } - - [Test] - public void ConfigureTab_Uses_Tab_SkinSrc_If_SkinSrc_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalSkin = DefaultSkin, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, SkinSrc = TabSkin }; - settings.ActiveTab = validTab; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.AreEqual(TabSkin, settings.ActiveTab.SkinSrc); - } - - [Test] - public void ConfigureTab_Formats_Tab_SkinSrc_If_Neccessary() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalSkin = DefaultSkin, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, SkinSrc = GlobalTabSkin }; - settings.ActiveTab = validTab; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.AreEqual(SkinController.FormatSkinSrc(GlobalTabSkin, settings), settings.ActiveTab.SkinSrc); - } - - [Test] - public void ConfigureTab_Uses_PortalSettings_DefaultContainer_If_ContainerSrc_Not_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; - settings.ActiveTab = validTab; - settings.ActiveTab.SkinSrc = TabSkin; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.AreEqual(DefaultContainer, settings.ActiveTab.ContainerSrc); - } - - [Test] - public void ConfigureTab_Uses_Tab_ContainerSrc_If_ContainerSrc_Set() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, ContainerSrc = TabContainer }; - settings.ActiveTab = validTab; - settings.ActiveTab.SkinSrc = TabSkin; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.AreEqual(TabContainer, settings.ActiveTab.ContainerSrc); - } - - [Test] - public void ConfigureTab_Formats_Tab_ContainerSrc_If_Neccessary() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, ContainerSrc = GlobalTabContainer }; - settings.ActiveTab = validTab; - settings.ActiveTab.SkinSrc = TabSkin; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.AreEqual(SkinController.FormatSkinSrc(GlobalTabContainer, settings), settings.ActiveTab.ContainerSrc); - } - - [Test] - public void ConfigureTab_Builds_Breadcrumbs_For_Tab() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, SkinSrc = GlobalTabSkin }; - settings.ActiveTab = validTab; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - Assert.NotNull(settings.ActiveTab.BreadCrumbs); - Assert.AreEqual(1, settings.ActiveTab.BreadCrumbs.Count); - } - - [Test] - public void ConfigureTab_Builds_Breadcrumbs_For_Tab_And_Parent() - { - // Arrange - var controller = new PortalSettingsController(); - var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; - var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, ParentId = ParentTabId }; - var parentTab = new TabInfo { TabID = ParentTabId, PortalID = ValidPortalId }; - settings.ActiveTab = validTab; - settings.ActiveTab.SkinSrc = TabSkin; - - var mockLocaleController = new Mock(); - mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); - LocaleController.RegisterInstance(mockLocaleController.Object); - - var mockTabController = new Mock(); - mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab, parentTab })); - mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); - TabController.SetTestableInstance(mockTabController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); - - // Act - controller.ConfigureActiveTab(settings); - - // Assert - var actualParent = settings.ActiveTab.BreadCrumbs[0] as TabInfo; - var actualTab = settings.ActiveTab.BreadCrumbs[1] as TabInfo; - Assert.AreEqual(2, settings.ActiveTab.BreadCrumbs.Count); - Assert.AreEqual(ValidTabId, actualTab.TabID); - Assert.AreEqual(ParentTabId, actualParent.TabID); - } - } -} + + [Test] + [TestCaseSource(typeof(PortalSettingsControllerTestFactory), "LoadPortalSettings_Loads_Default_Value")] + public void LoadPortalSettings_Loads_Default_Value(Dictionary testFields) + { + // Arrange + var propertyName = testFields["PropertyName"]; + var settingName = testFields["SettingName"]; + var isHostDefault = bool.Parse(testFields["IsHostDefault"]); + var defaultValue = testFields["DefaultValue"]; + var controller = new PortalSettingsController(); + var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var hostSettings = PortalSettingsControllerTestFactory.GetHostSettings(); + + var mockPortalController = new Mock(); + mockPortalController + .Setup(c => c.GetPortalSettings(It.IsAny())) + .Returns(new Dictionary()); + PortalController.SetTestableInstance(mockPortalController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString(It.IsAny())) + .Returns((string s) => hostSettings[s]); + mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) + .Returns((string s1, string s2) => hostSettings[s1]); + mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) + .Returns((string s, bool b) => bool.Parse(hostSettings[s])); + mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) + .Returns((string s, int i) => int.Parse(hostSettings[s])); + mockHostController.Setup(c => c.GetInteger(It.IsAny())) + .Returns((string s) => int.Parse(hostSettings[s])); + HostController.RegisterInstance(mockHostController.Object); + + if (isHostDefault) + { + defaultValue = hostSettings[settingName]; + } + + // Act + controller.LoadPortalSettings(settings); + + // Assert + var property = settings.GetType().GetProperty(propertyName); + var actualValue = property.GetValue(settings, null); + if (actualValue is bool) + { + Assert.AreEqual(defaultValue, actualValue.ToString().ToLowerInvariant()); + } + else + { + Assert.AreEqual(defaultValue, actualValue.ToString()); + } + } + + [Test] + [TestCaseSource(typeof(PortalSettingsControllerTestFactory), "LoadPortalSettings_Loads_Setting_Value")] + public void LoadPortalSettings_Loads_Setting_Value(Dictionary testFields) + { + // Arrange + var propertyName = testFields["PropertyName"]; + var settingName = testFields["SettingName"]; + var settingValue = testFields["SettingValue"]; + var propertyValue = testFields.ContainsKey("PropertyValue") ? testFields["PropertyValue"] : settingValue; + var controller = new PortalSettingsController(); + var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var hostSettings = PortalSettingsControllerTestFactory.GetHostSettings(); + + var mockPortalController = new Mock(); + mockPortalController + .Setup(c => c.GetPortalSettings(It.IsAny())) + .Returns(new Dictionary { { settingName, settingValue } }); + PortalController.SetTestableInstance(mockPortalController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString(It.IsAny())) + .Returns((string s) => hostSettings[s]); + mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) + .Returns((string s1, string s2) => hostSettings[s1]); + mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) + .Returns((string s, bool b) => bool.Parse(hostSettings[s])); + mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) + .Returns((string s, int i) => int.Parse(hostSettings[s])); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.LoadPortalSettings(settings); + + // Assert + var property = settings.GetType().GetProperty(propertyName); + var actualValue = property.GetValue(settings, null); + if (actualValue is bool) + { + Assert.AreEqual(propertyValue, actualValue.ToString().ToLowerInvariant()); + } + else + { + Assert.AreEqual(propertyValue, actualValue.ToString()); + } + } + + [Test] + public void LoadPortalSettings_Sets_TimeZone_Property_To_Local_TimeZone() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var hostSettings = PortalSettingsControllerTestFactory.GetHostSettings(); + + var mockPortalController = new Mock(); + mockPortalController + .Setup(c => c.GetPortalSettings(It.IsAny())) + .Returns(new Dictionary()); + PortalController.SetTestableInstance(mockPortalController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString(It.IsAny())) + .Returns((string s) => hostSettings[s]); + mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) + .Returns((string s1, string s2) => hostSettings[s1]); + mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) + .Returns((string s, bool b) => bool.Parse(hostSettings[s])); + mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) + .Returns((string s, int i) => int.Parse(hostSettings[s])); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.LoadPortalSettings(settings); + + // Assert + Assert.AreEqual(TimeZoneInfo.Local, settings.TimeZone); + } + + [Test] + public void LoadPortal_Loads_Portal_Property_Values() + { + // Arrange + var controller = new PortalSettingsController(); + var portal = new PortalInfo() + { + Users = 2, + Pages = 5, + DefaultLanguage = Localization.SystemLocale, + HomeDirectory = "Portals/0", + }; + var settings = new PortalSettings() { PortalId = ValidPortalId, CultureCode = Null.NullString }; + + // Act + controller.LoadPortal(portal, settings); + + // Assert + Assert.AreEqual(portal.AdminTabId, settings.AdminTabId); + Assert.AreEqual(portal.AdministratorId, settings.AdministratorId); + Assert.AreEqual(portal.AdministratorRoleId, settings.AdministratorRoleId); + Assert.AreEqual(portal.AdministratorRoleName, settings.AdministratorRoleName); + Assert.AreEqual(portal.BackgroundFile, settings.BackgroundFile); + Assert.AreEqual(portal.BannerAdvertising, settings.BannerAdvertising); + Assert.AreEqual(portal.CultureCode, settings.CultureCode); + Assert.AreEqual(portal.Currency, settings.Currency); + Assert.AreEqual(portal.Custom404TabId, settings.ErrorPage404); + Assert.AreEqual(portal.Custom500TabId, settings.ErrorPage500); + Assert.AreEqual(portal.TermsTabId, settings.TermsTabId); + Assert.AreEqual(portal.PrivacyTabId, settings.PrivacyTabId); + Assert.AreEqual(portal.DefaultLanguage, settings.DefaultLanguage); + Assert.AreEqual(portal.Description, settings.Description); + Assert.AreEqual(portal.Email, settings.Email); + Assert.AreEqual(portal.ExpiryDate, settings.ExpiryDate); + Assert.AreEqual(portal.FooterText, settings.FooterText); + Assert.AreEqual(portal.GUID, settings.GUID); + Assert.AreEqual(Globals.ApplicationPath + "/" + portal.HomeDirectory + "/", settings.HomeDirectory); + Assert.AreEqual(portal.HomeDirectoryMapPath, settings.HomeDirectoryMapPath); + Assert.AreEqual(Globals.ApplicationPath + "/" + portal.HomeSystemDirectory + "/", settings.HomeSystemDirectory); + Assert.AreEqual(portal.HomeSystemDirectoryMapPath, settings.HomeSystemDirectoryMapPath); + Assert.AreEqual(portal.HomeTabId, settings.HomeTabId); + Assert.AreEqual(portal.HostFee, settings.HostFee); + Assert.AreEqual(portal.HostSpace, settings.HostSpace); + Assert.AreEqual(portal.KeyWords, settings.KeyWords); + Assert.AreEqual(portal.LoginTabId, settings.LoginTabId); + Assert.AreEqual(portal.LogoFile, settings.LogoFile); + Assert.AreEqual(portal.PageQuota, settings.PageQuota); + Assert.AreEqual(portal.Pages, settings.Pages); + Assert.AreEqual(portal.PortalName, settings.PortalName); + Assert.AreEqual(portal.RegisterTabId, settings.RegisterTabId); + Assert.AreEqual(portal.RegisteredRoleId, settings.RegisteredRoleId); + Assert.AreEqual(portal.RegisteredRoleName, settings.RegisteredRoleName); + Assert.AreEqual(portal.SearchTabId, settings.SearchTabId); + Assert.AreEqual(portal.SplashTabId, settings.SplashTabId); + Assert.AreEqual(portal.SuperTabId, settings.SuperTabId); + Assert.AreEqual(portal.UserQuota, settings.UserQuota); + Assert.AreEqual(portal.UserRegistration, settings.UserRegistration); + Assert.AreEqual(portal.UserTabId, settings.UserTabId); + Assert.AreEqual(portal.Users, settings.Users); + } + + [Test] + public void GetActiveTab_Gets_Correct_Tab_If_Valid_Portal_TabId() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + var tab = controller.GetActiveTab(ValidTabId, settings); + + // Assert + Assert.AreEqual(validTab.TabID, tab.TabID); + } + + [Test] + public void GetActiveTab_Gets_Correct_Tab_If_Valid_Host_TabId() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = HostTabId, PortalID = HostPortalId }; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + var tab = controller.GetActiveTab(HostTabId, settings); + + // Assert + Assert.AreEqual(validTab.TabID, tab.TabID); + } + + [Test] + public void GetActiveTab_Gets_Splash_Tab_If_InValid_TabId_And_SplashTab_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, SplashTabId = SplashTabId, CultureCode = Null.NullString }; + var splashTabId = new TabInfo { TabID = SplashTabId, PortalID = ValidPortalId }; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(ValidPortalId)).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { splashTabId })); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + var tab = controller.GetActiveTab(InValidTabId, settings); + + // Assert + Assert.AreEqual(SplashTabId, tab.TabID); + } + + [Test] + public void GetActiveTab_Gets_Home_Tab_If_InValid_TabId_And_Home_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, HomeTabId = HomeTabId, CultureCode = Null.NullString }; + var homeTabId = new TabInfo { TabID = HomeTabId, PortalID = ValidPortalId }; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(ValidPortalId)).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { homeTabId })); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + var tab = controller.GetActiveTab(InValidTabId, settings); + + // Assert + Assert.AreEqual(HomeTabId, tab.TabID); + } + + [Test] + public void GetActiveTab_Gets_Splash_Tab_If_InValid_TabId_And_Both_HomeTab_And_SplashTab_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, SplashTabId = SplashTabId, HomeTabId = HomeTabId, CultureCode = Null.NullString }; + var splashTabId = new TabInfo { TabID = SplashTabId, PortalID = ValidPortalId }; + var homeTabId = new TabInfo { TabID = HomeTabId, PortalID = ValidPortalId }; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(ValidPortalId)).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { splashTabId, homeTabId })); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + var tab = controller.GetActiveTab(InValidTabId, settings); + + // Assert + Assert.AreEqual(SplashTabId, tab.TabID); + } + + [Test] + public void GetActiveTab_Sets_StartDate_And_EndDate_Of_Tab_If_Not_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + var tab = controller.GetActiveTab(ValidTabId, settings); + + // Assert + Assert.AreEqual(DateTime.MinValue, tab.StartDate); + Assert.AreEqual(DateTime.MaxValue, tab.EndDate); + } + + [Test] + public void ConfigureTab_Uses_PortalSettings_DefaultSkin_If_SkinSrc_Not_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalSkin = DefaultSkin, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; + settings.ActiveTab = validTab; + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("DefaultPortalSkin")).Returns(DefaultSkin); + mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); + HostController.RegisterInstance(mockHostController.Object); + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.AreEqual(DefaultSkin, settings.ActiveTab.SkinSrc); + } + + [Test] + public void ConfigureTab_Uses_Tab_SkinSrc_If_SkinSrc_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalSkin = DefaultSkin, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, SkinSrc = TabSkin }; + settings.ActiveTab = validTab; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.AreEqual(TabSkin, settings.ActiveTab.SkinSrc); + } + + [Test] + public void ConfigureTab_Formats_Tab_SkinSrc_If_Neccessary() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalSkin = DefaultSkin, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, SkinSrc = GlobalTabSkin }; + settings.ActiveTab = validTab; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.AreEqual(SkinController.FormatSkinSrc(GlobalTabSkin, settings), settings.ActiveTab.SkinSrc); + } + + [Test] + public void ConfigureTab_Uses_PortalSettings_DefaultContainer_If_ContainerSrc_Not_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; + settings.ActiveTab = validTab; + settings.ActiveTab.SkinSrc = TabSkin; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.AreEqual(DefaultContainer, settings.ActiveTab.ContainerSrc); + } + + [Test] + public void ConfigureTab_Uses_Tab_ContainerSrc_If_ContainerSrc_Set() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, ContainerSrc = TabContainer }; + settings.ActiveTab = validTab; + settings.ActiveTab.SkinSrc = TabSkin; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.AreEqual(TabContainer, settings.ActiveTab.ContainerSrc); + } + + [Test] + public void ConfigureTab_Formats_Tab_ContainerSrc_If_Neccessary() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, DefaultPortalContainer = DefaultContainer, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, ContainerSrc = GlobalTabContainer }; + settings.ActiveTab = validTab; + settings.ActiveTab.SkinSrc = TabSkin; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.AreEqual(SkinController.FormatSkinSrc(GlobalTabContainer, settings), settings.ActiveTab.ContainerSrc); + } + + [Test] + public void ConfigureTab_Builds_Breadcrumbs_For_Tab() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, SkinSrc = GlobalTabSkin }; + settings.ActiveTab = validTab; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + Assert.NotNull(settings.ActiveTab.BreadCrumbs); + Assert.AreEqual(1, settings.ActiveTab.BreadCrumbs.Count); + } + + [Test] + public void ConfigureTab_Builds_Breadcrumbs_For_Tab_And_Parent() + { + // Arrange + var controller = new PortalSettingsController(); + var settings = new PortalSettings { PortalId = ValidPortalId, CultureCode = Null.NullString }; + var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId, ParentId = ParentTabId }; + var parentTab = new TabInfo { TabID = ParentTabId, PortalID = ValidPortalId }; + settings.ActiveTab = validTab; + settings.ActiveTab.SkinSrc = TabSkin; + + var mockLocaleController = new Mock(); + mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); + LocaleController.RegisterInstance(mockLocaleController.Object); + + var mockTabController = new Mock(); + mockTabController.Setup(c => c.GetTabsByPortal(ValidPortalId)).Returns(new TabCollection(new List { validTab, parentTab })); + mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); + TabController.SetTestableInstance(mockTabController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); + HostController.RegisterInstance(mockHostController.Object); + + // Act + controller.ConfigureActiveTab(settings); + + // Assert + var actualParent = settings.ActiveTab.BreadCrumbs[0] as TabInfo; + var actualTab = settings.ActiveTab.BreadCrumbs[1] as TabInfo; + Assert.AreEqual(2, settings.ActiveTab.BreadCrumbs.Count); + Assert.AreEqual(ValidTabId, actualTab.TabID); + Assert.AreEqual(ParentTabId, actualParent.TabID); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs index 5b917da70d9..2ca670969dc 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs @@ -3,20 +3,20 @@ // See the LICENSE file in the project root for more information namespace DotNetNuke.Tests.Core.Providers.Folder -{ +{ using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.FileSystem; using DotNetNuke.Tests.Utilities.Mocks; - using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class FileContentTypeManagerTests @@ -29,6 +29,7 @@ public void Setup() mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); var _mockData = MockComponentProvider.CreateDataProvider(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs index 71c5b655c57..9c3d90129ef 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs @@ -10,8 +10,8 @@ namespace DotNetNuke.Tests.Core.Providers.Folder using System.Drawing; using System.IO; using System.Reflection; - using System.Text; - + using System.Text; + using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; @@ -26,11 +26,13 @@ namespace DotNetNuke.Tests.Core.Providers.Folder using DotNetNuke.Services.FileSystem.Internal; using DotNetNuke.Services.Log.EventLog; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class FileManagerTests @@ -59,6 +61,10 @@ public class FileManagerTests [SetUp] public void Setup() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + this._mockData = MockComponentProvider.CreateDataProvider(); this._mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); this._mockCache = MockComponentProvider.CreateDataCacheProvider(); @@ -103,6 +109,7 @@ public void Setup() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; TestableGlobals.ClearInstance(); CBO.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs index 27124f48d3c..75f56eb4306 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs @@ -6,14 +6,18 @@ namespace DotNetNuke.Tests.Core.Services.Mobile { using System; using System.Collections.Generic; - using System.Data; - + using System.Data; + using DotNetNuke.Common; using DotNetNuke.ComponentModel; - using DotNetNuke.Data; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Mobile; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Summary description for PreviewProfileControllerTests. @@ -28,6 +32,10 @@ public class PreviewProfileControllerTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.Container = new SimpleContainer(); this._dataProvider = MockComponentProvider.CreateDataProvider(); this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); @@ -108,6 +116,12 @@ public void SetUp() }); } + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + } + [Test] public void PreviewProfileController_Save_Valid_Profile() { diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs index e4cd277731a..e704dd7427b 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs @@ -11,7 +11,7 @@ namespace DotNetNuke.Tests.Core.Services.Mobile using System.Reflection; using System.Web; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Internal; @@ -30,6 +30,8 @@ namespace DotNetNuke.Tests.Core.Services.Mobile using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Summary description for RedirectionControllerTests. @@ -111,8 +113,6 @@ public void SetUp() { dataProviderField.SetValue(tabController, this._dataProvider.Object); } - - } [TearDown] @@ -491,6 +491,7 @@ private void SetupContianer() serviceCollection.AddTransient(container => mockNavigationManager.Object); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs index 6182dd77dac..09ca0eb862b 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs @@ -2,7 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information namespace DotNetNuke.Tests.Core.Services.Tokens -{ +{ + using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules; @@ -12,10 +13,13 @@ namespace DotNetNuke.Tests.Core.Services.Tokens using DotNetNuke.Entities.Users; using DotNetNuke.Services.Cache; using DotNetNuke.Services.Tokens; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + [TestFixture] public class TokenReplaceTests { @@ -28,6 +32,10 @@ public class TokenReplaceTests [SetUp] public void SetUp() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + ComponentFactory.RegisterComponentInstance(new CoreTokenProvider()); this._mockCache = MockComponentProvider.CreateDataCacheProvider(); this._mockHostController = new Mock(); @@ -46,6 +54,7 @@ public void SetUp() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; PortalController.ClearInstance(); ModuleController.ClearInstance(); UserController.ClearInstance(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs index 19260665959..db407bc4f58 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs @@ -5,15 +5,18 @@ namespace DotNetNuke.Tests.Core.Services.UserRequest { using System.Collections.Specialized; - using System.Web; - + using System.Web; + using DotNetNuke.Common; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.Services.UserRequest; using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] internal class UserRequestIPAddressControllerTest @@ -28,6 +31,10 @@ internal class UserRequestIPAddressControllerTest [SetUp] public void Setup() { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + NameValueCollection serverVariables = new NameValueCollection(); // Setup Mock @@ -45,6 +52,7 @@ public void Setup() [TearDown] public void TearDown() { + Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); } From 425df4365052a5f4ea315c1f6c1617994ace8cc1 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Wed, 19 Aug 2020 20:45:06 -0400 Subject: [PATCH 13/32] Fixed verbiage in xml documentation --- .../DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs b/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs index 19c2e6d76aa..0eadf709305 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs @@ -20,7 +20,7 @@ public interface IConfigurationSetting string Key { get; set; } /// - /// gets or sets configuraiton value. + /// gets or sets the configuraiton value. /// string Value { get; set; } } From 7469775ffe0ddcdcaca09e481962e5fc423cb110 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Wed, 19 Aug 2020 20:52:58 -0400 Subject: [PATCH 14/32] Updated 'this as INewHostController to use casting instead which will generate better error reports --- DNN Platform/Library/Obsolete/HostController.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/DNN Platform/Library/Obsolete/HostController.cs b/DNN Platform/Library/Obsolete/HostController.cs index db7b40e571e..d4147a5fadc 100644 --- a/DNN Platform/Library/Obsolete/HostController.cs +++ b/DNN Platform/Library/Obsolete/HostController.cs @@ -19,6 +19,7 @@ namespace DotNetNuke.Entities.Controllers // is deprecated and moved to the abstractions project. When // it is time to remove APIs we should remove the parent // classes listed here + /// public partial class HostController : ComponentBase, IHostController { @@ -42,7 +43,7 @@ public partial class HostController : ComponentBase [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] public Dictionary GetSettings() => - (this as INewHostController).GetSettings() + ((INewHostController)this).GetSettings() .Where(setting => setting.Value is ConfigurationSetting) .Select(setting => new KeyValuePair(setting.Key, (ConfigurationSetting)setting.Value)) .ToDictionary(setting => setting.Key, setting => setting.Value); @@ -50,11 +51,11 @@ public Dictionary GetSettings() => /// [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] public void Update(ConfigurationSetting config) => - (this as INewHostController).Update(config); + ((INewHostController)this).Update(config); /// [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] public void Update(ConfigurationSetting config, bool clearCache) => - (this as INewHostController).Update(config, clearCache); + ((INewHostController)this).Update(config, clearCache); } } From f2162fa420112bb27e23c941d88c2077d4218e56 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Wed, 19 Aug 2020 23:38:29 -0400 Subject: [PATCH 15/32] removed static instance of IHostController. When consumers request instance let the DI container handle resolving the state --- DNN Platform/Library/Obsolete/HostController.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/DNN Platform/Library/Obsolete/HostController.cs b/DNN Platform/Library/Obsolete/HostController.cs index d4147a5fadc..8327dec3d42 100644 --- a/DNN Platform/Library/Obsolete/HostController.cs +++ b/DNN Platform/Library/Obsolete/HostController.cs @@ -23,20 +23,13 @@ namespace DotNetNuke.Entities.Controllers /// public partial class HostController : ComponentBase, IHostController { - private static IHostController currentInstance; - [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] public static new IHostController Instance { get { - if (currentInstance != null) - { - return currentInstance; - } - var newHostController = Globals.DependencyProvider.GetRequiredService(); - return newHostController is IHostController castedController ? currentInstance = castedController : new HostController(); + return newHostController is IHostController castedController ? castedController : new HostController(); } } From a2749f0a8dee2702c140f039bc1e0e1c64205021 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Thu, 20 Aug 2020 00:03:02 -0400 Subject: [PATCH 16/32] Updated unit tests to use mocked IHostController instead of static singletons --- .../ContentControllerTests.cs | 1384 ++-- .../Common/NavigationManagerTests.cs | 53 +- .../SubscriptionTypeControllerTests.cs | 23 +- .../Portal/PortalGroupControllerTests.cs | 14 +- .../Search/InternalSearchControllerTests.cs | 1478 ++-- .../Search/LuceneControllerTests.cs | 238 +- .../Search/SearchControllerTests.cs | 5983 +++++++++-------- .../Modules/Settings/ModuleSettingsTests.cs | 10 +- .../Modules/Settings/NullableSettingsTests.cs | 9 + .../Modules/Settings/PortalSettingsTests.cs | 9 +- .../Settings/TabModuleSettingsTests.cs | 10 +- .../Portals/PortalSettingsControllerTests.cs | 74 +- .../Providers/Folder/FileManagerTests.cs | 792 +-- .../Providers/Folder/FolderManagerTests.cs | 626 +- .../Mobile/PreviewProfileControllerTests.cs | 72 +- .../Services/Tokens/TokenReplaceTests.cs | 46 +- .../UserRequestIPAddressControllerTest.cs | 69 +- .../SearchServiceControllerTests.cs | 158 +- .../TabVersionControllerTests.cs | 42 +- 19 files changed, 5602 insertions(+), 5488 deletions(-) diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs index 46142e1fe2c..a269ae38413 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs @@ -2,708 +2,710 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Content -{ - using System; - using System.Collections.Generic; - using System.Collections.Specialized; +namespace DotNetNuke.Tests.Content +{ + using System; + using System.Collections.Generic; + using System.Collections.Specialized; using System.Linq; + using DotNetNuke.Abstractions; using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; - using DotNetNuke.Data; - using DotNetNuke.Entities.Content; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; + using DotNetNuke.Data; + using DotNetNuke.Entities.Content; using DotNetNuke.Entities.Content.Data; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Search.Entities; - using DotNetNuke.Tests.Content.Mocks; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Search.Entities; + using DotNetNuke.Tests.Content.Mocks; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Summary description for ContentItemTests. - /// - [TestFixture] - public class ContentControllerTests - { - private const int ModuleSearchTypeId = 1; - - private Mock _mockCache; - private Mock _mockDataProvider; - private Mock _mockSearchHelper; - - [SetUp] - public void SetUp() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._mockCache = MockComponentProvider.CreateNew(); - this._mockDataProvider = MockComponentProvider.CreateDataProvider(); - this._mockSearchHelper = new Mock(); - - Services.Search.Internals.SearchHelper.SetTestableInstance(this._mockSearchHelper.Object); - - this._mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns( - (string searchTypeName) => new SearchType { SearchTypeName = searchTypeName, SearchTypeId = ModuleSearchTypeId }); - + + using Moq; + + using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + + /// + /// Summary description for ContentItemTests. + /// + [TestFixture] + public class ContentControllerTests + { + private const int ModuleSearchTypeId = 1; + + private Mock mockCache; + private Mock mockDataProvider; + private Mock mockSearchHelper; + + [SetUp] + public void SetUp() + { + this.mockCache = MockComponentProvider.CreateNew(); + this.mockDataProvider = MockComponentProvider.CreateDataProvider(); + this.mockSearchHelper = new Mock(); + + Services.Search.Internals.SearchHelper.SetTestableInstance(this.mockSearchHelper.Object); + + this.mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns( + (string searchTypeName) => new SearchType { SearchTypeName = searchTypeName, SearchTypeId = ModuleSearchTypeId }); + var serviceCollection = new ServiceCollection(); var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void ContentController_AddContentItem_Throws_On_Null_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.AddContentItem(null)); - } - - [Test] - public void ContentController_AddContentItem_Calls_DataService_On_Valid_Arguments() - { - // Arrange - Mock mockDataService = new Mock(); - - ContentController controller = new ContentController(mockDataService.Object); - - ComponentFactory.RegisterComponentInstance(controller); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - - // Act - int contentId = controller.AddContentItem(content); - - // Assert - mockDataService.Verify(ds => ds.AddContentItem(content, It.IsAny())); - } - - [Test] - public void ContentController_AddContentItem_Returns_ValidId_On_Valid_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())).Returns(Constants.CONTENT_AddContentItemId); - ContentController controller = new ContentController(mockDataService.Object); - - ComponentFactory.RegisterComponentInstance(controller); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - - // Act - int contentId = controller.AddContentItem(content); - - // Assert - Assert.AreEqual(Constants.CONTENT_AddContentItemId, contentId); - } - - [Test] - public void ContentController_AddContentItem_Sets_ContentItemId_Property_On_Valid_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())).Returns(Constants.CONTENT_AddContentItemId); - ContentController controller = new ContentController(mockDataService.Object); - - ComponentFactory.RegisterComponentInstance(controller); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - - // Act - int contentId = controller.AddContentItem(content); - - // Assert - Assert.AreEqual(Constants.CONTENT_AddContentItemId, content.ContentItemId); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void ContentController_DeleteContentItem_Throws_On_Null_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - controller.DeleteContentItem(null); - } - - [Test] - public void ContentController_DeleteContentItem_Throws_On_Negative_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => controller.DeleteContentItem(content)); - } - - [Test] - public void ContentController_DeleteContentItem_Calls_DataService_On_Valid_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_DeleteContentItemId; - - // Act - controller.DeleteContentItem(content); - - // Assert - mockDataService.Verify(ds => ds.DeleteContentItem(content.ContentItemId)); - } - - [Test] - public void ContentController_GetContentItem_Throws_On_Negative_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.GetContentItem(Null.NullInteger)); - } - - [Test] - public void ContentController_GetContentItem_Returns_Null_On_InValid_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentItem(Constants.CONTENT_InValidContentItemId)).Returns(MockHelper.CreateEmptyContentItemReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - ContentItem content = controller.GetContentItem(Constants.CONTENT_InValidContentItemId); - - // Assert - Assert.IsNull(content); - } - - [Test] - public void ContentController_GetContentItem_Calls_DataService_On_Valid_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentItem(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidContentItemReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - ContentItem content = controller.GetContentItem(Constants.CONTENT_ValidContentItemId); - - // Assert - mockDataService.Verify(ds => ds.GetContentItem(Constants.CONTENT_ValidContentItemId)); - } - - [Test] - public void ContentController_GetContentItem_Returns_ContentItem_On_Valid_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentItem(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidContentItemReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - ContentItem content = controller.GetContentItem(Constants.CONTENT_ValidContentItemId); - - // Assert - Assert.AreEqual(Constants.CONTENT_ValidContentItemId, content.ContentItemId); - Assert.AreEqual(ContentTestHelper.GetContent(Constants.CONTENT_ValidContentItemId), content.Content); - Assert.AreEqual(ContentTestHelper.GetContentKey(Constants.CONTENT_ValidContentItemId), content.ContentKey); - } - - [Test] - public void ContentController_GetContentItemsByTerm_Throws_On_Null_Term() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.GetContentItemsByTerm(Null.NullString)); - } - - [Test] - public void ContentController_GetContentItemsByTerm_Calls_DataService() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentItemsByTerm(Constants.TERM_ValidName)).Returns(MockHelper.CreateValidContentItemReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - IQueryable contentItems = controller.GetContentItemsByTerm(Constants.TERM_ValidName); - - // Assert - mockDataService.Verify(ds => ds.GetContentItemsByTerm(Constants.TERM_ValidName)); - } - - [Test] - public void ContentController_GetContentItemsByTerm_Returns_Empty_List_If_Term_Not_Used() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentItemsByTerm(Constants.TERM_UnusedName)).Returns(MockHelper.CreateEmptyContentItemReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - IQueryable contentItems = controller.GetContentItemsByTerm(Constants.TERM_UnusedName); - - // Assert - Assert.AreEqual(0, contentItems.Count()); - } - - [Test] - public void ContentController_GetContentItemsByTerm_Returns_List_Of_ContentItems() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentItemsByTerm(Constants.TERM_ValidName)).Returns(MockHelper.CreateValidContentItemsReader( - Constants.CONTENT_TaggedItemCount, - Constants.CONTENT_IndexedFalse, - Null.NullInteger, - Constants.TERM_ValidName)); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - IQueryable contentItems = controller.GetContentItemsByTerm(Constants.TERM_ValidName); - - // Assert - Assert.AreEqual(Constants.CONTENT_TaggedItemCount, contentItems.Count()); - } - - [Test] - public void ContentController_GetContentItemsByContentType_Returns_Results() - { - var mock = new Mock(); - mock.Setup(ds => ds.GetContentItemsByContentType(It.IsAny())) - .Returns(MockHelper.CreateValidContentItemsReader(10, true, 0, null)); - - var controller = new ContentController(mock.Object); - - var items = controller.GetContentItemsByContentType(10).ToArray(); - - Assert.AreEqual(items.Length, 10); - } - - [Test] - public void ContentController_GetContentItemsByContentType_Invalid_Id_Returns_No_Elements() - { - var mock = new Mock(); - mock.Setup(ds => ds.GetContentItemsByContentType(It.IsAny())).Returns(MockHelper.CreateEmptyContentItemReader()); - - var controller = new ContentController(mock.Object); - - var items = controller.GetContentItemsByContentType(-1).ToArray(); - - Assert.IsEmpty(items); - } - - [Test] - public void GetContentItemsByModuleId_With_Negative_ModuleId_Returns_ContentItems() - { - var mock = new Mock(); - mock.Setup(ds => ds.GetContentItemsByModuleId(-1)).Returns(MockHelper.CreateValidContentItemsReader(10, false, 0, null)); - mock.Setup(ds => ds.GetContentItemsByModuleId(0)).Returns(MockHelper.CreateValidContentItemReader()); - - var controller = new ContentController(mock.Object); - - var negative = controller.GetContentItemsByModuleId(-1).ToArray(); - var positive = controller.GetContentItemsByModuleId(0).ToArray(); - - Assert.AreEqual(negative.Length, 10); - Assert.AreEqual(positive.Length, 1); - } - - [Test] - public void ContentController_GetUnIndexedContentItems_Calls_DataService() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetUnIndexedContentItems()).Returns(MockHelper.CreateValidContentItemReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - IQueryable contentItems = controller.GetUnIndexedContentItems(); - - // Assert - mockDataService.Verify(ds => ds.GetUnIndexedContentItems()); - } - - [Test] - public void ContentController_GetUnIndexedContentItems_Returns_EmptyList_If_No_UnIndexed_Items() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetUnIndexedContentItems()).Returns(MockHelper.CreateEmptyContentItemReader()); - - ContentController controller = new ContentController(mockDataService.Object); - - // Act - IQueryable contentItems = controller.GetUnIndexedContentItems(); - - // Assert - Assert.AreEqual(0, contentItems.Count()); - } - - [Test] - public void ContentController_GetUnIndexedContentItems_Returns_List_Of_UnIndexedContentItems() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetUnIndexedContentItems()).Returns(MockHelper.CreateValidContentItemsReader( - Constants.CONTENT_IndexedFalseItemCount, - Constants.CONTENT_IndexedFalse, - Null.NullInteger, - Null.NullString)); - - ContentController controller = new ContentController(mockDataService.Object); - - // Act - IQueryable contentItems = controller.GetUnIndexedContentItems(); - - // Assert - Assert.AreEqual(Constants.CONTENT_IndexedFalseItemCount, contentItems.Count()); - foreach (ContentItem content in contentItems) - { - Assert.IsFalse(content.Indexed); - } - } - - [Test] - public void ContentController_UpdateContentItem_Throws_On_Null_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.UpdateContentItem(null)); - } - - [Test] - public void ContentController_UpdateContentItem_Throws_On_Negative_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = new ContentItem(); - content.ContentItemId = Null.NullInteger; - - Assert.Throws(() => controller.UpdateContentItem(content)); - } - - [Test] - public void ContentController_UpdateContentItem_Calls_DataService_On_Valid_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ComponentFactory.RegisterComponentInstance(controller); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_UpdateContentItemId; - content.Content = Constants.CONTENT_UpdateContent; - content.ContentKey = Constants.CONTENT_UpdateContentKey; - - // Act - controller.UpdateContentItem(content); - - // Assert - mockDataService.Verify(ds => ds.UpdateContentItem(content, It.IsAny())); - } - - [Test] - public void ContentController_AddMetaData_Throws_On_Null_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.AddMetaData(null, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_AddMetaData_Throws_On_Negative_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => controller.AddMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_AddMetaData_Throws_On_Null_MetaDataName() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - - // Act, Arrange - Assert.Throws(() => controller.AddMetaData(content, Null.NullString, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_AddMetaData_Calls_DataService_On_Valid_Arguments() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - - // Act - controller.AddMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue); - - // Assert - mockDataService.Verify(ds => ds.AddMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_DeleteMetaData_Throws_On_Null_ContentItem() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.AddMetaData(null, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_DeleteMetaData_Throws_On_Negative_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => controller.DeleteMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_DeleteMetaData_Throws_On_Null_MetaDataName() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - - // Act, Arrange - Assert.Throws(() => controller.AddMetaData(content, Null.NullString, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_DeleteMetaData_Calls_DataService_On_Valid_Arguments() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - - // Act - controller.DeleteMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue); - - // Assert - mockDataService.Verify(ds => ds.DeleteMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); - } - - [Test] - public void ContentController_GetMetaData_Throws_On_Negative_ContentItemId() - { - // Arrange - Mock mockDataService = new Mock(); - ContentController controller = new ContentController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => controller.GetMetaData(Null.NullInteger)); - } - - [Test] - public void ContentController_GetMetaData_Calls_DataService_On_Valid_Arguments() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetMetaData(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidMetaDataReader()); - ContentController controller = new ContentController(mockDataService.Object); - - // Act - NameValueCollection metaData = controller.GetMetaData(Constants.CONTENT_ValidContentItemId); - - // Assert - mockDataService.Verify(ds => ds.GetMetaData(Constants.CONTENT_ValidContentItemId)); - } - - [Test] - public void ContentController_GetMetaData_Returns_NameValueCollection_Of_MetaData() - { - // Arrange - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetMetaData(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidMetaDataReader()); - - mockDataService.Setup(ds => - ds.SynchronizeMetaData( - It.IsAny(), - It.IsAny>>(), - It.IsAny>>())) - .Callback>, IEnumerable>>( - (ci, added, deleted) => - { - deleted.ToList().ForEach( - item => mockDataService.Object.DeleteMetaData(ci, item.Key, item.Value)); - - added.ToList().ForEach( - item => mockDataService.Object.AddMetaData(ci, item.Key, item.Value)); - }); - - var controller = new ContentController(mockDataService.Object); - - // Act - var metaData = controller.GetMetaData(Constants.CONTENT_ValidContentItemId); - - // Assert - Assert.AreEqual(Constants.CONTENT_MetaDataCount, metaData.Count); - } - - [Test] - public void ContentController_Title_Is_Saved_On_Add() - { - var mockDataService = new Mock(); - - mockDataService.Setup( - ds => - ds.AddContentItem( - It.IsAny(), - It.IsAny())) - .Returns(Constants.CONTENT_AddContentItemId); - - mockDataService.Setup(ds => - ds.SynchronizeMetaData( - It.IsAny(), - It.IsAny>>(), - It.IsAny>>())) - .Callback>, IEnumerable>>( - (ci, added, deleted) => - { - deleted.ToList().ForEach( - item => mockDataService.Object.DeleteMetaData(ci, item.Key, item.Value)); - - added.ToList().ForEach( - item => mockDataService.Object.AddMetaData(ci, item.Key, item.Value)); - }); - - // Return empty set of metadata. - mockDataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(MockHelper.CreateValidMetaDataReader); - - var controller = new ContentController(mockDataService.Object); - - // The ContentExtensions methods look this up. - ComponentFactory.RegisterComponentInstance(controller); - - var content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - content.ContentTitle = Constants.CONTENT_ValidTitle; - - // Act - controller.AddContentItem(content); - - // Assert - mockDataService.Verify(ds => ds.AddMetaData(content, AttachmentController.TitleKey, Constants.CONTENT_ValidTitle)); - } - - [Test] - public void ContentController_Title_Is_Saved_On_Update() - { - var mockDataService = new Mock(); - - mockDataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())) - .Returns(Constants.CONTENT_AddContentItemId); - - mockDataService.Setup(ds => - ds.SynchronizeMetaData( - It.IsAny(), - It.IsAny>>(), - It.IsAny>>())) - .Callback>, IEnumerable>>( - (ci, added, deleted) => - { - deleted.ToList().ForEach( - item => mockDataService.Object.DeleteMetaData(ci, item.Key, item.Value)); - - added.ToList().ForEach( - item => mockDataService.Object.AddMetaData(ci, item.Key, item.Value)); - }); - - // Return empty set of metadata. - mockDataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(MockHelper.CreateValidMetaDataReader); - - var controller = new ContentController(mockDataService.Object); - - // The ContentExtensions methods look this up. - ComponentFactory.RegisterComponentInstance(controller); - - var content = ContentTestHelper.CreateValidContentItem(); - content.ContentItemId = Constants.CONTENT_ValidContentItemId; - content.ContentTitle = Constants.CONTENT_ValidTitle; - - // Act - controller.AddContentItem(content); - - content.ContentTitle = Constants.CONTENT_ValidTitle2; - controller.UpdateContentItem(content); - - // Assert - mockDataService.Verify(ds => ds.AddMetaData(content, AttachmentController.TitleKey, Constants.CONTENT_ValidTitle)); - mockDataService.Verify(ds => ds.AddMetaData(content, AttachmentController.TitleKey, Constants.CONTENT_ValidTitle2)); - } - } -} + serviceCollection.AddTransient(); + + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + public void ContentController_AddContentItem_Throws_On_Null_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.AddContentItem(null)); + } + + [Test] + public void ContentController_AddContentItem_Calls_DataService_On_Valid_Arguments() + { + // Arrange + Mock mockDataService = new Mock(); + + ContentController controller = new ContentController(mockDataService.Object); + + ComponentFactory.RegisterComponentInstance(controller); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + + // Act + int contentId = controller.AddContentItem(content); + + // Assert + mockDataService.Verify(ds => ds.AddContentItem(content, It.IsAny())); + } + + [Test] + public void ContentController_AddContentItem_Returns_ValidId_On_Valid_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())).Returns(Constants.CONTENT_AddContentItemId); + ContentController controller = new ContentController(mockDataService.Object); + + ComponentFactory.RegisterComponentInstance(controller); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + + // Act + int contentId = controller.AddContentItem(content); + + // Assert + Assert.AreEqual(Constants.CONTENT_AddContentItemId, contentId); + } + + [Test] + public void ContentController_AddContentItem_Sets_ContentItemId_Property_On_Valid_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())).Returns(Constants.CONTENT_AddContentItemId); + ContentController controller = new ContentController(mockDataService.Object); + + ComponentFactory.RegisterComponentInstance(controller); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + + // Act + int contentId = controller.AddContentItem(content); + + // Assert + Assert.AreEqual(Constants.CONTENT_AddContentItemId, content.ContentItemId); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void ContentController_DeleteContentItem_Throws_On_Null_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + controller.DeleteContentItem(null); + } + + [Test] + public void ContentController_DeleteContentItem_Throws_On_Negative_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => controller.DeleteContentItem(content)); + } + + [Test] + public void ContentController_DeleteContentItem_Calls_DataService_On_Valid_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_DeleteContentItemId; + + // Act + controller.DeleteContentItem(content); + + // Assert + mockDataService.Verify(ds => ds.DeleteContentItem(content.ContentItemId)); + } + + [Test] + public void ContentController_GetContentItem_Throws_On_Negative_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.GetContentItem(Null.NullInteger)); + } + + [Test] + public void ContentController_GetContentItem_Returns_Null_On_InValid_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentItem(Constants.CONTENT_InValidContentItemId)).Returns(MockHelper.CreateEmptyContentItemReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + ContentItem content = controller.GetContentItem(Constants.CONTENT_InValidContentItemId); + + // Assert + Assert.IsNull(content); + } + + [Test] + public void ContentController_GetContentItem_Calls_DataService_On_Valid_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentItem(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidContentItemReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + ContentItem content = controller.GetContentItem(Constants.CONTENT_ValidContentItemId); + + // Assert + mockDataService.Verify(ds => ds.GetContentItem(Constants.CONTENT_ValidContentItemId)); + } + + [Test] + public void ContentController_GetContentItem_Returns_ContentItem_On_Valid_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentItem(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidContentItemReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + ContentItem content = controller.GetContentItem(Constants.CONTENT_ValidContentItemId); + + // Assert + Assert.AreEqual(Constants.CONTENT_ValidContentItemId, content.ContentItemId); + Assert.AreEqual(ContentTestHelper.GetContent(Constants.CONTENT_ValidContentItemId), content.Content); + Assert.AreEqual(ContentTestHelper.GetContentKey(Constants.CONTENT_ValidContentItemId), content.ContentKey); + } + + [Test] + public void ContentController_GetContentItemsByTerm_Throws_On_Null_Term() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.GetContentItemsByTerm(Null.NullString)); + } + + [Test] + public void ContentController_GetContentItemsByTerm_Calls_DataService() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentItemsByTerm(Constants.TERM_ValidName)).Returns(MockHelper.CreateValidContentItemReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + IQueryable contentItems = controller.GetContentItemsByTerm(Constants.TERM_ValidName); + + // Assert + mockDataService.Verify(ds => ds.GetContentItemsByTerm(Constants.TERM_ValidName)); + } + + [Test] + public void ContentController_GetContentItemsByTerm_Returns_Empty_List_If_Term_Not_Used() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentItemsByTerm(Constants.TERM_UnusedName)).Returns(MockHelper.CreateEmptyContentItemReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + IQueryable contentItems = controller.GetContentItemsByTerm(Constants.TERM_UnusedName); + + // Assert + Assert.AreEqual(0, contentItems.Count()); + } + + [Test] + public void ContentController_GetContentItemsByTerm_Returns_List_Of_ContentItems() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentItemsByTerm(Constants.TERM_ValidName)).Returns(MockHelper.CreateValidContentItemsReader( + Constants.CONTENT_TaggedItemCount, + Constants.CONTENT_IndexedFalse, + Null.NullInteger, + Constants.TERM_ValidName)); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + IQueryable contentItems = controller.GetContentItemsByTerm(Constants.TERM_ValidName); + + // Assert + Assert.AreEqual(Constants.CONTENT_TaggedItemCount, contentItems.Count()); + } + + [Test] + public void ContentController_GetContentItemsByContentType_Returns_Results() + { + var mock = new Mock(); + mock.Setup(ds => ds.GetContentItemsByContentType(It.IsAny())) + .Returns(MockHelper.CreateValidContentItemsReader(10, true, 0, null)); + + var controller = new ContentController(mock.Object); + + var items = controller.GetContentItemsByContentType(10).ToArray(); + + Assert.AreEqual(items.Length, 10); + } + + [Test] + public void ContentController_GetContentItemsByContentType_Invalid_Id_Returns_No_Elements() + { + var mock = new Mock(); + mock.Setup(ds => ds.GetContentItemsByContentType(It.IsAny())).Returns(MockHelper.CreateEmptyContentItemReader()); + + var controller = new ContentController(mock.Object); + + var items = controller.GetContentItemsByContentType(-1).ToArray(); + + Assert.IsEmpty(items); + } + + [Test] + public void GetContentItemsByModuleId_With_Negative_ModuleId_Returns_ContentItems() + { + var mock = new Mock(); + mock.Setup(ds => ds.GetContentItemsByModuleId(-1)).Returns(MockHelper.CreateValidContentItemsReader(10, false, 0, null)); + mock.Setup(ds => ds.GetContentItemsByModuleId(0)).Returns(MockHelper.CreateValidContentItemReader()); + + var controller = new ContentController(mock.Object); + + var negative = controller.GetContentItemsByModuleId(-1).ToArray(); + var positive = controller.GetContentItemsByModuleId(0).ToArray(); + + Assert.AreEqual(negative.Length, 10); + Assert.AreEqual(positive.Length, 1); + } + + [Test] + public void ContentController_GetUnIndexedContentItems_Calls_DataService() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetUnIndexedContentItems()).Returns(MockHelper.CreateValidContentItemReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + IQueryable contentItems = controller.GetUnIndexedContentItems(); + + // Assert + mockDataService.Verify(ds => ds.GetUnIndexedContentItems()); + } + + [Test] + public void ContentController_GetUnIndexedContentItems_Returns_EmptyList_If_No_UnIndexed_Items() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetUnIndexedContentItems()).Returns(MockHelper.CreateEmptyContentItemReader()); + + ContentController controller = new ContentController(mockDataService.Object); + + // Act + IQueryable contentItems = controller.GetUnIndexedContentItems(); + + // Assert + Assert.AreEqual(0, contentItems.Count()); + } + + [Test] + public void ContentController_GetUnIndexedContentItems_Returns_List_Of_UnIndexedContentItems() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetUnIndexedContentItems()).Returns(MockHelper.CreateValidContentItemsReader( + Constants.CONTENT_IndexedFalseItemCount, + Constants.CONTENT_IndexedFalse, + Null.NullInteger, + Null.NullString)); + + ContentController controller = new ContentController(mockDataService.Object); + + // Act + IQueryable contentItems = controller.GetUnIndexedContentItems(); + + // Assert + Assert.AreEqual(Constants.CONTENT_IndexedFalseItemCount, contentItems.Count()); + foreach (ContentItem content in contentItems) + { + Assert.IsFalse(content.Indexed); + } + } + + [Test] + public void ContentController_UpdateContentItem_Throws_On_Null_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.UpdateContentItem(null)); + } + + [Test] + public void ContentController_UpdateContentItem_Throws_On_Negative_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = new ContentItem(); + content.ContentItemId = Null.NullInteger; + + Assert.Throws(() => controller.UpdateContentItem(content)); + } + + [Test] + public void ContentController_UpdateContentItem_Calls_DataService_On_Valid_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ComponentFactory.RegisterComponentInstance(controller); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_UpdateContentItemId; + content.Content = Constants.CONTENT_UpdateContent; + content.ContentKey = Constants.CONTENT_UpdateContentKey; + + // Act + controller.UpdateContentItem(content); + + // Assert + mockDataService.Verify(ds => ds.UpdateContentItem(content, It.IsAny())); + } + + [Test] + public void ContentController_AddMetaData_Throws_On_Null_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.AddMetaData(null, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_AddMetaData_Throws_On_Negative_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => controller.AddMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_AddMetaData_Throws_On_Null_MetaDataName() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + + // Act, Arrange + Assert.Throws(() => controller.AddMetaData(content, Null.NullString, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_AddMetaData_Calls_DataService_On_Valid_Arguments() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + + // Act + controller.AddMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue); + + // Assert + mockDataService.Verify(ds => ds.AddMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_DeleteMetaData_Throws_On_Null_ContentItem() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.AddMetaData(null, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_DeleteMetaData_Throws_On_Negative_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => controller.DeleteMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_DeleteMetaData_Throws_On_Null_MetaDataName() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + + // Act, Arrange + Assert.Throws(() => controller.AddMetaData(content, Null.NullString, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_DeleteMetaData_Calls_DataService_On_Valid_Arguments() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + + // Act + controller.DeleteMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue); + + // Assert + mockDataService.Verify(ds => ds.DeleteMetaData(content, Constants.CONTENT_ValidMetaDataName, Constants.CONTENT_ValidMetaDataValue)); + } + + [Test] + public void ContentController_GetMetaData_Throws_On_Negative_ContentItemId() + { + // Arrange + Mock mockDataService = new Mock(); + ContentController controller = new ContentController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => controller.GetMetaData(Null.NullInteger)); + } + + [Test] + public void ContentController_GetMetaData_Calls_DataService_On_Valid_Arguments() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetMetaData(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidMetaDataReader()); + ContentController controller = new ContentController(mockDataService.Object); + + // Act + NameValueCollection metaData = controller.GetMetaData(Constants.CONTENT_ValidContentItemId); + + // Assert + mockDataService.Verify(ds => ds.GetMetaData(Constants.CONTENT_ValidContentItemId)); + } + + [Test] + public void ContentController_GetMetaData_Returns_NameValueCollection_Of_MetaData() + { + // Arrange + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetMetaData(Constants.CONTENT_ValidContentItemId)).Returns(MockHelper.CreateValidMetaDataReader()); + + mockDataService.Setup(ds => + ds.SynchronizeMetaData( + It.IsAny(), + It.IsAny>>(), + It.IsAny>>())) + .Callback>, IEnumerable>>( + (ci, added, deleted) => + { + deleted.ToList().ForEach( + item => mockDataService.Object.DeleteMetaData(ci, item.Key, item.Value)); + + added.ToList().ForEach( + item => mockDataService.Object.AddMetaData(ci, item.Key, item.Value)); + }); + + var controller = new ContentController(mockDataService.Object); + + // Act + var metaData = controller.GetMetaData(Constants.CONTENT_ValidContentItemId); + + // Assert + Assert.AreEqual(Constants.CONTENT_MetaDataCount, metaData.Count); + } + + [Test] + public void ContentController_Title_Is_Saved_On_Add() + { + var mockDataService = new Mock(); + + mockDataService.Setup( + ds => + ds.AddContentItem( + It.IsAny(), + It.IsAny())) + .Returns(Constants.CONTENT_AddContentItemId); + + mockDataService.Setup(ds => + ds.SynchronizeMetaData( + It.IsAny(), + It.IsAny>>(), + It.IsAny>>())) + .Callback>, IEnumerable>>( + (ci, added, deleted) => + { + deleted.ToList().ForEach( + item => mockDataService.Object.DeleteMetaData(ci, item.Key, item.Value)); + + added.ToList().ForEach( + item => mockDataService.Object.AddMetaData(ci, item.Key, item.Value)); + }); + + // Return empty set of metadata. + mockDataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(MockHelper.CreateValidMetaDataReader); + + var controller = new ContentController(mockDataService.Object); + + // The ContentExtensions methods look this up. + ComponentFactory.RegisterComponentInstance(controller); + + var content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + content.ContentTitle = Constants.CONTENT_ValidTitle; + + // Act + controller.AddContentItem(content); + + // Assert + mockDataService.Verify(ds => ds.AddMetaData(content, AttachmentController.TitleKey, Constants.CONTENT_ValidTitle)); + } + + [Test] + public void ContentController_Title_Is_Saved_On_Update() + { + var mockDataService = new Mock(); + + mockDataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())) + .Returns(Constants.CONTENT_AddContentItemId); + + mockDataService.Setup(ds => + ds.SynchronizeMetaData( + It.IsAny(), + It.IsAny>>(), + It.IsAny>>())) + .Callback>, IEnumerable>>( + (ci, added, deleted) => + { + deleted.ToList().ForEach( + item => mockDataService.Object.DeleteMetaData(ci, item.Key, item.Value)); + + added.ToList().ForEach( + item => mockDataService.Object.AddMetaData(ci, item.Key, item.Value)); + }); + + // Return empty set of metadata. + mockDataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(MockHelper.CreateValidMetaDataReader); + + var controller = new ContentController(mockDataService.Object); + + // The ContentExtensions methods look this up. + ComponentFactory.RegisterComponentInstance(controller); + + var content = ContentTestHelper.CreateValidContentItem(); + content.ContentItemId = Constants.CONTENT_ValidContentItemId; + content.ContentTitle = Constants.CONTENT_ValidTitle; + + // Act + controller.AddContentItem(content); + + content.ContentTitle = Constants.CONTENT_ValidTitle2; + controller.UpdateContentItem(content); + + // Assert + mockDataService.Verify(ds => ds.AddMetaData(content, AttachmentController.TitleKey, Constants.CONTENT_ValidTitle)); + mockDataService.Verify(ds => ds.AddMetaData(content, AttachmentController.TitleKey, Constants.CONTENT_ValidTitle2)); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs index e81ef3d5892..7e01607bd27 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs @@ -7,7 +7,8 @@ namespace DotNetNuke.Tests.Core.Common using System.Collections.Generic; using System.Linq; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Abstractions.Portals; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; @@ -16,7 +17,9 @@ namespace DotNetNuke.Tests.Core.Common using DotNetNuke.Entities.Tabs; using DotNetNuke.Services.Localization; using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -30,16 +33,12 @@ public class NavigationManagerTests private const string DefaultSuperTabPattern = "&portalid={0}"; private const string ControlKeyPattern = "&ctl={0}"; private const string LanguagePattern = "&language={0}"; - private INavigationManager _navigationManager; + private INavigationManager navigationManager; [TestFixtureSetUp] public void Setup() { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._navigationManager = new NavigationManager(PortalControllerMock()); + this.navigationManager = new NavigationManager(PortalControllerMock()); TabController.SetTestableInstance(TabControllerMock()); LocaleController.SetTestableInstance(LocaleControllerMock()); @@ -99,13 +98,19 @@ ILocaleController LocaleControllerMock() return mockLocaleController.Object; } + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => this.navigationManager); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [TestFixtureTearDown] public void TearDown() { Globals.DependencyProvider = null; - this._navigationManager = null; + this.navigationManager = null; TabController.ClearInstance(); LocaleController.ClearInstance(); } @@ -114,7 +119,7 @@ public void TearDown() public void NavigateUrlTest() { var expected = string.Format(DefaultURLPattern, TabID); - var actual = this._navigationManager.NavigateURL(); + var actual = this.navigationManager.NavigateURL(); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -134,7 +139,7 @@ public void NavigateUrlTest() public void NavigateUrl_CustomTabID(int tabId) { var expected = string.Format(DefaultURLPattern, tabId); - var actual = this._navigationManager.NavigateURL(tabId); + var actual = this.navigationManager.NavigateURL(tabId); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -145,7 +150,7 @@ public void NavigateUrl_CustomTab_NotSuperTab() { var customTabId = 55; var expected = string.Format(DefaultURLPattern, customTabId); - var actual = this._navigationManager.NavigateURL(customTabId, false); + var actual = this.navigationManager.NavigateURL(customTabId, false); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -165,7 +170,7 @@ public void NavigateUrl_CustomTab_NotSuperTab() public void NavigateUrl_CustomTab_IsSuperTab(int tabId) { var expected = string.Format(DefaultURLPattern, tabId) + string.Format(DefaultSuperTabPattern, PortalID); - var actual = this._navigationManager.NavigateURL(tabId, true); + var actual = this.navigationManager.NavigateURL(tabId, true); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -179,7 +184,7 @@ public void NavigateUrl_ControlKey_AccessDenied() // Globals.AccessDeniedURL to an interface in the abstraction // project. The dependencies go very deep and make it very // difficult to properly test just the NavigationManager logic. - var actual = this._navigationManager.NavigateURL("Access Denied"); + var actual = this.navigationManager.NavigateURL("Access Denied"); } [Test] @@ -187,7 +192,7 @@ public void NavigateUrl_ControlKey() { var controlKey = "My-Control-Key"; var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey); - var actual = this._navigationManager.NavigateURL(controlKey); + var actual = this.navigationManager.NavigateURL(controlKey); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -198,7 +203,7 @@ public void NavigateUrl_ControlKey_EmptyAdditionalParameter() { var controlKey = "My-Control-Key"; var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey); - var actual = this._navigationManager.NavigateURL(controlKey, new string[0]); + var actual = this.navigationManager.NavigateURL(controlKey, new string[0]); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -212,7 +217,7 @@ public void NavigateUrl_ControlKey_SingleAdditionalParameter() var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey) + $"&{parameters[0]}"; - var actual = this._navigationManager.NavigateURL(controlKey, parameters); + var actual = this.navigationManager.NavigateURL(controlKey, parameters); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -239,7 +244,7 @@ public void NavigateUrl_ControlKey_MultipleAdditionalParameter(int count) var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey) + parameters.Select(s => $"&{s}").Aggregate((x, y) => $"{x}{y}"); - var actual = this._navigationManager.NavigateURL(controlKey, parameters); + var actual = this.navigationManager.NavigateURL(controlKey, parameters); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -260,7 +265,7 @@ public void NavigateUrl_TabID_ControlKey(int tabId) { var controlKey = "My-Control-Key"; var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); - var actual = this._navigationManager.NavigateURL(tabId, controlKey); + var actual = this.navigationManager.NavigateURL(tabId, controlKey); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -280,7 +285,7 @@ public void NavigateUrl_TabID_ControlKey(int tabId) public void NavigateUrl_TabID_EmptyControlKey(int tabId) { var expected = string.Format(DefaultURLPattern, tabId); - var actual = this._navigationManager.NavigateURL(tabId, string.Empty); + var actual = this.navigationManager.NavigateURL(tabId, string.Empty); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -300,7 +305,7 @@ public void NavigateUrl_TabID_EmptyControlKey(int tabId) public void NavigateUrl_TabID_NullControlKey(int tabId) { var expected = string.Format(DefaultURLPattern, tabId); - var actual = this._navigationManager.NavigateURL(tabId, string.Empty); + var actual = this.navigationManager.NavigateURL(tabId, string.Empty); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -334,7 +339,7 @@ public void NavigateUrl_TabID_ControlKey_Parameter(int count, string controlKey) expected += parameters.Select(s => $"&{s}").Aggregate((x, y) => $"{x}{y}"); } - var actual = this._navigationManager.NavigateURL(customTabId, controlKey, parameters); + var actual = this.navigationManager.NavigateURL(customTabId, controlKey, parameters); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -356,7 +361,7 @@ public void NavigateUrl_TabID_ControlKey_NullParameter(int tabId, string control var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); - var actual = this._navigationManager.NavigateURL(tabId, controlKey, null); + var actual = this.navigationManager.NavigateURL(tabId, controlKey, null); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -378,7 +383,7 @@ public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlK var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); - var actual = this._navigationManager.NavigateURL(tabId, default(IPortalSettings), controlKey, null); + var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettings), controlKey, null); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); @@ -406,7 +411,7 @@ public void NavigateUrl_TabId_Settings_ControlKey(int tabId, string controlKey) string.Format(ControlKeyPattern, controlKey) + string.Format(LanguagePattern, "en-US"); - var actual = this._navigationManager.NavigateURL(tabId, mockSettings.Object, controlKey, null); + var actual = this.navigationManager.NavigateURL(tabId, mockSettings.Object, controlKey, null); Assert.IsNotNull(actual); Assert.AreEqual(expected, actual); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs index 06b1616c97a..a10b20e8cdd 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs @@ -5,6 +5,9 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging { using System; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; @@ -14,8 +17,11 @@ namespace DotNetNuke.Tests.Core.Controllers.Messaging using DotNetNuke.Tests.Core.Controllers.Messaging.Builders; using DotNetNuke.Tests.Core.Controllers.Messaging.Mocks; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -28,20 +34,25 @@ public class SubscriptionTypeControllerTests private SubscriptionTypeController subscriptionTypeController; private Mock mockDataService; private Mock mockCacheProvider; + private Mock mockHostController; [SetUp] public void SetUp() { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - // Setup Mocks and Stub this.mockDataService = new Mock(); this.mockCacheProvider = MockComponentProvider.CreateDataCacheProvider(); + this.mockHostController = new Mock(); + this.mockHostController.As(); DataService.SetTestableInstance(this.mockDataService.Object); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + // Setup SUT this.subscriptionTypeController = new SubscriptionTypeController(); } @@ -50,11 +61,9 @@ public void SetUp() public void GetSubscriptionTypes_ShouldCallDataService_WhenNoError() { // Arrange - var mockHostController = new Mock(); - mockHostController + this.mockHostController .Setup(c => c.GetString("PerformanceSetting")) .Returns("0"); - HostController.RegisterInstance(mockHostController.Object); this.mockDataService .Setup(ds => ds.GetSubscriptionTypes()) diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs index eee92bcf65b..9ab07cbb896 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs @@ -8,6 +8,9 @@ namespace DotNetNuke.Tests.Core.Controllers.Portal using System.Collections.Generic; using System.Data; using System.Linq; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; @@ -17,8 +20,11 @@ namespace DotNetNuke.Tests.Core.Controllers.Portal using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -27,7 +33,7 @@ namespace DotNetNuke.Tests.Core.Controllers.Portal [TestFixture] public class PortalGroupControllerTests { - private Mock _mockData; + private Mock mockData; #pragma warning disable 649 private UserCopiedCallback userCopied; #pragma warning restore 649 @@ -36,10 +42,12 @@ public class PortalGroupControllerTests public void SetUp() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - this._mockData = MockComponentProvider.CreateDataProvider(); + this.mockData = MockComponentProvider.CreateDataProvider(); DataTable hostSettingsTable = new DataTable("HostSettings"); var nameCol = hostSettingsTable.Columns.Add("SettingName"); @@ -48,7 +56,7 @@ public void SetUp() hostSettingsTable.PrimaryKey = new[] { nameCol }; hostSettingsTable.Rows.Add("PerformanceSetting", "0", false); - this._mockData.Setup(c => c.GetHostSettings()).Returns(hostSettingsTable.CreateDataReader()); + this.mockData.Setup(c => c.GetHostSettings()).Returns(hostSettingsTable.CreateDataReader()); } [TearDown] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs index 736c2414fae..2c972ea11bf 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs @@ -2,755 +2,755 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Search -{ - using System; - using System.Collections.Generic; - using System.Data; - using System.IO; +namespace DotNetNuke.Tests.Core.Controllers.Search +{ + using System; + using System.Collections.Generic; + using System.Data; + using System.IO; using System.Threading; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.ComponentModel; - using DotNetNuke.Data; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Search.Entities; - using DotNetNuke.Services.Search.Internals; + using DotNetNuke.Common; + using DotNetNuke.ComponentModel; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Users; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Localization; + using DotNetNuke.Services.Search.Entities; + using DotNetNuke.Services.Search.Internals; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Testing various aspects of SearchController. - /// - [TestFixture] - public class InternalSearchControllerTests + + using Moq; + + using NUnit.Framework; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + + /// + /// Testing various aspects of SearchController. + /// + [TestFixture] + public class InternalSearchControllerTests { - private const int ModuleSearchTypeId = (int)SearchTypeIds.ModuleSearchTypeId; - private const int TabSearchTypeId = (int)SearchTypeIds.TabSearchTypeId; - private const int DocumentSearchTypeId = (int)SearchTypeIds.DocumentSearchTypeId; - - private const int UrlSearchTypeId = (int)SearchTypeIds.UrlSearchTypeId; - private const int OtherSearchTypeId = (int)SearchTypeIds.OtherSearchTypeId; - private const int UnknownSearchTypeId = (int)SearchTypeIds.UnknownSearchTypeId; - - private const int PortalId0 = 0; - private const int PortalId1 = 1; - - private const string TermDNN = "DNN"; - private const string TermDotNetNuke = "DotnetNuke"; - private const string TermLaptop = "Laptop"; - private const string TermNotebook = "Notebook"; - private const string TermJump = "Jump"; - private const string TermLeap = "Leap"; - private const string TermHop = "Hop"; - - private const string ModuleSearchTypeName = "module"; - private const string OtherSearchTypeName = "other"; - private const string TabSearchTypeName = "tab"; - private const string DocumentSearchTypeName = "document"; - private const string UrlSearchTypeName = "url"; - private const string ModuleResultControllerClass = "DotNetNuke.Services.Search.Crawlers.ModuleResultController, DotNetNuke"; - private const string FakeResultControllerClass = "DotNetNuke.Tests.Core.Controllers.Search.FakeResultController, DotNetNuke.Tests.Core"; - - private const string NoPermissionFakeResultControllerClass = - "DotNetNuke.Tests.Core.Controllers.Search.NoPermissionFakeResultController, DotNetNuke.Tests.Core"; - - private const string CultureEnUs = "en-US"; - private const string CultureEnCa = "en-CA"; - private const string CultureItIt = "it-IT"; - private const string CultureEsEs = "es-ES"; - private const int LanguageIdEnUs = 1; - private const int LanguageIdEnFr = 2; - private const int LanguageIdItIt = 3; - private const int LanguageIdEsEs = 4; - - private const string SearchIndexFolder = @"App_Data\InternalSearchTests"; - private readonly double _readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; - private Mock _mockHostController; - private Mock _mockCachingProvider; - private Mock _mockDataProvider; - private Mock _mockLocaleController; - private Mock _mockSearchHelper; - private Mock _mockUserController; - - private IInternalSearchController _internalSearchController; - private LuceneControllerImpl _luceneController; - - public enum SearchTypeIds - { - ModuleSearchTypeId = 1, - TabSearchTypeId, - DocumentSearchTypeId, - UrlSearchTypeId, - OtherSearchTypeId, - UnknownSearchTypeId, - } - - [SetUp] - public void SetUp() - { - ComponentFactory.Container = new SimpleContainer(); - MockComponentProvider.ResetContainer(); - - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._mockDataProvider = MockComponentProvider.CreateDataProvider(); - this._mockLocaleController = MockComponentProvider.CreateLocaleController(); - this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); - - this._mockUserController = new Mock(); - this._mockHostController = new Mock(); - this._mockSearchHelper = new Mock(); - - this.SetupDataProvider(); - this.SetupHostController(); - this.SetupSearchHelper(); - this.SetupLocaleController(); - - this._mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())) - .Returns((int portalId, int userId) => this.GetUserByIdCallback(portalId, userId)); - UserController.SetTestableInstance(this._mockUserController.Object); + private const int ModuleSearchTypeId = (int)SearchTypeIds.ModuleSearchTypeId; + private const int TabSearchTypeId = (int)SearchTypeIds.TabSearchTypeId; + private const int DocumentSearchTypeId = (int)SearchTypeIds.DocumentSearchTypeId; + + private const int UrlSearchTypeId = (int)SearchTypeIds.UrlSearchTypeId; + private const int OtherSearchTypeId = (int)SearchTypeIds.OtherSearchTypeId; + private const int UnknownSearchTypeId = (int)SearchTypeIds.UnknownSearchTypeId; + + private const int PortalId0 = 0; + private const int PortalId1 = 1; + + private const string TermDNN = "DNN"; + private const string TermDotNetNuke = "DotnetNuke"; + private const string TermLaptop = "Laptop"; + private const string TermNotebook = "Notebook"; + private const string TermJump = "Jump"; + private const string TermLeap = "Leap"; + private const string TermHop = "Hop"; + + private const string ModuleSearchTypeName = "module"; + private const string OtherSearchTypeName = "other"; + private const string TabSearchTypeName = "tab"; + private const string DocumentSearchTypeName = "document"; + private const string UrlSearchTypeName = "url"; + private const string ModuleResultControllerClass = "DotNetNuke.Services.Search.Crawlers.ModuleResultController, DotNetNuke"; + private const string FakeResultControllerClass = "DotNetNuke.Tests.Core.Controllers.Search.FakeResultController, DotNetNuke.Tests.Core"; + + private const string NoPermissionFakeResultControllerClass = + "DotNetNuke.Tests.Core.Controllers.Search.NoPermissionFakeResultController, DotNetNuke.Tests.Core"; + + private const string CultureEnUs = "en-US"; + private const string CultureEnCa = "en-CA"; + private const string CultureItIt = "it-IT"; + private const string CultureEsEs = "es-ES"; + private const int LanguageIdEnUs = 1; + private const int LanguageIdEnFr = 2; + private const int LanguageIdItIt = 3; + private const int LanguageIdEsEs = 4; + + private const string SearchIndexFolder = @"App_Data\InternalSearchTests"; + private readonly double readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; + private Mock mockHostController; + private Mock mockCachingProvider; + private Mock mockDataProvider; + private Mock mockLocaleController; + private Mock mockSearchHelper; + private Mock mockUserController; + + private IInternalSearchController internalSearchController; + private LuceneControllerImpl luceneController; + + public enum SearchTypeIds + { + ModuleSearchTypeId = 1, + TabSearchTypeId, + DocumentSearchTypeId, + UrlSearchTypeId, + OtherSearchTypeId, + UnknownSearchTypeId, + } + + [SetUp] + public void SetUp() + { + ComponentFactory.Container = new SimpleContainer(); + MockComponentProvider.ResetContainer(); + + this.mockHostController = new Mock(); + this.SetupHostController(); var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(container => (INewHostController)_mockHostController.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this.CreateNewLuceneControllerInstance(); - } - - [TearDown] - public void TearDown() - { - this._mockHostController = null; - Globals.DependencyProvider = null; - this._luceneController.Dispose(); - this.DeleteIndexFolder(); - InternalSearchController.ClearInstance(); - UserController.ClearInstance(); - SearchHelper.ClearInstance(); - LuceneController.ClearInstance(); - this._luceneController = null; - Globals.DependencyProvider = null; - } - - [Test] - public void SearchController_Add_Throws_On_Null_SearchDocument() - { - // Arrange - - // Act, Assert - Assert.Throws(() => this._internalSearchController.AddSearchDocument(null)); - } - - [Test] - public void SearchController_Add_Throws_On_Null_Or_Empty_UniqueuKey() - { - // Arrange - - // Act, Assert - Assert.Throws(() => this._internalSearchController.AddSearchDocument(new SearchDocument())); - } - - [Test] - public void SearchController_Add_Throws_On_Null_OrEmpty_Title() - { - // Arrange - - // Act, Assert - Assert.Throws( - () => this._internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString() })); - } - - [Test] - public void SearchController_AddSearchDcoumets_Does_Not_Throw_On_Null_OrEmpty_Title() - { - // Arrange - var documents = new List { new SearchDocument { UniqueKey = Guid.NewGuid().ToString() } }; - - // Act, Assert - this._internalSearchController.AddSearchDocuments(documents); - } - - [Test] - public void SearchController_AddSearchDcoumets_Does_Not_Throw_On_Empty_Search_Document() - { - // Arrange - var documents = new List { new SearchDocument() }; - - // Act, Assert - this._internalSearchController.AddSearchDocuments(documents); - } - - [Test] - public void SearchController_Add_Throws_On_Zero_SearchTypeId() - { - // Arrange - - // Act, Assert - Assert.Throws( - () => this._internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString() })); - } - - [Test] - public void SearchController_Add_Throws_On_Negative_SearchTypeId() - { - // Arrange - - // Act, Assert - Assert.Throws( - () => - this._internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString(), Title = "title", SearchTypeId = -1 })); - } - - [Test] - public void SearchController_Add_Throws_On_DateTimeMin_ModifiedTimeUtc() - { - // Arrange - - // Act, Assert - Assert.Throws( - () => this._internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString(), Title = "title", SearchTypeId = 1 })); - } - - [Test] - public void SearchController_Add_Then_Delete_ModuleDefinition_WorksAsExpected() - { - // Arrange - const int totalDocs = 10; - var now = DateTime.UtcNow; - - // Act - for (var i = 1; i <= totalDocs; i++) - { - var doc = new SearchDocument - { - ModuleDefId = i, - ModuleId = 100, - SearchTypeId = ModuleSearchTypeId, - PortalId = PortalId0, - UniqueKey = Guid.NewGuid().ToString(), - ModifiedTimeUtc = now, - }; - - this._internalSearchController.AddSearchDocument(doc); - } - - // Assert - var stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); - - // Act - delete last item - var searchDoc = new SearchDocument { ModuleDefId = totalDocs }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); - Assert.AreEqual(1, stats.TotalDeletedDocuments); - - // Act - delete first item - searchDoc = new SearchDocument { ModuleDefId = 1 }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); - Assert.AreEqual(2, stats.TotalDeletedDocuments); - } - - [Test] - public void SearchController_Add_Then_Delete_Module_WorksAsExpected() - { - // Arrange - const int totalDocs = 10; - var now = DateTime.UtcNow; - - // Act - for (var i = 1; i <= totalDocs; i++) - { - var doc = new SearchDocument - { - ModuleId = i, - ModuleDefId = 10, - PortalId = PortalId0, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = ModuleSearchTypeId, - ModifiedTimeUtc = now, - }; - - this._internalSearchController.AddSearchDocument(doc); - } - - // Assert - var stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); - - // Act - delete last item - var searchDoc = new SearchDocument { ModuleId = totalDocs }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); - Assert.AreEqual(1, stats.TotalDeletedDocuments); - - // Act - delete first item - searchDoc = new SearchDocument { ModuleId = 1 }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); - Assert.AreEqual(2, stats.TotalDeletedDocuments); - } - - [Test] - public void SearchController_Add_Then_Delete_Portals_WorksAsExpected() - { - // Arrange - const int totalDocs = 10; // must be even - var now = DateTime.UtcNow; - - // Act - for (var i = 1; i <= totalDocs; i++) - { - var doc = new SearchDocument - { - PortalId = i <= (totalDocs / 2) ? PortalId0 : PortalId1, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = ModuleSearchTypeId, - ModifiedTimeUtc = now, - ModuleId = 100, - ModuleDefId = 10, - }; - - this._internalSearchController.AddSearchDocument(doc); - } - - // Assert - var stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); - - // Act - delete all portal 1 items - var searchDoc = new SearchDocument { PortalId = PortalId1 }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - delete all portal 1 - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs / 2, stats.TotalActiveDocuments); - Assert.AreEqual(totalDocs / 2, stats.TotalDeletedDocuments); - } - - [Test] - public void SearchController_Add_Then_Delete_Roles_WorksAsExpected() - { - // Arrange - const int totalDocs = 10; - var now = DateTime.UtcNow; - - // Act - for (var i = 1; i <= totalDocs; i++) - { - var doc = new SearchDocument - { - RoleId = i, - PortalId = PortalId0, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = ModuleSearchTypeId, - ModifiedTimeUtc = now, - ModuleId = 100, - ModuleDefId = 10, - }; - - this._internalSearchController.AddSearchDocument(doc); - } - - // Assert - var stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); - - // Act - delete last item - var searchDoc = new SearchDocument { RoleId = totalDocs }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); - Assert.AreEqual(1, stats.TotalDeletedDocuments); - - // Act - delete first item - searchDoc = new SearchDocument { RoleId = 1 }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); - Assert.AreEqual(2, stats.TotalDeletedDocuments); - } - - [Test] - public void SearchController_Add_Then_Delete_Tabs_WorksAsExpected() - { - // Arrange - const int totalDocs = 10; - var now = DateTime.UtcNow; - - // Act - for (var i = 1; i <= totalDocs; i++) - { - var doc = new SearchDocument - { - TabId = i, - PortalId = PortalId0, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = TabSearchTypeId, - ModifiedTimeUtc = now, - }; - - this._internalSearchController.AddSearchDocument(doc); - } - - // Assert - var stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); - - // Act - delete last item - var searchDoc = new SearchDocument { TabId = totalDocs }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); - Assert.AreEqual(1, stats.TotalDeletedDocuments); - - // Act - delete first item - searchDoc = new SearchDocument { TabId = 1 }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); - Assert.AreEqual(2, stats.TotalDeletedDocuments); - } - - [Test] - public void SearchController_Add_Then_Delete_Users_WorksAsExpected() - { - // Arrange - const int totalDocs = 10; - var now = DateTime.UtcNow; - - // Act - for (var i = 1; i <= totalDocs; i++) - { - var doc = new SearchDocument - { - AuthorUserId = i, - PortalId = PortalId0, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = ModuleSearchTypeId, - ModifiedTimeUtc = now, - ModuleId = 100, - ModuleDefId = 10, - }; - - this._internalSearchController.AddSearchDocument(doc); - } - - // Assert - var stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); - - // Act - delete last item - var searchDoc = new SearchDocument { AuthorUserId = totalDocs }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); - Assert.AreEqual(1, stats.TotalDeletedDocuments); - - // Act - delete first item - searchDoc = new SearchDocument { AuthorUserId = 1 }; - this._internalSearchController.DeleteSearchDocument(searchDoc); - - // Assert - stats = this.GetSearchStatistics(); - Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); - Assert.AreEqual(2, stats.TotalDeletedDocuments); - } - - private void CreateNewLuceneControllerInstance() - { - this.DeleteIndexFolder(); - InternalSearchController.SetTestableInstance(new InternalSearchControllerImpl()); - this._internalSearchController = InternalSearchController.Instance; - - if (this._luceneController != null) - { - LuceneController.ClearInstance(); - this._luceneController.Dispose(); - } - - this._luceneController = new LuceneControllerImpl(); - LuceneController.SetTestableInstance(this._luceneController); - } - - private void SetupHostController() - { - this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); - this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this._readerStaleTimeSpan); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTitleBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTagBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchKeywordBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())) - .Returns(Constants.DefaultSearchDescriptionBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchAuthorBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); - this._mockHostController.As(); - } - - private void SetupLocaleController() - { - this._mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = -1, Code = string.Empty }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureEnCa)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); - - this._mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnFr)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); - } - - private void SetupDataProvider() - { - // Standard DataProvider Path for Logging - this._mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - - DataTableReader searchTypes = null; - this._mockDataProvider.Setup(ds => ds.GetAllSearchTypes()) - .Callback(() => searchTypes = this.GetAllSearchTypes().CreateDataReader()) - .Returns(() => searchTypes); - - this._mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); - } - - private IDataReader GetPortalsCallBack(string culture) - { - return this.GetPortalCallBack(PortalId0, CultureEnUs); - } - - private IDataReader GetPortalCallBack(int portalId, string culture) - { - var table = new DataTable("Portal"); - - var cols = new[] - { - "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", - "Currency", "HostFee", - "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", - "PaymentProcessor", "ProcessorUserId", - "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", - "LoginTabId", "RegisterTabId", - "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", - "LastModifiedOnDate", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - const int homePage = 1; - table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, - "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, - "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", - null, homePage.ToString("D"), null, null, "57", "56", "-1", "-1", "7", null, null, "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); - - return table.CreateDataReader(); - } - - private void SetupSearchHelper() - { - this._mockSearchHelper.Setup(c => c.GetSearchMinMaxLength()).Returns(new Tuple(Constants.DefaultMinLen, Constants.DefaultMaxLen)); - this._mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(this.GetSynonymsCallBack); - this._mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())) - .Returns((string name) => new SearchType { SearchTypeId = 0, SearchTypeName = name }); - this._mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns(this.GetSearchTypeByNameCallback); - this._mockSearchHelper.Setup(x => x.GetSearchTypes()).Returns(this.GetSearchTypes()); - this._mockSearchHelper.Setup(c => c.GetSynonymsGroups(It.IsAny(), It.IsAny())).Returns(this.GetSynonymsGroupsCallBack); - this._mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEsEs)).Returns( - new SearchStopWords - { - PortalId = 0, - CultureCode = CultureEsEs, - StopWords = "los,de,el", - }); - this._mockSearchHelper.Setup(x => x.RephraseSearchText(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new SearchHelperImpl().RephraseSearchText); - this._mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); - SearchHelper.SetTestableInstance(this._mockSearchHelper.Object); - } - - private IList GetSynonymsGroupsCallBack() - { - var groups = new List - { - new SynonymsGroup { PortalId = 0, SynonymsGroupId = 1, SynonymsTags = string.Join(",", TermDNN, TermDotNetNuke) }, - new SynonymsGroup { PortalId = 0, SynonymsGroupId = 2, SynonymsTags = string.Join(",", TermLaptop, TermNotebook) }, - new SynonymsGroup { PortalId = 0, SynonymsGroupId = 3, SynonymsTags = string.Join(",", TermJump, TermLeap, TermHop) }, - }; - - return groups; - } - - private SearchType GetSearchTypeByNameCallback(string searchTypeName) - { - var searchType = new SearchType { SearchTypeName = searchTypeName, SearchTypeId = 0 }; - switch (searchTypeName) - { - case ModuleSearchTypeName: - searchType.SearchTypeId = ModuleSearchTypeId; - break; - case TabSearchTypeName: - searchType.SearchTypeId = TabSearchTypeId; - break; - case OtherSearchTypeName: - searchType.SearchTypeId = OtherSearchTypeId; - break; - case DocumentSearchTypeName: - searchType.SearchTypeId = DocumentSearchTypeId; - break; - case UrlSearchTypeName: - searchType.SearchTypeId = UrlSearchTypeId; - break; - } - - return searchType; - } - - private IList GetSynonymsCallBack(int portalId, string cultureCode, string term) - { - var synonyms = new List(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + this.mockDataProvider = MockComponentProvider.CreateDataProvider(); + this.mockLocaleController = MockComponentProvider.CreateLocaleController(); + this.mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); + this.mockUserController = new Mock(); + + this.mockSearchHelper = new Mock(); + this.SetupDataProvider(); + this.SetupSearchHelper(); + this.SetupLocaleController(); + + this.mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())) + .Returns((int portalId, int userId) => this.GetUserByIdCallback(portalId, userId)); + UserController.SetTestableInstance(this.mockUserController.Object); + + this.CreateNewLuceneControllerInstance(); + } + + [TearDown] + public void TearDown() + { + this.mockHostController = null; + Globals.DependencyProvider = null; + this.luceneController.Dispose(); + this.DeleteIndexFolder(); + InternalSearchController.ClearInstance(); + UserController.ClearInstance(); + SearchHelper.ClearInstance(); + LuceneController.ClearInstance(); + this.luceneController = null; + Globals.DependencyProvider = null; + } + + [Test] + public void SearchController_Add_Throws_On_Null_SearchDocument() + { + // Arrange + + // Act, Assert + Assert.Throws(() => this.internalSearchController.AddSearchDocument(null)); + } + + [Test] + public void SearchController_Add_Throws_On_Null_Or_Empty_UniqueuKey() + { + // Arrange + + // Act, Assert + Assert.Throws(() => this.internalSearchController.AddSearchDocument(new SearchDocument())); + } + + [Test] + public void SearchController_Add_Throws_On_Null_OrEmpty_Title() + { + // Arrange + + // Act, Assert + Assert.Throws( + () => this.internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString() })); + } + + [Test] + public void SearchController_AddSearchDcoumets_Does_Not_Throw_On_Null_OrEmpty_Title() + { + // Arrange + var documents = new List { new SearchDocument { UniqueKey = Guid.NewGuid().ToString() } }; + + // Act, Assert + this.internalSearchController.AddSearchDocuments(documents); + } + + [Test] + public void SearchController_AddSearchDcoumets_Does_Not_Throw_On_Empty_Search_Document() + { + // Arrange + var documents = new List { new SearchDocument() }; + + // Act, Assert + this.internalSearchController.AddSearchDocuments(documents); + } + + [Test] + public void SearchController_Add_Throws_On_Zero_SearchTypeId() + { + // Arrange + + // Act, Assert + Assert.Throws( + () => this.internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString() })); + } + + [Test] + public void SearchController_Add_Throws_On_Negative_SearchTypeId() + { + // Arrange + + // Act, Assert + Assert.Throws( + () => + this.internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString(), Title = "title", SearchTypeId = -1 })); + } + + [Test] + public void SearchController_Add_Throws_On_DateTimeMin_ModifiedTimeUtc() + { + // Arrange + + // Act, Assert + Assert.Throws( + () => this.internalSearchController.AddSearchDocument(new SearchDocument { UniqueKey = Guid.NewGuid().ToString(), Title = "title", SearchTypeId = 1 })); + } + + [Test] + public void SearchController_Add_Then_Delete_ModuleDefinition_WorksAsExpected() + { + // Arrange + const int totalDocs = 10; + var now = DateTime.UtcNow; + + // Act + for (var i = 1; i <= totalDocs; i++) + { + var doc = new SearchDocument + { + ModuleDefId = i, + ModuleId = 100, + SearchTypeId = ModuleSearchTypeId, + PortalId = PortalId0, + UniqueKey = Guid.NewGuid().ToString(), + ModifiedTimeUtc = now, + }; + + this.internalSearchController.AddSearchDocument(doc); + } + + // Assert + var stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); + + // Act - delete last item + var searchDoc = new SearchDocument { ModuleDefId = totalDocs }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); + Assert.AreEqual(1, stats.TotalDeletedDocuments); + + // Act - delete first item + searchDoc = new SearchDocument { ModuleDefId = 1 }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); + Assert.AreEqual(2, stats.TotalDeletedDocuments); + } + + [Test] + public void SearchController_Add_Then_Delete_Module_WorksAsExpected() + { + // Arrange + const int totalDocs = 10; + var now = DateTime.UtcNow; + + // Act + for (var i = 1; i <= totalDocs; i++) + { + var doc = new SearchDocument + { + ModuleId = i, + ModuleDefId = 10, + PortalId = PortalId0, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = ModuleSearchTypeId, + ModifiedTimeUtc = now, + }; + + this.internalSearchController.AddSearchDocument(doc); + } + + // Assert + var stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); + + // Act - delete last item + var searchDoc = new SearchDocument { ModuleId = totalDocs }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); + Assert.AreEqual(1, stats.TotalDeletedDocuments); + + // Act - delete first item + searchDoc = new SearchDocument { ModuleId = 1 }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); + Assert.AreEqual(2, stats.TotalDeletedDocuments); + } + + [Test] + public void SearchController_Add_Then_Delete_Portals_WorksAsExpected() + { + // Arrange + const int totalDocs = 10; // must be even + var now = DateTime.UtcNow; + + // Act + for (var i = 1; i <= totalDocs; i++) + { + var doc = new SearchDocument + { + PortalId = i <= (totalDocs / 2) ? PortalId0 : PortalId1, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = ModuleSearchTypeId, + ModifiedTimeUtc = now, + ModuleId = 100, + ModuleDefId = 10, + }; + + this.internalSearchController.AddSearchDocument(doc); + } + + // Assert + var stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); + + // Act - delete all portal 1 items + var searchDoc = new SearchDocument { PortalId = PortalId1 }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert - delete all portal 1 + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs / 2, stats.TotalActiveDocuments); + Assert.AreEqual(totalDocs / 2, stats.TotalDeletedDocuments); + } + + [Test] + public void SearchController_Add_Then_Delete_Roles_WorksAsExpected() + { + // Arrange + const int totalDocs = 10; + var now = DateTime.UtcNow; + + // Act + for (var i = 1; i <= totalDocs; i++) + { + var doc = new SearchDocument + { + RoleId = i, + PortalId = PortalId0, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = ModuleSearchTypeId, + ModifiedTimeUtc = now, + ModuleId = 100, + ModuleDefId = 10, + }; + + this.internalSearchController.AddSearchDocument(doc); + } + + // Assert + var stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); + + // Act - delete last item + var searchDoc = new SearchDocument { RoleId = totalDocs }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); + Assert.AreEqual(1, stats.TotalDeletedDocuments); + + // Act - delete first item + searchDoc = new SearchDocument { RoleId = 1 }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); + Assert.AreEqual(2, stats.TotalDeletedDocuments); + } + + [Test] + public void SearchController_Add_Then_Delete_Tabs_WorksAsExpected() + { + // Arrange + const int totalDocs = 10; + var now = DateTime.UtcNow; + + // Act + for (var i = 1; i <= totalDocs; i++) + { + var doc = new SearchDocument + { + TabId = i, + PortalId = PortalId0, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = TabSearchTypeId, + ModifiedTimeUtc = now, + }; + + this.internalSearchController.AddSearchDocument(doc); + } + + // Assert + var stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); + + // Act - delete last item + var searchDoc = new SearchDocument { TabId = totalDocs }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); + Assert.AreEqual(1, stats.TotalDeletedDocuments); + + // Act - delete first item + searchDoc = new SearchDocument { TabId = 1 }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); + Assert.AreEqual(2, stats.TotalDeletedDocuments); + } + + [Test] + public void SearchController_Add_Then_Delete_Users_WorksAsExpected() + { + // Arrange + const int totalDocs = 10; + var now = DateTime.UtcNow; + + // Act + for (var i = 1; i <= totalDocs; i++) + { + var doc = new SearchDocument + { + AuthorUserId = i, + PortalId = PortalId0, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = ModuleSearchTypeId, + ModifiedTimeUtc = now, + ModuleId = 100, + ModuleDefId = 10, + }; + + this.internalSearchController.AddSearchDocument(doc); + } + + // Assert + var stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs, stats.TotalActiveDocuments); + + // Act - delete last item + var searchDoc = new SearchDocument { AuthorUserId = totalDocs }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 1, stats.TotalActiveDocuments); + Assert.AreEqual(1, stats.TotalDeletedDocuments); + + // Act - delete first item + searchDoc = new SearchDocument { AuthorUserId = 1 }; + this.internalSearchController.DeleteSearchDocument(searchDoc); + + // Assert + stats = this.GetSearchStatistics(); + Assert.AreEqual(totalDocs - 2, stats.TotalActiveDocuments); + Assert.AreEqual(2, stats.TotalDeletedDocuments); + } + + private void CreateNewLuceneControllerInstance() + { + this.DeleteIndexFolder(); + InternalSearchController.SetTestableInstance(new InternalSearchControllerImpl()); + this.internalSearchController = InternalSearchController.Instance; + + if (this.luceneController != null) + { + LuceneController.ClearInstance(); + this.luceneController.Dispose(); + } + + this.luceneController = new LuceneControllerImpl(); + LuceneController.SetTestableInstance(this.luceneController); + } + + private void SetupHostController() + { + this.mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); + this.mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this.readerStaleTimeSpan); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTitleBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTagBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchKeywordBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())) + .Returns(Constants.DefaultSearchDescriptionBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchAuthorBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); + this.mockHostController.As(); + } + + private void SetupLocaleController() + { + this.mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = -1, Code = string.Empty }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureEnCa)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); + + this.mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnFr)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); + } + + private void SetupDataProvider() + { + // Standard DataProvider Path for Logging + this.mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + + DataTableReader searchTypes = null; + this.mockDataProvider.Setup(ds => ds.GetAllSearchTypes()) + .Callback(() => searchTypes = this.GetAllSearchTypes().CreateDataReader()) + .Returns(() => searchTypes); + + this.mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); + } + + private IDataReader GetPortalsCallBack(string culture) + { + return this.GetPortalCallBack(PortalId0, CultureEnUs); + } + + private IDataReader GetPortalCallBack(int portalId, string culture) + { + var table = new DataTable("Portal"); + + var cols = new[] + { + "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", + "Currency", "HostFee", + "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", + "PaymentProcessor", "ProcessorUserId", + "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", + "LoginTabId", "RegisterTabId", + "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", + "LastModifiedOnDate", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + const int homePage = 1; + table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, + "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, + "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", + null, homePage.ToString("D"), null, null, "57", "56", "-1", "-1", "7", null, null, "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); + + return table.CreateDataReader(); + } + + private void SetupSearchHelper() + { + this.mockSearchHelper.Setup(c => c.GetSearchMinMaxLength()).Returns(new Tuple(Constants.DefaultMinLen, Constants.DefaultMaxLen)); + this.mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(this.GetSynonymsCallBack); + this.mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())) + .Returns((string name) => new SearchType { SearchTypeId = 0, SearchTypeName = name }); + this.mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns(this.GetSearchTypeByNameCallback); + this.mockSearchHelper.Setup(x => x.GetSearchTypes()).Returns(this.GetSearchTypes()); + this.mockSearchHelper.Setup(c => c.GetSynonymsGroups(It.IsAny(), It.IsAny())).Returns(this.GetSynonymsGroupsCallBack); + this.mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEsEs)).Returns( + new SearchStopWords + { + PortalId = 0, + CultureCode = CultureEsEs, + StopWords = "los,de,el", + }); + this.mockSearchHelper.Setup(x => x.RephraseSearchText(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(new SearchHelperImpl().RephraseSearchText); + this.mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); + SearchHelper.SetTestableInstance(this.mockSearchHelper.Object); + } + + private IList GetSynonymsGroupsCallBack() + { + var groups = new List + { + new SynonymsGroup { PortalId = 0, SynonymsGroupId = 1, SynonymsTags = string.Join(",", TermDNN, TermDotNetNuke) }, + new SynonymsGroup { PortalId = 0, SynonymsGroupId = 2, SynonymsTags = string.Join(",", TermLaptop, TermNotebook) }, + new SynonymsGroup { PortalId = 0, SynonymsGroupId = 3, SynonymsTags = string.Join(",", TermJump, TermLeap, TermHop) }, + }; + + return groups; + } + + private SearchType GetSearchTypeByNameCallback(string searchTypeName) + { + var searchType = new SearchType { SearchTypeName = searchTypeName, SearchTypeId = 0 }; + switch (searchTypeName) + { + case ModuleSearchTypeName: + searchType.SearchTypeId = ModuleSearchTypeId; + break; + case TabSearchTypeName: + searchType.SearchTypeId = TabSearchTypeId; + break; + case OtherSearchTypeName: + searchType.SearchTypeId = OtherSearchTypeId; + break; + case DocumentSearchTypeName: + searchType.SearchTypeId = DocumentSearchTypeId; + break; + case UrlSearchTypeName: + searchType.SearchTypeId = UrlSearchTypeId; + break; + } + + return searchType; + } + + private IList GetSynonymsCallBack(int portalId, string cultureCode, string term) + { + var synonyms = new List(); if (term == "fox") { synonyms.Add("wolf"); } - return synonyms; - } - - private UserInfo GetUserByIdCallback(int portalId, int userId) - { - return new UserInfo { UserID = userId, DisplayName = "User" + userId, PortalID = portalId }; - } - - private DataTable GetAllSearchTypes() - { - var dtSearchTypes = new DataTable("SearchTypes"); - var pkId = dtSearchTypes.Columns.Add("SearchTypeId", typeof(int)); - dtSearchTypes.Columns.Add("SearchTypeName", typeof(string)); - dtSearchTypes.Columns.Add("SearchResultClass", typeof(string)); - dtSearchTypes.PrimaryKey = new[] { pkId }; - - // Create default Crawler - dtSearchTypes.Rows.Add(ModuleSearchTypeId, ModuleSearchTypeName, FakeResultControllerClass); - dtSearchTypes.Rows.Add(TabSearchTypeId, TabSearchTypeName, FakeResultControllerClass); - dtSearchTypes.Rows.Add(OtherSearchTypeId, OtherSearchTypeName, FakeResultControllerClass); - dtSearchTypes.Rows.Add(DocumentSearchTypeId, DocumentSearchTypeName, NoPermissionFakeResultControllerClass); - dtSearchTypes.Rows.Add(UrlSearchTypeId, UrlSearchTypeName, FakeResultControllerClass); - - return dtSearchTypes; - } - - private IEnumerable GetSearchTypes() - { - var searchTypes = new List - { - new SearchType { SearchTypeId = ModuleSearchTypeId, SearchTypeName = ModuleSearchTypeName, SearchResultClass = FakeResultControllerClass }, - new SearchType { SearchTypeId = TabSearchTypeId, SearchTypeName = TabSearchTypeName, SearchResultClass = FakeResultControllerClass }, - new SearchType { SearchTypeId = OtherSearchTypeId, SearchTypeName = OtherSearchTypeName, SearchResultClass = FakeResultControllerClass }, - new SearchType - { - SearchTypeId = DocumentSearchTypeId, - SearchTypeName = DocumentSearchTypeName, - SearchResultClass = NoPermissionFakeResultControllerClass, - }, - new SearchType { SearchTypeId = UrlSearchTypeId, SearchTypeName = UrlSearchTypeName, SearchResultClass = FakeResultControllerClass }, - }; - - return searchTypes; - } - - private void DeleteIndexFolder() - { - try - { - if (Directory.Exists(SearchIndexFolder)) - { - Directory.Delete(SearchIndexFolder, true); - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } - - private SearchStatistics GetSearchStatistics() - { - this._internalSearchController.Commit(); - Thread.Sleep((int)(this._readerStaleTimeSpan * 1000)); // time to flush data to Lucene - return this._internalSearchController.GetSearchStatistics(); - } - -#if false // the rules have changed and these are invalid tests now - [Test] - public void SearchController_Delete_Throws_On_Null_Or_Empty_UniqueuKey() - { - //Arrange - - //Act, Assert - var searchDoc = new SearchDocument() { UniqueKey = null, PortalId = 0, SearchTypeId = 1 }; - Assert.Throws(() => _internalSearchController.DeleteSearchDocument(searchDoc)); - } - - [Test] - public void SearchController_Delete_Throws_On_Zero_SearchTypeId() - { - //Arrange - - //Act, Assert - var searchDoc = new SearchDocument() { UniqueKey = "key", PortalId = 0, SearchTypeId = 0 }; - Assert.Throws(() => _internalSearchController.DeleteSearchDocument(searchDoc)); - } - - [Test] - public void SearchController_Delete_Throws_On_Negative_SearchTypeId() - { - //Arrange - - //Act, Assert - var searchDoc = new SearchDocument() { UniqueKey = "key", PortalId = 0, SearchTypeId = -1 }; - Assert.Throws(() => _internalSearchController.DeleteSearchDocument(searchDoc)); - } -#endif - - } -} + return synonyms; + } + + private UserInfo GetUserByIdCallback(int portalId, int userId) + { + return new UserInfo { UserID = userId, DisplayName = "User" + userId, PortalID = portalId }; + } + + private DataTable GetAllSearchTypes() + { + var dtSearchTypes = new DataTable("SearchTypes"); + var pkId = dtSearchTypes.Columns.Add("SearchTypeId", typeof(int)); + dtSearchTypes.Columns.Add("SearchTypeName", typeof(string)); + dtSearchTypes.Columns.Add("SearchResultClass", typeof(string)); + dtSearchTypes.PrimaryKey = new[] { pkId }; + + // Create default Crawler + dtSearchTypes.Rows.Add(ModuleSearchTypeId, ModuleSearchTypeName, FakeResultControllerClass); + dtSearchTypes.Rows.Add(TabSearchTypeId, TabSearchTypeName, FakeResultControllerClass); + dtSearchTypes.Rows.Add(OtherSearchTypeId, OtherSearchTypeName, FakeResultControllerClass); + dtSearchTypes.Rows.Add(DocumentSearchTypeId, DocumentSearchTypeName, NoPermissionFakeResultControllerClass); + dtSearchTypes.Rows.Add(UrlSearchTypeId, UrlSearchTypeName, FakeResultControllerClass); + + return dtSearchTypes; + } + + private IEnumerable GetSearchTypes() + { + var searchTypes = new List + { + new SearchType { SearchTypeId = ModuleSearchTypeId, SearchTypeName = ModuleSearchTypeName, SearchResultClass = FakeResultControllerClass }, + new SearchType { SearchTypeId = TabSearchTypeId, SearchTypeName = TabSearchTypeName, SearchResultClass = FakeResultControllerClass }, + new SearchType { SearchTypeId = OtherSearchTypeId, SearchTypeName = OtherSearchTypeName, SearchResultClass = FakeResultControllerClass }, + new SearchType + { + SearchTypeId = DocumentSearchTypeId, + SearchTypeName = DocumentSearchTypeName, + SearchResultClass = NoPermissionFakeResultControllerClass, + }, + new SearchType { SearchTypeId = UrlSearchTypeId, SearchTypeName = UrlSearchTypeName, SearchResultClass = FakeResultControllerClass }, + }; + + return searchTypes; + } + + private void DeleteIndexFolder() + { + try + { + if (Directory.Exists(SearchIndexFolder)) + { + Directory.Delete(SearchIndexFolder, true); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + private SearchStatistics GetSearchStatistics() + { + this.internalSearchController.Commit(); + Thread.Sleep((int)(this.readerStaleTimeSpan * 1000)); // time to flush data to Lucene + return this.internalSearchController.GetSearchStatistics(); + } + +#if false // the rules have changed and these are invalid tests now + [Test] + public void SearchController_Delete_Throws_On_Null_Or_Empty_UniqueuKey() + { + //Arrange + + //Act, Assert + var searchDoc = new SearchDocument() { UniqueKey = null, PortalId = 0, SearchTypeId = 1 }; + Assert.Throws(() => _internalSearchController.DeleteSearchDocument(searchDoc)); + } + + [Test] + public void SearchController_Delete_Throws_On_Zero_SearchTypeId() + { + //Arrange + + //Act, Assert + var searchDoc = new SearchDocument() { UniqueKey = "key", PortalId = 0, SearchTypeId = 0 }; + Assert.Throws(() => _internalSearchController.DeleteSearchDocument(searchDoc)); + } + + [Test] + public void SearchController_Delete_Throws_On_Negative_SearchTypeId() + { + //Arrange + + //Act, Assert + var searchDoc = new SearchDocument() { UniqueKey = "key", PortalId = 0, SearchTypeId = -1 }; + Assert.Throws(() => _internalSearchController.DeleteSearchDocument(searchDoc)); + } +#endif + + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs index 6043cac7d3c..2f56eec83ca 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs @@ -9,9 +9,10 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using System.IO; using System.Linq; using System.Threading; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Cache; @@ -19,14 +20,17 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using DotNetNuke.Services.Search.Entities; using DotNetNuke.Services.Search.Internals; using DotNetNuke.Tests.Utilities.Mocks; + using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.QueryParsers; using Lucene.Net.Search; + using Microsoft.Extensions.DependencyInjection; + using Moq; - using NUnit.Framework; + using NUnit.Framework; using Directory = System.IO.Directory; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -55,38 +59,36 @@ public class LuceneControllerTests // Arrange private const int TotalTestDocs2Create = 5; private const string ContentFieldName = "content"; - private readonly double _readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; + private readonly double readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; - private Mock _mockHostController; - private LuceneControllerImpl _luceneController; - private Mock _cachingProvider; - private Mock _mockSearchHelper; - private Mock _mockSearchQuery; + private Mock mockHostController; + private LuceneControllerImpl luceneController; + private Mock cachingProvider; + private Mock mockSearchHelper; + private Mock mockSearchQuery; [SetUp] public void SetUp() { - - ComponentFactory.Container = new SimpleContainer(); - this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); + this.cachingProvider = MockComponentProvider.CreateDataCacheProvider(); this.MockHostController(); - this._mockSearchHelper = new Mock(); - this._mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.GetSynonymsCallBack); - this._mockSearchHelper.Setup(c => c.GetSearchStopWords(It.IsAny(), It.IsAny())).Returns(new SearchStopWords()); - this._mockSearchHelper.Setup(c => c.GetSearchMinMaxLength()).Returns(new Tuple(Constants.DefaultMinLen, Constants.DefaultMaxLen)); - this._mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); - SearchHelper.SetTestableInstance(this._mockSearchHelper.Object); + this.mockSearchHelper = new Mock(); + this.mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.GetSynonymsCallBack); + this.mockSearchHelper.Setup(c => c.GetSearchStopWords(It.IsAny(), It.IsAny())).Returns(new SearchStopWords()); + this.mockSearchHelper.Setup(c => c.GetSearchMinMaxLength()).Returns(new Tuple(Constants.DefaultMinLen, Constants.DefaultMaxLen)); + this.mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); + SearchHelper.SetTestableInstance(this.mockSearchHelper.Object); var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(container => (INewHostController)this._mockHostController.Object); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - this._mockSearchQuery = new Mock(); + this.mockSearchQuery = new Mock(); this.DeleteIndexFolder(); this.CreateNewLuceneControllerInstance(); @@ -95,30 +97,36 @@ public void SetUp() [TearDown] public void TearDown() { - Globals.DependencyProvider = null; - this._luceneController.Dispose(); + LuceneController.ClearInstance(); + this.luceneController.Dispose(); this.DeleteIndexFolder(); SearchHelper.ClearInstance(); Globals.DependencyProvider = null; + + this.mockHostController = null; + this.luceneController = null; + this.cachingProvider = null; + this.mockSearchHelper = null; + this.mockSearchQuery = null; } private void MockHostController() { - this._mockHostController = new Mock(); - this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); - this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this._readerStaleTimeSpan); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); - - this._mockHostController.As(); + this.mockHostController = new Mock(); + + this.mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); + this.mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this.readerStaleTimeSpan); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); + this.mockHostController.As(); } [Test] public void LuceneController_SearchFolderIsAsExpected() { var inf1 = new DirectoryInfo(SearchIndexFolder); - var inf2 = new DirectoryInfo(this._luceneController.IndexFolder); + var inf2 = new DirectoryInfo(this.luceneController.IndexFolder); Assert.AreEqual(inf1.FullName, inf2.FullName); } @@ -128,7 +136,7 @@ public void LuceneController_Add_Throws_On_Null_Document() // Arrange // Act, Assert - Assert.Throws(() => this._luceneController.Add(null)); + Assert.Throws(() => this.luceneController.Add(null)); } public void LuceneController_Add_Throws_On_Null_Query() @@ -136,7 +144,7 @@ public void LuceneController_Add_Throws_On_Null_Query() // Arrange // Act, Assert - Assert.Throws(() => this._luceneController.Delete(null)); + Assert.Throws(() => this.luceneController.Delete(null)); } [Test] @@ -145,8 +153,8 @@ public void LuceneController_Add_Empty_FiledsCollection_DoesNot_Create_Index() // Arrange // Act - this._luceneController.Add(new Document()); - this._luceneController.Commit(); + this.luceneController.Add(new Document()); + this.luceneController.Commit(); var numFiles = 0; this.DeleteIndexFolder(); @@ -166,10 +174,10 @@ public void LuceneController_GetsHighlightedDesc() var doc = new Document(); doc.Add(field); - this._luceneController.Add(doc); - this._luceneController.Commit(); + this.luceneController.Add(doc); + this.luceneController.Commit(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(fieldName, "fox")) })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(fieldName, "fox")) })); // Assert Assert.AreEqual(1, hits.Results.Count()); @@ -191,10 +199,10 @@ public void LuceneController_HighlightedDescHtmlEncodesOutput() var doc = new Document(); doc.Add(field); - this._luceneController.Add(doc); - this._luceneController.Commit(); + this.luceneController.Add(doc); + this.luceneController.Commit(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(fieldName, "fox")) })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(fieldName, "fox")) })); // Assert Assert.AreEqual(1, hits.Results.Count()); @@ -212,11 +220,11 @@ public void LuceneController_FindsResultsUsingNearRealtimeSearchWithoutCommit() var field = new Field(fieldName, fieldValue, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); var doc = new Document(); doc.Add(field); - this._luceneController.Add(doc); + this.luceneController.Add(doc); // DONOT commit here to enable testing near-realtime of search writer // _luceneController.Commit(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(fieldName, "fox")) })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(fieldName, "fox")) })); // Assert Assert.AreEqual(1, hits.Results.Count()); @@ -228,7 +236,7 @@ public void LuceneController_Search_Returns_Correct_Total_Hits() // Arrange this.AddStandardDocs(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")) })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")) })); // Assert Assert.AreEqual(4, hits.TotalHits); @@ -241,7 +249,7 @@ public void LuceneController_Search_Request_For_1_Result_Returns_1_Record_But_Mo // Arrange this.AddStandardDocs(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), PageIndex = 1, PageSize = 1 })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), PageIndex = 1, PageSize = 1 })); // Assert Assert.AreEqual(4, hits.TotalHits); @@ -254,7 +262,7 @@ public void LuceneController_Search_Request_For_4_Records_Returns_4_Records_With // Arrange this.AddStandardDocs(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), PageIndex = 1, PageSize = 4 })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), PageIndex = 1, PageSize = 4 })); // Assert Assert.AreEqual(4, hits.TotalHits); @@ -267,7 +275,7 @@ public void LuceneController_Search_Request_For_4_Records_Returns_4_Records_With // Arrange this.AddStandardDocs(); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), PageIndex = 1, PageSize = 4 })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), PageIndex = 1, PageSize = 4 })); // Assert Assert.AreEqual(4, hits.TotalHits); @@ -280,7 +288,7 @@ public void LuceneController_Search_Request_For_NonExisting_PageNumbers_Returns_ // Arrange this.AddStandardDocs(); - var hits = this._luceneController.Search(this.CreateSearchContext( + var hits = this.luceneController.Search(this.CreateSearchContext( new LuceneQuery { Query = new TermQuery(new Term(Constants.ContentTag, "fox")), @@ -306,7 +314,7 @@ public void LuceneController_Search_Request_For_PagIndex2_PageSize1_Returns_2nd_ PageSize = 1, }; - var hits = this._luceneController.Search(this.CreateSearchContext(query)); + var hits = this.luceneController.Search(this.CreateSearchContext(query)); // Assert Assert.AreEqual(3, hits.TotalHits); @@ -328,27 +336,27 @@ public void LuceneController_NumericRangeCheck() // Add first numeric field var doc1 = new Document(); doc1.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(1)); - this._luceneController.Add(doc1); + this.luceneController.Add(doc1); // Add second numeric field var doc2 = new Document(); doc2.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(2)); - this._luceneController.Add(doc2); + this.luceneController.Add(doc2); // Add third numeric field var doc3 = new Document(); doc3.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(3)); - this._luceneController.Add(doc3); + this.luceneController.Add(doc3); // Add fourth numeric field var doc4 = new Document(); doc4.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(4)); - this._luceneController.Add(doc4); + this.luceneController.Add(doc4); - this._luceneController.Commit(); + this.luceneController.Commit(); var query = NumericRangeQuery.NewIntRange(fieldName, 2, 3, true, true); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); Assert.AreEqual(2, hits.Results.Count()); } @@ -364,48 +372,48 @@ public void LuceneController_DateRangeCheck() { var doc = new Document(); doc.Add(new NumericField(fieldName, Field.Store.YES, true).SetLongValue(long.Parse(date.ToString(Constants.DateTimeFormat)))); - this._luceneController.Add(doc); + this.luceneController.Add(doc); } - this._luceneController.Commit(); + this.luceneController.Commit(); var futureTime = DateTime.Now.AddMinutes(1).ToString(Constants.DateTimeFormat); var query = NumericRangeQuery.NewLongRange(fieldName, long.Parse(futureTime), long.Parse(futureTime), true, true); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); Assert.AreEqual(0, hits.Results.Count()); query = NumericRangeQuery.NewLongRange(fieldName, long.Parse(DateTime.Now.AddDays(-1).ToString(Constants.DateTimeFormat)), long.Parse(DateTime.Now.ToString(Constants.DateTimeFormat)), true, true); - hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); + hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); Assert.AreEqual(1, hits.Results.Count()); query = NumericRangeQuery.NewLongRange(fieldName, long.Parse(DateTime.Now.AddDays(-368).ToString(Constants.DateTimeFormat)), long.Parse(DateTime.Now.ToString(Constants.DateTimeFormat)), true, true); - hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); + hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = query })); Assert.AreEqual(2, hits.Results.Count()); } [Test] public void LuceneController_Search_Throws_On_Null_LuceneQuery() { - Assert.Throws(() => this._luceneController.Search(this.CreateSearchContext(null))); + Assert.Throws(() => this.luceneController.Search(this.CreateSearchContext(null))); } [Test] public void LuceneController_Search_Throws_On_Null_Query() { - Assert.Throws(() => this._luceneController.Search(this.CreateSearchContext(new LuceneQuery()))); + Assert.Throws(() => this.luceneController.Search(this.CreateSearchContext(new LuceneQuery()))); } [Test] public void LuceneController_Search_Throws_On_Zero_PageSize() { - Assert.Throws(() => this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new BooleanQuery(), PageSize = 0 }))); + Assert.Throws(() => this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new BooleanQuery(), PageSize = 0 }))); } [Test] public void LuceneController_Search_Throws_On_Zero_PageIndex() { - Assert.Throws(() => this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new BooleanQuery(), PageIndex = 0 }))); + Assert.Throws(() => this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = new BooleanQuery(), PageIndex = 0 }))); } [Test] @@ -414,7 +422,7 @@ public void LuceneController_Search_Throws_On_Zero_PageIndex() [TestCase(ValidCustomAnalyzer)] public void LuceneController_Search_With_Chinese_Chars_And_Custom_Analyzer(string customAlalyzer = "") { - this._mockHostController.Setup(c => c.GetString(Constants.SearchCustomAnalyzer, It.IsAny())).Returns(customAlalyzer); + this.mockHostController.Setup(controller => controller.GetString(Constants.SearchCustomAnalyzer, It.IsAny())).Returns(customAlalyzer); // Arrange const string fieldName = "content"; @@ -425,16 +433,16 @@ public void LuceneController_Search_With_Chinese_Chars_And_Custom_Analyzer(strin var doc = new Document(); doc.Add(field); - this._luceneController.Add(doc); - this._luceneController.Commit(); + this.luceneController.Add(doc); + this.luceneController.Commit(); - var analyzer = this._luceneController.GetCustomAnalyzer() ?? new SearchQueryAnalyzer(true); + var analyzer = this.luceneController.GetCustomAnalyzer() ?? new SearchQueryAnalyzer(true); var keywordQuery = new BooleanQuery(); var parserContent = new QueryParser(Constants.LuceneVersion, fieldName, analyzer); var parsedQueryContent = parserContent.Parse(SearchKeyword_Chinese); keywordQuery.Add(parsedQueryContent, Occur.SHOULD); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = keywordQuery })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = keywordQuery })); // Assert if (customAlalyzer == ValidCustomAnalyzer) @@ -454,7 +462,7 @@ public void LuceneController_Search_With_Chinese_Chars_And_Custom_Analyzer(strin [TestCase(ValidCustomAnalyzer)] public void LuceneController_Search_With_English_Chars_And_Custom_Analyzer(string customAlalyzer = "") { - this._mockHostController.Setup(c => c.GetString(Constants.SearchCustomAnalyzer, It.IsAny())).Returns(customAlalyzer); + this.mockHostController.Setup(c => c.GetString(Constants.SearchCustomAnalyzer, It.IsAny())).Returns(customAlalyzer); // Arrange const string fieldName = "content"; @@ -465,16 +473,16 @@ public void LuceneController_Search_With_English_Chars_And_Custom_Analyzer(strin var doc = new Document(); doc.Add(field); - this._luceneController.Add(doc); - this._luceneController.Commit(); + this.luceneController.Add(doc); + this.luceneController.Commit(); - var analyzer = this._luceneController.GetCustomAnalyzer() ?? new SearchQueryAnalyzer(true); + var analyzer = this.luceneController.GetCustomAnalyzer() ?? new SearchQueryAnalyzer(true); var keywordQuery = new BooleanQuery(); var parserContent = new QueryParser(Constants.LuceneVersion, fieldName, analyzer); var parsedQueryContent = parserContent.Parse(SearchKeyword_Line1); keywordQuery.Add(parsedQueryContent, Occur.SHOULD); - var hits = this._luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = keywordQuery })); + var hits = this.luceneController.Search(this.CreateSearchContext(new LuceneQuery { Query = keywordQuery })); // Assert Assert.AreEqual(1, hits.Results.Count()); @@ -496,7 +504,7 @@ public void LuceneController_Search_Single_FuzzyQuery() // Act var luceneQuery = new LuceneQuery { Query = new FuzzyQuery(new Term(Constants.ContentTag, keyword)) }; - var previews = this._luceneController.Search(this.CreateSearchContext(luceneQuery)); + var previews = this.luceneController.Search(this.CreateSearchContext(luceneQuery)); // Assert Assert.AreEqual(2, previews.Results.Count()); @@ -530,7 +538,7 @@ public void LuceneController_Search_Double_FuzzyQuery() } var luceneQuery = new LuceneQuery { Query = finalQuery }; - var previews = this._luceneController.Search(this.CreateSearchContext(luceneQuery)); + var previews = this.luceneController.Search(this.CreateSearchContext(luceneQuery)); // Assert Assert.AreEqual(3, previews.Results.Count()); @@ -539,7 +547,7 @@ public void LuceneController_Search_Double_FuzzyQuery() [Test] public void LuceneController_Throws_SearchIndexEmptyException_WhenNoDataInSearch() { - Assert.Throws(() => { var r = this._luceneController.GetSearcher(); }); + Assert.Throws(() => { var r = this.luceneController.GetSearcher(); }); } [Test] @@ -553,13 +561,13 @@ public void LuceneController_ReaderNotChangedBeforeTimeSpanElapsed() // Add first numeric field var doc1 = new Document(); doc1.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(1)); - this._luceneController.Add(doc1); - this._luceneController.Commit(); + this.luceneController.Add(doc1); + this.luceneController.Commit(); - var reader = this._luceneController.GetSearcher(); - Thread.Sleep(TimeSpan.FromSeconds(this._readerStaleTimeSpan / 2)); + var reader = this.luceneController.GetSearcher(); + Thread.Sleep(TimeSpan.FromSeconds(this.readerStaleTimeSpan / 2)); - Assert.AreSame(reader, this._luceneController.GetSearcher()); + Assert.AreSame(reader, this.luceneController.GetSearcher()); } [Test] @@ -573,13 +581,13 @@ public void LuceneController_ReaderNotChangedIfNoIndexUpdated() // Add first numeric field var doc1 = new Document(); doc1.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(1)); - this._luceneController.Add(doc1); - this._luceneController.Commit(); + this.luceneController.Add(doc1); + this.luceneController.Commit(); - var reader = this._luceneController.GetSearcher(); - Thread.Sleep(TimeSpan.FromSeconds(this._readerStaleTimeSpan * 1.1)); + var reader = this.luceneController.GetSearcher(); + Thread.Sleep(TimeSpan.FromSeconds(this.readerStaleTimeSpan * 1.1)); - Assert.AreSame(reader, this._luceneController.GetSearcher()); + Assert.AreSame(reader, this.luceneController.GetSearcher()); } [Test] @@ -593,20 +601,20 @@ public void LuceneController_ReaderIsChangedWhenIndexIsUpdatedAndTimeIsElapsed() // Add first numeric field var doc1 = new Document(); doc1.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(1)); - this._luceneController.Add(doc1); - this._luceneController.Commit(); + this.luceneController.Add(doc1); + this.luceneController.Commit(); - var reader = this._luceneController.GetSearcher(); - Thread.Sleep(TimeSpan.FromSeconds(this._readerStaleTimeSpan * 1.1)); + var reader = this.luceneController.GetSearcher(); + Thread.Sleep(TimeSpan.FromSeconds(this.readerStaleTimeSpan * 1.1)); // Add second numeric field var doc2 = new Document(); doc2.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(2)); - this._luceneController.Add(doc2); + this.luceneController.Add(doc2); // var lastAcccess = Directory.GetLastWriteTime(_luceneController.IndexFolder); // Directory.SetLastWriteTime(_luceneController.IndexFolder, lastAcccess + TimeSpan.FromSeconds(1)); - Assert.AreNotSame(reader, this._luceneController.GetSearcher()); + Assert.AreNotSame(reader, this.luceneController.GetSearcher()); } [Test] @@ -631,7 +639,7 @@ public void LuceneController_LockFileWhenExistsDoesNotCauseProblemForFirstIContr // Assert Assert.True(File.Exists(lockFile)); - Assert.DoesNotThrow(() => this._luceneController.Add(doc1)); + Assert.DoesNotThrow(() => this.luceneController.Add(doc1)); } [Test] @@ -644,7 +652,7 @@ public void LuceneController_LockFileCanBeObtainedByOnlySingleController() // Act var doc1 = new Document(); doc1.Add(new NumericField(fieldName, Field.Store.YES, true).SetIntValue(1)); - this._luceneController.Add(doc1); + this.luceneController.Add(doc1); // create another controller then try to access the already locked index by the first one var secondController = new LuceneControllerImpl(); @@ -659,8 +667,8 @@ public void LuceneController_DocumentMaxAndCountAreCorrect() { this.AddTestDocs(); - Assert.AreEqual(TotalTestDocs2Create, this._luceneController.MaxDocsCount()); - Assert.AreEqual(TotalTestDocs2Create, this._luceneController.SearchbleDocsCount()); + Assert.AreEqual(TotalTestDocs2Create, this.luceneController.MaxDocsCount()); + Assert.AreEqual(TotalTestDocs2Create, this.luceneController.SearchbleDocsCount()); } [Test] @@ -670,9 +678,9 @@ public void LuceneController_TestDeleteBeforeOptimize() this.AddTestDocs(); var delCount = this.DeleteTestDocs(); - Assert.IsTrue(this._luceneController.HasDeletions()); - Assert.AreEqual(TotalTestDocs2Create, this._luceneController.MaxDocsCount()); - Assert.AreEqual(TotalTestDocs2Create - delCount, this._luceneController.SearchbleDocsCount()); + Assert.IsTrue(this.luceneController.HasDeletions()); + Assert.AreEqual(TotalTestDocs2Create, this.luceneController.MaxDocsCount()); + Assert.AreEqual(TotalTestDocs2Create - delCount, this.luceneController.SearchbleDocsCount()); } [Test] @@ -682,10 +690,10 @@ public void LuceneController_TestDeleteAfterOptimize() this.AddTestDocs(); var delCount = this.DeleteTestDocs(); - this._luceneController.OptimizeSearchIndex(true); + this.luceneController.OptimizeSearchIndex(true); - Assert.AreEqual(TotalTestDocs2Create, this._luceneController.MaxDocsCount()); - Assert.AreEqual(TotalTestDocs2Create - delCount, this._luceneController.SearchbleDocsCount()); + Assert.AreEqual(TotalTestDocs2Create, this.luceneController.MaxDocsCount()); + Assert.AreEqual(TotalTestDocs2Create - delCount, this.luceneController.SearchbleDocsCount()); } [Test] @@ -694,7 +702,7 @@ public void LuceneController_TestGetSearchStatistics() // Arrange var addedCount = this.AddTestDocs(); var delCount = this.DeleteTestDocs(); - var statistics = this._luceneController.GetSearchStatistics(); + var statistics = this.luceneController.GetSearchStatistics(); Assert.IsNotNull(statistics); Assert.AreEqual(statistics.TotalDeletedDocuments, delCount); @@ -709,19 +717,19 @@ public void SearchController_LuceneControllerReaderIsNotNullWhenWriterIsNull() this.CreateNewLuceneControllerInstance(); // to force a new reader for the next assertion // Assert - Assert.IsNotNull(this._luceneController.GetSearcher()); + Assert.IsNotNull(this.luceneController.GetSearcher()); } private void CreateNewLuceneControllerInstance() { - if (this._luceneController != null) + if (this.luceneController != null) { LuceneController.ClearInstance(); - this._luceneController.Dispose(); + this.luceneController.Dispose(); } - this._luceneController = new LuceneControllerImpl(); - LuceneController.SetTestableInstance(this._luceneController); + this.luceneController = new LuceneControllerImpl(); + LuceneController.SetTestableInstance(this.luceneController); } private IList GetSynonymsCallBack(int portalId, string cultureCode, string term) @@ -770,10 +778,10 @@ private void AddLinesAsSearchDocs(IEnumerable lines) var field = new Field(Constants.ContentTag, line, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); var doc = new Document(); doc.Add(field); - this._luceneController.Add(doc); + this.luceneController.Add(doc); } - this._luceneController.Commit(); + this.luceneController.Commit(); } private int AddTestDocs() @@ -785,10 +793,10 @@ private int AddTestDocs() // format to "D#" because LengthFilter will not consider words of length < 3 or > 255 characters in length (defaults) doc.Add(new Field(ContentFieldName, i.ToString("D" + Constants.DefaultMinLen), Field.Store.YES, Field.Index.ANALYZED)); - this._luceneController.Add(doc); + this.luceneController.Add(doc); } - this._luceneController.Commit(); + this.luceneController.Commit(); return TotalTestDocs2Create; } @@ -800,17 +808,17 @@ private int DeleteTestDocs() for (var i = 1; i < TotalTestDocs2Create; i += 2) { // format to "D#" because LengthFilter will not consider the defaults for these values - this._luceneController.Delete(new TermQuery(new Term(ContentFieldName, i.ToString("D" + Constants.DefaultMinLen)))); + this.luceneController.Delete(new TermQuery(new Term(ContentFieldName, i.ToString("D" + Constants.DefaultMinLen)))); delCount++; } - this._luceneController.Commit(); + this.luceneController.Commit(); return delCount; } private LuceneSearchContext CreateSearchContext(LuceneQuery luceneQuery) { - return new LuceneSearchContext { LuceneQuery = luceneQuery, SearchQuery = this._mockSearchQuery.Object }; + return new LuceneSearchContext { LuceneQuery = luceneQuery, SearchQuery = this.mockSearchQuery.Object }; } } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs index 8e0be409804..0bd5f4c46c6 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs @@ -2,2999 +2,3000 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Search -{ - using System; - using System.Collections.Generic; - using System.Data; - using System.IO; - using System.Linq; +namespace DotNetNuke.Tests.Core.Controllers.Search +{ + using System; + using System.Collections.Generic; + using System.Data; + using System.IO; + using System.Linq; using System.Threading; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.ComponentModel; - using DotNetNuke.Data; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Search.Controllers; - using DotNetNuke.Services.Search.Entities; - using DotNetNuke.Services.Search.Internals; - using DotNetNuke.Tests.Utilities.Mocks; - using Lucene.Net.Documents; + using DotNetNuke.Common; + using DotNetNuke.ComponentModel; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Users; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Localization; + using DotNetNuke.Services.Search.Controllers; + using DotNetNuke.Services.Search.Entities; + using DotNetNuke.Services.Search.Internals; + using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using Constants = DotNetNuke.Services.Search.Internals.Constants; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Testing various aspects of SearchController. - /// - [TestFixture] - public class SearchControllerTests - { - private const int ModuleSearchTypeId = (int)SearchTypeIds.ModuleSearchTypeId; - private const int TabSearchTypeId = (int)SearchTypeIds.TabSearchTypeId; - private const int DocumentSearchTypeId = (int)SearchTypeIds.DocumentSearchTypeId; - private const int UrlSearchTypeId = (int)SearchTypeIds.UrlSearchTypeId; - private const int OtherSearchTypeId = (int)SearchTypeIds.OtherSearchTypeId; - private const int UnknownSearchTypeId = (int)SearchTypeIds.UnknownSearchTypeId; - private const int PortalId0 = 0; - private const int PortalId12 = 12; - private const int IdeasModuleDefId = 201; - private const int BlogsoduleDefId = 202; - private const int AnswersModuleDefId = 203; - private const int HtmlModuleDefId = 20; - private const int HtmlModuleId = 25; - private const int IdeasModuleId = 301; - private const int BlogsModuleId = 302; - private const int AnswersModuleId = 303; - private const int RoleId731 = 731; - private const int RoleId532 = 532; - private const int RoleId0 = 0; - private const string Tag0 = "tag0"; - private const string Tag0WithSpace = "tag0 hello"; - private const string Tag1 = "tag1"; - private const string Tag2 = "tag2"; - private const string Tag3 = "tag3"; - private const string Tag4 = "tag4"; - private const string TagTootsie = "tootsie"; - private const string TagLatest = "latest"; - private const string TagOldest = "oldest"; - private const string TagIt = "IT"; - private const string TagNeutral = "Neutral"; - private const string ModuleSearchTypeName = "module"; - private const string OtherSearchTypeName = "other"; - private const string TabSearchTypeName = "tab"; - private const string DocumentSearchTypeName = "document"; - private const string UrlSearchTypeName = "url"; - private const string ModuleResultControllerClass = "DotNetNuke.Services.Search.Crawlers.ModuleResultController, DotNetNuke"; - private const string FakeResultControllerClass = "DotNetNuke.Tests.Core.Controllers.Search.FakeResultController, DotNetNuke.Tests.Core"; - private const string NoPermissionFakeResultControllerClass = "DotNetNuke.Tests.Core.Controllers.Search.NoPermissionFakeResultController, DotNetNuke.Tests.Core"; - private const string CultureEnUs = "en-US"; - private const string CultureEnCa = "en-CA"; - private const string CultureItIt = "it-IT"; - private const string CultureEsEs = "es-ES"; - private const int LanguageIdEnUs = 1; - private const int LanguageIdEnFr = 2; - private const int LanguageIdItIt = 3; - private const int LanguageIdEsEs = 4; - private const int StandardAuthorId = 55; - private const int StandardRoleId = 66; - private const string StandardAuthorDisplayName = "Standard User"; - private const int StandardTabId = 99; - private const string StandardPermission = "!Translator (en-US);![4];[5];[6];Administrators;ContentEditorRole;"; - private const string StandardQueryString = "cid=1"; - private const string NumericKey1 = "numerickey1"; - private const string NumericKey2 = "numerickey2"; - private const int NumericValue1 = 77777; - private const int NumericValue2 = 55555; - private const int NumericValue50 = 50; - private const int NumericValue100 = 100; - private const int NumericValue200 = 200; - private const int NumericValue500 = 500; - private const int NumericValue1000 = 1000; - private const string KeyWord1Name = "keyword1"; - private const string KeyWord1Value = "value1"; - private const string KeyWord2Name = "keyword2"; - private const string KeyWord2Value = "value2"; - private const string KeyWord3Value = "value3"; - private const string KeyWord4Value = "value4"; - private const string KeyWord5Value = "value5"; - private const string Line1 = "The quick brown fox jumps over the lazy dog"; - private const string Line2 = "The quick gold fox jumped over the lazy black dog"; - private const string Line3 = "the quick fox jumps over the black dog - Italian"; - private const string Line4 = "the red fox jumped over the lazy dark gray dog"; - private const string Line5 = "the quick fox jumps over the white dog - los de el Espana"; - - private const int CustomBoost = 80; - - private const string SearchIndexFolder = @"App_Data\SearchTests"; - private const int DefaultSearchRetryTimes = 5; - private readonly double _readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; - private Mock _mockHostController; - private Mock _mockCachingProvider; - private Mock _mockDataProvider; - private Mock _mockLocaleController; - private Mock _mockSearchHelper; - private Mock _mockUserController; - - private SearchControllerImpl _searchController; - private IInternalSearchController _internalSearchController; - private LuceneControllerImpl _luceneController; - - public enum SearchTypeIds - { - ModuleSearchTypeId = 1, - TabSearchTypeId, - DocumentSearchTypeId, - UrlSearchTypeId, - OtherSearchTypeId, - UnknownSearchTypeId, - } - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + using Constants = DotNetNuke.Services.Search.Internals.Constants; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + + /// + /// Testing various aspects of SearchController. + /// + [TestFixture] + public class SearchControllerTests + { + private const int ModuleSearchTypeId = (int)SearchTypeIds.ModuleSearchTypeId; + private const int TabSearchTypeId = (int)SearchTypeIds.TabSearchTypeId; + private const int DocumentSearchTypeId = (int)SearchTypeIds.DocumentSearchTypeId; + private const int UrlSearchTypeId = (int)SearchTypeIds.UrlSearchTypeId; + private const int OtherSearchTypeId = (int)SearchTypeIds.OtherSearchTypeId; + private const int UnknownSearchTypeId = (int)SearchTypeIds.UnknownSearchTypeId; + private const int PortalId0 = 0; + private const int PortalId12 = 12; + private const int IdeasModuleDefId = 201; + private const int BlogsoduleDefId = 202; + private const int AnswersModuleDefId = 203; + private const int HtmlModuleDefId = 20; + private const int HtmlModuleId = 25; + private const int IdeasModuleId = 301; + private const int BlogsModuleId = 302; + private const int AnswersModuleId = 303; + private const int RoleId731 = 731; + private const int RoleId532 = 532; + private const int RoleId0 = 0; + private const string Tag0 = "tag0"; + private const string Tag0WithSpace = "tag0 hello"; + private const string Tag1 = "tag1"; + private const string Tag2 = "tag2"; + private const string Tag3 = "tag3"; + private const string Tag4 = "tag4"; + private const string TagTootsie = "tootsie"; + private const string TagLatest = "latest"; + private const string TagOldest = "oldest"; + private const string TagIt = "IT"; + private const string TagNeutral = "Neutral"; + private const string ModuleSearchTypeName = "module"; + private const string OtherSearchTypeName = "other"; + private const string TabSearchTypeName = "tab"; + private const string DocumentSearchTypeName = "document"; + private const string UrlSearchTypeName = "url"; + private const string ModuleResultControllerClass = "DotNetNuke.Services.Search.Crawlers.ModuleResultController, DotNetNuke"; + private const string FakeResultControllerClass = "DotNetNuke.Tests.Core.Controllers.Search.FakeResultController, DotNetNuke.Tests.Core"; + private const string NoPermissionFakeResultControllerClass = "DotNetNuke.Tests.Core.Controllers.Search.NoPermissionFakeResultController, DotNetNuke.Tests.Core"; + private const string CultureEnUs = "en-US"; + private const string CultureEnCa = "en-CA"; + private const string CultureItIt = "it-IT"; + private const string CultureEsEs = "es-ES"; + private const int LanguageIdEnUs = 1; + private const int LanguageIdEnFr = 2; + private const int LanguageIdItIt = 3; + private const int LanguageIdEsEs = 4; + private const int StandardAuthorId = 55; + private const int StandardRoleId = 66; + private const string StandardAuthorDisplayName = "Standard User"; + private const int StandardTabId = 99; + private const string StandardPermission = "!Translator (en-US);![4];[5];[6];Administrators;ContentEditorRole;"; + private const string StandardQueryString = "cid=1"; + private const string NumericKey1 = "numerickey1"; + private const string NumericKey2 = "numerickey2"; + private const int NumericValue1 = 77777; + private const int NumericValue2 = 55555; + private const int NumericValue50 = 50; + private const int NumericValue100 = 100; + private const int NumericValue200 = 200; + private const int NumericValue500 = 500; + private const int NumericValue1000 = 1000; + private const string KeyWord1Name = "keyword1"; + private const string KeyWord1Value = "value1"; + private const string KeyWord2Name = "keyword2"; + private const string KeyWord2Value = "value2"; + private const string KeyWord3Value = "value3"; + private const string KeyWord4Value = "value4"; + private const string KeyWord5Value = "value5"; + private const string Line1 = "The quick brown fox jumps over the lazy dog"; + private const string Line2 = "The quick gold fox jumped over the lazy black dog"; + private const string Line3 = "the quick fox jumps over the black dog - Italian"; + private const string Line4 = "the red fox jumped over the lazy dark gray dog"; + private const string Line5 = "the quick fox jumps over the white dog - los de el Espana"; + + private const int CustomBoost = 80; + + private const string SearchIndexFolder = @"App_Data\SearchTests"; + private const int DefaultSearchRetryTimes = 5; + private readonly double readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; + private Mock mockHostController; + private Mock mockCachingProvider; + private Mock mockDataProvider; + private Mock mockLocaleController; + private Mock mockSearchHelper; + private Mock mockUserController; + + private SearchControllerImpl searchController; + private IInternalSearchController internalSearchController; + private LuceneControllerImpl luceneController; + + public enum SearchTypeIds + { + ModuleSearchTypeId = 1, + TabSearchTypeId, + DocumentSearchTypeId, + UrlSearchTypeId, + OtherSearchTypeId, + UnknownSearchTypeId, + } + + [SetUp] + public void SetUp() + { + ComponentFactory.Container = new SimpleContainer(); + MockComponentProvider.ResetContainer(); + + this.mockDataProvider = MockComponentProvider.CreateDataProvider(); + this.mockLocaleController = MockComponentProvider.CreateLocaleController(); + this.mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); + + this.mockUserController = new Mock(); + this.mockHostController = new Mock(); + this.mockSearchHelper = new Mock(); + + this.SetupDataProvider(); + this.SetupHostController(); + this.SetupSearchHelper(); + this.SetupLocaleController(); + + this.mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())).Returns((int portalId, int userId) => this.GetUserByIdCallback(portalId, userId)); + UserController.SetTestableInstance(this.mockUserController.Object); + var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - ComponentFactory.Container = new SimpleContainer(); - MockComponentProvider.ResetContainer(); - - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._mockDataProvider = MockComponentProvider.CreateDataProvider(); - this._mockLocaleController = MockComponentProvider.CreateLocaleController(); - this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); - - this._mockUserController = new Mock(); - this._mockHostController = new Mock(); - this._mockSearchHelper = new Mock(); - - this.SetupDataProvider(); - this.SetupHostController(); - this.SetupSearchHelper(); - this.SetupLocaleController(); - - this._mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())).Returns((int portalId, int userId) => this.GetUserByIdCallback(portalId, userId)); - UserController.SetTestableInstance(this._mockUserController.Object); - - this.CreateNewLuceneControllerInstance(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - this._luceneController.Dispose(); - this.DeleteIndexFolder(); - InternalSearchController.ClearInstance(); - UserController.ClearInstance(); - SearchHelper.ClearInstance(); - LuceneController.ClearInstance(); - this._luceneController = null; - Globals.DependencyProvider = null; - } - - [Test] - public void SearchController_Search_Throws_On_Null_Query() - { - // Arrange - - // Act, Assert - Assert.Throws(() => this._searchController.SiteSearch(null)); - } - - [Test] - public void SearchController_Search_Throws_On_Empty_TypeId_Collection() - { - // Arrange - - // Act, Assert - Assert.Throws(() => this._searchController.SiteSearch(new SearchQuery { KeyWords = "word" })); - } - - [Test] - public void SearchController_AddSearchDcoumet_Regex_Does_Not_Sleep_On_Bad_Text_During_Alt_Text_Parsing() - { - // Arrange - var document = new SearchDocument { UniqueKey = Guid.NewGuid().ToString(), Title = "< ExecuteWithTimeout( - () => - { - this._internalSearchController.AddSearchDocument(document); - return false; - }, TimeSpan.FromSeconds(1))); - } - - [Test] - public void SearchController_Added_Item_IsRetrieved() - { - // Arrange - var doc = new SearchDocument { UniqueKey = "key01", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - - // Act - this._internalSearchController.AddSearchDocument(doc); - - var result = this.SearchForKeyword("hello"); - - // Assert - Assert.AreEqual(1, result.Results.Count); - Assert.AreEqual(result.Results[0].UniqueKey, doc.UniqueKey); - Assert.AreEqual(result.Results[0].Title, doc.Title); - } - - [Test] - public void SearchController_EnsureIndexIsAppended_When_Index_Is_NotDeleted_InBetween() - { - // Arrange - string[] docs = - { - Line1, - Line2, - }; - - // Act - - // Add first document - var doc1 = new SearchDocument { Title = docs[0], UniqueKey = Guid.NewGuid().ToString(), SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - this._internalSearchController.AddSearchDocument(doc1); - - // first luceneQuery - var query1 = new SearchQuery { KeyWords = "fox", SearchTypeIds = new List { OtherSearchTypeId } }; - var search1 = this._searchController.SiteSearch(query1); - - // Assert - Assert.AreEqual(1, search1.Results.Count); - - // Add second document - var doc2 = new SearchDocument { Title = docs[1], UniqueKey = Guid.NewGuid().ToString(), SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - this._internalSearchController.AddSearchDocument(doc2); - this.CreateNewLuceneControllerInstance(); // to force a new reader for the next assertion - - // second luceneQuery - var query2 = new SearchQuery { KeyWords = "fox", SearchTypeIds = new List { OtherSearchTypeId } }; - var search2 = this._searchController.SiteSearch(query2); - - // Assert - Assert.AreEqual(2, search2.Results.Count); - } - - [Test] - public void SearchController_Getsearch_TwoTermsSearch() - { - // Arrange - string[] docs = - { - Line1, - Line2, - Line3, - Line4, - Line5, - }; - - this.AddLinesAsSearchDocs(docs); - - // Act - var search = this.SearchForKeyword("fox jumps"); - - // Assert - Assert.AreEqual(docs.Length, search.Results.Count); - - // Assert.AreEqual("brown fox jumps over the lazy dog ", search.Results[0].Snippet); - // Assert.AreEqual("quick fox jumps over the black dog ", search.Results[1].Snippet); - } - - [Test] - public void SearchController_GetResult_TwoTermsSearch() - { - // Arrange - string[] docs = - { - Line1, - Line2, - Line3, - Line4, - Line5, - }; - - this.AddLinesAsSearchDocs(docs); - - // Act - var search = this.SearchForKeyword("fox jumps"); - - // Assert - Assert.AreEqual(docs.Length, search.Results.Count); - - // Assert.AreEqual("brown fox jumps over the lazy dog ", search.Results[0].Snippet); - // Assert.AreEqual("quick fox jumps over the black dog ", search.Results[1].Snippet); - } - - [Test] - public void SearchController_GetResult_PortalIdSearch() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, PortalIds = new List { PortalId0 } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_SearchTypeIdSearch() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - } - - [Test] - public void SearchController_SearchFindsAnalyzedVeryLongWords() - { - // Arrange - // const string fieldName = Constants.ContentTag; - const string veryLongWord = // 107 characters - "NowIsTheTimeForAllGoodMenToComeToTheAidOfTheirCountryalsoIsTheTimeForAllGoodMenToComeToTheAidOfTheirCountry"; - - var doc = new SearchDocument - { - Title = veryLongWord, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = ModuleSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - ModuleId = 1, - ModuleDefId = 1, - }; - this._internalSearchController.AddSearchDocument(doc); - - // Act - var query = new SearchQuery { KeyWords = veryLongWord, SearchTypeIds = new List { ModuleSearchTypeId } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual("" + veryLongWord + "", this.StipEllipses(search.Results[0].Snippet).Trim()); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsNoResultsWhenHavingNoPermission() - { - // Arrange - this.AddStandardSearchDocs(DocumentSearchTypeId); - - // Act - var result = this.SearchForKeyword("fox", DocumentSearchTypeId); - - // Assert - // by default AuthorUserId = 0 which have no permission, so this passes - Assert.AreEqual(0, result.Results.Count); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1A() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 1, - PageSize = 4, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(query.PageSize, result.Results.Count); - Assert.AreEqual(new[] { 6, 7, 8, 9 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1B() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 1, - PageSize = 6, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(query.PageSize, result.Results.Count); - Assert.AreEqual(new[] { 6, 7, 8, 9, 16, 17 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1C() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 1, - PageSize = 8, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(query.PageSize, result.Results.Count); - Assert.AreEqual(new[] { 6, 7, 8, 9, 16, 17, 18, 19 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1D() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; // user should have access to some documnets here - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 1, - PageSize = 100, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(4 * 3, result.TotalHits); - Assert.AreEqual(4 * 3, result.Results.Count); - Assert.AreEqual(new[] { 6, 7, 8, 9, 16, 17, 18, 19, 26, 27, 28, 29 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1E() - { - // Arrange - const int maxDocs = 30; - const int stype = TabSearchTypeId; // user should have access to all documnets here - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 1, - PageSize = 10, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).Skip(1).ToArray(); - - // Assert - Assert.AreEqual(maxDocs, result.TotalHits); - Assert.AreEqual(query.PageSize, result.Results.Count); - Assert.AreEqual(Enumerable.Range(1, 9).ToArray(), ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1F() - { - // Arrange - const int maxDocs = 100; - const int stype = TabSearchTypeId; // user should have access to all documnets here - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 10, - PageSize = 10, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs, result.TotalHits); - Assert.AreEqual(query.PageSize, result.Results.Count); - Assert.AreEqual(Enumerable.Range(90, 10).ToArray(), ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage2A() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 2, - PageSize = 5, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(5, result.Results.Count); - Assert.AreEqual(new[] { 17, 18, 19, 26, 27 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage2B() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 2, - PageSize = 6, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(6, result.Results.Count); - Assert.AreEqual(new[] { 18, 19, 26, 27, 28, 29 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage2C() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var query = new SearchQuery - { - PageIndex = 2, - PageSize = 8, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(query); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(4, result.Results.Count); - Assert.AreEqual(new[] { 26, 27, 28, 29 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage3A() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var queryPg3 = new SearchQuery - { - PageIndex = 3, - PageSize = 4, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(queryPg3); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(queryPg3.PageSize, result.Results.Count); - Assert.AreEqual(new[] { 26, 27, 28, 29 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage3B() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var queryPg3 = new SearchQuery - { - PageIndex = 3, - PageSize = 5, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(queryPg3); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(2, result.Results.Count); - Assert.AreEqual(new[] { 28, 29 }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage3C() - { - // Arrange - const int maxDocs = 30; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var queryPg3 = new SearchQuery - { - PageIndex = 3, - PageSize = 8, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(queryPg3); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - 18, result.TotalHits); - Assert.AreEqual(0, result.Results.Count); - Assert.AreEqual(new int[] { }, ids); - } - - [Test] - public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage5() - { - // Arrange - const int maxDocs = 100; - const int stype = DocumentSearchTypeId; - this.SetupSecurityTrimmingDocs(maxDocs, stype); - - // Act - var queryPg3 = new SearchQuery - { - PageIndex = 5, - PageSize = 8, - KeyWords = "fox", - SearchTypeIds = new[] { stype }, - }; - - var result = this._searchController.SiteSearch(queryPg3); - var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); - - // Assert - Assert.AreEqual(maxDocs - (10 * 6), result.TotalHits); - Assert.AreEqual(queryPg3.PageSize, result.Results.Count); - Assert.AreEqual(new int[] { 86, 87, 88, 89, 96, 97, 98, 99 }, ids); - } - - [Test] - public void SearchController_GetResult_Returns_Correct_SuppliedData_When_Optionals_Are_Supplied() - { - // Arrange - var modifiedDateTime = DateTime.UtcNow; - var numericKeys = new Dictionary() { { NumericKey1, NumericValue1 }, { NumericKey2, NumericValue2 } }; - var keywords = new Dictionary() { { KeyWord1Name, KeyWord1Value }, { KeyWord2Name, KeyWord2Value } }; - var tags = new List { Tag1, Tag2 }; - var doc = new SearchDocument - { - Title = "Title", - UniqueKey = "key", - SearchTypeId = ModuleSearchTypeId, - ModifiedTimeUtc = modifiedDateTime, - PortalId = PortalId12, - TabId = StandardTabId, - ModuleDefId = HtmlModuleDefId, - ModuleId = HtmlModuleId, - Description = "Description", - Body = "Body", - AuthorUserId = StandardAuthorId, - RoleId = StandardRoleId, - Permissions = StandardPermission, - QueryString = StandardQueryString, - Tags = tags, - NumericKeys = numericKeys, - Keywords = keywords, - }; - this._internalSearchController.AddSearchDocument(doc); - - // run luceneQuery on common keyword between both the docs - var search = this.SearchForKeywordInModule("Title"); - - // Assert - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(PortalId12, search.Results[0].PortalId); - Assert.AreEqual(StandardTabId, search.Results[0].TabId); - Assert.AreEqual(HtmlModuleDefId, search.Results[0].ModuleDefId); - Assert.AreEqual(HtmlModuleId, search.Results[0].ModuleId); - Assert.AreEqual(ModuleSearchTypeId, search.Results[0].SearchTypeId); - Assert.AreEqual("Description", search.Results[0].Description); - Assert.AreEqual("Body", search.Results[0].Body); - Assert.AreEqual(StandardAuthorId, search.Results[0].AuthorUserId); - Assert.AreEqual(StandardRoleId, search.Results[0].RoleId); - Assert.AreEqual(modifiedDateTime.ToString(Constants.DateTimeFormat), search.Results[0].ModifiedTimeUtc.ToString(Constants.DateTimeFormat)); - Assert.AreEqual(StandardPermission, search.Results[0].Permissions); - Assert.AreEqual(StandardQueryString, search.Results[0].QueryString); - Assert.AreEqual(StandardAuthorDisplayName, search.Results[0].AuthorName); - Assert.AreEqual(tags.Count, search.Results[0].Tags.Count()); - Assert.AreEqual(tags[0], search.Results[0].Tags.ElementAt(0)); - Assert.AreEqual(tags[1], search.Results[0].Tags.ElementAt(1)); - Assert.AreEqual(numericKeys.Count, search.Results[0].NumericKeys.Count); - Assert.AreEqual(numericKeys[NumericKey1], search.Results[0].NumericKeys[NumericKey1]); - Assert.AreEqual(numericKeys[NumericKey2], search.Results[0].NumericKeys[NumericKey2]); - Assert.AreEqual(keywords.Count, search.Results[0].Keywords.Count); - Assert.AreEqual(keywords[KeyWord1Name], search.Results[0].Keywords[KeyWord1Name]); - Assert.AreEqual(keywords[KeyWord2Name], search.Results[0].Keywords[KeyWord2Name]); - } - - [Test] - public void SearchController_GetResult_Returns_EmptyData_When_Optionals_Are_Not_Supplied() - { - // Arrange - var modifiedDateTime = DateTime.UtcNow; - var doc = new SearchDocument - { - PortalId = PortalId0, - Title = "Title", - UniqueKey = "key", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = modifiedDateTime, - }; - this._internalSearchController.AddSearchDocument(doc); - - var search = this.SearchForKeyword("Title"); - - // Assert - - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(PortalId0, search.Results[0].PortalId); - Assert.AreEqual(0, search.Results[0].TabId); - Assert.AreEqual(0, search.Results[0].ModuleDefId); - Assert.AreEqual(0, search.Results[0].ModuleId); - Assert.AreEqual(OtherSearchTypeId, search.Results[0].SearchTypeId); - Assert.AreEqual(null, search.Results[0].Description); - Assert.AreEqual(null, search.Results[0].Body); - Assert.AreEqual(0, search.Results[0].AuthorUserId); - Assert.AreEqual(-1, search.Results[0].RoleId); - Assert.AreEqual(modifiedDateTime.ToString(Constants.DateTimeFormat), search.Results[0].ModifiedTimeUtc.ToString(Constants.DateTimeFormat)); - Assert.AreEqual(null, search.Results[0].Permissions); - Assert.AreEqual(null, search.Results[0].QueryString); - Assert.AreEqual(null, search.Results[0].AuthorName); - Assert.AreEqual(0, search.Results[0].Tags.Count()); - Assert.AreEqual(0, search.Results[0].NumericKeys.Count); - Assert.AreEqual(0, search.Results[0].Keywords.Count); - } - - [Test] - public void SearchController_GetsHighlightedDesc() - { - // Arrange - string[] docs = - { - Line1, - Line2, - Line3, - Line4, - Line5, - }; - this.AddLinesAsSearchDocs(docs); - - // Act - var search = this.SearchForKeyword("fox"); - - // Assert - Assert.AreEqual(docs.Length, search.Results.Count); - Assert.IsTrue( - new[] - { - "brown fox jumps over the lazy dog", - "quick fox jumps over the black dog - Italian", - "gold fox jumped over the lazy black dog", - "e red fox jumped over the lazy dark gray dog", - "quick fox jumps over the white dog - los de el Espana", - }.SequenceEqual(search.Results.Select(r => this.StipEllipses(r.Snippet))), - "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Snippet))); - } - - [Test] - public void SearchController_CorrectDocumentCultureIsUsedAtIndexing() - { - // Arrange - // assign a culture that is different than the current one - var isNonEnglishEnv = Thread.CurrentThread.CurrentCulture.Name != CultureEsEs; - string cultureCode, title, searchWord; - - // Act - if (isNonEnglishEnv) - { - cultureCode = CultureEsEs; - searchWord = "zorro"; - title = "los rápidos saltos de zorro sobre el perro negro"; - } - else - { - cultureCode = CultureEnUs; - searchWord = "fox"; - title = Line3; - } - - this._internalSearchController.AddSearchDocument( - new SearchDocument - { - Title = title, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - CultureCode = cultureCode, - }); - this._internalSearchController.Commit(); - - var searches = this.SearchForKeyword(searchWord); - - // Assert - Assert.AreEqual(1, searches.TotalHits); - Assert.AreEqual(cultureCode, searches.Results[0].CultureCode); - } - - [Test] - public void SearchController_GetResult_TimeRangeSearch_Ignores_When_Only_BeginDate_Specified() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, BeginModifiedTimeUtc = DateTime.Now }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_TimeRangeSearch_Resturns_Scoped_Results_When_BeginDate_Is_After_End_Date() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - BeginModifiedTimeUtc = DateTime.Now, - EndModifiedTimeUtc = DateTime.Now.AddSeconds(-1), - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_TimeRangeSearch_Resturns_Scoped_Results_When_Both_Dates_Specified() - { - // Arrange - var added = this.AddStandardSearchDocs(); - var stypeIds = new List { ModuleSearchTypeId }; - var utcNow = DateTime.UtcNow.AddDays(1); - const SortFields sfield = SortFields.LastModified; - - // Act and Assert - just a bit later - var query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddSeconds(1), EndModifiedTimeUtc = utcNow.AddDays(1) }; - var search = this._searchController.SiteSearch(query); - Assert.AreEqual(0, search.Results.Count); - - // Act and Assert - 10 day - query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-10), EndModifiedTimeUtc = utcNow.AddDays(1) }; - search = this._searchController.SiteSearch(query); - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(Line5, search.Results[0].Title); - - // Act and Assert - 1 year or so - query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-368), EndModifiedTimeUtc = utcNow.AddDays(1) }; - search = this._searchController.SiteSearch(query); - Assert.AreEqual(2, search.Results.Count); - Assert.AreEqual(Line5, search.Results[0].Title); - Assert.AreEqual(Line4, search.Results[1].Title); - - // Act and Assert - 2 years or so - query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-800), EndModifiedTimeUtc = utcNow.AddDays(1) }; - search = this._searchController.SiteSearch(query); - Assert.AreEqual(3, search.Results.Count); - Assert.AreEqual(Line5, search.Results[0].Title); - Assert.AreEqual(Line4, search.Results[1].Title); - Assert.AreEqual(Line3, search.Results[2].Title); - - // Act and Assert - 3 years or so - query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-1200), EndModifiedTimeUtc = utcNow.AddDays(1) }; - search = this._searchController.SiteSearch(query); - Assert.AreEqual(4, search.Results.Count); - Assert.AreEqual(Line5, search.Results[0].Title); - Assert.AreEqual(Line4, search.Results[1].Title); - Assert.AreEqual(Line3, search.Results[2].Title); - Assert.AreEqual(Line2, search.Results[3].Title); - - // Act and Assert - 2 to 3 years or so - query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-1200), EndModifiedTimeUtc = utcNow.AddDays(-800) }; - search = this._searchController.SiteSearch(query); - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(Line2, search.Results[0].Title); - } - - [Test] - public void SearchController_GetResult_TagSearch_Single_Tag_Returns_Single_Result() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag0 } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_TagSearch_Single_Tag_With_Space_Returns_Single_Result() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag0WithSpace } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_TagSearch_Lowercase_Search_Returns_PropercaseTag_Single_Result() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { TagNeutral.ToLowerInvariant() } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_TagSearch_Single_Tag_Returns_Two_Results() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag1 } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(2, search.Results.Count); - Assert.AreEqual(Tag0, search.Results[0].Tags.ElementAt(0)); - Assert.AreEqual(Tag1, search.Results[0].Tags.ElementAt(1)); - Assert.AreEqual(Tag1, search.Results[1].Tags.ElementAt(0)); - Assert.AreEqual(Tag2, search.Results[1].Tags.ElementAt(1)); - } - - [Test] - public void SearchController_GetResult_TagSearch_Two_Tags_Returns_Nothing() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag0, Tag4 } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(0, search.Results.Count); - } - - [Test] - public void SearchController_GetResult_TagSearch_Two_Tags_Returns_Single_Results() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag1, Tag2 } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(Tag1, search.Results[0].Tags.ElementAt(0)); - Assert.AreEqual(Tag2, search.Results[0].Tags.ElementAt(1)); - } - - [Test] - public void SearchController_GetResult_TagSearch_With_Vowel_Tags_Returns_Data() - { - // Arrange - const string keyword = "awesome"; - var doc1 = new SearchDocument { UniqueKey = "key01", Title = keyword, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Tags = new List { TagTootsie } }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { OtherSearchTypeId }, Tags = new List { TagTootsie } }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SearchController_GetResult_Throws_When_CustomNumericField_Is_Specified_And_CustomSortField_Is_Not() - { - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.CustomNumericField, - }; - - this._searchController.SiteSearch(query); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SearchController_GetResult_Throws_When_CustomStringField_Is_Specified_And_CustomSortField_Is_Not() - { - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.CustomStringField, - }; - - this._searchController.SiteSearch(query); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SearchController_GetResult_Throws_When_NumericKey_Is_Specified_And_CustomSortField_Is_Not() - { - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.NumericKey, - }; - - this._searchController.SiteSearch(query); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SearchController_GetResult_Throws_When_Keyword_Is_Specified_And_CustomSortField_Is_Not() - { - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Keyword, - }; - - this._searchController.SiteSearch(query); - } - - [Test] - public void SearchController_GetResult_Sorty_By_Date_Returns_Latest_Docs_First() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.LastModified, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); - - Assert.AreEqual(Tag3, search.Results[1].Tags.ElementAt(0)); - Assert.AreEqual(Tag4, search.Results[1].Tags.ElementAt(1)); - Assert.AreEqual(TagLatest, search.Results[1].Tags.ElementAt(2)); - - Assert.AreEqual(Tag2, search.Results[0].Tags.ElementAt(0)); - Assert.AreEqual(Tag3, search.Results[0].Tags.ElementAt(1)); - Assert.AreEqual(TagIt.ToLowerInvariant(), search.Results[0].Tags.ElementAt(2)); - } - - [Test] - public void SearchController_GetResult_Sorty_By_Date_Ascending_Returns_Earliest_Docs_First() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.LastModified, - SortDirection = SortDirections.Ascending, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.Greater(search.Results[1].DisplayModifiedTime, search.Results[0].DisplayModifiedTime); - Assert.Greater(search.Results[2].DisplayModifiedTime, search.Results[1].DisplayModifiedTime); - Assert.Greater(search.Results[3].DisplayModifiedTime, search.Results[2].DisplayModifiedTime); - - Assert.AreEqual(Tag0, search.Results[0].Tags.ElementAt(0)); - Assert.AreEqual(Tag1, search.Results[0].Tags.ElementAt(1)); - Assert.AreEqual(TagOldest, search.Results[0].Tags.ElementAt(2)); - } - - [Test] - public void SearchController_GetResult_Sorty_By_NumericKeys_Ascending_Returns_Smaller_Numers_First() - { - var added = this.AddDocumentsWithNumericKeys(); - - // Act - var query = new SearchQuery - { - KeyWords = "Title", - SearchTypeIds = new List { OtherSearchTypeId }, - SortField = SortFields.NumericKey, - SortDirection = SortDirections.Ascending, - CustomSortField = NumericKey1, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.Greater(search.Results[1].NumericKeys[NumericKey1], search.Results[0].NumericKeys[NumericKey1]); - Assert.Greater(search.Results[2].NumericKeys[NumericKey1], search.Results[1].NumericKeys[NumericKey1]); - } - - [Test] - public void SearchController_GetResult_Sorty_By_NumericKeys_Descending_Returns_Bigger_Numbers_First() - { - var added = this.AddDocumentsWithNumericKeys(); - - // Act - var query = new SearchQuery - { - KeyWords = "Title", - SearchTypeIds = new List { OtherSearchTypeId }, - SortField = SortFields.NumericKey, - SortDirection = SortDirections.Descending, - CustomSortField = NumericKey1, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.Greater(search.Results[0].NumericKeys[NumericKey1], search.Results[1].NumericKeys[NumericKey1]); - Assert.Greater(search.Results[1].NumericKeys[NumericKey1], search.Results[2].NumericKeys[NumericKey1]); - } - - [Test] - public void SearchController_GetResult_Sorty_By_Title_Ascending_Returns_Alphabetic_Ascending() - { - var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; - - var added = this.AddDocuments(titles, "animal"); - - // Act - var query = new SearchQuery - { - KeyWords = "animal", - SearchTypeIds = new List { OtherSearchTypeId }, - SortField = SortFields.Title, - SortDirection = SortDirections.Ascending, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - - var count = 0; - foreach (var title in titles.OrderBy(s => s)) - { - Assert.AreEqual(title, search.Results[count++].Title); - } - } - - [Test] - public void SearchController_GetResult_Sorty_By_Title_Descending_Returns_Alphabetic_Descending() - { - var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; - - var added = this.AddDocuments(titles, "animal"); - - // Act - var query = new SearchQuery - { - KeyWords = "animal", - SearchTypeIds = new List { OtherSearchTypeId }, - SortField = SortFields.Title, - SortDirection = SortDirections.Descending, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - - var count = 0; - foreach (var title in titles.OrderByDescending(s => s)) - { - Assert.AreEqual(title, search.Results[count++].Title); - } - } - - [Test] - public void SearchController_GetResult_Sorty_By_Keyword_Ascending_Returns_Alphabetic_Ascending() - { - var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; - - var added = this.AddDocumentsWithKeywords(titles, "animal"); - - // Act - var query = new SearchQuery - { - KeyWords = "animal", - SearchTypeIds = new List { OtherSearchTypeId }, - SortField = SortFields.Keyword, - SortDirection = SortDirections.Ascending, - CustomSortField = KeyWord1Name, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - - var count = 0; - foreach (var title in titles.OrderBy(s => s)) - { - Assert.AreEqual(title, search.Results[count++].Keywords[KeyWord1Name]); - } - } - - [Test] - public void SearchController_GetResult_Sorty_By_Keyword_Descending_Returns_Alphabetic_Descending() - { - var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; - - var added = this.AddDocumentsWithKeywords(titles, "animal"); - - // Act - var query = new SearchQuery - { - KeyWords = "animal", - SearchTypeIds = new List { OtherSearchTypeId }, - SortField = SortFields.Keyword, - SortDirection = SortDirections.Descending, - CustomSortField = KeyWord1Name, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - - var count = 0; - foreach (var title in titles.OrderByDescending(s => s)) - { - Assert.AreEqual(title, search.Results[count++].Keywords[KeyWord1Name]); - } - } - - [Test] - public void SearchController_GetResult_Sort_By_Unknown_StringField_In_Descending_Order_Does_Not_Throw() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.CustomStringField, - SortDirection = SortDirections.Descending, - CustomSortField = "unknown", - }; - this._searchController.SiteSearch(query); - } - - [Test] - public void SearchController_GetResult_Sort_By_Unknown_StringField_In_Ascending_Order_Does_Not_Throw() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.CustomStringField, - SortDirection = SortDirections.Ascending, - CustomSortField = "unknown", - }; - this._searchController.SiteSearch(query); - } - - [Test] - public void SearchController_GetResult_Sort_By_Unknown_NumericField_In_Descending_Order_Does_Not_Throw() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.CustomNumericField, - SortDirection = SortDirections.Descending, - CustomSortField = "unknown", - }; - this._searchController.SiteSearch(query); - } - - [Test] - public void SearchController_GetResult_Sort_By_Unknown_NumericField_In_Ascending_Order_Does_Not_Throw() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.CustomNumericField, - SortDirection = SortDirections.Ascending, - CustomSortField = "unknown", - }; - this._searchController.SiteSearch(query); - } - - [Test] - public void SearchController_GetResult_Sorty_By_Relevance_Returns_TopHit_Docs_First() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Relevance, - KeyWords = "brown OR fox", - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.AreEqual(true, search.Results[0].Snippet.Contains("brown") && search.Results[0].Snippet.Contains("dog")); - } - - [Test] - public void SearchController_GetResult_Sorty_By_RelevanceAndTitleKeyword_Returns_TopHit_Docs_First() - { - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns(CustomBoost); - - // Arrange - var added = this.AddSearchDocsForCustomBoost(); - this.CreateNewLuceneControllerInstance(true); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Relevance, - KeyWords = "Hello", - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.AreEqual(true, search.Results[0].Body.Contains("Hello1")); - } - - [Test] - public void SearchController_GetResult_Sorty_By_RelevanceAndSubjectKeyword_Returns_TopHit_Docs_First() - { - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns(CustomBoost); - this.CreateNewLuceneControllerInstance(true); - - // Arrange - var added = this.AddSearchDocsForCustomBoost(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Relevance, - KeyWords = "Hello", - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.AreEqual(true, search.Results[0].Body.Contains("Hello2")); - } - - [Test] - public void SearchController_GetResult_Sorty_By_RelevanceAndCommentKeyword_Returns_TopHit_Docs_First() - { - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())).Returns(CustomBoost); - this.CreateNewLuceneControllerInstance(true); - - // Arrange - var added = this.AddSearchDocsForCustomBoost(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Relevance, - KeyWords = "Hello", - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.AreEqual(true, search.Results[0].Body.Contains("Hello3")); - } - - [Test] - public void SearchController_GetResult_Sorty_By_RelevanceAndAuthorKeyword_Returns_TopHit_Docs_First() - { - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(CustomBoost); - this.CreateNewLuceneControllerInstance(true); - - // Arrange - var added = this.AddSearchDocsForCustomBoost(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Relevance, - KeyWords = "Hello", - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.AreEqual(true, search.Results[0].Body.Contains("Hello4")); - } - - [Test] - public void SearchController_GetResult_Sorty_By_Relevance_Ascending_Does_Not_Change_Sequence_Of_Results() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.Relevance, - SortDirection = SortDirections.Ascending, - KeyWords = "brown OR fox", - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(added, search.Results.Count); - Assert.AreEqual(true, search.Results[0].Snippet.Contains("brown") && search.Results[0].Snippet.Contains("dog")); - } - - [Test] - public void SearchController_GetResult_By_Locale_Returns_Specific_And_Neutral_Locales() - { - // Arrange - this.AddStandardSearchDocs(); - - // Act - var query = new SearchQuery - { - SearchTypeIds = new List { ModuleSearchTypeId }, - SortField = SortFields.LastModified, - CultureCode = CultureItIt, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(2, search.Results.Count, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); - Assert.AreEqual(Line3, search.Results[0].Title); - Assert.AreEqual(Line1, search.Results[1].Title); - } - - [Test] - public void SearchController_EnsureOldDocument_Deleted_Upon_Second_Index_Content_With_Same_Key() - { - // Arrange - string[] docs = - { - Line1, - Line2, - }; - const string docKey = "key1"; - - // Act - - // Add first document - var doc1 = new SearchDocument { Title = docs[0], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - this._internalSearchController.AddSearchDocument(doc1); - - // Add second document with same key - var doc2 = new SearchDocument { Title = docs[1], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - this._internalSearchController.AddSearchDocument(doc2); - - // run luceneQuery on common keyword between both the docs - var search = this.SearchForKeyword("fox"); - - // Assert - there should just be one entry - first one must have been removed. - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(docs[1], search.Results[0].Title); - } - - [Test] - public void SearchController_Add_Does_Not_Throw_On_Empty_Url() - { - var doc = new SearchDocument - { - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = OtherSearchTypeId, - Title = " ", - ModifiedTimeUtc = DateTime.UtcNow, - QueryString = "?foo=bar", - }; - - Assert.DoesNotThrow(() => this._internalSearchController.AddSearchDocument(doc)); - } - - [Test] - public void SearchController_Add_Does_Not_Throw_On_Empty_Title() - { - var doc = new SearchDocument - { - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - }; - - Assert.DoesNotThrow(() => this._internalSearchController.AddSearchDocument(doc)); - } - - [Test] - public void SearchController_EnsureOldDocument_Deleted_Upon_Second_Index_When_IsActive_Is_False() - { - // Arrange - string[] docs = - { - Line1, - Line2, - }; - const string docKey = "key1"; - - // Act - - // Add first document - var doc1 = new SearchDocument { Title = docs[0], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - this._internalSearchController.AddSearchDocument(doc1); - - // Add second document with same key - var doc2 = new SearchDocument { Title = docs[1], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, IsActive = false }; - this._internalSearchController.AddSearchDocument(doc2); - - // run luceneQuery on common keyword between both the docs - var search = this.SearchForKeyword("fox"); - - // Assert - there should not be any record. - Assert.AreEqual(0, search.Results.Count); - } - - // Note: these tests needs to pass through the analyzer which is utilized - // in SearchControllerImpl but not LuceneControllerImpl. - [Test] - public void SearchController_SearchFindsAccentedAndNonAccentedWords() - { - // Arrange - string[] lines = - { - "zèbre or panthère", - "zebre without accent", - "panthere without accent", - }; - - this.AddLinesAsSearchDocs(lines); - - // Act - var searches1 = this.SearchForKeyword("zèbre"); - var searches2 = this.SearchForKeyword("zebre"); - - // Assert - Assert.AreEqual(2, searches1.TotalHits); - Assert.AreEqual("zèbre or panthère", this.StipEllipses(searches1.Results[0].Snippet).Trim()); - Assert.AreEqual("zebre without accent", this.StipEllipses(searches1.Results[1].Snippet).Trim()); - - Assert.AreEqual(2, searches2.TotalHits); - Assert.AreEqual("zèbre or panthère", this.StipEllipses(searches2.Results[0].Snippet).Trim()); - Assert.AreEqual("zebre without accent", this.StipEllipses(searches2.Results[1].Snippet).Trim()); - } - - [Test] - public void SearchController_PorterFilterTest() - { - // Arrange - string[] lines = - { - "field1_value", - "field2_value", - }; - - this.AddLinesAsSearchDocs(lines); - - // Act - var search1 = this.SearchForKeyword(lines[0]); - var search2 = this.SearchForKeyword("\"" + lines[1] + "\""); - - // Assert - Assert.AreEqual(1, search1.TotalHits); - Assert.AreEqual(1, search2.TotalHits); - - Assert.AreEqual("" + lines[0] + "", this.StipEllipses(search1.Results[0].Snippet).Trim()); - Assert.AreEqual("" + lines[1] + "", this.StipEllipses(search2.Results[0].Snippet).Trim()); - } - - [Test] - public void SearchController_SearchFindsStemmedWords() - { - // Arrange - string[] lines = - { - "I ride my bike to work", - "All team are riding their bikes", - "The boy rides his bike to school", - "This sentence is missing the bike ri... word", - }; - - this.AddLinesAsSearchDocs(lines); - - // Act - var search = this.SearchForKeyword("ride"); - - // Assert - Assert.AreEqual(3, search.TotalHits); - Assert.AreEqual("I ride my bike to work", this.StipEllipses(search.Results[0].Snippet)); - Assert.AreEqual("m are riding their bikes", this.StipEllipses(search.Results[1].Snippet)); - Assert.AreEqual("e boy rides his bike to school", this.StipEllipses(search.Results[2].Snippet)); - } - - [Test] - public void SearchController_Search_Synonym_Works() - { - // Arrange - var added = this.AddStandardSearchDocs(); - - // Act - var search = this.SearchForKeywordInModule("wolf"); - - // Assert - Assert.AreEqual(added, search.TotalHits); - - var snippets = search.Results.Select(result => this.StipEllipses(result.Snippet)).OrderBy(s => s).ToArray(); - Assert.AreEqual("brown fox jumps over the lazy dog", snippets[0]); - Assert.AreEqual("e red fox jumped over the lazy dark gray dog", snippets[1]); - Assert.AreEqual("gold fox jumped over the lazy black dog", snippets[2]); - Assert.AreEqual("quick fox jumps over the black dog - Italian", snippets[3]); - } - - [Test] - public void SearchController_Title_Ranked_Higher_Than_Body() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "Hello World" }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "cow is gone" }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "random text" }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("cow"); - - // Assert - Assert.AreEqual(result.TotalHits, 2); - Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); - Assert.AreEqual(doc2.UniqueKey, result.Results[1].UniqueKey); - } - - [Test] - public void SearchController_Title_Ranked_Higher_Than_Body_Regardless_Of_Document_Sequence() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "cow is gone" }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "random text" }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("cow"); - - // Assert - Assert.AreEqual(result.TotalHits, 2); - Assert.AreEqual(doc3.UniqueKey, result.Results[0].UniqueKey); - Assert.AreEqual(doc1.UniqueKey, result.Results[1].UniqueKey); - } - - [Test] - public void SearchController_Title_Ranked_Higher_Than_Tag() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "Hello World" }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Tags = new List { "cow", "hello", "world" } }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "random text" }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.Commit(); - var result = this.SearchForKeyword("cow"); - - // Assert - Assert.AreEqual(result.TotalHits, 2); - Console.WriteLine("first score: {0} {1}", result.Results[0].UniqueKey, result.Results[0].DisplayScore); - Console.WriteLine("second score: {0} {1}", result.Results[1].UniqueKey, result.Results[1].DisplayScore); - Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); - Assert.AreEqual(doc2.UniqueKey, result.Results[1].UniqueKey); - } - - [Test] - public void SearchController_RankingTest_With_Vowel() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "tootsie", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Tags = new List { "tootsie" } }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Keywords = new Dictionary() { { KeyWord1Name, "tootsie" } } }; - var doc4 = new SearchDocument { UniqueKey = "key04", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Description = "tootsie" }; - var doc5 = new SearchDocument { UniqueKey = "key05", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "hello tootsie" }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.AddSearchDocument(doc4); - this._internalSearchController.AddSearchDocument(doc5); - - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("tootsie"); - - // Assert - Assert.AreEqual(5, result.TotalHits); - foreach (var searchResult in result.Results) - { - Console.WriteLine("{0} score: {1}", searchResult.UniqueKey, searchResult.DisplayScore); - } - - Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); - Assert.AreEqual(doc2.UniqueKey, result.Results[1].UniqueKey); - Assert.AreEqual(doc3.UniqueKey, result.Results[2].UniqueKey); - Assert.AreEqual(doc4.UniqueKey, result.Results[3].UniqueKey); - } - - [Test] - public void SearchController_FileNameTest_With_WildCard() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "file.ext", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - - this._internalSearchController.Commit(); - - var result = this.SearchForKeywordWithWildCard("file"); - - // Assert - Assert.AreEqual(1, result.TotalHits); - Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); - } - - [Test] - public void SearchController_Full_FileNameTest_Without_WildCard() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "file.ext", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - - this._internalSearchController.Commit(); - - var result = this.SearchForKeywordWithWildCard("file.ext"); - - // Assert - Assert.AreEqual(1, result.TotalHits); - Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); - } - - [Test] - public void SearchController_Full_FileNameTest_With_WildCard() - { - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "file.ext", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("file.ext"); - - // Assert - Assert.AreEqual(1, result.TotalHits); - Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); - } - - [Test] - public void SearchController_Scope_By_FolderName() - { - // Arrange - this.AddFoldersAndFiles(); - - // Act - var result1 = this.SearchForKeyword("kw-folderName:Images/*"); - var result2 = this.SearchForKeyword("kw-folderName:Images/DNN/*"); - var result3 = this.SearchForKeywordWithWildCard("kw-folderName:Images/* AND spacer"); - - // Assert - Assert.AreEqual(5, result1.TotalHits); - Assert.AreEqual(2, result2.TotalHits); - Assert.AreEqual(1, result3.TotalHits); - } - - [Test] - public void SearchController_Scope_By_FolderName_With_Spaces() - { - // Arrange - this.AddFoldersAndFiles(); - - // Act - Space is replaced by < - var query1 = new SearchQuery { KeyWords = "kw-folderName:Images/*", SearchTypeIds = new[] { OtherSearchTypeId }, WildCardSearch = false }; - var query2 = new SearchQuery { KeyWords = "kw-folderName:my() { { NumericKey1, NumericValue50 } }, - SearchTypeIds = new List { OtherSearchTypeId }, - WildCardSearch = false, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(NumericValue50, search.Results[0].NumericKeys[NumericKey1]); - } - - [Test] - public void SearchController_GetResult_Works_With_CustomKeyword_Querirs() - { - this.AddDocumentsWithKeywords(); - - // Act - var query = new SearchQuery - { - CustomKeywords = new Dictionary() { { KeyWord1Name, KeyWord1Value } }, - SearchTypeIds = new List { OtherSearchTypeId }, - WildCardSearch = false, - }; - var search = this._searchController.SiteSearch(query); - - // Assert - Assert.AreEqual(1, search.Results.Count); - Assert.AreEqual(KeyWord1Value, search.Results[0].Keywords[KeyWord1Name]); - } - - [Test] - public void SearchController_EnableLeadingWildcard_Should_Not_Return_Results_When_Property_Is_False() - { - this._mockHostController.Setup(c => c.GetString("Search_AllowLeadingWildcard", It.IsAny())).Returns("N"); - - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("rld", OtherSearchTypeId, true, false); - - // Assert - Assert.AreEqual(0, result.TotalHits); - } - - [Test] - public void SearchController_EnableLeadingWildcard_Should_Return_Results_When_Property_Is_True() - { - this._mockHostController.Setup(c => c.GetString("Search_AllowLeadingWildcard", It.IsAny())).Returns("N"); - - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("rld", OtherSearchTypeId, true, true); - - // Assert - Assert.AreEqual(1, result.TotalHits); - Assert.AreEqual(doc2.UniqueKey, result.Results[0].UniqueKey); - } - - [Test] - public void SearchController_EnableLeadingWildcard_Should_Return_Results_When_Property_Is_False_But_Host_Setting_Is_True() - { - this._mockHostController.Setup(c => c.GetString("Search_AllowLeadingWildcard", It.IsAny())).Returns("Y"); - - // Arrange - var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; - - // Act - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.Commit(); - - var result = this.SearchForKeyword("rld", OtherSearchTypeId, true, false); - - // Assert - Assert.AreEqual(1, result.TotalHits); - Assert.AreEqual(doc2.UniqueKey, result.Results[0].UniqueKey); - } - - [Test] - public void SearchController_Search_StopWords_Works() - { - // Arrange - var added = this.AddStandardSearchDocs(); - this._internalSearchController.Commit(); - - // Act - var search = this.SearchForKeywordInModule("the"); - - // Assert - // the word "the" is ignored in all languages except es-ES - Assert.AreEqual(1, search.TotalHits, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); - - // Act - search = this.SearchForKeywordInModule("over"); - - // Assert - // we won't find "over" in neutral, en-US, and en-CA documents, but will find it in the es-ES and it-IT documents. - Assert.AreEqual(2, search.TotalHits, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); - - // Act - search = this.SearchForKeywordInModule("los"); - - // Assert - // we won't find "los" in the es-ES document. - Assert.AreEqual(0, search.TotalHits, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); - } - - /// - /// Executes function proc on a separate thread respecting the given timeout value. - /// - /// - /// The function to execute. - /// The timeout duration. - /// R. - /// From: http://stackoverflow.com/questions/9460661/implementing-regex-timeout-in-net-4. - private static R ExecuteWithTimeout(Func proc, TimeSpan timeout) - { - var r = default(R); // init default return value - Exception ex = null; // records inter-thread exception - - // define a thread to wrap 'proc' - var t = new Thread(() => - { - try - { - r = proc(); - } - catch (Exception e) - { - // this can get set to ThreadAbortException - ex = e; - - Console.WriteLine("Exception hit"); - } - }); - - t.Start(); // start running 'proc' thread wrapper - - // from docs: "The Start method does not return until the new thread has started running." - if (t.Join(timeout) == false) - { - t.Abort(); // die evil thread! - - // Abort raises the ThreadAbortException - int i = 0; - while ((t.Join(1) == false) && (i < 20)) - { - // 20 ms wait possible here - i++; - } - - if (i >= 20) - { - // we didn't abort, might want to log this or take some other action - // this can happen if you are doing something indefinitely hinky in a - // finally block (cause the finally be will executed before the Abort - // completes. - Console.WriteLine("Abort didn't work as expected"); - } - } - - if (ex != null) - { - throw ex; // oops - } - - return r; // ah! - } - - private void CreateNewLuceneControllerInstance(bool reCreate = false) - { - InternalSearchController.SetTestableInstance(new InternalSearchControllerImpl()); - this._internalSearchController = InternalSearchController.Instance; - this._searchController = new SearchControllerImpl(); - - if (!reCreate) - { - this.DeleteIndexFolder(); - - if (this._luceneController != null) - { - LuceneController.ClearInstance(); - this._luceneController.Dispose(); - } - - this._luceneController = new LuceneControllerImpl(); - LuceneController.SetTestableInstance(this._luceneController); - } - } - - private void SetupHostController() - { - this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); - this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this._readerStaleTimeSpan); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTitleBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTagBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchKeywordBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchDescriptionBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchAuthorBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); - HostController.RegisterInstance(this._mockHostController.Object); - } - - private void SetupLocaleController() - { - this._mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = -1, Code = string.Empty }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureEnCa)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); - this._mockLocaleController.Setup(l => l.GetLocale(CultureEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); - - this._mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnFr)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); - this._mockLocaleController.Setup(l => l.GetLocale(LanguageIdEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); - } - - private void SetupDataProvider() - { - // Standard DataProvider Path for Logging - this._mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - - DataTableReader searchTypes = null; - this._mockDataProvider.Setup(ds => ds.GetAllSearchTypes()) - .Callback(() => searchTypes = this.GetAllSearchTypes().CreateDataReader()) - .Returns(() => searchTypes); - - this._mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); - } - - private IDataReader GetPortalsCallBack(string culture) - { - return this.GetPortalCallBack(PortalId0, CultureEnUs); - } - - private IDataReader GetPortalCallBack(int portalId, string culture) - { - var table = new DataTable("Portal"); - - var cols = new[] - { - "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", - "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", "ProcessorUserId", - "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", - "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - const int homePage = 1; - table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, - "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, - "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", - null, homePage.ToString("D"), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); - - return table.CreateDataReader(); - } - - private void SetupSearchHelper() - { - this._mockSearchHelper.Setup(c => c.GetSearchMinMaxLength()).Returns(new Tuple(Constants.DefaultMinLen, Constants.DefaultMaxLen)); - this._mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.GetSynonymsCallBack); - this._mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns((string name) => new SearchType { SearchTypeId = 0, SearchTypeName = name }); - this._mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns(this.GetSearchTypeByNameCallback); - this._mockSearchHelper.Setup(x => x.GetSearchTypes()).Returns(this.GetSearchTypes()); - this._mockSearchHelper.Setup(x => x.GetSearchStopWords(It.IsAny(), It.IsAny())).Returns(new SearchStopWords()); - this._mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEsEs)).Returns( - new SearchStopWords - { - PortalId = 0, - CultureCode = CultureEsEs, - StopWords = "los,de,el", - }); - this._mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEnUs)).Returns( - new SearchStopWords - { - PortalId = 0, - CultureCode = CultureEnUs, - StopWords = "the,over", - }); - this._mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEnCa)).Returns( - new SearchStopWords - { - PortalId = 0, - CultureCode = CultureEnCa, - StopWords = "the,over", - }); - - this._mockSearchHelper.Setup(x => x.RephraseSearchText(It.IsAny(), It.IsAny(), It.IsAny())).Returns(new SearchHelperImpl().RephraseSearchText); - this._mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); - SearchHelper.SetTestableInstance(this._mockSearchHelper.Object); - } - - private SearchType GetSearchTypeByNameCallback(string searchTypeName) - { - var searchType = new SearchType { SearchTypeName = searchTypeName, SearchTypeId = 0 }; - switch (searchTypeName) - { - case ModuleSearchTypeName: - searchType.SearchTypeId = ModuleSearchTypeId; - break; - case TabSearchTypeName: - searchType.SearchTypeId = TabSearchTypeId; - break; - case OtherSearchTypeName: - searchType.SearchTypeId = OtherSearchTypeId; - break; - case DocumentSearchTypeName: - searchType.SearchTypeId = DocumentSearchTypeId; - break; - case UrlSearchTypeName: - searchType.SearchTypeId = UrlSearchTypeId; - break; - } - - return searchType; - } - - private IList GetSynonymsCallBack(int portalId, string cultureCode, string term) - { - var synonyms = new List(); - if (term == "fox") - { - synonyms.Add("wolf"); - } - - return synonyms; - } - - private UserInfo GetUserByIdCallback(int portalId, int userId) - { - if (portalId == PortalId12 && userId == StandardAuthorId) - { - return new UserInfo { UserID = userId, DisplayName = StandardAuthorDisplayName }; - } - - return null; - } - - private DataTable GetAllSearchTypes() - { - var dtSearchTypes = new DataTable("SearchTypes"); - var pkId = dtSearchTypes.Columns.Add("SearchTypeId", typeof(int)); - dtSearchTypes.Columns.Add("SearchTypeName", typeof(string)); - dtSearchTypes.Columns.Add("SearchResultClass", typeof(string)); - dtSearchTypes.PrimaryKey = new[] { pkId }; - - // Create default Crawler - dtSearchTypes.Rows.Add(ModuleSearchTypeId, ModuleSearchTypeName, FakeResultControllerClass); - dtSearchTypes.Rows.Add(TabSearchTypeId, TabSearchTypeName, FakeResultControllerClass); - dtSearchTypes.Rows.Add(OtherSearchTypeId, OtherSearchTypeName, FakeResultControllerClass); - dtSearchTypes.Rows.Add(DocumentSearchTypeId, DocumentSearchTypeName, NoPermissionFakeResultControllerClass); - dtSearchTypes.Rows.Add(UrlSearchTypeId, UrlSearchTypeName, FakeResultControllerClass); - - return dtSearchTypes; - } - - private IEnumerable GetSearchTypes() - { - var searchTypes = new List - { - new SearchType { SearchTypeId = ModuleSearchTypeId, SearchTypeName = ModuleSearchTypeName, SearchResultClass = FakeResultControllerClass }, - new SearchType { SearchTypeId = TabSearchTypeId, SearchTypeName = TabSearchTypeName, SearchResultClass = FakeResultControllerClass }, - new SearchType { SearchTypeId = OtherSearchTypeId, SearchTypeName = OtherSearchTypeName, SearchResultClass = FakeResultControllerClass }, - new SearchType { SearchTypeId = DocumentSearchTypeId, SearchTypeName = DocumentSearchTypeName, SearchResultClass = NoPermissionFakeResultControllerClass }, - new SearchType { SearchTypeId = UrlSearchTypeId, SearchTypeName = UrlSearchTypeName, SearchResultClass = FakeResultControllerClass }, - }; - - return searchTypes; - } - - private void DeleteIndexFolder() - { - try - { - if (Directory.Exists(SearchIndexFolder)) - { - Directory.Delete(SearchIndexFolder, true); - } - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - } - - /// - /// Returns few SearchDocs. - /// - private IEnumerable GetStandardSearchDocs(int searchTypeId = ModuleSearchTypeId) - { - var searchDocs = new List - { - new SearchDocument { PortalId = PortalId0, Tags = new List { Tag0, Tag1, TagOldest, Tag0WithSpace }, Title = Line1 }, - new SearchDocument { PortalId = PortalId0, Tags = new List { Tag1, Tag2, TagNeutral }, Title = Line2, CultureCode = CultureEnUs }, - new SearchDocument { PortalId = PortalId0, Tags = new List { Tag2, Tag3, TagIt }, Title = Line3, CultureCode = CultureItIt }, - new SearchDocument { PortalId = PortalId0, Tags = new List { Tag3, Tag4, TagLatest }, Title = Line4, CultureCode = CultureEnCa }, - new SearchDocument { PortalId = PortalId0, Tags = new List { Tag2, Tag3, TagIt }, Title = Line5, CultureCode = CultureEsEs }, - }; - - var now = DateTime.UtcNow.AddYears(-searchDocs.Count); - var i = 0; - - foreach (var searchDocument in searchDocs) - { - searchDocument.SearchTypeId = searchTypeId; - searchDocument.UniqueKey = Guid.NewGuid().ToString(); - searchDocument.ModuleId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleId : -1; - searchDocument.ModuleDefId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleDefId : -1; - searchDocument.ModifiedTimeUtc = now.AddYears(++i); // last added is the newest - } - - return searchDocs; - } - - private IEnumerable GetSearchDocsForCustomBoost(int searchTypeId = ModuleSearchTypeId) - { - var searchDocs = new List - { - new SearchDocument { PortalId = PortalId0, Title = Line1, Keywords = { { "title", "Hello" } }, Body = "Hello1 World" }, - new SearchDocument { PortalId = PortalId0, Title = Line2, Keywords = { { "subject", "Hello" } }, Body = "Hello2 World" }, - new SearchDocument { PortalId = PortalId0, Title = Line3, Keywords = { { "comments", "Hello" } }, Body = "Hello3 World" }, - new SearchDocument { PortalId = PortalId0, Title = Line4, Keywords = { { "authorname", "Hello" } }, Body = "Hello4 World" }, - }; - - var now = DateTime.UtcNow.AddYears(-searchDocs.Count); - var i = 0; - - foreach (var searchDocument in searchDocs) - { - searchDocument.SearchTypeId = searchTypeId; - searchDocument.UniqueKey = Guid.NewGuid().ToString(); - searchDocument.ModuleId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleId : -1; - searchDocument.ModuleDefId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleDefId : -1; - searchDocument.ModifiedTimeUtc = now.AddYears(++i); // last added is the newest - } - - return searchDocs; - } - - /// - /// Adds standarad SearchDocs in Lucene Index. - /// - /// Number of dcuments added. - private int AddStandardSearchDocs(int searchTypeId = ModuleSearchTypeId) - { - var docs = this.GetStandardSearchDocs(searchTypeId).ToArray(); - this._internalSearchController.AddSearchDocuments(docs); - return docs.Length; - } - - private int AddSearchDocsForCustomBoost(int searchTypeId = ModuleSearchTypeId) - { - var docs = this.GetSearchDocsForCustomBoost(searchTypeId).ToArray(); - this._internalSearchController.AddSearchDocuments(docs); - return docs.Length; - } - - private int AddDocumentsWithNumericKeys(int searchTypeId = OtherSearchTypeId) - { - var doc1 = new SearchDocument - { - Title = "Title", - UniqueKey = "key1", - Body = "hello", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - NumericKeys = new Dictionary() { { NumericKey1, NumericValue50 } }, - }; - var doc2 = new SearchDocument - { - Title = "Title", - UniqueKey = "key2", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - NumericKeys = new Dictionary() { { NumericKey1, NumericValue100 } }, - }; - var doc3 = new SearchDocument - { - Title = "Title", - UniqueKey = "key3", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - NumericKeys = new Dictionary() { { NumericKey1, NumericValue200 } }, - }; - var doc4 = new SearchDocument - { - Title = "Title", - UniqueKey = "key4", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - NumericKeys = new Dictionary() { { NumericKey1, NumericValue500 } }, - }; - var doc5 = new SearchDocument - { - Title = "Title", - UniqueKey = "key5", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - NumericKeys = new Dictionary() { { NumericKey1, NumericValue1000 } }, - }; - - var docs = new List() { doc1, doc2, doc3, doc4, doc5 }; - - this._internalSearchController.AddSearchDocuments(docs); - - return docs.Count; - } - - private int AddDocumentsWithKeywords(int searchTypeId = OtherSearchTypeId) - { - var doc1 = new SearchDocument - { - Title = "Title", - UniqueKey = "key1", - Body = "hello", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - Keywords = new Dictionary() { { KeyWord1Name, KeyWord1Value } }, - }; - var doc2 = new SearchDocument - { - Title = "Title", - UniqueKey = "key2", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - Keywords = new Dictionary() { { KeyWord1Name, KeyWord2Value } }, - }; - var doc3 = new SearchDocument - { - Title = "Title", - UniqueKey = "key3", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - Keywords = new Dictionary() { { KeyWord1Name, KeyWord3Value } }, - }; - var doc4 = new SearchDocument - { - Title = "Title", - UniqueKey = "key4", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - Keywords = new Dictionary() { { KeyWord1Name, KeyWord4Value } }, - }; - var doc5 = new SearchDocument - { - Title = "Title", - UniqueKey = "key5", - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - Keywords = new Dictionary() { { KeyWord1Name, KeyWord5Value } }, - }; - - var docs = new List() { doc1, doc2, doc3, doc4, doc5 }; - - this._internalSearchController.AddSearchDocuments(docs); - - return docs.Count; - } - - private int AddDocuments(IList titles, string body, int searchTypeId = OtherSearchTypeId) - { - var count = 0; - foreach (var doc in titles.Select(title => new SearchDocument - { - Title = title, - UniqueKey = Guid.NewGuid().ToString(), - Body = body, - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - })) - { - this._internalSearchController.AddSearchDocument(doc); - count++; - } - - return count; - } - - private int AddDocumentsWithKeywords(IEnumerable keywords, string title, int searchTypeId = OtherSearchTypeId) - { - var count = 0; - foreach (var doc in keywords.Select(keyword => new SearchDocument - { - Title = title, - UniqueKey = Guid.NewGuid().ToString(), - Keywords = new Dictionary() { { KeyWord1Name, keyword } }, - SearchTypeId = OtherSearchTypeId, - ModifiedTimeUtc = DateTime.UtcNow, - PortalId = PortalId12, - })) - { - this._internalSearchController.AddSearchDocument(doc); - count++; - } - - return count; - } - - private void AddLinesAsSearchDocs(IList lines, int searchTypeId = OtherSearchTypeId) - { - var now = DateTime.UtcNow - TimeSpan.FromSeconds(lines.Count()); - var i = 0; - - this._internalSearchController.AddSearchDocuments( - lines.Select(line => - new SearchDocument - { - Title = line, - UniqueKey = Guid.NewGuid().ToString(), - SearchTypeId = searchTypeId, - ModifiedTimeUtc = now.AddSeconds(i++), - }).ToList()); - } - - private SearchResults SearchForKeyword(string keyword, int searchTypeId = OtherSearchTypeId, bool useWildcard = false, bool allowLeadingWildcard = false) - { - var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { searchTypeId }, WildCardSearch = useWildcard, AllowLeadingWildcard = allowLeadingWildcard }; - return this._searchController.SiteSearch(query); - } - - private SearchResults SearchForKeywordWithWildCard(string keyword, int searchTypeId = OtherSearchTypeId) - { - var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { searchTypeId }, WildCardSearch = true }; - return this._searchController.SiteSearch(query); - } - - private SearchResults SearchForKeywordInModule(string keyword, int searchTypeId = ModuleSearchTypeId) - { - var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { searchTypeId } }; - return this._searchController.SiteSearch(query); - } - - private string StipEllipses(string text) - { - return text.Replace("...", string.Empty).Trim(); - } - - /// - /// Sets up some data for testing security trimming. - /// In the tests below, the users will have access to the follwoing documents - /// { 6, 7, 8, 9, 16, 17, 18, 19, 26, 27, 28, 29, ..., etc. } - /// The tests check that pagination qith various page sizes returns the proper groupings. - /// - private void SetupSecurityTrimmingDocs(int totalDocs, int searchType = DocumentSearchTypeId) - { - var docModifyTime = DateTime.UtcNow - TimeSpan.FromSeconds(totalDocs); - for (var i = 0; i < totalDocs; i++) - { - this._internalSearchController.AddSearchDocument(new SearchDocument - { - AuthorUserId = i, - Title = "Fox and Dog", - Body = Line1, - Tags = new[] { Tag0, Tag1 }, - SearchTypeId = searchType, - UniqueKey = Guid.NewGuid().ToString(), - ModifiedTimeUtc = docModifyTime.AddSeconds(i), - }); - } - } - - private void AddFoldersAndFiles() - { - var allFiles = new Dictionary - { - { "Awesome-Cycles-Logo.png", "Images/" }, - { "Banner1.jpg", "Images/" }, - { "Banner2.jpg", "Images/" }, - { "bike-powered.png", "Images/DNN/" }, - { "Spacer.gif", "Images/DNN/" }, - { "monday.png", "My { { "folderName", file.Value.ToLowerInvariant() } }, - }; - this._internalSearchController.AddSearchDocument(doc); - } - - this._internalSearchController.Commit(); - } - } -} + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + this.CreateNewLuceneControllerInstance(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + this.luceneController.Dispose(); + this.DeleteIndexFolder(); + InternalSearchController.ClearInstance(); + UserController.ClearInstance(); + SearchHelper.ClearInstance(); + LuceneController.ClearInstance(); + this.luceneController = null; + Globals.DependencyProvider = null; + } + + [Test] + public void SearchController_Search_Throws_On_Null_Query() + { + // Arrange + + // Act, Assert + Assert.Throws(() => this.searchController.SiteSearch(null)); + } + + [Test] + public void SearchController_Search_Throws_On_Empty_TypeId_Collection() + { + // Arrange + + // Act, Assert + Assert.Throws(() => this.searchController.SiteSearch(new SearchQuery { KeyWords = "word" })); + } + + [Test] + public void SearchController_AddSearchDcoumet_Regex_Does_Not_Sleep_On_Bad_Text_During_Alt_Text_Parsing() + { + // Arrange + var document = new SearchDocument { UniqueKey = Guid.NewGuid().ToString(), Title = "< ExecuteWithTimeout( + () => + { + this.internalSearchController.AddSearchDocument(document); + return false; + }, TimeSpan.FromSeconds(1))); + } + + [Test] + public void SearchController_Added_Item_IsRetrieved() + { + // Arrange + var doc = new SearchDocument { UniqueKey = "key01", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + + // Act + this.internalSearchController.AddSearchDocument(doc); + + var result = this.SearchForKeyword("hello"); + + // Assert + Assert.AreEqual(1, result.Results.Count); + Assert.AreEqual(result.Results[0].UniqueKey, doc.UniqueKey); + Assert.AreEqual(result.Results[0].Title, doc.Title); + } + + [Test] + public void SearchController_EnsureIndexIsAppended_When_Index_Is_NotDeleted_InBetween() + { + // Arrange + string[] docs = + { + Line1, + Line2, + }; + + // Act + + // Add first document + var doc1 = new SearchDocument { Title = docs[0], UniqueKey = Guid.NewGuid().ToString(), SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + this.internalSearchController.AddSearchDocument(doc1); + + // first luceneQuery + var query1 = new SearchQuery { KeyWords = "fox", SearchTypeIds = new List { OtherSearchTypeId } }; + var search1 = this.searchController.SiteSearch(query1); + + // Assert + Assert.AreEqual(1, search1.Results.Count); + + // Add second document + var doc2 = new SearchDocument { Title = docs[1], UniqueKey = Guid.NewGuid().ToString(), SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + this.internalSearchController.AddSearchDocument(doc2); + this.CreateNewLuceneControllerInstance(); // to force a new reader for the next assertion + + // second luceneQuery + var query2 = new SearchQuery { KeyWords = "fox", SearchTypeIds = new List { OtherSearchTypeId } }; + var search2 = this.searchController.SiteSearch(query2); + + // Assert + Assert.AreEqual(2, search2.Results.Count); + } + + [Test] + public void SearchController_Getsearch_TwoTermsSearch() + { + // Arrange + string[] docs = + { + Line1, + Line2, + Line3, + Line4, + Line5, + }; + + this.AddLinesAsSearchDocs(docs); + + // Act + var search = this.SearchForKeyword("fox jumps"); + + // Assert + Assert.AreEqual(docs.Length, search.Results.Count); + + // Assert.AreEqual("brown fox jumps over the lazy dog ", search.Results[0].Snippet); + // Assert.AreEqual("quick fox jumps over the black dog ", search.Results[1].Snippet); + } + + [Test] + public void SearchController_GetResult_TwoTermsSearch() + { + // Arrange + string[] docs = + { + Line1, + Line2, + Line3, + Line4, + Line5, + }; + + this.AddLinesAsSearchDocs(docs); + + // Act + var search = this.SearchForKeyword("fox jumps"); + + // Assert + Assert.AreEqual(docs.Length, search.Results.Count); + + // Assert.AreEqual("brown fox jumps over the lazy dog ", search.Results[0].Snippet); + // Assert.AreEqual("quick fox jumps over the black dog ", search.Results[1].Snippet); + } + + [Test] + public void SearchController_GetResult_PortalIdSearch() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, PortalIds = new List { PortalId0 } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_SearchTypeIdSearch() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + } + + [Test] + public void SearchController_SearchFindsAnalyzedVeryLongWords() + { + // Arrange + // const string fieldName = Constants.ContentTag; + const string veryLongWord = // 107 characters + "NowIsTheTimeForAllGoodMenToComeToTheAidOfTheirCountryalsoIsTheTimeForAllGoodMenToComeToTheAidOfTheirCountry"; + + var doc = new SearchDocument + { + Title = veryLongWord, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = ModuleSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + ModuleId = 1, + ModuleDefId = 1, + }; + this.internalSearchController.AddSearchDocument(doc); + + // Act + var query = new SearchQuery { KeyWords = veryLongWord, SearchTypeIds = new List { ModuleSearchTypeId } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual("" + veryLongWord + "", this.StipEllipses(search.Results[0].Snippet).Trim()); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsNoResultsWhenHavingNoPermission() + { + // Arrange + this.AddStandardSearchDocs(DocumentSearchTypeId); + + // Act + var result = this.SearchForKeyword("fox", DocumentSearchTypeId); + + // Assert + // by default AuthorUserId = 0 which have no permission, so this passes + Assert.AreEqual(0, result.Results.Count); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1A() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 1, + PageSize = 4, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(query.PageSize, result.Results.Count); + Assert.AreEqual(new[] { 6, 7, 8, 9 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1B() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 1, + PageSize = 6, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(query.PageSize, result.Results.Count); + Assert.AreEqual(new[] { 6, 7, 8, 9, 16, 17 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1C() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 1, + PageSize = 8, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(query.PageSize, result.Results.Count); + Assert.AreEqual(new[] { 6, 7, 8, 9, 16, 17, 18, 19 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1D() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; // user should have access to some documnets here + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 1, + PageSize = 100, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(4 * 3, result.TotalHits); + Assert.AreEqual(4 * 3, result.Results.Count); + Assert.AreEqual(new[] { 6, 7, 8, 9, 16, 17, 18, 19, 26, 27, 28, 29 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1E() + { + // Arrange + const int maxDocs = 30; + const int stype = TabSearchTypeId; // user should have access to all documnets here + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 1, + PageSize = 10, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).Skip(1).ToArray(); + + // Assert + Assert.AreEqual(maxDocs, result.TotalHits); + Assert.AreEqual(query.PageSize, result.Results.Count); + Assert.AreEqual(Enumerable.Range(1, 9).ToArray(), ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage1F() + { + // Arrange + const int maxDocs = 100; + const int stype = TabSearchTypeId; // user should have access to all documnets here + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 10, + PageSize = 10, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs, result.TotalHits); + Assert.AreEqual(query.PageSize, result.Results.Count); + Assert.AreEqual(Enumerable.Range(90, 10).ToArray(), ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage2A() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 2, + PageSize = 5, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(5, result.Results.Count); + Assert.AreEqual(new[] { 17, 18, 19, 26, 27 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage2B() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 2, + PageSize = 6, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(6, result.Results.Count); + Assert.AreEqual(new[] { 18, 19, 26, 27, 28, 29 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage2C() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var query = new SearchQuery + { + PageIndex = 2, + PageSize = 8, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(query); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(4, result.Results.Count); + Assert.AreEqual(new[] { 26, 27, 28, 29 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage3A() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var queryPg3 = new SearchQuery + { + PageIndex = 3, + PageSize = 4, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(queryPg3); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(queryPg3.PageSize, result.Results.Count); + Assert.AreEqual(new[] { 26, 27, 28, 29 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage3B() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var queryPg3 = new SearchQuery + { + PageIndex = 3, + PageSize = 5, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(queryPg3); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(2, result.Results.Count); + Assert.AreEqual(new[] { 28, 29 }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage3C() + { + // Arrange + const int maxDocs = 30; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var queryPg3 = new SearchQuery + { + PageIndex = 3, + PageSize = 8, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(queryPg3); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - 18, result.TotalHits); + Assert.AreEqual(0, result.Results.Count); + Assert.AreEqual(new int[] { }, ids); + } + + [Test] + public void SearchController_SecurityTrimmedTest_ReturnsExpectedResultsForPage5() + { + // Arrange + const int maxDocs = 100; + const int stype = DocumentSearchTypeId; + this.SetupSecurityTrimmingDocs(maxDocs, stype); + + // Act + var queryPg3 = new SearchQuery + { + PageIndex = 5, + PageSize = 8, + KeyWords = "fox", + SearchTypeIds = new[] { stype }, + }; + + var result = this.searchController.SiteSearch(queryPg3); + var ids = result.Results.Select(doc => doc.AuthorUserId).ToArray(); + + // Assert + Assert.AreEqual(maxDocs - (10 * 6), result.TotalHits); + Assert.AreEqual(queryPg3.PageSize, result.Results.Count); + Assert.AreEqual(new int[] { 86, 87, 88, 89, 96, 97, 98, 99 }, ids); + } + + [Test] + public void SearchController_GetResult_Returns_Correct_SuppliedData_When_Optionals_Are_Supplied() + { + // Arrange + var modifiedDateTime = DateTime.UtcNow; + var numericKeys = new Dictionary() { { NumericKey1, NumericValue1 }, { NumericKey2, NumericValue2 } }; + var keywords = new Dictionary() { { KeyWord1Name, KeyWord1Value }, { KeyWord2Name, KeyWord2Value } }; + var tags = new List { Tag1, Tag2 }; + var doc = new SearchDocument + { + Title = "Title", + UniqueKey = "key", + SearchTypeId = ModuleSearchTypeId, + ModifiedTimeUtc = modifiedDateTime, + PortalId = PortalId12, + TabId = StandardTabId, + ModuleDefId = HtmlModuleDefId, + ModuleId = HtmlModuleId, + Description = "Description", + Body = "Body", + AuthorUserId = StandardAuthorId, + RoleId = StandardRoleId, + Permissions = StandardPermission, + QueryString = StandardQueryString, + Tags = tags, + NumericKeys = numericKeys, + Keywords = keywords, + }; + this.internalSearchController.AddSearchDocument(doc); + + // run luceneQuery on common keyword between both the docs + var search = this.SearchForKeywordInModule("Title"); + + // Assert + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(PortalId12, search.Results[0].PortalId); + Assert.AreEqual(StandardTabId, search.Results[0].TabId); + Assert.AreEqual(HtmlModuleDefId, search.Results[0].ModuleDefId); + Assert.AreEqual(HtmlModuleId, search.Results[0].ModuleId); + Assert.AreEqual(ModuleSearchTypeId, search.Results[0].SearchTypeId); + Assert.AreEqual("Description", search.Results[0].Description); + Assert.AreEqual("Body", search.Results[0].Body); + Assert.AreEqual(StandardAuthorId, search.Results[0].AuthorUserId); + Assert.AreEqual(StandardRoleId, search.Results[0].RoleId); + Assert.AreEqual(modifiedDateTime.ToString(Constants.DateTimeFormat), search.Results[0].ModifiedTimeUtc.ToString(Constants.DateTimeFormat)); + Assert.AreEqual(StandardPermission, search.Results[0].Permissions); + Assert.AreEqual(StandardQueryString, search.Results[0].QueryString); + Assert.AreEqual(StandardAuthorDisplayName, search.Results[0].AuthorName); + Assert.AreEqual(tags.Count, search.Results[0].Tags.Count()); + Assert.AreEqual(tags[0], search.Results[0].Tags.ElementAt(0)); + Assert.AreEqual(tags[1], search.Results[0].Tags.ElementAt(1)); + Assert.AreEqual(numericKeys.Count, search.Results[0].NumericKeys.Count); + Assert.AreEqual(numericKeys[NumericKey1], search.Results[0].NumericKeys[NumericKey1]); + Assert.AreEqual(numericKeys[NumericKey2], search.Results[0].NumericKeys[NumericKey2]); + Assert.AreEqual(keywords.Count, search.Results[0].Keywords.Count); + Assert.AreEqual(keywords[KeyWord1Name], search.Results[0].Keywords[KeyWord1Name]); + Assert.AreEqual(keywords[KeyWord2Name], search.Results[0].Keywords[KeyWord2Name]); + } + + [Test] + public void SearchController_GetResult_Returns_EmptyData_When_Optionals_Are_Not_Supplied() + { + // Arrange + var modifiedDateTime = DateTime.UtcNow; + var doc = new SearchDocument + { + PortalId = PortalId0, + Title = "Title", + UniqueKey = "key", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = modifiedDateTime, + }; + this.internalSearchController.AddSearchDocument(doc); + + var search = this.SearchForKeyword("Title"); + + // Assert - + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(PortalId0, search.Results[0].PortalId); + Assert.AreEqual(0, search.Results[0].TabId); + Assert.AreEqual(0, search.Results[0].ModuleDefId); + Assert.AreEqual(0, search.Results[0].ModuleId); + Assert.AreEqual(OtherSearchTypeId, search.Results[0].SearchTypeId); + Assert.AreEqual(null, search.Results[0].Description); + Assert.AreEqual(null, search.Results[0].Body); + Assert.AreEqual(0, search.Results[0].AuthorUserId); + Assert.AreEqual(-1, search.Results[0].RoleId); + Assert.AreEqual(modifiedDateTime.ToString(Constants.DateTimeFormat), search.Results[0].ModifiedTimeUtc.ToString(Constants.DateTimeFormat)); + Assert.AreEqual(null, search.Results[0].Permissions); + Assert.AreEqual(null, search.Results[0].QueryString); + Assert.AreEqual(null, search.Results[0].AuthorName); + Assert.AreEqual(0, search.Results[0].Tags.Count()); + Assert.AreEqual(0, search.Results[0].NumericKeys.Count); + Assert.AreEqual(0, search.Results[0].Keywords.Count); + } + + [Test] + public void SearchController_GetsHighlightedDesc() + { + // Arrange + string[] docs = + { + Line1, + Line2, + Line3, + Line4, + Line5, + }; + this.AddLinesAsSearchDocs(docs); + + // Act + var search = this.SearchForKeyword("fox"); + + // Assert + Assert.AreEqual(docs.Length, search.Results.Count); + Assert.IsTrue( + new[] + { + "brown fox jumps over the lazy dog", + "quick fox jumps over the black dog - Italian", + "gold fox jumped over the lazy black dog", + "e red fox jumped over the lazy dark gray dog", + "quick fox jumps over the white dog - los de el Espana", + }.SequenceEqual(search.Results.Select(r => this.StipEllipses(r.Snippet))), + "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Snippet))); + } + + [Test] + public void SearchController_CorrectDocumentCultureIsUsedAtIndexing() + { + // Arrange + // assign a culture that is different than the current one + var isNonEnglishEnv = Thread.CurrentThread.CurrentCulture.Name != CultureEsEs; + string cultureCode, title, searchWord; + + // Act + if (isNonEnglishEnv) + { + cultureCode = CultureEsEs; + searchWord = "zorro"; + title = "los rápidos saltos de zorro sobre el perro negro"; + } + else + { + cultureCode = CultureEnUs; + searchWord = "fox"; + title = Line3; + } + + this.internalSearchController.AddSearchDocument( + new SearchDocument + { + Title = title, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + CultureCode = cultureCode, + }); + this.internalSearchController.Commit(); + + var searches = this.SearchForKeyword(searchWord); + + // Assert + Assert.AreEqual(1, searches.TotalHits); + Assert.AreEqual(cultureCode, searches.Results[0].CultureCode); + } + + [Test] + public void SearchController_GetResult_TimeRangeSearch_Ignores_When_Only_BeginDate_Specified() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, BeginModifiedTimeUtc = DateTime.Now }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_TimeRangeSearch_Resturns_Scoped_Results_When_BeginDate_Is_After_End_Date() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + BeginModifiedTimeUtc = DateTime.Now, + EndModifiedTimeUtc = DateTime.Now.AddSeconds(-1), + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_TimeRangeSearch_Resturns_Scoped_Results_When_Both_Dates_Specified() + { + // Arrange + var added = this.AddStandardSearchDocs(); + var stypeIds = new List { ModuleSearchTypeId }; + var utcNow = DateTime.UtcNow.AddDays(1); + const SortFields sfield = SortFields.LastModified; + + // Act and Assert - just a bit later + var query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddSeconds(1), EndModifiedTimeUtc = utcNow.AddDays(1) }; + var search = this.searchController.SiteSearch(query); + Assert.AreEqual(0, search.Results.Count); + + // Act and Assert - 10 day + query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-10), EndModifiedTimeUtc = utcNow.AddDays(1) }; + search = this.searchController.SiteSearch(query); + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(Line5, search.Results[0].Title); + + // Act and Assert - 1 year or so + query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-368), EndModifiedTimeUtc = utcNow.AddDays(1) }; + search = this.searchController.SiteSearch(query); + Assert.AreEqual(2, search.Results.Count); + Assert.AreEqual(Line5, search.Results[0].Title); + Assert.AreEqual(Line4, search.Results[1].Title); + + // Act and Assert - 2 years or so + query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-800), EndModifiedTimeUtc = utcNow.AddDays(1) }; + search = this.searchController.SiteSearch(query); + Assert.AreEqual(3, search.Results.Count); + Assert.AreEqual(Line5, search.Results[0].Title); + Assert.AreEqual(Line4, search.Results[1].Title); + Assert.AreEqual(Line3, search.Results[2].Title); + + // Act and Assert - 3 years or so + query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-1200), EndModifiedTimeUtc = utcNow.AddDays(1) }; + search = this.searchController.SiteSearch(query); + Assert.AreEqual(4, search.Results.Count); + Assert.AreEqual(Line5, search.Results[0].Title); + Assert.AreEqual(Line4, search.Results[1].Title); + Assert.AreEqual(Line3, search.Results[2].Title); + Assert.AreEqual(Line2, search.Results[3].Title); + + // Act and Assert - 2 to 3 years or so + query = new SearchQuery { SearchTypeIds = stypeIds, SortField = sfield, BeginModifiedTimeUtc = utcNow.AddDays(-1200), EndModifiedTimeUtc = utcNow.AddDays(-800) }; + search = this.searchController.SiteSearch(query); + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(Line2, search.Results[0].Title); + } + + [Test] + public void SearchController_GetResult_TagSearch_Single_Tag_Returns_Single_Result() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag0 } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_TagSearch_Single_Tag_With_Space_Returns_Single_Result() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag0WithSpace } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_TagSearch_Lowercase_Search_Returns_PropercaseTag_Single_Result() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { TagNeutral.ToLowerInvariant() } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_TagSearch_Single_Tag_Returns_Two_Results() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag1 } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(2, search.Results.Count); + Assert.AreEqual(Tag0, search.Results[0].Tags.ElementAt(0)); + Assert.AreEqual(Tag1, search.Results[0].Tags.ElementAt(1)); + Assert.AreEqual(Tag1, search.Results[1].Tags.ElementAt(0)); + Assert.AreEqual(Tag2, search.Results[1].Tags.ElementAt(1)); + } + + [Test] + public void SearchController_GetResult_TagSearch_Two_Tags_Returns_Nothing() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag0, Tag4 } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(0, search.Results.Count); + } + + [Test] + public void SearchController_GetResult_TagSearch_Two_Tags_Returns_Single_Results() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery { SearchTypeIds = new List { ModuleSearchTypeId }, Tags = new List { Tag1, Tag2 } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(Tag1, search.Results[0].Tags.ElementAt(0)); + Assert.AreEqual(Tag2, search.Results[0].Tags.ElementAt(1)); + } + + [Test] + public void SearchController_GetResult_TagSearch_With_Vowel_Tags_Returns_Data() + { + // Arrange + const string keyword = "awesome"; + var doc1 = new SearchDocument { UniqueKey = "key01", Title = keyword, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Tags = new List { TagTootsie } }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { OtherSearchTypeId }, Tags = new List { TagTootsie } }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SearchController_GetResult_Throws_When_CustomNumericField_Is_Specified_And_CustomSortField_Is_Not() + { + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.CustomNumericField, + }; + + this.searchController.SiteSearch(query); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SearchController_GetResult_Throws_When_CustomStringField_Is_Specified_And_CustomSortField_Is_Not() + { + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.CustomStringField, + }; + + this.searchController.SiteSearch(query); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SearchController_GetResult_Throws_When_NumericKey_Is_Specified_And_CustomSortField_Is_Not() + { + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.NumericKey, + }; + + this.searchController.SiteSearch(query); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SearchController_GetResult_Throws_When_Keyword_Is_Specified_And_CustomSortField_Is_Not() + { + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Keyword, + }; + + this.searchController.SiteSearch(query); + } + + [Test] + public void SearchController_GetResult_Sorty_By_Date_Returns_Latest_Docs_First() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.LastModified, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); + + Assert.AreEqual(Tag3, search.Results[1].Tags.ElementAt(0)); + Assert.AreEqual(Tag4, search.Results[1].Tags.ElementAt(1)); + Assert.AreEqual(TagLatest, search.Results[1].Tags.ElementAt(2)); + + Assert.AreEqual(Tag2, search.Results[0].Tags.ElementAt(0)); + Assert.AreEqual(Tag3, search.Results[0].Tags.ElementAt(1)); + Assert.AreEqual(TagIt.ToLowerInvariant(), search.Results[0].Tags.ElementAt(2)); + } + + [Test] + public void SearchController_GetResult_Sorty_By_Date_Ascending_Returns_Earliest_Docs_First() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.LastModified, + SortDirection = SortDirections.Ascending, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.Greater(search.Results[1].DisplayModifiedTime, search.Results[0].DisplayModifiedTime); + Assert.Greater(search.Results[2].DisplayModifiedTime, search.Results[1].DisplayModifiedTime); + Assert.Greater(search.Results[3].DisplayModifiedTime, search.Results[2].DisplayModifiedTime); + + Assert.AreEqual(Tag0, search.Results[0].Tags.ElementAt(0)); + Assert.AreEqual(Tag1, search.Results[0].Tags.ElementAt(1)); + Assert.AreEqual(TagOldest, search.Results[0].Tags.ElementAt(2)); + } + + [Test] + public void SearchController_GetResult_Sorty_By_NumericKeys_Ascending_Returns_Smaller_Numers_First() + { + var added = this.AddDocumentsWithNumericKeys(); + + // Act + var query = new SearchQuery + { + KeyWords = "Title", + SearchTypeIds = new List { OtherSearchTypeId }, + SortField = SortFields.NumericKey, + SortDirection = SortDirections.Ascending, + CustomSortField = NumericKey1, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.Greater(search.Results[1].NumericKeys[NumericKey1], search.Results[0].NumericKeys[NumericKey1]); + Assert.Greater(search.Results[2].NumericKeys[NumericKey1], search.Results[1].NumericKeys[NumericKey1]); + } + + [Test] + public void SearchController_GetResult_Sorty_By_NumericKeys_Descending_Returns_Bigger_Numbers_First() + { + var added = this.AddDocumentsWithNumericKeys(); + + // Act + var query = new SearchQuery + { + KeyWords = "Title", + SearchTypeIds = new List { OtherSearchTypeId }, + SortField = SortFields.NumericKey, + SortDirection = SortDirections.Descending, + CustomSortField = NumericKey1, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.Greater(search.Results[0].NumericKeys[NumericKey1], search.Results[1].NumericKeys[NumericKey1]); + Assert.Greater(search.Results[1].NumericKeys[NumericKey1], search.Results[2].NumericKeys[NumericKey1]); + } + + [Test] + public void SearchController_GetResult_Sorty_By_Title_Ascending_Returns_Alphabetic_Ascending() + { + var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; + + var added = this.AddDocuments(titles, "animal"); + + // Act + var query = new SearchQuery + { + KeyWords = "animal", + SearchTypeIds = new List { OtherSearchTypeId }, + SortField = SortFields.Title, + SortDirection = SortDirections.Ascending, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + + var count = 0; + foreach (var title in titles.OrderBy(s => s)) + { + Assert.AreEqual(title, search.Results[count++].Title); + } + } + + [Test] + public void SearchController_GetResult_Sorty_By_Title_Descending_Returns_Alphabetic_Descending() + { + var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; + + var added = this.AddDocuments(titles, "animal"); + + // Act + var query = new SearchQuery + { + KeyWords = "animal", + SearchTypeIds = new List { OtherSearchTypeId }, + SortField = SortFields.Title, + SortDirection = SortDirections.Descending, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + + var count = 0; + foreach (var title in titles.OrderByDescending(s => s)) + { + Assert.AreEqual(title, search.Results[count++].Title); + } + } + + [Test] + public void SearchController_GetResult_Sorty_By_Keyword_Ascending_Returns_Alphabetic_Ascending() + { + var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; + + var added = this.AddDocumentsWithKeywords(titles, "animal"); + + // Act + var query = new SearchQuery + { + KeyWords = "animal", + SearchTypeIds = new List { OtherSearchTypeId }, + SortField = SortFields.Keyword, + SortDirection = SortDirections.Ascending, + CustomSortField = KeyWord1Name, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + + var count = 0; + foreach (var title in titles.OrderBy(s => s)) + { + Assert.AreEqual(title, search.Results[count++].Keywords[KeyWord1Name]); + } + } + + [Test] + public void SearchController_GetResult_Sorty_By_Keyword_Descending_Returns_Alphabetic_Descending() + { + var titles = new List { "cat", "ant", "dog", "antelope", "zebra", "yellow", " " }; + + var added = this.AddDocumentsWithKeywords(titles, "animal"); + + // Act + var query = new SearchQuery + { + KeyWords = "animal", + SearchTypeIds = new List { OtherSearchTypeId }, + SortField = SortFields.Keyword, + SortDirection = SortDirections.Descending, + CustomSortField = KeyWord1Name, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + + var count = 0; + foreach (var title in titles.OrderByDescending(s => s)) + { + Assert.AreEqual(title, search.Results[count++].Keywords[KeyWord1Name]); + } + } + + [Test] + public void SearchController_GetResult_Sort_By_Unknown_StringField_In_Descending_Order_Does_Not_Throw() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.CustomStringField, + SortDirection = SortDirections.Descending, + CustomSortField = "unknown", + }; + this.searchController.SiteSearch(query); + } + + [Test] + public void SearchController_GetResult_Sort_By_Unknown_StringField_In_Ascending_Order_Does_Not_Throw() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.CustomStringField, + SortDirection = SortDirections.Ascending, + CustomSortField = "unknown", + }; + this.searchController.SiteSearch(query); + } + + [Test] + public void SearchController_GetResult_Sort_By_Unknown_NumericField_In_Descending_Order_Does_Not_Throw() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.CustomNumericField, + SortDirection = SortDirections.Descending, + CustomSortField = "unknown", + }; + this.searchController.SiteSearch(query); + } + + [Test] + public void SearchController_GetResult_Sort_By_Unknown_NumericField_In_Ascending_Order_Does_Not_Throw() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.CustomNumericField, + SortDirection = SortDirections.Ascending, + CustomSortField = "unknown", + }; + this.searchController.SiteSearch(query); + } + + [Test] + public void SearchController_GetResult_Sorty_By_Relevance_Returns_TopHit_Docs_First() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Relevance, + KeyWords = "brown OR fox", + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.AreEqual(true, search.Results[0].Snippet.Contains("brown") && search.Results[0].Snippet.Contains("dog")); + } + + [Test] + public void SearchController_GetResult_Sorty_By_RelevanceAndTitleKeyword_Returns_TopHit_Docs_First() + { + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns(CustomBoost); + + // Arrange + var added = this.AddSearchDocsForCustomBoost(); + this.CreateNewLuceneControllerInstance(true); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Relevance, + KeyWords = "Hello", + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.AreEqual(true, search.Results[0].Body.Contains("Hello1")); + } + + [Test] + public void SearchController_GetResult_Sorty_By_RelevanceAndSubjectKeyword_Returns_TopHit_Docs_First() + { + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns(CustomBoost); + this.CreateNewLuceneControllerInstance(true); + + // Arrange + var added = this.AddSearchDocsForCustomBoost(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Relevance, + KeyWords = "Hello", + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.AreEqual(true, search.Results[0].Body.Contains("Hello2")); + } + + [Test] + public void SearchController_GetResult_Sorty_By_RelevanceAndCommentKeyword_Returns_TopHit_Docs_First() + { + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())).Returns(CustomBoost); + this.CreateNewLuceneControllerInstance(true); + + // Arrange + var added = this.AddSearchDocsForCustomBoost(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Relevance, + KeyWords = "Hello", + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.AreEqual(true, search.Results[0].Body.Contains("Hello3")); + } + + [Test] + public void SearchController_GetResult_Sorty_By_RelevanceAndAuthorKeyword_Returns_TopHit_Docs_First() + { + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(CustomBoost); + this.CreateNewLuceneControllerInstance(true); + + // Arrange + var added = this.AddSearchDocsForCustomBoost(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Relevance, + KeyWords = "Hello", + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.AreEqual(true, search.Results[0].Body.Contains("Hello4")); + } + + [Test] + public void SearchController_GetResult_Sorty_By_Relevance_Ascending_Does_Not_Change_Sequence_Of_Results() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.Relevance, + SortDirection = SortDirections.Ascending, + KeyWords = "brown OR fox", + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(added, search.Results.Count); + Assert.AreEqual(true, search.Results[0].Snippet.Contains("brown") && search.Results[0].Snippet.Contains("dog")); + } + + [Test] + public void SearchController_GetResult_By_Locale_Returns_Specific_And_Neutral_Locales() + { + // Arrange + this.AddStandardSearchDocs(); + + // Act + var query = new SearchQuery + { + SearchTypeIds = new List { ModuleSearchTypeId }, + SortField = SortFields.LastModified, + CultureCode = CultureItIt, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(2, search.Results.Count, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); + Assert.AreEqual(Line3, search.Results[0].Title); + Assert.AreEqual(Line1, search.Results[1].Title); + } + + [Test] + public void SearchController_EnsureOldDocument_Deleted_Upon_Second_Index_Content_With_Same_Key() + { + // Arrange + string[] docs = + { + Line1, + Line2, + }; + const string docKey = "key1"; + + // Act + + // Add first document + var doc1 = new SearchDocument { Title = docs[0], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + this.internalSearchController.AddSearchDocument(doc1); + + // Add second document with same key + var doc2 = new SearchDocument { Title = docs[1], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + this.internalSearchController.AddSearchDocument(doc2); + + // run luceneQuery on common keyword between both the docs + var search = this.SearchForKeyword("fox"); + + // Assert - there should just be one entry - first one must have been removed. + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(docs[1], search.Results[0].Title); + } + + [Test] + public void SearchController_Add_Does_Not_Throw_On_Empty_Url() + { + var doc = new SearchDocument + { + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = OtherSearchTypeId, + Title = " ", + ModifiedTimeUtc = DateTime.UtcNow, + QueryString = "?foo=bar", + }; + + Assert.DoesNotThrow(() => this.internalSearchController.AddSearchDocument(doc)); + } + + [Test] + public void SearchController_Add_Does_Not_Throw_On_Empty_Title() + { + var doc = new SearchDocument + { + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + }; + + Assert.DoesNotThrow(() => this.internalSearchController.AddSearchDocument(doc)); + } + + [Test] + public void SearchController_EnsureOldDocument_Deleted_Upon_Second_Index_When_IsActive_Is_False() + { + // Arrange + string[] docs = + { + Line1, + Line2, + }; + const string docKey = "key1"; + + // Act + + // Add first document + var doc1 = new SearchDocument { Title = docs[0], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + this.internalSearchController.AddSearchDocument(doc1); + + // Add second document with same key + var doc2 = new SearchDocument { Title = docs[1], UniqueKey = docKey, SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, IsActive = false }; + this.internalSearchController.AddSearchDocument(doc2); + + // run luceneQuery on common keyword between both the docs + var search = this.SearchForKeyword("fox"); + + // Assert - there should not be any record. + Assert.AreEqual(0, search.Results.Count); + } + + // Note: these tests needs to pass through the analyzer which is utilized + // in SearchControllerImpl but not LuceneControllerImpl. + [Test] + public void SearchController_SearchFindsAccentedAndNonAccentedWords() + { + // Arrange + string[] lines = + { + "zèbre or panthère", + "zebre without accent", + "panthere without accent", + }; + + this.AddLinesAsSearchDocs(lines); + + // Act + var searches1 = this.SearchForKeyword("zèbre"); + var searches2 = this.SearchForKeyword("zebre"); + + // Assert + Assert.AreEqual(2, searches1.TotalHits); + Assert.AreEqual("zèbre or panthère", this.StipEllipses(searches1.Results[0].Snippet).Trim()); + Assert.AreEqual("zebre without accent", this.StipEllipses(searches1.Results[1].Snippet).Trim()); + + Assert.AreEqual(2, searches2.TotalHits); + Assert.AreEqual("zèbre or panthère", this.StipEllipses(searches2.Results[0].Snippet).Trim()); + Assert.AreEqual("zebre without accent", this.StipEllipses(searches2.Results[1].Snippet).Trim()); + } + + [Test] + public void SearchController_PorterFilterTest() + { + // Arrange + string[] lines = + { + "field1_value", + "field2_value", + }; + + this.AddLinesAsSearchDocs(lines); + + // Act + var search1 = this.SearchForKeyword(lines[0]); + var search2 = this.SearchForKeyword("\"" + lines[1] + "\""); + + // Assert + Assert.AreEqual(1, search1.TotalHits); + Assert.AreEqual(1, search2.TotalHits); + + Assert.AreEqual("" + lines[0] + "", this.StipEllipses(search1.Results[0].Snippet).Trim()); + Assert.AreEqual("" + lines[1] + "", this.StipEllipses(search2.Results[0].Snippet).Trim()); + } + + [Test] + public void SearchController_SearchFindsStemmedWords() + { + // Arrange + string[] lines = + { + "I ride my bike to work", + "All team are riding their bikes", + "The boy rides his bike to school", + "This sentence is missing the bike ri... word", + }; + + this.AddLinesAsSearchDocs(lines); + + // Act + var search = this.SearchForKeyword("ride"); + + // Assert + Assert.AreEqual(3, search.TotalHits); + Assert.AreEqual("I ride my bike to work", this.StipEllipses(search.Results[0].Snippet)); + Assert.AreEqual("m are riding their bikes", this.StipEllipses(search.Results[1].Snippet)); + Assert.AreEqual("e boy rides his bike to school", this.StipEllipses(search.Results[2].Snippet)); + } + + [Test] + public void SearchController_Search_Synonym_Works() + { + // Arrange + var added = this.AddStandardSearchDocs(); + + // Act + var search = this.SearchForKeywordInModule("wolf"); + + // Assert + Assert.AreEqual(added, search.TotalHits); + + var snippets = search.Results.Select(result => this.StipEllipses(result.Snippet)).OrderBy(s => s).ToArray(); + Assert.AreEqual("brown fox jumps over the lazy dog", snippets[0]); + Assert.AreEqual("e red fox jumped over the lazy dark gray dog", snippets[1]); + Assert.AreEqual("gold fox jumped over the lazy black dog", snippets[2]); + Assert.AreEqual("quick fox jumps over the black dog - Italian", snippets[3]); + } + + [Test] + public void SearchController_Title_Ranked_Higher_Than_Body() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "Hello World" }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "cow is gone" }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "random text" }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("cow"); + + // Assert + Assert.AreEqual(result.TotalHits, 2); + Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); + Assert.AreEqual(doc2.UniqueKey, result.Results[1].UniqueKey); + } + + [Test] + public void SearchController_Title_Ranked_Higher_Than_Body_Regardless_Of_Document_Sequence() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "cow is gone" }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "random text" }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("cow"); + + // Assert + Assert.AreEqual(result.TotalHits, 2); + Assert.AreEqual(doc3.UniqueKey, result.Results[0].UniqueKey); + Assert.AreEqual(doc1.UniqueKey, result.Results[1].UniqueKey); + } + + [Test] + public void SearchController_Title_Ranked_Higher_Than_Tag() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "Hello World" }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Tags = new List { "cow", "hello", "world" } }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "random text" }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.Commit(); + var result = this.SearchForKeyword("cow"); + + // Assert + Assert.AreEqual(result.TotalHits, 2); + Console.WriteLine("first score: {0} {1}", result.Results[0].UniqueKey, result.Results[0].DisplayScore); + Console.WriteLine("second score: {0} {1}", result.Results[1].UniqueKey, result.Results[1].DisplayScore); + Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); + Assert.AreEqual(doc2.UniqueKey, result.Results[1].UniqueKey); + } + + [Test] + public void SearchController_RankingTest_With_Vowel() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "tootsie", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Tags = new List { "tootsie" } }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Keywords = new Dictionary() { { KeyWord1Name, "tootsie" } } }; + var doc4 = new SearchDocument { UniqueKey = "key04", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Description = "tootsie" }; + var doc5 = new SearchDocument { UniqueKey = "key05", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = "hello tootsie" }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.AddSearchDocument(doc4); + this.internalSearchController.AddSearchDocument(doc5); + + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("tootsie"); + + // Assert + Assert.AreEqual(5, result.TotalHits); + foreach (var searchResult in result.Results) + { + Console.WriteLine("{0} score: {1}", searchResult.UniqueKey, searchResult.DisplayScore); + } + + Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); + Assert.AreEqual(doc2.UniqueKey, result.Results[1].UniqueKey); + Assert.AreEqual(doc3.UniqueKey, result.Results[2].UniqueKey); + Assert.AreEqual(doc4.UniqueKey, result.Results[3].UniqueKey); + } + + [Test] + public void SearchController_FileNameTest_With_WildCard() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "file.ext", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + + this.internalSearchController.Commit(); + + var result = this.SearchForKeywordWithWildCard("file"); + + // Assert + Assert.AreEqual(1, result.TotalHits); + Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); + } + + [Test] + public void SearchController_Full_FileNameTest_Without_WildCard() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "file.ext", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + + this.internalSearchController.Commit(); + + var result = this.SearchForKeywordWithWildCard("file.ext"); + + // Assert + Assert.AreEqual(1, result.TotalHits); + Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); + } + + [Test] + public void SearchController_Full_FileNameTest_With_WildCard() + { + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "file.ext", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("file.ext"); + + // Assert + Assert.AreEqual(1, result.TotalHits); + Assert.AreEqual(doc1.UniqueKey, result.Results[0].UniqueKey); + } + + [Test] + public void SearchController_Scope_By_FolderName() + { + // Arrange + this.AddFoldersAndFiles(); + + // Act + var result1 = this.SearchForKeyword("kw-folderName:Images/*"); + var result2 = this.SearchForKeyword("kw-folderName:Images/DNN/*"); + var result3 = this.SearchForKeywordWithWildCard("kw-folderName:Images/* AND spacer"); + + // Assert + Assert.AreEqual(5, result1.TotalHits); + Assert.AreEqual(2, result2.TotalHits); + Assert.AreEqual(1, result3.TotalHits); + } + + [Test] + public void SearchController_Scope_By_FolderName_With_Spaces() + { + // Arrange + this.AddFoldersAndFiles(); + + // Act - Space is replaced by < + var query1 = new SearchQuery { KeyWords = "kw-folderName:Images/*", SearchTypeIds = new[] { OtherSearchTypeId }, WildCardSearch = false }; + var query2 = new SearchQuery { KeyWords = "kw-folderName:my() { { NumericKey1, NumericValue50 } }, + SearchTypeIds = new List { OtherSearchTypeId }, + WildCardSearch = false, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(NumericValue50, search.Results[0].NumericKeys[NumericKey1]); + } + + [Test] + public void SearchController_GetResult_Works_With_CustomKeyword_Querirs() + { + this.AddDocumentsWithKeywords(); + + // Act + var query = new SearchQuery + { + CustomKeywords = new Dictionary() { { KeyWord1Name, KeyWord1Value } }, + SearchTypeIds = new List { OtherSearchTypeId }, + WildCardSearch = false, + }; + var search = this.searchController.SiteSearch(query); + + // Assert + Assert.AreEqual(1, search.Results.Count); + Assert.AreEqual(KeyWord1Value, search.Results[0].Keywords[KeyWord1Name]); + } + + [Test] + public void SearchController_EnableLeadingWildcard_Should_Not_Return_Results_When_Property_Is_False() + { + this.mockHostController.Setup(c => c.GetString("Search_AllowLeadingWildcard", It.IsAny())).Returns("N"); + + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("rld", OtherSearchTypeId, true, false); + + // Assert + Assert.AreEqual(0, result.TotalHits); + } + + [Test] + public void SearchController_EnableLeadingWildcard_Should_Return_Results_When_Property_Is_True() + { + this.mockHostController.Setup(c => c.GetString("Search_AllowLeadingWildcard", It.IsAny())).Returns("N"); + + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("rld", OtherSearchTypeId, true, true); + + // Assert + Assert.AreEqual(1, result.TotalHits); + Assert.AreEqual(doc2.UniqueKey, result.Results[0].UniqueKey); + } + + [Test] + public void SearchController_EnableLeadingWildcard_Should_Return_Results_When_Property_Is_False_But_Host_Setting_Is_True() + { + this.mockHostController.Setup(c => c.GetString("Search_AllowLeadingWildcard", It.IsAny())).Returns("Y"); + + // Arrange + var doc1 = new SearchDocument { UniqueKey = "key01", Title = "cow is gone", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + var doc2 = new SearchDocument { UniqueKey = "key02", Title = "Hello World", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + var doc3 = new SearchDocument { UniqueKey = "key03", Title = "I'm here", SearchTypeId = OtherSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, Body = string.Empty }; + + // Act + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.Commit(); + + var result = this.SearchForKeyword("rld", OtherSearchTypeId, true, false); + + // Assert + Assert.AreEqual(1, result.TotalHits); + Assert.AreEqual(doc2.UniqueKey, result.Results[0].UniqueKey); + } + + [Test] + public void SearchController_Search_StopWords_Works() + { + // Arrange + var added = this.AddStandardSearchDocs(); + this.internalSearchController.Commit(); + + // Act + var search = this.SearchForKeywordInModule("the"); + + // Assert + // the word "the" is ignored in all languages except es-ES + Assert.AreEqual(1, search.TotalHits, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); + + // Act + search = this.SearchForKeywordInModule("over"); + + // Assert + // we won't find "over" in neutral, en-US, and en-CA documents, but will find it in the es-ES and it-IT documents. + Assert.AreEqual(2, search.TotalHits, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); + + // Act + search = this.SearchForKeywordInModule("los"); + + // Assert + // we won't find "los" in the es-ES document. + Assert.AreEqual(0, search.TotalHits, "Found: " + string.Join(Environment.NewLine, search.Results.Select(r => r.Title))); + } + + /// + /// Executes function proc on a separate thread respecting the given timeout value. + /// + /// + /// The function to execute. + /// The timeout duration. + /// R. + /// From: http://stackoverflow.com/questions/9460661/implementing-regex-timeout-in-net-4. + private static R ExecuteWithTimeout(Func proc, TimeSpan timeout) + { + var r = default(R); // init default return value + Exception ex = null; // records inter-thread exception + + // define a thread to wrap 'proc' + var t = new Thread(() => + { + try + { + r = proc(); + } + catch (Exception e) + { + // this can get set to ThreadAbortException + ex = e; + + Console.WriteLine("Exception hit"); + } + }); + + t.Start(); // start running 'proc' thread wrapper + + // from docs: "The Start method does not return until the new thread has started running." + if (t.Join(timeout) == false) + { + t.Abort(); // die evil thread! + + // Abort raises the ThreadAbortException + int i = 0; + while ((t.Join(1) == false) && (i < 20)) + { + // 20 ms wait possible here + i++; + } + + if (i >= 20) + { + // we didn't abort, might want to log this or take some other action + // this can happen if you are doing something indefinitely hinky in a + // finally block (cause the finally be will executed before the Abort + // completes. + Console.WriteLine("Abort didn't work as expected"); + } + } + + if (ex != null) + { + throw ex; // oops + } + + return r; // ah! + } + + private void CreateNewLuceneControllerInstance(bool reCreate = false) + { + InternalSearchController.SetTestableInstance(new InternalSearchControllerImpl()); + this.internalSearchController = InternalSearchController.Instance; + this.searchController = new SearchControllerImpl(); + + if (!reCreate) + { + this.DeleteIndexFolder(); + + if (this.luceneController != null) + { + LuceneController.ClearInstance(); + this.luceneController.Dispose(); + } + + this.luceneController = new LuceneControllerImpl(); + LuceneController.SetTestableInstance(this.luceneController); + } + } + + private void SetupHostController() + { + this.mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns(SearchIndexFolder); + this.mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())).Returns(this.readerStaleTimeSpan); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTitleBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchTagBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchKeywordBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchDescriptionBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchAuthorBoost); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); + this.mockHostController.As(); + } + + private void SetupLocaleController() + { + this.mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = -1, Code = string.Empty }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureEnCa)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); + this.mockLocaleController.Setup(l => l.GetLocale(CultureEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); + + this.mockLocaleController.Setup(l => l.GetLocale(It.IsAny())).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnUs)).Returns(new Locale { LanguageId = LanguageIdEnUs, Code = CultureEnUs }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdEnFr)).Returns(new Locale { LanguageId = LanguageIdEnFr, Code = CultureEnCa }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdItIt)).Returns(new Locale { LanguageId = LanguageIdItIt, Code = CultureItIt }); + this.mockLocaleController.Setup(l => l.GetLocale(LanguageIdEsEs)).Returns(new Locale { LanguageId = LanguageIdEsEs, Code = CultureEsEs }); + } + + private void SetupDataProvider() + { + // Standard DataProvider Path for Logging + this.mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + + DataTableReader searchTypes = null; + this.mockDataProvider.Setup(ds => ds.GetAllSearchTypes()) + .Callback(() => searchTypes = this.GetAllSearchTypes().CreateDataReader()) + .Returns(() => searchTypes); + + this.mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); + } + + private IDataReader GetPortalsCallBack(string culture) + { + return this.GetPortalCallBack(PortalId0, CultureEnUs); + } + + private IDataReader GetPortalCallBack(int portalId, string culture) + { + var table = new DataTable("Portal"); + + var cols = new[] + { + "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", + "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", "ProcessorUserId", + "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", + "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + const int homePage = 1; + table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, + "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, + "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", + null, homePage.ToString("D"), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); + + return table.CreateDataReader(); + } + + private void SetupSearchHelper() + { + this.mockSearchHelper.Setup(c => c.GetSearchMinMaxLength()).Returns(new Tuple(Constants.DefaultMinLen, Constants.DefaultMaxLen)); + this.mockSearchHelper.Setup(c => c.GetSynonyms(It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.GetSynonymsCallBack); + this.mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns((string name) => new SearchType { SearchTypeId = 0, SearchTypeName = name }); + this.mockSearchHelper.Setup(x => x.GetSearchTypeByName(It.IsAny())).Returns(this.GetSearchTypeByNameCallback); + this.mockSearchHelper.Setup(x => x.GetSearchTypes()).Returns(this.GetSearchTypes()); + this.mockSearchHelper.Setup(x => x.GetSearchStopWords(It.IsAny(), It.IsAny())).Returns(new SearchStopWords()); + this.mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEsEs)).Returns( + new SearchStopWords + { + PortalId = 0, + CultureCode = CultureEsEs, + StopWords = "los,de,el", + }); + this.mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEnUs)).Returns( + new SearchStopWords + { + PortalId = 0, + CultureCode = CultureEnUs, + StopWords = "the,over", + }); + this.mockSearchHelper.Setup(x => x.GetSearchStopWords(0, CultureEnCa)).Returns( + new SearchStopWords + { + PortalId = 0, + CultureCode = CultureEnCa, + StopWords = "the,over", + }); + + this.mockSearchHelper.Setup(x => x.RephraseSearchText(It.IsAny(), It.IsAny(), It.IsAny())).Returns(new SearchHelperImpl().RephraseSearchText); + this.mockSearchHelper.Setup(x => x.StripTagsNoAttributes(It.IsAny(), It.IsAny())).Returns((string html, bool retainSpace) => html); + SearchHelper.SetTestableInstance(this.mockSearchHelper.Object); + } + + private SearchType GetSearchTypeByNameCallback(string searchTypeName) + { + var searchType = new SearchType { SearchTypeName = searchTypeName, SearchTypeId = 0 }; + switch (searchTypeName) + { + case ModuleSearchTypeName: + searchType.SearchTypeId = ModuleSearchTypeId; + break; + case TabSearchTypeName: + searchType.SearchTypeId = TabSearchTypeId; + break; + case OtherSearchTypeName: + searchType.SearchTypeId = OtherSearchTypeId; + break; + case DocumentSearchTypeName: + searchType.SearchTypeId = DocumentSearchTypeId; + break; + case UrlSearchTypeName: + searchType.SearchTypeId = UrlSearchTypeId; + break; + } + + return searchType; + } + + private IList GetSynonymsCallBack(int portalId, string cultureCode, string term) + { + var synonyms = new List(); + if (term == "fox") + { + synonyms.Add("wolf"); + } + + return synonyms; + } + + private UserInfo GetUserByIdCallback(int portalId, int userId) + { + if (portalId == PortalId12 && userId == StandardAuthorId) + { + return new UserInfo { UserID = userId, DisplayName = StandardAuthorDisplayName }; + } + + return null; + } + + private DataTable GetAllSearchTypes() + { + var dtSearchTypes = new DataTable("SearchTypes"); + var pkId = dtSearchTypes.Columns.Add("SearchTypeId", typeof(int)); + dtSearchTypes.Columns.Add("SearchTypeName", typeof(string)); + dtSearchTypes.Columns.Add("SearchResultClass", typeof(string)); + dtSearchTypes.PrimaryKey = new[] { pkId }; + + // Create default Crawler + dtSearchTypes.Rows.Add(ModuleSearchTypeId, ModuleSearchTypeName, FakeResultControllerClass); + dtSearchTypes.Rows.Add(TabSearchTypeId, TabSearchTypeName, FakeResultControllerClass); + dtSearchTypes.Rows.Add(OtherSearchTypeId, OtherSearchTypeName, FakeResultControllerClass); + dtSearchTypes.Rows.Add(DocumentSearchTypeId, DocumentSearchTypeName, NoPermissionFakeResultControllerClass); + dtSearchTypes.Rows.Add(UrlSearchTypeId, UrlSearchTypeName, FakeResultControllerClass); + + return dtSearchTypes; + } + + private IEnumerable GetSearchTypes() + { + var searchTypes = new List + { + new SearchType { SearchTypeId = ModuleSearchTypeId, SearchTypeName = ModuleSearchTypeName, SearchResultClass = FakeResultControllerClass }, + new SearchType { SearchTypeId = TabSearchTypeId, SearchTypeName = TabSearchTypeName, SearchResultClass = FakeResultControllerClass }, + new SearchType { SearchTypeId = OtherSearchTypeId, SearchTypeName = OtherSearchTypeName, SearchResultClass = FakeResultControllerClass }, + new SearchType { SearchTypeId = DocumentSearchTypeId, SearchTypeName = DocumentSearchTypeName, SearchResultClass = NoPermissionFakeResultControllerClass }, + new SearchType { SearchTypeId = UrlSearchTypeId, SearchTypeName = UrlSearchTypeName, SearchResultClass = FakeResultControllerClass }, + }; + + return searchTypes; + } + + private void DeleteIndexFolder() + { + try + { + if (Directory.Exists(SearchIndexFolder)) + { + Directory.Delete(SearchIndexFolder, true); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + } + + /// + /// Returns few SearchDocs. + /// + private IEnumerable GetStandardSearchDocs(int searchTypeId = ModuleSearchTypeId) + { + var searchDocs = new List + { + new SearchDocument { PortalId = PortalId0, Tags = new List { Tag0, Tag1, TagOldest, Tag0WithSpace }, Title = Line1 }, + new SearchDocument { PortalId = PortalId0, Tags = new List { Tag1, Tag2, TagNeutral }, Title = Line2, CultureCode = CultureEnUs }, + new SearchDocument { PortalId = PortalId0, Tags = new List { Tag2, Tag3, TagIt }, Title = Line3, CultureCode = CultureItIt }, + new SearchDocument { PortalId = PortalId0, Tags = new List { Tag3, Tag4, TagLatest }, Title = Line4, CultureCode = CultureEnCa }, + new SearchDocument { PortalId = PortalId0, Tags = new List { Tag2, Tag3, TagIt }, Title = Line5, CultureCode = CultureEsEs }, + }; + + var now = DateTime.UtcNow.AddYears(-searchDocs.Count); + var i = 0; + + foreach (var searchDocument in searchDocs) + { + searchDocument.SearchTypeId = searchTypeId; + searchDocument.UniqueKey = Guid.NewGuid().ToString(); + searchDocument.ModuleId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleId : -1; + searchDocument.ModuleDefId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleDefId : -1; + searchDocument.ModifiedTimeUtc = now.AddYears(++i); // last added is the newest + } + + return searchDocs; + } + + private IEnumerable GetSearchDocsForCustomBoost(int searchTypeId = ModuleSearchTypeId) + { + var searchDocs = new List + { + new SearchDocument { PortalId = PortalId0, Title = Line1, Keywords = { { "title", "Hello" } }, Body = "Hello1 World" }, + new SearchDocument { PortalId = PortalId0, Title = Line2, Keywords = { { "subject", "Hello" } }, Body = "Hello2 World" }, + new SearchDocument { PortalId = PortalId0, Title = Line3, Keywords = { { "comments", "Hello" } }, Body = "Hello3 World" }, + new SearchDocument { PortalId = PortalId0, Title = Line4, Keywords = { { "authorname", "Hello" } }, Body = "Hello4 World" }, + }; + + var now = DateTime.UtcNow.AddYears(-searchDocs.Count); + var i = 0; + + foreach (var searchDocument in searchDocs) + { + searchDocument.SearchTypeId = searchTypeId; + searchDocument.UniqueKey = Guid.NewGuid().ToString(); + searchDocument.ModuleId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleId : -1; + searchDocument.ModuleDefId = (searchTypeId == ModuleSearchTypeId) ? HtmlModuleDefId : -1; + searchDocument.ModifiedTimeUtc = now.AddYears(++i); // last added is the newest + } + + return searchDocs; + } + + /// + /// Adds standarad SearchDocs in Lucene Index. + /// + /// Number of dcuments added. + private int AddStandardSearchDocs(int searchTypeId = ModuleSearchTypeId) + { + var docs = this.GetStandardSearchDocs(searchTypeId).ToArray(); + this.internalSearchController.AddSearchDocuments(docs); + return docs.Length; + } + + private int AddSearchDocsForCustomBoost(int searchTypeId = ModuleSearchTypeId) + { + var docs = this.GetSearchDocsForCustomBoost(searchTypeId).ToArray(); + this.internalSearchController.AddSearchDocuments(docs); + return docs.Length; + } + + private int AddDocumentsWithNumericKeys(int searchTypeId = OtherSearchTypeId) + { + var doc1 = new SearchDocument + { + Title = "Title", + UniqueKey = "key1", + Body = "hello", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + NumericKeys = new Dictionary() { { NumericKey1, NumericValue50 } }, + }; + var doc2 = new SearchDocument + { + Title = "Title", + UniqueKey = "key2", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + NumericKeys = new Dictionary() { { NumericKey1, NumericValue100 } }, + }; + var doc3 = new SearchDocument + { + Title = "Title", + UniqueKey = "key3", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + NumericKeys = new Dictionary() { { NumericKey1, NumericValue200 } }, + }; + var doc4 = new SearchDocument + { + Title = "Title", + UniqueKey = "key4", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + NumericKeys = new Dictionary() { { NumericKey1, NumericValue500 } }, + }; + var doc5 = new SearchDocument + { + Title = "Title", + UniqueKey = "key5", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + NumericKeys = new Dictionary() { { NumericKey1, NumericValue1000 } }, + }; + + var docs = new List() { doc1, doc2, doc3, doc4, doc5 }; + + this.internalSearchController.AddSearchDocuments(docs); + + return docs.Count; + } + + private int AddDocumentsWithKeywords(int searchTypeId = OtherSearchTypeId) + { + var doc1 = new SearchDocument + { + Title = "Title", + UniqueKey = "key1", + Body = "hello", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + Keywords = new Dictionary() { { KeyWord1Name, KeyWord1Value } }, + }; + var doc2 = new SearchDocument + { + Title = "Title", + UniqueKey = "key2", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + Keywords = new Dictionary() { { KeyWord1Name, KeyWord2Value } }, + }; + var doc3 = new SearchDocument + { + Title = "Title", + UniqueKey = "key3", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + Keywords = new Dictionary() { { KeyWord1Name, KeyWord3Value } }, + }; + var doc4 = new SearchDocument + { + Title = "Title", + UniqueKey = "key4", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + Keywords = new Dictionary() { { KeyWord1Name, KeyWord4Value } }, + }; + var doc5 = new SearchDocument + { + Title = "Title", + UniqueKey = "key5", + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + Keywords = new Dictionary() { { KeyWord1Name, KeyWord5Value } }, + }; + + var docs = new List() { doc1, doc2, doc3, doc4, doc5 }; + + this.internalSearchController.AddSearchDocuments(docs); + + return docs.Count; + } + + private int AddDocuments(IList titles, string body, int searchTypeId = OtherSearchTypeId) + { + var count = 0; + foreach (var doc in titles.Select(title => new SearchDocument + { + Title = title, + UniqueKey = Guid.NewGuid().ToString(), + Body = body, + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + })) + { + this.internalSearchController.AddSearchDocument(doc); + count++; + } + + return count; + } + + private int AddDocumentsWithKeywords(IEnumerable keywords, string title, int searchTypeId = OtherSearchTypeId) + { + var count = 0; + foreach (var doc in keywords.Select(keyword => new SearchDocument + { + Title = title, + UniqueKey = Guid.NewGuid().ToString(), + Keywords = new Dictionary() { { KeyWord1Name, keyword } }, + SearchTypeId = OtherSearchTypeId, + ModifiedTimeUtc = DateTime.UtcNow, + PortalId = PortalId12, + })) + { + this.internalSearchController.AddSearchDocument(doc); + count++; + } + + return count; + } + + private void AddLinesAsSearchDocs(IList lines, int searchTypeId = OtherSearchTypeId) + { + var now = DateTime.UtcNow - TimeSpan.FromSeconds(lines.Count()); + var i = 0; + + this.internalSearchController.AddSearchDocuments( + lines.Select(line => + new SearchDocument + { + Title = line, + UniqueKey = Guid.NewGuid().ToString(), + SearchTypeId = searchTypeId, + ModifiedTimeUtc = now.AddSeconds(i++), + }).ToList()); + } + + private SearchResults SearchForKeyword(string keyword, int searchTypeId = OtherSearchTypeId, bool useWildcard = false, bool allowLeadingWildcard = false) + { + var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { searchTypeId }, WildCardSearch = useWildcard, AllowLeadingWildcard = allowLeadingWildcard }; + return this.searchController.SiteSearch(query); + } + + private SearchResults SearchForKeywordWithWildCard(string keyword, int searchTypeId = OtherSearchTypeId) + { + var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { searchTypeId }, WildCardSearch = true }; + return this.searchController.SiteSearch(query); + } + + private SearchResults SearchForKeywordInModule(string keyword, int searchTypeId = ModuleSearchTypeId) + { + var query = new SearchQuery { KeyWords = keyword, SearchTypeIds = new[] { searchTypeId } }; + return this.searchController.SiteSearch(query); + } + + private string StipEllipses(string text) + { + return text.Replace("...", string.Empty).Trim(); + } + + /// + /// Sets up some data for testing security trimming. + /// In the tests below, the users will have access to the follwoing documents + /// { 6, 7, 8, 9, 16, 17, 18, 19, 26, 27, 28, 29, ..., etc. } + /// The tests check that pagination qith various page sizes returns the proper groupings. + /// + private void SetupSecurityTrimmingDocs(int totalDocs, int searchType = DocumentSearchTypeId) + { + var docModifyTime = DateTime.UtcNow - TimeSpan.FromSeconds(totalDocs); + for (var i = 0; i < totalDocs; i++) + { + this.internalSearchController.AddSearchDocument(new SearchDocument + { + AuthorUserId = i, + Title = "Fox and Dog", + Body = Line1, + Tags = new[] { Tag0, Tag1 }, + SearchTypeId = searchType, + UniqueKey = Guid.NewGuid().ToString(), + ModifiedTimeUtc = docModifyTime.AddSeconds(i), + }); + } + } + + private void AddFoldersAndFiles() + { + var allFiles = new Dictionary + { + { "Awesome-Cycles-Logo.png", "Images/" }, + { "Banner1.jpg", "Images/" }, + { "Banner2.jpg", "Images/" }, + { "bike-powered.png", "Images/DNN/" }, + { "Spacer.gif", "Images/DNN/" }, + { "monday.png", "My { { "folderName", file.Value.ToLowerInvariant() } }, + }; + this.internalSearchController.AddSearchDocument(doc); + } + + this.internalSearchController.Commit(); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs index 0f51ebcec31..47f037124d6 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs @@ -6,14 +6,18 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings { using System; using System.Collections; - using System.Collections.Generic; using System.Globalization; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Modules.Settings; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -25,6 +29,8 @@ public class ModuleSettingsTests : BaseSettingsTests public void Setup() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs index a11264aa558..42076f18cc8 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs @@ -8,11 +8,18 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using System.Collections; using System.Collections.Generic; using System.Globalization; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules.Settings; + using Microsoft.Extensions.DependencyInjection; + + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -31,6 +38,8 @@ public class NullableSettingsTests : BaseSettingsTests public void Setup() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs index a8294aba924..79e5aae36a4 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs @@ -7,13 +7,18 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using System; using System.Collections.Generic; using System.Globalization; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules.Settings; - using DotNetNuke.Entities.Portals; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -25,6 +30,8 @@ public class PortalSettingsTests : BaseSettingsTests public void Setup() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs index 061ee1a9cb4..a5a8e1a956c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs @@ -6,14 +6,18 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings { using System; using System.Collections; - using System.Collections.Generic; using System.Globalization; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Modules.Settings; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -25,6 +29,8 @@ public class TabModuleSettingsTests : BaseSettingsTests public void Setup() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs index d5743a4e7a8..ab09e973f8c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs @@ -6,11 +6,9 @@ namespace DotNetNuke.Tests.Core.Entities.Portals { using System; using System.Collections.Generic; - using System.Reflection; - using System.Runtime.Serialization; + using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; @@ -19,10 +17,15 @@ namespace DotNetNuke.Tests.Core.Entities.Portals using DotNetNuke.Services.Localization; using DotNetNuke.Tests.Utilities.Mocks; using DotNetNuke.UI.Skins; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + [TestFixture] public class PortalSettingsControllerTests { @@ -42,6 +45,8 @@ public class PortalSettingsControllerTests private const string DefaultContainer = "DefaultContainer"; private const string TabContainer = "TabContainer"; private const string GlobalTabContainer = "[g]TabContainer"; + + private Mock mockHostController; [SetUp] public void SetUp() @@ -51,8 +56,13 @@ public void SetUp() var serviceCollection = new ServiceCollection(); var mockApplicationInfo = new Mock(); mockApplicationInfo.Setup(info => info.ApplicationMapPath).Returns("path/to/application"); + + this.mockHostController = new Mock(); + this.mockHostController.As(); + serviceCollection.AddTransient(container => mockApplicationInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } @@ -84,18 +94,16 @@ public void LoadPortalSettings_Loads_Default_Value(Dictionary te .Returns(new Dictionary()); PortalController.SetTestableInstance(mockPortalController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString(It.IsAny())) + this.mockHostController.Setup(c => c.GetString(It.IsAny())) .Returns((string s) => hostSettings[s]); - mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) .Returns((string s1, string s2) => hostSettings[s1]); - mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) .Returns((string s, bool b) => bool.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) .Returns((string s, int i) => int.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny())) + this.mockHostController.Setup(c => c.GetInteger(It.IsAny())) .Returns((string s) => int.Parse(hostSettings[s])); - HostController.RegisterInstance(mockHostController.Object); if (isHostDefault) { @@ -137,16 +145,14 @@ public void LoadPortalSettings_Loads_Setting_Value(Dictionary te .Returns(new Dictionary { { settingName, settingValue } }); PortalController.SetTestableInstance(mockPortalController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString(It.IsAny())) + this.mockHostController.Setup(c => c.GetString(It.IsAny())) .Returns((string s) => hostSettings[s]); - mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) .Returns((string s1, string s2) => hostSettings[s1]); - mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) .Returns((string s, bool b) => bool.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) .Returns((string s, int i) => int.Parse(hostSettings[s])); - HostController.RegisterInstance(mockHostController.Object); // Act controller.LoadPortalSettings(settings); @@ -178,16 +184,14 @@ public void LoadPortalSettings_Sets_TimeZone_Property_To_Local_TimeZone() .Returns(new Dictionary()); PortalController.SetTestableInstance(mockPortalController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString(It.IsAny())) + this.mockHostController.Setup(c => c.GetString(It.IsAny())) .Returns((string s) => hostSettings[s]); - mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetString(It.IsAny(), It.IsAny())) .Returns((string s1, string s2) => hostSettings[s1]); - mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetBoolean(It.IsAny(), It.IsAny())) .Returns((string s, bool b) => bool.Parse(hostSettings[s])); - mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) + this.mockHostController.Setup(c => c.GetInteger(It.IsAny(), It.IsAny())) .Returns((string s, int i) => int.Parse(hostSettings[s])); - HostController.RegisterInstance(mockHostController.Object); // Act controller.LoadPortalSettings(settings); @@ -409,10 +413,8 @@ public void ConfigureTab_Uses_PortalSettings_DefaultSkin_If_SkinSrc_Not_Set() var validTab = new TabInfo { TabID = ValidTabId, PortalID = ValidPortalId }; settings.ActiveTab = validTab; - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalSkin")).Returns(DefaultSkin); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); + this.mockHostController.Setup(c => c.GetString("DefaultPortalSkin")).Returns(DefaultSkin); + this.mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); var mockLocaleController = new Mock(); mockLocaleController.Setup(c => c.GetLocales(It.IsAny())).Returns(new Dictionary()); @@ -448,9 +450,7 @@ public void ConfigureTab_Uses_Tab_SkinSrc_If_SkinSrc_Set() mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); TabController.SetTestableInstance(mockTabController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); + this.mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); // Act controller.ConfigureActiveTab(settings); @@ -477,9 +477,7 @@ public void ConfigureTab_Formats_Tab_SkinSrc_If_Neccessary() mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); TabController.SetTestableInstance(mockTabController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); + this.mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); // Act controller.ConfigureActiveTab(settings); @@ -507,9 +505,7 @@ public void ConfigureTab_Uses_PortalSettings_DefaultContainer_If_ContainerSrc_No mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); TabController.SetTestableInstance(mockTabController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); + this.mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); // Act controller.ConfigureActiveTab(settings); @@ -588,9 +584,7 @@ public void ConfigureTab_Builds_Breadcrumbs_For_Tab() mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); TabController.SetTestableInstance(mockTabController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); + this.mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); // Act controller.ConfigureActiveTab(settings); @@ -620,9 +614,7 @@ public void ConfigureTab_Builds_Breadcrumbs_For_Tab_And_Parent() mockTabController.Setup(c => c.GetTabsByPortal(HostPortalId)).Returns(new TabCollection()); TabController.SetTestableInstance(mockTabController.Object); - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); - HostController.RegisterInstance(mockHostController.Object); + this.mockHostController.Setup(c => c.GetString("DefaultPortalContainer")).Returns("DefaultPortalContainer"); // Act controller.ConfigureActiveTab(settings); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs index 9c3d90129ef..3030d226003 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs @@ -5,12 +5,13 @@ namespace DotNetNuke.Tests.Core.Providers.Folder { using System; - using System.Collections.Generic; using System.Data; using System.Drawing; using System.IO; - using System.Reflection; using System.Text; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Internal; using DotNetNuke.Common.Utilities; @@ -27,8 +28,11 @@ namespace DotNetNuke.Tests.Core.Providers.Folder using DotNetNuke.Services.Log.EventLog; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; @@ -37,73 +41,75 @@ namespace DotNetNuke.Tests.Core.Providers.Folder [TestFixture] public class FileManagerTests { - private FileManager _fileManager; - private Mock _folderManager; - private Mock _folderPermissionController; - private Mock _portalController; - private Mock _folderMappingController; - private Mock _globals; - private Mock _cbo; - private Mock _mockData; - private Mock _mockFolder; - private Mock _mockCache; - private Mock _mockFileManager; - private Mock _folderInfo; - private Mock _fileInfo; - private Mock _pathUtils; - private Mock _fileVersionController; - private Mock _workflowManager; - private Mock> _fileEventHandlersContainer; - private Mock _mockFileLockingController; - private Mock _mockFileDeletionController; - private Mock _hostController; + private FileManager fileManager; + private Mock folderManager; + private Mock folderPermissionController; + private Mock portalController; + private Mock folderMappingController; + private Mock globals; + private Mock cbo; + private Mock mockData; + private Mock mockFolder; + private Mock mockCache; + private Mock mockFileManager; + private Mock folderInfo; + private Mock fileInfo; + private Mock pathUtils; + private Mock fileVersionController; + private Mock workflowManager; + private Mock> fileEventHandlersContainer; + private Mock mockFileLockingController; + private Mock mockFileDeletionController; + private Mock hostController; [SetUp] public void Setup() { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._mockData = MockComponentProvider.CreateDataProvider(); - this._mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); - this._mockCache = MockComponentProvider.CreateDataCacheProvider(); - - this._folderManager = new Mock(); - this._folderPermissionController = new Mock(); - this._portalController = new Mock(); - this._hostController = new Mock(); - this._folderMappingController = new Mock(); - this._fileVersionController = new Mock(); - this._workflowManager = new Mock(); - this._fileEventHandlersContainer = new Mock>(); - this._globals = new Mock(); - this._cbo = new Mock(); - this._pathUtils = new Mock(); - this._mockFileLockingController = new Mock(); - this._mockFileDeletionController = new Mock(); + this.mockData = MockComponentProvider.CreateDataProvider(); + this.mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); + this.mockCache = MockComponentProvider.CreateDataCacheProvider(); + + this.folderManager = new Mock(); + this.folderPermissionController = new Mock(); + this.portalController = new Mock(); + this.hostController = new Mock(); + this.hostController.As(); + this.folderMappingController = new Mock(); + this.fileVersionController = new Mock(); + this.workflowManager = new Mock(); + this.fileEventHandlersContainer = new Mock>(); + this.globals = new Mock(); + this.cbo = new Mock(); + this.pathUtils = new Mock(); + this.mockFileLockingController = new Mock(); + this.mockFileDeletionController = new Mock(); EventLogController.SetTestableInstance(Mock.Of()); - FolderManager.RegisterInstance(this._folderManager.Object); - FolderPermissionController.SetTestableInstance(this._folderPermissionController.Object); - PortalController.SetTestableInstance(this._portalController.Object); - HostController.RegisterInstance(this._hostController.Object); - FolderMappingController.RegisterInstance(this._folderMappingController.Object); - TestableGlobals.SetTestableInstance(this._globals.Object); - CBO.SetTestableInstance(this._cbo.Object); - PathUtils.RegisterInstance(this._pathUtils.Object); - FileVersionController.RegisterInstance(this._fileVersionController.Object); - WorkflowManager.SetTestableInstance(this._workflowManager.Object); - EventHandlersContainer.RegisterInstance(this._fileEventHandlersContainer.Object); - this._mockFileManager = new Mock { CallBase = true }; - - this._folderInfo = new Mock(); - this._fileInfo = new Mock(); - - this._fileManager = new FileManager(); - - FileLockingController.SetTestableInstance(this._mockFileLockingController.Object); - FileDeletionController.SetTestableInstance(this._mockFileDeletionController.Object); + FolderManager.RegisterInstance(this.folderManager.Object); + FolderPermissionController.SetTestableInstance(this.folderPermissionController.Object); + PortalController.SetTestableInstance(this.portalController.Object); + FolderMappingController.RegisterInstance(this.folderMappingController.Object); + TestableGlobals.SetTestableInstance(this.globals.Object); + CBO.SetTestableInstance(this.cbo.Object); + PathUtils.RegisterInstance(this.pathUtils.Object); + FileVersionController.RegisterInstance(this.fileVersionController.Object); + WorkflowManager.SetTestableInstance(this.workflowManager.Object); + EventHandlersContainer.RegisterInstance(this.fileEventHandlersContainer.Object); + this.mockFileManager = new Mock { CallBase = true }; + + this.folderInfo = new Mock(); + this.fileInfo = new Mock(); + + this.fileManager = new FileManager(); + + FileLockingController.SetTestableInstance(this.mockFileLockingController.Object); + FileDeletionController.SetTestableInstance(this.mockFileDeletionController.Object); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => (INewHostController)this.hostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [TearDown] @@ -124,7 +130,7 @@ public void TearDown() [ExpectedException(typeof(ArgumentNullException))] public void AddFile_Throws_On_Null_Folder() { - this._fileManager.AddFile(null, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); + this.fileManager.AddFile(null, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); } [Test] @@ -133,50 +139,50 @@ public void AddFile_Throws_On_Null_Folder() [ExpectedException(typeof(ArgumentException))] public void AddFile_Throws_On_Null_Or_Empty_FileName(string fileName) { - this._fileManager.AddFile(this._folderInfo.Object, fileName, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); + this.fileManager.AddFile(this.folderInfo.Object, fileName, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); } [Test] [ExpectedException(typeof(ArgumentException))] public void AddFile_Throws_On_Null_FileContent() { - this._fileManager.AddFile(this._folderInfo.Object, It.IsAny(), null, It.IsAny(), It.IsAny(), It.IsAny()); + this.fileManager.AddFile(this.folderInfo.Object, It.IsAny(), null, It.IsAny(), It.IsAny(), It.IsAny()); } [Test] [ExpectedException(typeof(PermissionsNotMetException))] public void AddFile_Throws_When_Permissions_Are_Not_Met() { - this._folderPermissionController.Setup(fpc => fpc.CanAddFolder(this._folderInfo.Object)).Returns(false); + this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(false); - this._fileManager.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, new MemoryStream(), It.IsAny(), true, It.IsAny()); + this.fileManager.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, new MemoryStream(), It.IsAny(), true, It.IsAny()); } [Test] [ExpectedException(typeof(NoSpaceAvailableException))] public void AddFile_Throws_When_Portal_Has_No_Space_Available() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._mockData.Setup(c => c.GetProviderPath()).Returns(string.Empty); + this.mockData.Setup(c => c.GetProviderPath()).Returns(string.Empty); var fileContent = new MemoryStream(); - this._globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(false); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(false); - this._mockFileManager.Setup(fm => fm.CreateFileContentItem()).Returns(new ContentItem()); - this._mockFileManager.Setup(fm => fm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFileManager.Setup(fm => fm.CreateFileContentItem()).Returns(new ContentItem()); + this.mockFileManager.Setup(fm => fm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); - this._mockFileManager.Object.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); } [Test] @@ -184,51 +190,51 @@ public void AddFile_Checks_Space_For_Stream_Length() { // Arrange this.PrepareFileSecurityCheck(); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); var fileContent = new MemoryStream(Encoding.ASCII.GetBytes("some data here")); - this._portalController.Setup(pc => pc.HasSpaceAvailable(It.IsAny(), It.IsAny())).Returns(true); + this.portalController.Setup(pc => pc.HasSpaceAvailable(It.IsAny(), It.IsAny())).Returns(true); - this._globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); - this._mockFolder.Setup(mf => mf.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); + this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); - this._mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); - this._workflowManager.Setup(we => we.GetWorkflow(It.IsAny())).Returns((Workflow)null); + this.workflowManager.Setup(we => we.GetWorkflow(It.IsAny())).Returns((Workflow)null); // Act - this._mockFileManager.Object.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, false, Constants.CONTENTTYPE_ValidContentType); + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, false, Constants.CONTENTTYPE_ValidContentType); // Assert - this._portalController.Verify(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)); + this.portalController.Verify(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)); } [Test] [ExpectedException(typeof(InvalidFileExtensionException))] public void AddFile_Throws_When_Extension_Is_Invalid() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); var fileContent = new MemoryStream(); - this._portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(false); - this._mockFileManager.Object.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); } [TestCase("invalid_script.svg")] @@ -241,10 +247,10 @@ public void AddFile_Throws_When_File_Content_Is_Invalid(string fileName) using (var fileContent = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources\\{fileName}"))) { - this._portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); - this._mockFileManager.Object.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); } } @@ -255,44 +261,44 @@ public void AddFile_No_Error_When_File_Content_Is_Valid() using (var fileContent = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources\\valid.svg"))) { - this._portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); - this._mockFileManager.Object.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); } } [Test] public void AddFile_Does_Not_Call_FolderProvider_AddFile_When_Not_Overwritting_And_File_Exists() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); var fileContent = new MemoryStream(); - this._portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - this._globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); - this._mockFolder.Setup(mf => mf.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)); - this._mockFolder.Setup(mf => mf.GetHashCode(It.IsAny())).Returns("aaa"); + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)); + this.mockFolder.Setup(mf => mf.GetHashCode(It.IsAny())).Returns("aaa"); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.UpdateFile(It.IsAny(), It.IsAny())); - this._mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(It.IsAny(), It.IsAny())); + this.mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); - this._workflowManager.Setup(wc => wc.GetWorkflow(It.IsAny())).Returns((Workflow)null); + this.workflowManager.Setup(wc => wc.GetWorkflow(It.IsAny())).Returns((Workflow)null); - this._mockData.Setup( + this.mockData.Setup( md => md.AddFile( It.IsAny(), @@ -317,25 +323,25 @@ public void AddFile_Does_Not_Call_FolderProvider_AddFile_When_Not_Overwritting_A It.IsAny())) .Returns(Constants.FOLDER_ValidFileId); - this._mockData.Setup(md => md.UpdateFileLastModificationTime(It.IsAny(), It.IsAny())); + this.mockData.Setup(md => md.UpdateFileLastModificationTime(It.IsAny(), It.IsAny())); - this._mockFileManager.Object.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); - this._mockFolder.Verify(mf => mf.AddFile(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); + this.mockFolder.Verify(mf => mf.AddFile(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void CopyFile_Throws_On_Null_File() { - this._fileManager.CopyFile(null, this._folderInfo.Object); + this.fileManager.CopyFile(null, this.folderInfo.Object); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void CopyFile_Throws_On_Null_DestinationFolder() { - this._fileManager.CopyFile(this._fileInfo.Object, null); + this.fileManager.CopyFile(this.fileInfo.Object, null); } [Test] @@ -344,166 +350,166 @@ public void CopyFile_Calls_FileManager_AddFile_When_FolderMapping_Of_Source_And_ const int sourceFolderMappingID = Constants.FOLDER_ValidFolderMappingID; const int destinationFolderMappingID = Constants.FOLDER_ValidFolderMappingID + 1; - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.ContentType).Returns(Constants.CONTENTTYPE_ValidContentType); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(sourceFolderMappingID); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.ContentType).Returns(Constants.CONTENTTYPE_ValidContentType); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(sourceFolderMappingID); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(destinationFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(destinationFolderMappingID); var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var fileContent = new MemoryStream(bytes); - this._mockFileManager.Setup(mfm => mfm.GetFileContent(this._fileInfo.Object)).Returns(fileContent); - this._mockFileManager.Setup(mfm => mfm.CopyContentItem(It.IsAny())).Returns(Constants.CONTENT_ValidContentItemId); - this._mockFileManager.Setup(mfm => mfm.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny(), true, true, Constants.CONTENTTYPE_ValidContentType)); + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); + this.mockFileManager.Setup(mfm => mfm.CopyContentItem(It.IsAny())).Returns(Constants.CONTENT_ValidContentItemId); + this.mockFileManager.Setup(mfm => mfm.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny(), true, true, Constants.CONTENTTYPE_ValidContentType)); - this._mockFileManager.Object.CopyFile(this._fileInfo.Object, this._folderInfo.Object); + this.mockFileManager.Object.CopyFile(this.fileInfo.Object, this.folderInfo.Object); - this._mockFileManager.Verify(fm => fm.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, true, Constants.CONTENTTYPE_ValidContentType), Times.Once()); + this.mockFileManager.Verify(fm => fm.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, true, Constants.CONTENTTYPE_ValidContentType), Times.Once()); } [Test] [ExpectedException(typeof(PermissionsNotMetException))] public void CopyFile_Throws_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Equal_And_Cannot_Add_Folder() { - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderPermissionController.Setup(fpc => fpc.CanAddFolder(this._folderInfo.Object)).Returns(false); + this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(false); - this._fileManager.CopyFile(this._fileInfo.Object, this._folderInfo.Object); + this.fileManager.CopyFile(this.fileInfo.Object, this.folderInfo.Object); } [Test] [ExpectedException(typeof(NoSpaceAvailableException))] public void CopyFile_Throws_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Equal_And_Portal_Has_No_Space_Available() { - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._fileInfo.Setup(fi => fi.Size).Returns(Constants.FOLDER_ValidFileSize); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.Size).Returns(Constants.FOLDER_ValidFileSize); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderPermissionController.Setup(fpc => fpc.CanAddFolder(this._folderInfo.Object)).Returns(true); - this._portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileSize)).Returns(false); + this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(true); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileSize)).Returns(false); - this._fileManager.CopyFile(this._fileInfo.Object, this._folderInfo.Object); + this.fileManager.CopyFile(this.fileInfo.Object, this.folderInfo.Object); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void DeleteFile_Throws_On_Null_File() { - this._fileManager.DeleteFile(null); + this.fileManager.DeleteFile(null); } [Test] public void DeleteFile_Calls_FileDeletionControllerDeleteFile() { - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this._fileInfo.Object)).Verifiable(); + this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this.fileInfo.Object)).Verifiable(); - this._mockFileManager.Object.DeleteFile(this._fileInfo.Object); + this.mockFileManager.Object.DeleteFile(this.fileInfo.Object); - this._mockFileDeletionController.Verify(); + this.mockFileDeletionController.Verify(); } [Test] [ExpectedException(typeof(FolderProviderException))] public void DeleteFile_Throws_WhenFileDeletionControllerThrows() { - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this._fileInfo.Object)) + this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this.fileInfo.Object)) .Throws(); - this._mockFileManager.Object.DeleteFile(this._fileInfo.Object); + this.mockFileManager.Object.DeleteFile(this.fileInfo.Object); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void DownloadFile_Throws_On_Null_File() { - this._fileManager.WriteFileToResponse(null, ContentDisposition.Inline); + this.fileManager.WriteFileToResponse(null, ContentDisposition.Inline); } [Test] [ExpectedException(typeof(PermissionsNotMetException))] public void DownloadFile_Throws_When_Permissions_Are_Not_Met() { - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._folderPermissionController.Setup(fpc => fpc.CanViewFolder(this._folderInfo.Object)).Returns(false); + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(false); - this._fileManager.WriteFileToResponse(this._fileInfo.Object, ContentDisposition.Inline); + this.fileManager.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); } [Test] public void DownloadFile_Calls_FileManager_AutoSyncFile_When_File_AutoSync_Is_Enabled() { - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._folderPermissionController.Setup(fpc => fpc.CanViewFolder(this._folderInfo.Object)).Returns(true); + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(true); - this._mockFileManager.Setup(mfm => mfm.AutoSyncFile(this._fileInfo.Object)).Verifiable(); - this._mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this._fileInfo.Object, It.IsAny())); + this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(true); + this.mockFileManager.Setup(mfm => mfm.AutoSyncFile(this.fileInfo.Object)).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())); - this._mockFileManager.Object.WriteFileToResponse(this._fileInfo.Object, ContentDisposition.Inline); + this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - this._mockFileManager.Verify(); + this.mockFileManager.Verify(); } [Test] public void DownloadFile_Does_Not_Call_FileManager_AutoSyncFile_When_File_AutoSync_Is_Not_Enabled() { - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._folderPermissionController.Setup(fpc => fpc.CanViewFolder(this._folderInfo.Object)).Returns(true); + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); - this._mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this._fileInfo.Object, It.IsAny())); + this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); + this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())); - this._mockFileManager.Object.WriteFileToResponse(this._fileInfo.Object, ContentDisposition.Inline); + this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - this._mockFileManager.Verify(mfm => mfm.AutoSyncFile(this._fileInfo.Object), Times.Never()); + this.mockFileManager.Verify(mfm => mfm.AutoSyncFile(this.fileInfo.Object), Times.Never()); } [Test] public void DownloadFile_Calls_FileManager_WriteBytesToHttpContext() { - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._folderPermissionController.Setup(fpc => fpc.CanViewFolder(this._folderInfo.Object)).Returns(true); + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); - this._mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this._fileInfo.Object, It.IsAny())).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); + this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())).Verifiable(); - this._mockFileManager.Object.WriteFileToResponse(this._fileInfo.Object, ContentDisposition.Inline); + this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - this._mockFileManager.Verify(); + this.mockFileManager.Verify(); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void ExistsFile_Throws_On_Null_Folder() { - this._fileManager.FileExists(null, It.IsAny()); + this.fileManager.FileExists(null, It.IsAny()); } [Test] @@ -512,62 +518,62 @@ public void ExistsFile_Throws_On_Null_Folder() [ExpectedException(typeof(ArgumentException))] public void ExistsFile_Throws_On_Null_Or_Empty_FileName(string fileName) { - this._fileManager.FileExists(this._folderInfo.Object, fileName); + this.fileManager.FileExists(this.folderInfo.Object, fileName); } [Test] public void ExistsFile_Calls_FileManager_GetFile() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._mockFileManager.Setup(mfm => mfm.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(null).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(null).Verifiable(); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFileManager.Object.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName); + this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - this._mockFileManager.Verify(); + this.mockFileManager.Verify(); } [Test] public void ExistsFile_Calls_FolderProvider_ExistsFile() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._mockFileManager.Setup(mfm => mfm.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this._fileInfo.Object); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true).Verifiable(); + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true).Verifiable(); - this._mockFileManager.Object.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName); + this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - this._mockFolder.Verify(); + this.mockFolder.Verify(); } [Test] public void ExistsFile_Returns_True_When_File_Exists() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._mockFileManager.Setup(mfm => mfm.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this._fileInfo.Object); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); - var result = this._mockFileManager.Object.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName); + var result = this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); Assert.IsTrue(result); } @@ -575,19 +581,19 @@ public void ExistsFile_Returns_True_When_File_Exists() [Test] public void ExistsFile_Returns_False_When_File_Does_Not_Exist() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._mockFileManager.Setup(mfm => mfm.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this._fileInfo.Object); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); - var result = this._mockFileManager.Object.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName); + var result = this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); Assert.IsFalse(result); } @@ -596,19 +602,19 @@ public void ExistsFile_Returns_False_When_File_Does_Not_Exist() [ExpectedException(typeof(FolderProviderException))] public void ExistsFile_Throws_When_FolderProvider_Throws() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._mockFileManager.Setup(mfm => mfm.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this._fileInfo.Object); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName)).Throws(); + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Throws(); - this._mockFileManager.Object.FileExists(this._folderInfo.Object, Constants.FOLDER_ValidFileName); + this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); } [Test] @@ -617,197 +623,197 @@ public void ExistsFile_Throws_When_FolderProvider_Throws() [ExpectedException(typeof(ArgumentException))] public void GetFile_Throws_On_Null_Or_Empty_FileName(string fileName) { - this._fileManager.GetFile(this._folderInfo.Object, fileName); + this.fileManager.GetFile(this.folderInfo.Object, fileName); } [Test] public void GetFile_Calls_DataProvider_GetFile() { - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); + this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); - this._fileManager.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName); + this.fileManager.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - this._mockData.Verify(); + this.mockData.Verify(); } [Test] public void GetFile_Handles_Path_In_Portal_Root() { - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, string.Empty)).Returns(this._folderInfo.Object).Verifiable(); - this._mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, string.Empty)).Returns(this.folderInfo.Object).Verifiable(); + this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); - this._fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileName); + this.fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileName); - this._folderManager.Verify(); - this._mockData.Verify(); + this.folderManager.Verify(); + this.mockData.Verify(); } [Test] public void GetFile_Handles_Path_Beyond_Portal_Root() { - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this._folderInfo.Object).Verifiable(); - this._mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this.folderInfo.Object).Verifiable(); + this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); - this._fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath + Constants.FOLDER_ValidFileName); + this.fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath + Constants.FOLDER_ValidFileName); - this._folderManager.Verify(); - this._mockData.Verify(); + this.folderManager.Verify(); + this.mockData.Verify(); } [Test] public void GetFileByID_Does_Not_Call_DataCache_GetCache_If_FileId_Is_Not_Valid() { - this._mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this._fileInfo.Object).Verifiable(); + this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this.fileInfo.Object).Verifiable(); - this._fileManager.GetFile(Constants.FOLDER_InvalidFileId); + this.fileManager.GetFile(Constants.FOLDER_InvalidFileId); - this._mockCache.Verify(mc => mc.GetItem(It.IsAny()), Times.Never()); + this.mockCache.Verify(mc => mc.GetItem(It.IsAny()), Times.Never()); } [Test] public void GetFileByID_Calls_DataCache_GetCache_First() { - this._mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this._fileInfo.Object).Verifiable(); + this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this.fileInfo.Object).Verifiable(); - this._fileManager.GetFile(Constants.FOLDER_ValidFileId); + this.fileManager.GetFile(Constants.FOLDER_ValidFileId); - this._mockCache.Verify(); + this.mockCache.Verify(); } [Test] public void GetFileByID_Calls_DataProvider_GetFileById_When_File_Is_Not_In_Cache() { - this._mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(null); + this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(null); - this._fileManager.GetFile(Constants.FOLDER_ValidFileId); + this.fileManager.GetFile(Constants.FOLDER_ValidFileId); - this._mockData.Verify(md => md.GetFileById(Constants.FOLDER_ValidFileId, It.IsAny()), Times.Once()); + this.mockData.Verify(md => md.GetFileById(Constants.FOLDER_ValidFileId, It.IsAny()), Times.Once()); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void MoveFile_Throws_On_Null_File() { - this._fileManager.MoveFile(null, this._folderInfo.Object); + this.fileManager.MoveFile(null, this.folderInfo.Object); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void MoveFile_Throws_On_Null_DestinationFolder() { - this._fileManager.MoveFile(this._fileInfo.Object, null); + this.fileManager.MoveFile(this.fileInfo.Object, null); } [Test] public void MoveFile_Calls_FolderProvider_AddFile_And_DeleteFile_And_FileManager_UpdateFile() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); var fileContent = new MemoryStream(); - this._mockFileManager.Setup(mfm => mfm.GetFileContent(this._fileInfo.Object)).Returns(fileContent); + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); string someString; - this._mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this._fileInfo.Object, out someString)).Returns(false); - this._mockFileManager.Setup(mfm => mfm.MoveVersions(this._fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); + this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); - this._mockFolder.Setup(mf => mf.AddFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); - this._mockFolder.Setup(mf => mf.DeleteFile(this._fileInfo.Object)).Verifiable(); + this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFile(this.fileInfo.Object)).Verifiable(); - this._mockFileManager.Setup(mfm => mfm.UpdateFile(this._fileInfo.Object)).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)).Verifiable(); - this._mockFileManager.Object.MoveFile(this._fileInfo.Object, this._folderInfo.Object); + this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); - this._mockFolder.Verify(); - this._mockFileManager.Verify(); + this.mockFolder.Verify(); + this.mockFileManager.Verify(); } [Test] public void MoveFile_Updates_FolderId_And_Folder() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._fileInfo.Setup(fi => fi.Folder).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.Folder).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_OtherValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_OtherValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._fileInfo.SetupSet(fi => fi.FolderId = Constants.FOLDER_OtherValidFolderId).Verifiable(); - this._fileInfo.SetupSet(fi => fi.Folder = Constants.FOLDER_OtherValidFolderRelativePath).Verifiable(); + this.fileInfo.SetupSet(fi => fi.FolderId = Constants.FOLDER_OtherValidFolderId).Verifiable(); + this.fileInfo.SetupSet(fi => fi.Folder = Constants.FOLDER_OtherValidFolderRelativePath).Verifiable(); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); var fileContent = new MemoryStream(); - this._mockFileManager.Setup(mfm => mfm.GetFileContent(this._fileInfo.Object)).Returns(fileContent); + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); string someString; - this._mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this._fileInfo.Object, out someString)).Returns(false); - this._mockFileManager.Setup(mfm => mfm.MoveVersions(this._fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); - this._mockFileManager.Object.MoveFile(this._fileInfo.Object, this._folderInfo.Object); + this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); + this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); - this._fileInfo.Verify(); + this.fileInfo.Verify(); } [Test] public void MoveFile_Calls_DeleteFile_When_A_File_With_The_Same_Name_Exists_On_The_Destination_Folder() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); var fileContent = new MemoryStream(); - this._mockFileManager.Setup(mfm => mfm.GetFileContent(this._fileInfo.Object)).Returns(fileContent); + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); string someString; - this._mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this._fileInfo.Object, out someString)).Returns(false); - this._mockFileManager.Setup(mfm => mfm.MoveVersions(this._fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); + this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); var existingFile = new FileInfo(); - this._mockFileManager.Setup(mfm => mfm.GetFile(this._folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(existingFile); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(existingFile); - this._mockFileManager.Setup(mfm => mfm.DeleteFile(existingFile)).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.DeleteFile(existingFile)).Verifiable(); - this._mockFileManager.Object.MoveFile(this._fileInfo.Object, this._folderInfo.Object); + this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); - this._mockFileManager.Verify(); + this.mockFileManager.Verify(); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void RenameFile_Throws_On_Null_File() { - this._fileManager.RenameFile(null, It.IsAny()); + this.fileManager.RenameFile(null, It.IsAny()); } [Test] @@ -816,147 +822,147 @@ public void RenameFile_Throws_On_Null_File() [ExpectedException(typeof(ArgumentException))] public void RenameFile_Throws_On_Null_Or_Empty_NewFileName(string newFileName) { - this._fileManager.RenameFile(this._fileInfo.Object, newFileName); + this.fileManager.RenameFile(this.fileInfo.Object, newFileName); } [Test] public void RenameFile_Calls_FolderProvider_RenameFile_When_FileNames_Are_Distinct_And_NewFileName_Does_Not_Exist() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._mockFileManager.Setup(mfm => mfm.FileExists(this._folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); - this._mockFileManager.Setup(mfm => mfm.UpdateFile(this._fileInfo.Object)); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); var folderMapping = new FolderMappingInfo(); folderMapping.FolderProviderType = Constants.FOLDER_ValidFolderProviderType; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFileManager.Object.RenameFile(this._fileInfo.Object, Constants.FOLDER_OtherValidFileName); + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); - this._mockFolder.Verify(mf => mf.RenameFile(this._fileInfo.Object, Constants.FOLDER_OtherValidFileName), Times.Once()); + this.mockFolder.Verify(mf => mf.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName), Times.Once()); } [Test] public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_FileNames_Are_Equal() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileManager.RenameFile(this._fileInfo.Object, Constants.FOLDER_ValidFileName); + this.fileManager.RenameFile(this.fileInfo.Object, Constants.FOLDER_ValidFileName); - this._mockFolder.Verify(mf => mf.RenameFile(this._fileInfo.Object, It.IsAny()), Times.Never()); + this.mockFolder.Verify(mf => mf.RenameFile(this.fileInfo.Object, It.IsAny()), Times.Never()); } [Test] [ExpectedException(typeof(FileAlreadyExistsException))] public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_NewFileName_Exists() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._mockFileManager.Setup(mfm => mfm.FileExists(this._folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(true); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); - this._mockFileManager.Object.RenameFile(this._fileInfo.Object, Constants.FOLDER_OtherValidFileName); + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); } [Test] [ExpectedException(typeof(InvalidFileExtensionException))] public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_InvalidExtensionType() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); - this._mockFileManager.Setup(fm => fm.IsAllowedExtension(It.IsAny())).Returns(false); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + this.mockFileManager.Setup(fm => fm.IsAllowedExtension(It.IsAny())).Returns(false); - this._mockFileManager.Object.RenameFile(this._fileInfo.Object, Constants.FOLDER_OtherInvalidFileNameExtension); + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherInvalidFileNameExtension); } [Test] [ExpectedException(typeof(FolderProviderException))] public void RenameFile_Throws_When_FolderProvider_Throws() { - this._fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this._fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this._fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this._fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this._folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this._folderInfo.Object); + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this._mockFileManager.Setup(mfm => mfm.FileExists(this._folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); - this._mockFileManager.Setup(mfm => mfm.UpdateFile(this._fileInfo.Object)); - this._mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); var folderMapping = new FolderMappingInfo(); folderMapping.FolderProviderType = Constants.FOLDER_ValidFolderProviderType; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.RenameFile(this._fileInfo.Object, Constants.FOLDER_OtherValidFileName)).Throws(); + this.mockFolder.Setup(mf => mf.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName)).Throws(); - this._mockFileManager.Object.RenameFile(this._fileInfo.Object, Constants.FOLDER_OtherValidFileName); + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void UnzipFile_Throws_On_Null_File() { - this._fileManager.UnzipFile(null, It.IsAny()); + this.fileManager.UnzipFile(null, It.IsAny()); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void UnzipFile_Throws_On_Null_DestinationFolder() { - this._fileManager.UnzipFile(It.IsAny(), null); + this.fileManager.UnzipFile(It.IsAny(), null); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void UnzipFile_Throws_When_File_Extension_Is_Not_Zip() { - this._fileInfo.Setup(fi => fi.Extension).Returns("txt"); + this.fileInfo.Setup(fi => fi.Extension).Returns("txt"); - this._fileManager.UnzipFile(this._fileInfo.Object, It.IsAny()); + this.fileManager.UnzipFile(this.fileInfo.Object, It.IsAny()); } [Test] public void UnzipFile_Calls_FileManager_ExtractFiles() { - this._fileInfo.Setup(fi => fi.Extension).Returns("zip"); + this.fileInfo.Setup(fi => fi.Extension).Returns("zip"); - this._mockFileManager.Setup(mfm => mfm.ExtractFiles(this._fileInfo.Object, this._folderInfo.Object, null)).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.ExtractFiles(this.fileInfo.Object, this.folderInfo.Object, null)).Verifiable(); - this._mockFileManager.Object.UnzipFile(this._fileInfo.Object, this._folderInfo.Object); + this.mockFileManager.Object.UnzipFile(this.fileInfo.Object, this.folderInfo.Object); - this._mockFileManager.Verify(); + this.mockFileManager.Verify(); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void UpdateFile_Throws_On_Null_File() { - this._fileManager.UpdateFile(null); + this.fileManager.UpdateFile(null); } [Test] public void UpdateFile_Calls_DataProvider_UpdateFile() { - this._fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this._mockFileManager.Object.UpdateFile(this._fileInfo.Object); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object); - this._mockData.Verify( + this.mockData.Verify( md => md.UpdateFile( It.IsAny(), It.IsAny(), @@ -983,7 +989,7 @@ public void UpdateFile_Calls_DataProvider_UpdateFile() [ExpectedException(typeof(ArgumentNullException))] public void UpdateFile_Throws_On_Null_File_Overload() { - this._fileManager.UpdateFile(null, It.IsAny()); + this.fileManager.UpdateFile(null, It.IsAny()); } [Test] @@ -991,22 +997,22 @@ public void UpdateFile_Sets_With_And_Height_When_File_Is_Image() { var image = new Bitmap(10, 20); - this._mockFileManager.Setup(mfm => mfm.IsImageFile(this._fileInfo.Object)).Returns(true); - this._mockFileManager.Setup(mfm => mfm.GetImageFromStream(It.IsAny())).Returns(image); - this._mockFileManager.Setup(mfm => mfm.GetHash(this._fileInfo.Object)); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.GetImageFromStream(It.IsAny())).Returns(image); + this.mockFileManager.Setup(mfm => mfm.GetHash(this.fileInfo.Object)); var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var stream = new MemoryStream(bytes); - this._fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this._folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); - this._mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); + this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); + this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); - this._mockFileManager.Object.UpdateFile(this._fileInfo.Object, stream); + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); - this._fileInfo.VerifySet(fi => fi.Width = 10); - this._fileInfo.VerifySet(fi => fi.Height = 20); + this.fileInfo.VerifySet(fi => fi.Width = 10); + this.fileInfo.VerifySet(fi => fi.Height = 20); } [Test] @@ -1015,17 +1021,17 @@ public void UpdateFile_Sets_SHA1Hash() var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var stream = new MemoryStream(bytes); - this._mockFileManager.Setup(mfm => mfm.IsImageFile(this._fileInfo.Object)).Returns(false); - this._mockFileManager.Setup(mfm => mfm.GetHash(stream)).Returns(Constants.FOLDER_UnmodifiedFileHash); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.GetHash(stream)).Returns(Constants.FOLDER_UnmodifiedFileHash); - this._fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this._folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); - this._mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); + this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); + this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); - this._mockFileManager.Object.UpdateFile(this._fileInfo.Object, stream); + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); - this._fileInfo.VerifySet(fi => fi.SHA1Hash = Constants.FOLDER_UnmodifiedFileHash); + this.fileInfo.VerifySet(fi => fi.SHA1Hash = Constants.FOLDER_UnmodifiedFileHash); } [Test] @@ -1034,31 +1040,31 @@ public void UpdateFile_Calls_FileManager_UpdateFile_Overload() var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var stream = new MemoryStream(bytes); - this._mockFileManager.Setup(mfm => mfm.IsImageFile(this._fileInfo.Object)).Returns(false); - this._mockFileManager.Setup(mfm => mfm.GetHash(this._fileInfo.Object)).Returns(Constants.FOLDER_UnmodifiedFileHash); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.GetHash(this.fileInfo.Object)).Returns(Constants.FOLDER_UnmodifiedFileHash); - this._fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this._folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); - this._mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); + this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); + this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); - this._mockFileManager.Object.UpdateFile(this._fileInfo.Object, stream); + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); - this._mockFileManager.Verify(mfm => mfm.UpdateFile(this._fileInfo.Object), Times.Once()); + this.mockFileManager.Verify(mfm => mfm.UpdateFile(this.fileInfo.Object), Times.Once()); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void GetSeekableStream_Throws_On_Null_Stream() { - this._fileManager.GetSeekableStream(null); + this.fileManager.GetSeekableStream(null); } [Test] public void GetSeekableStream_Returns_The_Same_Stream_If_It_Is_Seekable() { var inputStream = new MemoryStream(); - var seekableStream = this._fileManager.GetSeekableStream(inputStream); + var seekableStream = this.fileManager.GetSeekableStream(inputStream); Assert.AreEqual(inputStream, seekableStream); } @@ -1070,17 +1076,17 @@ public void GetSeekableStream_Calls_GetHostMapPath_And_Creates_A_Temporary_FileS inputStream.Setup(s => s.CanSeek).Returns(false); inputStream.Setup(s => s.Read(It.IsAny(), It.IsAny(), It.IsAny())).Returns(0); - this._mockFileManager.Setup(mfm => mfm.GetHostMapPath()).Returns(string.Empty).Verifiable(); - this._mockFileManager.Setup(mfm => mfm.GetAutoDeleteFileStream(It.Is((string x) => x.EndsWith(".resx")))).Returns(new MemoryStream()).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.GetHostMapPath()).Returns(string.Empty).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.GetAutoDeleteFileStream(It.Is((string x) => x.EndsWith(".resx")))).Returns(new MemoryStream()).Verifiable(); - this._mockFileManager.Object.GetSeekableStream(inputStream.Object); + this.mockFileManager.Object.GetSeekableStream(inputStream.Object); - this._mockFileManager.Verify(); + this.mockFileManager.Verify(); } private void PrepareFileSecurityCheck() { - this._mockData.Setup(p => p.GetListEntriesByListName("FileSecurityChecker", string.Empty, Null.NullInteger)).Returns(() => + this.mockData.Setup(p => p.GetListEntriesByListName("FileSecurityChecker", string.Empty, Null.NullInteger)).Returns(() => { var dataTable = new DataTable(); dataTable.Columns.Add("EntryID", typeof(int)); @@ -1111,15 +1117,15 @@ private void PrepareFileSecurityCheck() return dataTable.CreateDataReader(); }); - this._hostController.Setup(c => c.GetString("PerformanceSetting")).Returns("NoCaching"); - this._globals.Setup(g => g.HostMapPath).Returns(AppDomain.CurrentDomain.BaseDirectory); + this.hostController.Setup(c => c.GetString("PerformanceSetting")).Returns("NoCaching"); + this.globals.Setup(g => g.HostMapPath).Returns(AppDomain.CurrentDomain.BaseDirectory); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); } private class UnSeekableStream : MemoryStream diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FolderManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FolderManagerTests.cs index 5056140ebe1..b295473477b 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FolderManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FolderManagerTests.cs @@ -2,73 +2,84 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Providers.Folder -{ - using System; - using System.Collections; - using System.Collections.Generic; - using System.Data; - using System.IO; - using System.Linq; - using System.Web.Caching; - - using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.FileSystem; - using DotNetNuke.Services.FileSystem.Internal; - using DotNetNuke.Services.Log.EventLog; - using DotNetNuke.Tests.Core.Providers.Builders; - using DotNetNuke.Tests.Utilities; - using DotNetNuke.Tests.Utilities.Mocks; - using Moq; - using NUnit.Framework; - - using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; - - [TestFixture] - public class FolderManagerTests +namespace DotNetNuke.Tests.Core.Providers.Folder +{ + using System; + using System.Collections.Generic; + using System.Data; + using System.Linq; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Data; + using DotNetNuke.Services.FileSystem; + using DotNetNuke.Services.FileSystem.Internal; + using DotNetNuke.Services.Log.EventLog; + using DotNetNuke.Tests.Core.Providers.Builders; + using DotNetNuke.Tests.Utilities; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + + using Moq; + + using NUnit.Framework; + + using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; + + [TestFixture] + public class FolderManagerTests { - private FolderManager _folderManager; - private Mock _mockFolder; - private Mock _mockData; - private Mock _mockFolderManager; - private Mock _folderInfo; - private Mock _folderMappingController; - private Mock _directory; - private Mock _file; - private Mock _cbo; - private Mock _pathUtils; - private Mock _mockUserSecurityController; - private Mock _mockFileDeletionController; + private FolderManager folderManager; + private Mock mockFolder; + private Mock mockData; + private Mock mockFolderManager; + private Mock folderInfo; + private Mock folderMappingController; + private Mock directory; + private Mock file; + private Mock cbo; + private Mock pathUtils; + private Mock mockUserSecurityController; + private Mock mockFileDeletionController; [SetUp] public void Setup() { - this._mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); - this._mockData = MockComponentProvider.CreateDataProvider(); + this.mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); + this.mockData = MockComponentProvider.CreateDataProvider(); - this._folderMappingController = new Mock(); - this._directory = new Mock(); - this._file = new Mock(); - this._cbo = new Mock(); - this._pathUtils = new Mock(); - this._mockUserSecurityController = new Mock(); - this._mockFileDeletionController = new Mock(); + this.folderMappingController = new Mock(); + this.directory = new Mock(); + this.file = new Mock(); + this.cbo = new Mock(); + this.pathUtils = new Mock(); + this.mockUserSecurityController = new Mock(); + this.mockFileDeletionController = new Mock(); - FolderMappingController.RegisterInstance(this._folderMappingController.Object); - DirectoryWrapper.RegisterInstance(this._directory.Object); - FileWrapper.RegisterInstance(this._file.Object); - CBO.SetTestableInstance(this._cbo.Object); - PathUtils.RegisterInstance(this._pathUtils.Object); - UserSecurityController.SetTestableInstance(this._mockUserSecurityController.Object); - FileDeletionController.SetTestableInstance(this._mockFileDeletionController.Object); + FolderMappingController.RegisterInstance(this.folderMappingController.Object); + DirectoryWrapper.RegisterInstance(this.directory.Object); + FileWrapper.RegisterInstance(this.file.Object); + CBO.SetTestableInstance(this.cbo.Object); + PathUtils.RegisterInstance(this.pathUtils.Object); + UserSecurityController.SetTestableInstance(this.mockUserSecurityController.Object); + FileDeletionController.SetTestableInstance(this.mockFileDeletionController.Object); - this._mockFolderManager = new Mock { CallBase = true }; + this.mockFolderManager = new Mock { CallBase = true }; - this._folderManager = new FolderManager(); + this.folderManager = new FolderManager(); - this._folderInfo = new Mock(); + this.folderInfo = new Mock(); + + var serviceCollection = new ServiceCollection(); + var mockStatusInfo = new Mock(); + mockStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.None); + + serviceCollection.AddTransient(container => mockStatusInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [TearDown] @@ -80,13 +91,14 @@ public void TearDown() CBO.ClearInstance(); FileDeletionController.ClearInstance(); MockComponentProvider.ResetContainer(); + Globals.DependencyProvider = null; } [Test] [ExpectedException(typeof(ArgumentNullException))] public void AddFolder_Throws_On_Null_FolderPath() { - this._folderManager.AddFolder(It.IsAny(), null); + this.folderManager.AddFolder(It.IsAny(), null); } // [Test] @@ -166,9 +178,9 @@ public void AddFolder_Throws_When_Folder_Already_Exists() PortalID = Constants.CONTENT_ValidPortalId, }; - this._mockFolderManager.Setup(mfm => mfm.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidSubFolderRelativePath)).Returns(true); + this.mockFolderManager.Setup(mfm => mfm.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidSubFolderRelativePath)).Returns(true); - this._mockFolderManager.Object.AddFolder(folderMapping, Constants.FOLDER_ValidSubFolderRelativePath); + this.mockFolderManager.Object.AddFolder(folderMapping, Constants.FOLDER_ValidSubFolderRelativePath); } [Test] @@ -181,16 +193,16 @@ public void AddFolder_Throws_When_FolderPath_Is_Invalid() PortalID = Constants.CONTENT_ValidPortalId, }; - this._mockFolderManager + this.mockFolderManager .Setup(mfm => mfm.FolderExists(It.IsAny(), It.IsAny())) .Returns(false); - this._mockFolderManager + this.mockFolderManager .Setup(mfm => mfm.IsValidFolderPath(It.IsAny())) .Returns(false); // act - this._mockFolderManager.Object.AddFolder(folderMapping, Constants.FOLDER_ValidSubFolderRelativePath); + this.mockFolderManager.Object.AddFolder(folderMapping, Constants.FOLDER_ValidSubFolderRelativePath); // assert (implicit) } @@ -201,7 +213,7 @@ public void IsValidFolderPath_Returns_True_When_FolderPath_Is_Valid() // arrange (implicit) // act - var result = this._mockFolderManager.Object.IsValidFolderPath(Constants.FOLDER_ValidSubFolderRelativePath); + var result = this.mockFolderManager.Object.IsValidFolderPath(Constants.FOLDER_ValidSubFolderRelativePath); // assert Assert.IsTrue(result); @@ -213,7 +225,7 @@ public void IsValidFolderPath_Returns_False_When_FolderPath_Is_Invalid() // arrange (implicit) // act - var result = this._mockFolderManager.Object.IsValidFolderPath(Constants.FOLDER_InvalidSubFolderRelativePath); + var result = this.mockFolderManager.Object.IsValidFolderPath(Constants.FOLDER_InvalidSubFolderRelativePath); // assert Assert.IsFalse(result); @@ -223,7 +235,7 @@ public void IsValidFolderPath_Returns_False_When_FolderPath_Is_Invalid() [ExpectedException(typeof(ArgumentNullException))] public void DeleteFolder_Throws_On_Null_Folder() { - this._folderManager.DeleteFolder(null); + this.folderManager.DeleteFolder(null); } [Test] @@ -232,11 +244,11 @@ public void DeleteFolder_Throws_OnNullFolder_WhenRecursive() { // Arrange var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); // Act var notDeletedSubfolders = new List(); - this._folderManager.DeleteFolder(null, notDeletedSubfolders); + this.folderManager.DeleteFolder(null, notDeletedSubfolders); } [Test] @@ -248,23 +260,23 @@ public void DeleteFolder_CallsFolderProviderDeleteFolder_WhenRecursive() .Build(); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(folderInfo)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFolder(folderInfo)).Verifiable(); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(new List()); - this._mockFolderManager.Setup(mfm => mfm.GetFiles(folderInfo, It.IsAny(), It.IsAny())).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(folderInfo, It.IsAny(), It.IsAny())).Returns(new List()); - this._mockUserSecurityController.Setup(musc => musc.HasFolderPermission(folderInfo, "DELETE")).Returns(true); + this.mockUserSecurityController.Setup(musc => musc.HasFolderPermission(folderInfo, "DELETE")).Returns(true); // Act var subfoldersNotDeleted = new List(); - this._mockFolderManager.Object.DeleteFolder(folderInfo, subfoldersNotDeleted); + this.mockFolderManager.Object.DeleteFolder(folderInfo, subfoldersNotDeleted); // Assert - this._mockFolder.Verify(); + this.mockFolder.Verify(); Assert.AreEqual(0, subfoldersNotDeleted.Count); } @@ -292,27 +304,27 @@ public void DeleteFolder_CallsFolderProviderDeleteFolder_WhenRecursive_WhenExist }; var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(folderInfo)).Verifiable(); - this._mockFolder.Setup(mf => mf.DeleteFolder(subfolder1)).Verifiable(); - this._mockFolder.Setup(mf => mf.DeleteFolder(subfolder2)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFolder(folderInfo)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFolder(subfolder1)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFolder(subfolder2)).Verifiable(); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(subfolders); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsNotIn(folderInfo))).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(subfolders); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsNotIn(folderInfo))).Returns(new List()); - this._mockFolderManager.Setup(mfm => mfm.GetFiles(It.IsAny(), It.IsAny(), It.IsAny())).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(It.IsAny(), It.IsAny(), It.IsAny())).Returns(new List()); - this._mockUserSecurityController.Setup(musc => musc.HasFolderPermission(It.IsAny(), "DELETE")).Returns(true); + this.mockUserSecurityController.Setup(musc => musc.HasFolderPermission(It.IsAny(), "DELETE")).Returns(true); // Act var subfoldersNotDeleted = new List(); - this._mockFolderManager.Object.DeleteFolder(folderInfo, subfoldersNotDeleted); + this.mockFolderManager.Object.DeleteFolder(folderInfo, subfoldersNotDeleted); // Assert - this._mockFolder.Verify(); + this.mockFolder.Verify(); Assert.AreEqual(0, subfoldersNotDeleted.Count); } @@ -340,23 +352,23 @@ public void DeleteFolder_SubFoldersCollectionIsNotEmpty_WhenRecursive_WhenUserHa }; var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(subfolder1)); + this.mockFolder.Setup(mf => mf.DeleteFolder(subfolder1)); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(subfolders); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsNotIn(folderInfo))).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(subfolders); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsNotIn(folderInfo))).Returns(new List()); - this._mockFolderManager.Setup(mfm => mfm.GetFiles(It.IsAny(), It.IsAny(), It.IsAny())).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(It.IsAny(), It.IsAny(), It.IsAny())).Returns(new List()); - this._mockUserSecurityController.Setup(musc => musc.HasFolderPermission(subfolder2, "DELETE")).Returns(false); - this._mockUserSecurityController.Setup(musc => musc.HasFolderPermission(It.IsNotIn(subfolder2), "DELETE")).Returns(true); + this.mockUserSecurityController.Setup(musc => musc.HasFolderPermission(subfolder2, "DELETE")).Returns(false); + this.mockUserSecurityController.Setup(musc => musc.HasFolderPermission(It.IsNotIn(subfolder2), "DELETE")).Returns(true); // Act var subfoldersNotDeleted = new List(); - this._mockFolderManager.Object.DeleteFolder(folderInfo, subfoldersNotDeleted); + this.mockFolderManager.Object.DeleteFolder(folderInfo, subfoldersNotDeleted); // Assert Assert.AreEqual(2, subfoldersNotDeleted.Count); // folderInfo and subfolder2 are not deleted @@ -385,128 +397,128 @@ public void DeleteFolder_Throws_OnFileDeletionControllerThrows_WhenRecursive_Whe }; var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); // _mockFolder.Setup(mf => mf.DeleteFolder(folderInfo)); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(folderInfo)).Returns(new List()); - this._mockFolderManager.Setup(mfm => mfm.GetFiles(folderInfo, It.IsAny(), It.IsAny())).Returns(files); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(folderInfo, It.IsAny(), It.IsAny())).Returns(files); - this._mockUserSecurityController.Setup(musc => musc.HasFolderPermission(It.IsAny(), "DELETE")).Returns(true); + this.mockUserSecurityController.Setup(musc => musc.HasFolderPermission(It.IsAny(), "DELETE")).Returns(true); - this._mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(fileInfo1)); - this._mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(fileInfo2)).Throws(); + this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(fileInfo1)); + this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(fileInfo2)).Throws(); // Act - this._mockFolderManager.Object.DeleteFolder(folderInfo, new List()); + this.mockFolderManager.Object.DeleteFolder(folderInfo, new List()); } [Test] public void DeleteFolder_Calls_FolderProvider_DeleteFolder() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(this._folderInfo.Object)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFolder(this.folderInfo.Object)).Verifiable(); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); - this._mockFolderManager.Object.DeleteFolder(this._folderInfo.Object); + this.mockFolderManager.Object.DeleteFolder(this.folderInfo.Object); - this._mockFolder.Verify(); + this.mockFolder.Verify(); } [Test] [ExpectedException(typeof(FolderProviderException))] public void DeleteFolder_Throws_When_FolderProvider_Throws() { - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(this._folderInfo.Object)).Throws(); + this.mockFolder.Setup(mf => mf.DeleteFolder(this.folderInfo.Object)).Throws(); - this._mockFolderManager.Object.DeleteFolder(this._folderInfo.Object); + this.mockFolderManager.Object.DeleteFolder(this.folderInfo.Object); } [Test] public void DeleteFolder_Calls_Directory_Delete_When_Directory_Exists() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(this._folderInfo.Object)); + this.mockFolder.Setup(mf => mf.DeleteFolder(this.folderInfo.Object)); - this._directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(true); - this._directory.Setup(d => d.Delete(Constants.FOLDER_ValidFolderPath, true)).Verifiable(); + this.directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(true); + this.directory.Setup(d => d.Delete(Constants.FOLDER_ValidFolderPath, true)).Verifiable(); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); - this._mockFolderManager.Object.DeleteFolder(this._folderInfo.Object); + this.mockFolderManager.Object.DeleteFolder(this.folderInfo.Object); - this._directory.Verify(); + this.directory.Verify(); } [Test] public void DeleteFolder_Calls_FolderManager_DeleteFolder_Overload() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - this._folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolder.Setup(mf => mf.DeleteFolder(this._folderInfo.Object)); + this.mockFolder.Setup(mf => mf.DeleteFolder(this.folderInfo.Object)); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Verifiable(); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Verifiable(); - this._mockFolderManager.Object.DeleteFolder(this._folderInfo.Object); + this.mockFolderManager.Object.DeleteFolder(this.folderInfo.Object); - this._mockFolderManager.Verify(); + this.mockFolderManager.Verify(); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void ExistsFolder_Throws_On_Null_FolderPath() { - this._folderManager.FolderExists(Constants.CONTENT_ValidPortalId, null); + this.folderManager.FolderExists(Constants.CONTENT_ValidPortalId, null); } [Test] public void ExistsFolder_Calls_FolderManager_GetFolder() { - this._mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this._folderInfo.Object).Verifiable(); + this.mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this.folderInfo.Object).Verifiable(); - this._mockFolderManager.Object.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + this.mockFolderManager.Object.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); - this._mockFolderManager.Verify(); + this.mockFolderManager.Verify(); } [Test] public void ExistsFolder_Returns_True_When_Folder_Exists() { - this._mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this._folderInfo.Object); + this.mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this.folderInfo.Object); - var result = this._mockFolderManager.Object.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + var result = this.mockFolderManager.Object.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); Assert.IsTrue(result); } @@ -514,9 +526,9 @@ public void ExistsFolder_Returns_True_When_Folder_Exists() [Test] public void ExistsFolder_Returns_False_When_Folder_Does_Not_Exist() { - this._mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(null); + this.mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(null); - var result = this._mockFolderManager.Object.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + var result = this.mockFolderManager.Object.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); Assert.IsFalse(result); } @@ -525,36 +537,36 @@ public void ExistsFolder_Returns_False_When_Folder_Does_Not_Exist() [ExpectedException(typeof(ArgumentNullException))] public void GetFilesByFolder_Throws_On_Null_Folder() { - this._folderManager.GetFiles(null); + this.folderManager.GetFiles(null); } [Test] public void GetFilesByFolder_Calls_DataProvider_GetFiles() { - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); var files = new DataTable(); files.Columns.Add("FolderName"); var dr = files.CreateDataReader(); - this._mockData.Setup(md => md.GetFiles(Constants.FOLDER_ValidFolderId, It.IsAny(), It.IsAny())).Returns(dr).Verifiable(); + this.mockData.Setup(md => md.GetFiles(Constants.FOLDER_ValidFolderId, It.IsAny(), It.IsAny())).Returns(dr).Verifiable(); var filesList = new List { new FileInfo() { FileName = Constants.FOLDER_ValidFileName } }; - this._cbo.Setup(cbo => cbo.FillCollection(dr)).Returns(filesList); + this.cbo.Setup(cbo => cbo.FillCollection(dr)).Returns(filesList); - this._folderManager.GetFiles(this._folderInfo.Object); + this.folderManager.GetFiles(this.folderInfo.Object); - this._mockData.Verify(); + this.mockData.Verify(); } [Test] public void GetFilesByFolder_Count_Equals_DataProvider_GetFiles_Count() { - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); var files = new DataTable(); files.Columns.Add("FileName"); @@ -562,13 +574,13 @@ public void GetFilesByFolder_Count_Equals_DataProvider_GetFiles_Count() var dr = files.CreateDataReader(); - this._mockData.Setup(md => md.GetFiles(Constants.FOLDER_ValidFolderId, It.IsAny(), It.IsAny())).Returns(dr); + this.mockData.Setup(md => md.GetFiles(Constants.FOLDER_ValidFolderId, It.IsAny(), It.IsAny())).Returns(dr); var filesList = new List { new FileInfo { FileName = Constants.FOLDER_ValidFileName } }; - this._cbo.Setup(cbo => cbo.FillCollection(dr)).Returns(filesList); + this.cbo.Setup(cbo => cbo.FillCollection(dr)).Returns(filesList); - var result = this._folderManager.GetFiles(this._folderInfo.Object).ToList(); + var result = this.folderManager.GetFiles(this.folderInfo.Object).ToList(); Assert.AreEqual(1, result.Count); } @@ -576,8 +588,8 @@ public void GetFilesByFolder_Count_Equals_DataProvider_GetFiles_Count() [Test] public void GetFilesByFolder_Returns_Valid_FileNames_When_Folder_Contains_Files() { - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); var files = new DataTable(); files.Columns.Add("FileName"); @@ -586,7 +598,7 @@ public void GetFilesByFolder_Returns_Valid_FileNames_When_Folder_Contains_Files( var dr = files.CreateDataReader(); - this._mockData.Setup(md => md.GetFiles(Constants.FOLDER_ValidFolderId, It.IsAny(), It.IsAny())).Returns(dr); + this.mockData.Setup(md => md.GetFiles(Constants.FOLDER_ValidFolderId, It.IsAny(), It.IsAny())).Returns(dr); var filesList = new List { @@ -594,9 +606,9 @@ public void GetFilesByFolder_Returns_Valid_FileNames_When_Folder_Contains_Files( new FileInfo { FileName = Constants.FOLDER_OtherValidFileName }, }; - this._cbo.Setup(cbo => cbo.FillCollection(dr)).Returns(filesList); + this.cbo.Setup(cbo => cbo.FillCollection(dr)).Returns(filesList); - var result = this._folderManager.GetFiles(this._folderInfo.Object).Cast(); + var result = this.folderManager.GetFiles(this.folderInfo.Object).Cast(); CollectionAssert.AreEqual(filesList, result); } @@ -607,11 +619,11 @@ public void GetFolder_Calls_DataProvider_GetFolder() var folderDataTable = new DataTable(); folderDataTable.Columns.Add("FolderName"); - this._mockData.Setup(md => md.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(folderDataTable.CreateDataReader()).Verifiable(); + this.mockData.Setup(md => md.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(folderDataTable.CreateDataReader()).Verifiable(); - this._folderManager.GetFolder(Constants.FOLDER_ValidFolderId); + this.folderManager.GetFolder(Constants.FOLDER_ValidFolderId); - this._mockData.Verify(); + this.mockData.Verify(); } [Test] @@ -622,10 +634,10 @@ public void GetFolder_Returns_Null_When_Folder_Does_Not_Exist() var dr = folderDataTable.CreateDataReader(); - this._mockData.Setup(md => md.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(dr); - this._cbo.Setup(cbo => cbo.FillObject(dr)).Returns(null); + this.mockData.Setup(md => md.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(dr); + this.cbo.Setup(cbo => cbo.FillObject(dr)).Returns(null); - var result = this._folderManager.GetFolder(Constants.FOLDER_ValidFolderId); + var result = this.folderManager.GetFolder(Constants.FOLDER_ValidFolderId); Assert.IsNull(result); } @@ -633,9 +645,9 @@ public void GetFolder_Returns_Null_When_Folder_Does_Not_Exist() [Test] public void GetFolder_Returns_Valid_Folder_When_Folder_Exists() { - this._folderInfo.Setup(fi => fi.FolderName).Returns(Constants.FOLDER_ValidFolderName); + this.folderInfo.Setup(fi => fi.FolderName).Returns(Constants.FOLDER_ValidFolderName); - this._pathUtils.Setup(pu => pu.RemoveTrailingSlash(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderName); + this.pathUtils.Setup(pu => pu.RemoveTrailingSlash(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderName); var folderDataTable = new DataTable(); folderDataTable.Columns.Add("FolderName"); @@ -643,13 +655,13 @@ public void GetFolder_Returns_Valid_Folder_When_Folder_Exists() var dr = folderDataTable.CreateDataReader(); - this._mockData.Setup(md => md.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(dr); + this.mockData.Setup(md => md.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(dr); var folderInfo = new FolderInfo { FolderPath = Constants.FOLDER_ValidFolderRelativePath }; - this._cbo.Setup(cbo => cbo.FillObject(dr)).Returns(folderInfo); + this.cbo.Setup(cbo => cbo.FillObject(dr)).Returns(folderInfo); - var result = this._mockFolderManager.Object.GetFolder(Constants.FOLDER_ValidFolderId); + var result = this.mockFolderManager.Object.GetFolder(Constants.FOLDER_ValidFolderId); Assert.AreEqual(Constants.FOLDER_ValidFolderName, result.FolderName); } @@ -658,7 +670,7 @@ public void GetFolder_Returns_Valid_Folder_When_Folder_Exists() [ExpectedException(typeof(ArgumentNullException))] public void GetFolder_Throws_On_Null_FolderPath() { - this._folderManager.GetFolder(It.IsAny(), null); + this.folderManager.GetFolder(It.IsAny(), null); } [Test] @@ -666,25 +678,25 @@ public void GetFolder_Calls_GetFolders() { var foldersSorted = new List(); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(foldersSorted).Verifiable(); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(foldersSorted).Verifiable(); - this._mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + this.mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); - this._mockFolderManager.Verify(); + this.mockFolderManager.Verify(); } [Test] public void GetFolder_Calls_DataProvider_GetFolder_When_Folder_Is_Not_In_Cache() { - this._pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderRelativePath); var foldersSorted = new List(); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(foldersSorted); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(foldersSorted); - this._mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + this.mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); - this._mockData.Verify(md => md.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath), Times.Once()); + this.mockData.Verify(md => md.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath), Times.Once()); } [Test] @@ -695,13 +707,13 @@ public void GetFolder_Returns_Null_When_Folder_Does_Not_Exist_Overload() var dr = folderDataTable.CreateDataReader(); - this._mockData.Setup(md => md.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(dr); + this.mockData.Setup(md => md.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(dr); - this._cbo.Setup(cbo => cbo.FillObject(dr)).Returns(null); + this.cbo.Setup(cbo => cbo.FillObject(dr)).Returns(null); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(new List()); - var result = this._mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + var result = this.mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); Assert.IsNull(result); } @@ -709,8 +721,8 @@ public void GetFolder_Returns_Null_When_Folder_Does_Not_Exist_Overload() [Test] public void GetFolder_Returns_Valid_Folder_When_Folder_Exists_Overload() { - this._pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._pathUtils.Setup(pu => pu.RemoveTrailingSlash(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderName); + this.pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.pathUtils.Setup(pu => pu.RemoveTrailingSlash(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderName); var folderDataTable = new DataTable(); folderDataTable.Columns.Add("FolderName"); @@ -718,15 +730,15 @@ public void GetFolder_Returns_Valid_Folder_When_Folder_Exists_Overload() var dr = folderDataTable.CreateDataReader(); - this._mockData.Setup(md => md.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(dr); + this.mockData.Setup(md => md.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(dr); var folderInfo = new FolderInfo { FolderPath = Constants.FOLDER_ValidFolderRelativePath }; - this._cbo.Setup(cbo => cbo.FillObject(dr)).Returns(folderInfo); + this.cbo.Setup(cbo => cbo.FillObject(dr)).Returns(folderInfo); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(new List()); - var result = this._mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); + var result = this.mockFolderManager.Object.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath); Assert.AreEqual(Constants.FOLDER_ValidFolderName, result.FolderName); } @@ -735,17 +747,17 @@ public void GetFolder_Returns_Valid_Folder_When_Folder_Exists_Overload() [ExpectedException(typeof(ArgumentNullException))] public void GetFoldersByParentFolder_Throws_On_Null_ParentFolder() { - this._folderManager.GetFolders((IFolderInfo)null); + this.folderManager.GetFolders((IFolderInfo)null); } [Test] public void GetFoldersByParentFolder_Returns_Empty_List_When_ParentFolder_Contains_No_Subfolders() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(new List()); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(new List()); - var result = this._mockFolderManager.Object.GetFolders(this._folderInfo.Object).ToList(); + var result = this.mockFolderManager.Object.GetFolders(this.folderInfo.Object).ToList(); Assert.AreEqual(0, result.Count); } @@ -753,8 +765,8 @@ public void GetFoldersByParentFolder_Returns_Empty_List_When_ParentFolder_Contai [Test] public void GetFoldersByParentFolder_Returns_Valid_Subfolders() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); var foldersSorted = new List { @@ -762,9 +774,9 @@ public void GetFoldersByParentFolder_Returns_Valid_Subfolders() new FolderInfo { FolderID = Constants.FOLDER_OtherValidFolderId, ParentID = Constants.FOLDER_ValidFolderId }, }; - this._mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(foldersSorted); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(Constants.CONTENT_ValidPortalId)).Returns(foldersSorted); - var result = this._mockFolderManager.Object.GetFolders(this._folderInfo.Object).ToList(); + var result = this.mockFolderManager.Object.GetFolders(this.folderInfo.Object).ToList(); Assert.AreEqual(1, result.Count); Assert.AreEqual(Constants.FOLDER_OtherValidFolderId, result[0].FolderID); @@ -775,18 +787,18 @@ public void GetFolders_Calls_CBO_GetCachedObject() { var folders = new List(); - this._cbo.Setup(cbo => cbo.GetCachedObject>(It.IsAny(), It.IsAny(), false)).Returns(folders).Verifiable(); + this.cbo.Setup(cbo => cbo.GetCachedObject>(It.IsAny(), It.IsAny(), false)).Returns(folders).Verifiable(); - this._mockFolderManager.Object.GetFolders(Constants.CONTENT_ValidPortalId); + this.mockFolderManager.Object.GetFolders(Constants.CONTENT_ValidPortalId); - this._cbo.Verify(); + this.cbo.Verify(); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void RenameFolder_Throws_On_Null_Folder() { - this._folderManager.RenameFolder(null, It.IsAny()); + this.folderManager.RenameFolder(null, It.IsAny()); } [Test] @@ -795,41 +807,41 @@ public void RenameFolder_Throws_On_Null_Folder() [ExpectedException(typeof(ArgumentException))] public void RenameFolder_Throws_On_Null_Or_Empty_NewFolderName(string newFolderName) { - this._folderManager.RenameFolder(this._folderInfo.Object, newFolderName); + this.folderManager.RenameFolder(this.folderInfo.Object, newFolderName); } [Test] [ExpectedException(typeof(FolderAlreadyExistsException))] public void RenameFolder_Throws_When_DestinationFolder_Exists() { - this._pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_OtherValidFolderName)).Returns(Constants.FOLDER_OtherValidFolderRelativePath); + this.pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_OtherValidFolderName)).Returns(Constants.FOLDER_OtherValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderName).Returns(Constants.FOLDER_ValidFolderName); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderName).Returns(Constants.FOLDER_ValidFolderName); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._mockFolderManager.Setup(mfm => mfm.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_OtherValidFolderRelativePath)).Returns(true); + this.mockFolderManager.Setup(mfm => mfm.FolderExists(Constants.CONTENT_ValidPortalId, Constants.FOLDER_OtherValidFolderRelativePath)).Returns(true); - this._mockFolderManager.Object.RenameFolder(this._folderInfo.Object, Constants.FOLDER_OtherValidFolderName); + this.mockFolderManager.Object.RenameFolder(this.folderInfo.Object, Constants.FOLDER_OtherValidFolderName); } [Test] [ExpectedException(typeof(ArgumentNullException))] public void UpdateFolder_Throws_On_Null_Folder() { - this._folderManager.UpdateFolder(null); + this.folderManager.UpdateFolder(null); } [Test] public void UpdateFolder_Calls_DataProvider_UpdateFolder() { - this._mockFolderManager.Setup(mfm => mfm.AddLogEntry(this._folderInfo.Object, It.IsAny())); - this._mockFolderManager.Setup(mfm => mfm.SaveFolderPermissions(this._folderInfo.Object)); - this._mockFolderManager.Setup(mfm => mfm.ClearFolderCache(It.IsAny())); + this.mockFolderManager.Setup(mfm => mfm.AddLogEntry(this.folderInfo.Object, It.IsAny())); + this.mockFolderManager.Setup(mfm => mfm.SaveFolderPermissions(this.folderInfo.Object)); + this.mockFolderManager.Setup(mfm => mfm.ClearFolderCache(It.IsAny())); - this._mockFolderManager.Object.UpdateFolder(this._folderInfo.Object); + this.mockFolderManager.Object.UpdateFolder(this.folderInfo.Object); - this._mockData.Verify( + this.mockData.Verify( md => md.UpdateFolder( It.IsAny(), It.IsAny(), @@ -851,27 +863,27 @@ public void UpdateFolder_Calls_DataProvider_UpdateFolder() [ExpectedException(typeof(ArgumentNullException))] public void SynchronizeFolder_Throws_On_Null_RelativePath() { - this._folderManager.Synchronize(It.IsAny(), null, It.IsAny(), It.IsAny()); + this.folderManager.Synchronize(It.IsAny(), null, It.IsAny(), It.IsAny()); } [Test] [ExpectedException(typeof(NoNetworkAvailableException))] public void SynchronizeFolder_Throws_When_Some_Folder_Mapping_Requires_Network_Connectivity_But_There_Is_No_Network_Available() { - this._mockFolderManager.Setup(mfm => mfm.AreThereFolderMappingsRequiringNetworkConnectivity(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false)).Returns(true); - this._mockFolderManager.Setup(mfm => mfm.IsNetworkAvailable()).Returns(false); + this.mockFolderManager.Setup(mfm => mfm.AreThereFolderMappingsRequiringNetworkConnectivity(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false)).Returns(true); + this.mockFolderManager.Setup(mfm => mfm.IsNetworkAvailable()).Returns(false); - this._mockFolderManager.Object.Synchronize(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false, false); + this.mockFolderManager.Object.Synchronize(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false, false); } [Test] public void GetFileSystemFolders_Returns_Empty_List_When_Folder_Does_Not_Exist() { - this._pathUtils.Setup(pu => pu.GetPhysicalPath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderPath); + this.pathUtils.Setup(pu => pu.GetPhysicalPath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderPath); - this._directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(false); + this.directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(false); - var result = this._mockFolderManager.Object.GetFileSystemFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); + var result = this.mockFolderManager.Object.GetFileSystemFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); Assert.IsEmpty(result); } @@ -879,11 +891,11 @@ public void GetFileSystemFolders_Returns_Empty_List_When_Folder_Does_Not_Exist() [Test] public void GetFileSystemFolders_Returns_One_Item_When_Folder_Exists_And_Is_Not_Recursive() { - this._pathUtils.Setup(pu => pu.GetPhysicalPath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderPath); + this.pathUtils.Setup(pu => pu.GetPhysicalPath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderPath); - this._directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(true); + this.directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(true); - var result = this._mockFolderManager.Object.GetFileSystemFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); + var result = this.mockFolderManager.Object.GetFileSystemFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); Assert.AreEqual(1, result.Count); Assert.IsTrue(result.Values[0].ExistsInFileSystem); @@ -892,28 +904,28 @@ public void GetFileSystemFolders_Returns_One_Item_When_Folder_Exists_And_Is_Not_ [Test] public void GetFileSystemFolders_Calls_FolderManager_GetFileSystemFoldersRecursive_When_Folder_Exists_And_Is_Recursive() { - this._pathUtils.Setup(pu => pu.GetPhysicalPath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)) + this.pathUtils.Setup(pu => pu.GetPhysicalPath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)) .Returns(Constants.FOLDER_ValidFolderPath); - this._mockFolderManager.Setup(mfm => mfm.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderPath)) + this.mockFolderManager.Setup(mfm => mfm.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderPath)) .Returns(It.IsAny>()) .Verifiable(); - this._directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(true); + this.directory.Setup(d => d.Exists(Constants.FOLDER_ValidFolderPath)).Returns(true); - this._mockFolderManager.Object.GetFileSystemFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, true); + this.mockFolderManager.Object.GetFileSystemFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, true); - this._mockFolderManager.Verify(); + this.mockFolderManager.Verify(); } [Test] public void GetFileSystemFoldersRecursive_Returns_One_Item_When_Folder_Does_Not_Have_SubFolders() { - this._pathUtils.Setup(pu => pu.GetRelativePath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderPath)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.pathUtils.Setup(pu => pu.GetRelativePath(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderPath)).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._directory.Setup(d => d.GetDirectories(Constants.FOLDER_ValidFolderPath)).Returns(new string[0]); + this.directory.Setup(d => d.GetDirectories(Constants.FOLDER_ValidFolderPath)).Returns(new string[0]); - var result = this._mockFolderManager.Object.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderPath); + var result = this.mockFolderManager.Object.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderPath); Assert.AreEqual(1, result.Count); } @@ -930,15 +942,15 @@ public void GetFileSystemFoldersRecursive_Returns_All_The_Folders_In_Folder_Tree { @"C:\folder\subfolder2\subsubfolder2", "folder/subfolder2/subsubfolder2/" }, }; - this._pathUtils.Setup(pu => pu.GetRelativePath(Constants.CONTENT_ValidPortalId, It.IsAny())) + this.pathUtils.Setup(pu => pu.GetRelativePath(Constants.CONTENT_ValidPortalId, It.IsAny())) .Returns((portalID, physicalPath) => relativePaths[physicalPath]); var directories = new List { @"C:\folder\subfolder", @"C:\folder\subfolder2", @"C:\folder\subfolder2\subsubfolder", @"C:\folder\subfolder2\subsubfolder2" }; - this._directory.Setup(d => d.GetDirectories(It.IsAny())) + this.directory.Setup(d => d.GetDirectories(It.IsAny())) .Returns(path => directories.FindAll(sub => sub.StartsWith(path + "\\") && sub.LastIndexOf("\\") == path.Length).ToArray()); - var result = this._mockFolderManager.Object.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, @"C:\folder"); + var result = this.mockFolderManager.Object.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, @"C:\folder"); Assert.AreEqual(5, result.Count); } @@ -955,15 +967,15 @@ public void GetFileSystemFoldersRecursive_Sets_ExistsInFileSystem_For_All_Items( { @"C:\folder\subfolder2\subsubfolder2", "folder/subfolder2/subsubfolder2/" }, }; - this._pathUtils.Setup(pu => pu.GetRelativePath(Constants.CONTENT_ValidPortalId, It.IsAny())) + this.pathUtils.Setup(pu => pu.GetRelativePath(Constants.CONTENT_ValidPortalId, It.IsAny())) .Returns((portalID, physicalPath) => relativePaths[physicalPath]); var directories = new List { @"C:\folder", @"C:\folder\subfolder", @"C:\folder\subfolder2", @"C:\folder\subfolder2\subsubfolder", @"C:\folder\subfolder2\subsubfolder2" }; - this._directory.Setup(d => d.GetDirectories(It.IsAny())) + this.directory.Setup(d => d.GetDirectories(It.IsAny())) .Returns(path => directories.FindAll(sub => sub.StartsWith(path + "\\") && sub.LastIndexOf("\\") == path.Length).ToArray()); - var result = this._mockFolderManager.Object.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, @"C:\folder"); + var result = this.mockFolderManager.Object.GetFileSystemFoldersRecursive(Constants.CONTENT_ValidPortalId, @"C:\folder"); foreach (var mergedTreeItem in result.Values) { @@ -974,9 +986,9 @@ public void GetFileSystemFoldersRecursive_Sets_ExistsInFileSystem_For_All_Items( [Test] public void GetDatabaseFolders_Returns_Empty_List_When_Folder_Does_Not_Exist() { - this._mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(null); + this.mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(null); - var result = this._mockFolderManager.Object.GetDatabaseFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); + var result = this.mockFolderManager.Object.GetDatabaseFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); Assert.IsEmpty(result); } @@ -984,9 +996,9 @@ public void GetDatabaseFolders_Returns_Empty_List_When_Folder_Does_Not_Exist() [Test] public void GetDatabaseFolders_Returns_One_Item_When_Folder_Exists_And_Is_Not_Recursive() { - this._mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this._folderInfo.Object); + this.mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this.folderInfo.Object); - var result = this._mockFolderManager.Object.GetDatabaseFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); + var result = this.mockFolderManager.Object.GetDatabaseFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, false); Assert.AreEqual(1, result.Count); Assert.IsTrue(result.Values[0].ExistsInDatabase); @@ -995,29 +1007,29 @@ public void GetDatabaseFolders_Returns_One_Item_When_Folder_Exists_And_Is_Not_Re [Test] public void GetDatabaseFolders_Calls_FolderManager_GetDatabaseFoldersRecursive_When_Folder_Exists_And_Is_Recursive() { - this._mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)) - .Returns(this._folderInfo.Object); + this.mockFolderManager.Setup(mfm => mfm.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)) + .Returns(this.folderInfo.Object); - this._mockFolderManager.Setup(mfm => mfm.GetDatabaseFoldersRecursive(this._folderInfo.Object)) + this.mockFolderManager.Setup(mfm => mfm.GetDatabaseFoldersRecursive(this.folderInfo.Object)) .Returns(It.IsAny>()) .Verifiable(); - this._mockFolderManager.Object.GetDatabaseFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, true); + this.mockFolderManager.Object.GetDatabaseFolders(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath, true); - this._mockFolderManager.Verify(); + this.mockFolderManager.Verify(); } [Test] public void GetDatabaseFoldersRecursive_Returns_One_Item_When_Folder_Does_Not_Have_SubFolders() { - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var subfolders = new List(); - this._mockFolderManager.Setup(mfm => mfm.GetFolders(this._folderInfo.Object)).Returns(subfolders); + this.mockFolderManager.Setup(mfm => mfm.GetFolders(this.folderInfo.Object)).Returns(subfolders); - var result = this._mockFolderManager.Object.GetDatabaseFoldersRecursive(this._folderInfo.Object); + var result = this.mockFolderManager.Object.GetDatabaseFoldersRecursive(this.folderInfo.Object); Assert.AreEqual(1, result.Count); } @@ -1025,8 +1037,8 @@ public void GetDatabaseFoldersRecursive_Returns_One_Item_When_Folder_Does_Not_Ha [Test] public void GetDatabaseFoldersRecursive_Returns_All_The_Folders_In_Folder_Tree() { - this._folderInfo.Setup(fi => fi.FolderPath).Returns("folder/"); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderPath).Returns("folder/"); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var subfolders = new List { @@ -1036,13 +1048,13 @@ public void GetDatabaseFoldersRecursive_Returns_All_The_Folders_In_Folder_Tree() new FolderInfo { FolderPath = "folder/subfolder2/subsubfolder2/", FolderMappingID = Constants.FOLDER_ValidFolderMappingID }, }; - this._mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsAny())) + this.mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsAny())) .Returns(parent => subfolders.FindAll(sub => sub.FolderPath.StartsWith(parent.FolderPath) && sub.FolderPath.Length > parent.FolderPath.Length && sub.FolderPath.Substring(parent.FolderPath.Length).IndexOf("/") == sub.FolderPath.Substring(parent.FolderPath.Length).LastIndexOf("/"))); - var result = this._mockFolderManager.Object.GetDatabaseFoldersRecursive(this._folderInfo.Object); + var result = this.mockFolderManager.Object.GetDatabaseFoldersRecursive(this.folderInfo.Object); Assert.AreEqual(5, result.Count); } @@ -1050,8 +1062,8 @@ public void GetDatabaseFoldersRecursive_Returns_All_The_Folders_In_Folder_Tree() [Test] public void GetDatabaseFoldersRecursive_Sets_ExistsInDatabase_For_All_Items() { - this._folderInfo.Setup(fi => fi.FolderPath).Returns("folder/"); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderPath).Returns("folder/"); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var subfolders = new List { @@ -1061,13 +1073,13 @@ public void GetDatabaseFoldersRecursive_Sets_ExistsInDatabase_For_All_Items() new FolderInfo() { FolderPath = "folder/subfolder2/subsubfolder2/", FolderMappingID = Constants.FOLDER_ValidFolderMappingID }, }; - this._mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsAny())) + this.mockFolderManager.Setup(mfm => mfm.GetFolders(It.IsAny())) .Returns(parent => subfolders.FindAll(sub => sub.FolderPath.StartsWith(parent.FolderPath) && sub.FolderPath.Length > parent.FolderPath.Length && sub.FolderPath.Substring(parent.FolderPath.Length).IndexOf("/") == sub.FolderPath.Substring(parent.FolderPath.Length).LastIndexOf("/"))); - var result = this._mockFolderManager.Object.GetDatabaseFoldersRecursive(this._folderInfo.Object); + var result = this.mockFolderManager.Object.GetDatabaseFoldersRecursive(this.folderInfo.Object); foreach (var mergedTreeItem in result.Values) { @@ -1150,7 +1162,7 @@ public void MergeFolderLists_Returns_Empty_List_When_Both_Lists_Are_Empty() var list1 = new SortedList(); var list2 = new SortedList(); - var result = this._folderManager.MergeFolderLists(list1, list2); + var result = this.folderManager.MergeFolderLists(list1, list2); Assert.IsEmpty(result); } @@ -1170,7 +1182,7 @@ public void MergeFolderLists_Count_Equals_The_Intersection_Count_Between_Both_Li { "folder3", new FolderManager.MergedTreeItem { FolderPath = "folder3" } }, }; - var result = this._folderManager.MergeFolderLists(list1, list2); + var result = this.folderManager.MergeFolderLists(list1, list2); Assert.AreEqual(3, result.Count); } @@ -2081,7 +2093,7 @@ public void MergeFolderLists_Count_Equals_The_Intersection_Count_Between_Both_Li [ExpectedException(typeof(ArgumentNullException))] public void MoveFolder_Throws_On_Null_Folder() { - this._folderManager.MoveFolder(null, It.IsAny()); + this.folderManager.MoveFolder(null, It.IsAny()); } [Test] @@ -2090,42 +2102,42 @@ public void MoveFolder_Throws_On_Null_Folder() [ExpectedException(typeof(ArgumentException))] public void MoveFolder_Throws_On_Null_Or_Emtpy_NewFolderPath(string newFolderPath) { - this._folderManager.MoveFolder(this._folderInfo.Object, newFolderPath); + this.folderManager.MoveFolder(this.folderInfo.Object, newFolderPath); } [Test] public void MoveFolder_Returns_The_Same_Folder_If_The_Paths_Are_The_Same() { - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); IFolderInfo destinationFolder = new FolderInfo(); destinationFolder.FolderPath = Constants.FOLDER_ValidFolderRelativePath; - this._pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_ValidFolderRelativePath)).Returns(Constants.FOLDER_ValidFolderRelativePath); - var movedFolder = this._folderManager.MoveFolder(this._folderInfo.Object, destinationFolder); + var movedFolder = this.folderManager.MoveFolder(this.folderInfo.Object, destinationFolder); - Assert.AreEqual(this._folderInfo.Object, movedFolder); + Assert.AreEqual(this.folderInfo.Object, movedFolder); } [Test] [ExpectedException(typeof(InvalidOperationException))] public void MoveFolder_Throws_When_Move_Operation_Is_Not_Valid() { - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); IFolderInfo destinationFolder = new FolderInfo(); destinationFolder.FolderPath = Constants.FOLDER_OtherValidFolderRelativePath; destinationFolder.FolderMappingID = Constants.FOLDER_ValidFolderMappingID; - this._pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_OtherValidFolderRelativePath)).Returns(Constants.FOLDER_OtherValidFolderRelativePath); + this.pathUtils.Setup(pu => pu.FormatFolderPath(Constants.FOLDER_OtherValidFolderRelativePath)).Returns(Constants.FOLDER_OtherValidFolderRelativePath); - this._mockFolderManager.Setup(mfm => mfm.FolderExists(It.IsAny(), It.IsAny())).Returns(false); - this._mockFolderManager.Setup(mfm => mfm.CanMoveBetweenFolderMappings(It.IsAny(), It.IsAny())).Returns(true); - this._mockFolderManager.Setup(mfm => mfm.IsMoveOperationValid(this._folderInfo.Object, destinationFolder, It.IsAny())).Returns(false); + this.mockFolderManager.Setup(mfm => mfm.FolderExists(It.IsAny(), It.IsAny())).Returns(false); + this.mockFolderManager.Setup(mfm => mfm.CanMoveBetweenFolderMappings(It.IsAny(), It.IsAny())).Returns(true); + this.mockFolderManager.Setup(mfm => mfm.IsMoveOperationValid(this.folderInfo.Object, destinationFolder, It.IsAny())).Returns(false); - this._mockFolderManager.Object.MoveFolder(this._folderInfo.Object, destinationFolder); + this.mockFolderManager.Object.MoveFolder(this.folderInfo.Object, destinationFolder); } // [Test] @@ -2184,9 +2196,9 @@ public void MoveFolder_Throws_When_Move_Operation_Is_Not_Valid() [Test] public void OverwriteFolder_Calls_MoveFile_For_Each_File_In_Source_Folder() { - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var destinationFolder = new FolderInfo(); @@ -2195,21 +2207,21 @@ public void OverwriteFolder_Calls_MoveFile_For_Each_File_In_Source_Folder() var file3 = new FileInfo(); var files = new List { file1, file2, file3 }; - this._mockFolderManager.Setup(mfm => mfm.GetFiles(this._folderInfo.Object, It.IsAny(), It.IsAny())).Returns(files); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(this.folderInfo.Object, It.IsAny(), It.IsAny())).Returns(files); var fileManager = new Mock(); FileManager.RegisterInstance(fileManager.Object); fileManager.Setup(fm => fm.MoveFile(It.IsAny(), destinationFolder)); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); var folderMapping = new FolderMappingInfo(); - this._mockFolderManager.Setup(mfm => mfm.GetFolderMapping(It.IsAny>(), Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolderManager.Setup(mfm => mfm.IsFolderMappingEditable(folderMapping)).Returns(false); + this.mockFolderManager.Setup(mfm => mfm.GetFolderMapping(It.IsAny>(), Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.mockFolderManager.Setup(mfm => mfm.IsFolderMappingEditable(folderMapping)).Returns(false); - this._mockFolderManager.Object.OverwriteFolder(this._folderInfo.Object, destinationFolder, new Dictionary(), new SortedList()); + this.mockFolderManager.Object.OverwriteFolder(this.folderInfo.Object, destinationFolder, new Dictionary(), new SortedList()); fileManager.Verify(fm => fm.MoveFile(It.IsAny(), destinationFolder), Times.Exactly(3)); } @@ -2220,25 +2232,25 @@ public void OverwriteFolder_Deletes_Source_Folder_In_Database() var fileManager = new Mock(); FileManager.RegisterInstance(fileManager.Object); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var files = new List(); - this._mockFolderManager.Setup(mfm => mfm.GetFiles(this._folderInfo.Object, It.IsAny(), It.IsAny())).Returns(files); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(this.folderInfo.Object, It.IsAny(), It.IsAny())).Returns(files); var destinationFolder = new FolderInfo(); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Verifiable(); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Verifiable(); var folderMapping = new FolderMappingInfo(); - this._mockFolderManager.Setup(mfm => mfm.GetFolderMapping(It.IsAny>(), Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolderManager.Setup(mfm => mfm.IsFolderMappingEditable(folderMapping)).Returns(false); + this.mockFolderManager.Setup(mfm => mfm.GetFolderMapping(It.IsAny>(), Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.mockFolderManager.Setup(mfm => mfm.IsFolderMappingEditable(folderMapping)).Returns(false); - this._mockFolderManager.Object.OverwriteFolder(this._folderInfo.Object, destinationFolder, new Dictionary(), new SortedList()); + this.mockFolderManager.Object.OverwriteFolder(this.folderInfo.Object, destinationFolder, new Dictionary(), new SortedList()); - this._mockFolderManager.Verify(); + this.mockFolderManager.Verify(); } [Test] @@ -2247,24 +2259,24 @@ public void OverwriteFolder_Adds_Folder_To_FoldersToDelete_If_FolderMapping_Is_E var fileManager = new Mock(); FileManager.RegisterInstance(fileManager.Object); - this._folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this._folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); - this._folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); var files = new List(); - this._mockFolderManager.Setup(mfm => mfm.GetFiles(this._folderInfo.Object, It.IsAny(), It.IsAny())).Returns(files); + this.mockFolderManager.Setup(mfm => mfm.GetFiles(this.folderInfo.Object, It.IsAny(), It.IsAny())).Returns(files); var destinationFolder = new FolderInfo(); - this._mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); + this.mockFolderManager.Setup(mfm => mfm.DeleteFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)); var folderMapping = new FolderMappingInfo(); - this._mockFolderManager.Setup(mfm => mfm.GetFolderMapping(It.IsAny>(), Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - this._mockFolderManager.Setup(mfm => mfm.IsFolderMappingEditable(folderMapping)).Returns(true); + this.mockFolderManager.Setup(mfm => mfm.GetFolderMapping(It.IsAny>(), Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + this.mockFolderManager.Setup(mfm => mfm.IsFolderMappingEditable(folderMapping)).Returns(true); var foldersToDelete = new SortedList(); - this._mockFolderManager.Object.OverwriteFolder(this._folderInfo.Object, destinationFolder, new Dictionary(), foldersToDelete); + this.mockFolderManager.Object.OverwriteFolder(this.folderInfo.Object, destinationFolder, new Dictionary(), foldersToDelete); Assert.AreEqual(1, foldersToDelete.Count); } @@ -2314,5 +2326,5 @@ public void OverwriteFolder_Adds_Folder_To_FoldersToDelete_If_FolderMapping_Is_E // _mockFolderManager.Verify(); // } - } -} + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs index 75f56eb4306..38874f3d7cc 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs @@ -7,14 +7,20 @@ namespace DotNetNuke.Tests.Core.Services.Mobile using System; using System.Collections.Generic; using System.Data; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; using DotNetNuke.Services.Mobile; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -25,35 +31,37 @@ namespace DotNetNuke.Tests.Core.Services.Mobile [TestFixture] public class PreviewProfileControllerTests { - private Mock _dataProvider; + private Mock dataProvider; - private DataTable _dtProfiles; + private DataTable dtProfiles; [SetUp] public void SetUp() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); ComponentFactory.Container = new SimpleContainer(); - this._dataProvider = MockComponentProvider.CreateDataProvider(); - this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + this.dataProvider = MockComponentProvider.CreateDataProvider(); + this.dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); MockComponentProvider.CreateDataCacheProvider(); MockComponentProvider.CreateEventLogController(); - this._dtProfiles = new DataTable("PreviewProfiles"); - var pkCol = this._dtProfiles.Columns.Add("Id", typeof(int)); - this._dtProfiles.Columns.Add("PortalId", typeof(int)); - this._dtProfiles.Columns.Add("Name", typeof(string)); - this._dtProfiles.Columns.Add("Width", typeof(int)); - this._dtProfiles.Columns.Add("Height", typeof(int)); - this._dtProfiles.Columns.Add("UserAgent", typeof(string)); - this._dtProfiles.Columns.Add("SortOrder", typeof(int)); + this.dtProfiles = new DataTable("PreviewProfiles"); + var pkCol = this.dtProfiles.Columns.Add("Id", typeof(int)); + this.dtProfiles.Columns.Add("PortalId", typeof(int)); + this.dtProfiles.Columns.Add("Name", typeof(string)); + this.dtProfiles.Columns.Add("Width", typeof(int)); + this.dtProfiles.Columns.Add("Height", typeof(int)); + this.dtProfiles.Columns.Add("UserAgent", typeof(string)); + this.dtProfiles.Columns.Add("SortOrder", typeof(int)); - this._dtProfiles.PrimaryKey = new[] { pkCol }; + this.dtProfiles.PrimaryKey = new[] { pkCol }; - this._dataProvider.Setup(d => + this.dataProvider.Setup(d => d.SavePreviewProfile( It.IsAny(), It.IsAny(), @@ -67,16 +75,16 @@ public void SetUp() { if (id == -1) { - if (this._dtProfiles.Rows.Count == 0) + if (this.dtProfiles.Rows.Count == 0) { id = 1; } else { - id = Convert.ToInt32(this._dtProfiles.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; + id = Convert.ToInt32(this.dtProfiles.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; } - var row = this._dtProfiles.NewRow(); + var row = this.dtProfiles.NewRow(); row["Id"] = id; row["PortalId"] = portalId; row["name"] = name; @@ -85,11 +93,11 @@ public void SetUp() row["useragent"] = userAgent; row["sortorder"] = sortOrder; - this._dtProfiles.Rows.Add(row); + this.dtProfiles.Rows.Add(row); } else { - var rows = this._dtProfiles.Select("Id = " + id); + var rows = this.dtProfiles.Select("Id = " + id); if (rows.Length == 1) { var row = rows[0]; @@ -105,13 +113,13 @@ public void SetUp() return id; }); - this._dataProvider.Setup(d => d.GetPreviewProfiles(It.IsAny())).Returns((portalId) => { return this.GetProfilesCallBack(portalId); }); - this._dataProvider.Setup(d => d.DeletePreviewProfile(It.IsAny())).Callback((id) => + this.dataProvider.Setup(d => d.GetPreviewProfiles(It.IsAny())).Returns((portalId) => { return this.GetProfilesCallBack(portalId); }); + this.dataProvider.Setup(d => d.DeletePreviewProfile(It.IsAny())).Callback((id) => { - var rows = this._dtProfiles.Select("Id = " + id); + var rows = this.dtProfiles.Select("Id = " + id); if (rows.Length == 1) { - this._dtProfiles.Rows.Remove(rows[0]); + this.dtProfiles.Rows.Remove(rows[0]); } }); } @@ -128,7 +136,7 @@ public void PreviewProfileController_Save_Valid_Profile() var profile = new PreviewProfile { Name = "Test R", PortalId = 0, Width = 800, Height = 480 }; new PreviewProfileController().Save(profile); - var dataReader = this._dataProvider.Object.GetPreviewProfiles(0); + var dataReader = this.dataProvider.Object.GetPreviewProfiles(0); var affectedCount = 0; while (dataReader.Read()) { @@ -161,8 +169,8 @@ public void PreviewProfileController_Delete_With_ValidID() private IDataReader GetProfilesCallBack(int portalId) { - var dtCheck = this._dtProfiles.Clone(); - foreach (var row in this._dtProfiles.Select("PortalId = " + portalId)) + var dtCheck = this.dtProfiles.Clone(); + foreach (var row in this.dtProfiles.Select("PortalId = " + portalId)) { dtCheck.Rows.Add(row.ItemArray); } @@ -172,12 +180,12 @@ private IDataReader GetProfilesCallBack(int portalId) private void PrepareData() { - this._dtProfiles.Rows.Add(1, 0, "R1", 640, 480, string.Empty, 1); - this._dtProfiles.Rows.Add(2, 0, "R2", 640, 480, string.Empty, 2); - this._dtProfiles.Rows.Add(3, 0, "R3", 640, 480, string.Empty, 3); - this._dtProfiles.Rows.Add(4, 1, "R4", 640, 480, string.Empty, 4); - this._dtProfiles.Rows.Add(5, 1, "R5", 640, 480, string.Empty, 5); - this._dtProfiles.Rows.Add(6, 1, "R6", 640, 480, string.Empty, 6); + this.dtProfiles.Rows.Add(1, 0, "R1", 640, 480, string.Empty, 1); + this.dtProfiles.Rows.Add(2, 0, "R2", 640, 480, string.Empty, 2); + this.dtProfiles.Rows.Add(3, 0, "R3", 640, 480, string.Empty, 3); + this.dtProfiles.Rows.Add(4, 1, "R4", 640, 480, string.Empty, 4); + this.dtProfiles.Rows.Add(5, 1, "R5", 640, 480, string.Empty, 5); + this.dtProfiles.Rows.Add(6, 1, "R6", 640, 480, string.Empty, 6); } } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs index 09ca0eb862b..b3eaa79fb03 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs @@ -3,19 +3,23 @@ // See the LICENSE file in the project root for more information namespace DotNetNuke.Tests.Core.Services.Tokens { + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.ComponentModel; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Modules.Actions; using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Tabs; using DotNetNuke.Entities.Users; using DotNetNuke.Services.Cache; using DotNetNuke.Services.Tokens; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -23,29 +27,31 @@ namespace DotNetNuke.Tests.Core.Services.Tokens [TestFixture] public class TokenReplaceTests { - private Mock _mockCache; - private Mock _portalController; - private Mock _moduleController; - private Mock _userController; - private Mock _mockHostController; + private Mock mockCache; + private Mock portalController; + private Mock moduleController; + private Mock userController; + private Mock mockHostController; [SetUp] public void SetUp() { var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); ComponentFactory.RegisterComponentInstance(new CoreTokenProvider()); - this._mockCache = MockComponentProvider.CreateDataCacheProvider(); - this._mockHostController = new Mock(); - this._portalController = new Mock(); - this._moduleController = new Mock(); - this._userController = new Mock(); - PortalController.SetTestableInstance(this._portalController.Object); - ModuleController.SetTestableInstance(this._moduleController.Object); - UserController.SetTestableInstance(this._userController.Object); - HostController.RegisterInstance(this._mockHostController.Object); + this.mockCache = MockComponentProvider.CreateDataCacheProvider(); + this.mockHostController = new Mock(); + this.portalController = new Mock(); + this.moduleController = new Mock(); + this.userController = new Mock(); + PortalController.SetTestableInstance(this.portalController.Object); + ModuleController.SetTestableInstance(this.moduleController.Object); + UserController.SetTestableInstance(this.userController.Object); + HostController.RegisterInstance(this.mockHostController.Object); this.SetupPortalSettings(); this.SetupModuleInfo(); this.SetupUserInfo(); @@ -101,7 +107,7 @@ private void SetupPortalSettings() ActiveTab = new TabInfo { ModuleID = 1, TabID = 1 }, }; - this._portalController.Setup(pc => pc.GetCurrentPortalSettings()).Returns(portalSettings); + this.portalController.Setup(pc => pc.GetCurrentPortalSettings()).Returns(portalSettings); } private void SetupModuleInfo() @@ -109,10 +115,10 @@ private void SetupModuleInfo() var moduleInfo = new ModuleInfo { ModuleID = 1, - PortalID = this._portalController.Object.GetCurrentPortalSettings().PortalId, + PortalID = this.portalController.Object.GetCurrentPortalSettings().PortalId, }; - this._moduleController.Setup(mc => mc.GetModule(It.IsAny(), It.IsAny(), It.IsAny())) + this.moduleController.Setup(mc => mc.GetModule(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(moduleInfo); } @@ -122,9 +128,9 @@ private void SetupUserInfo() { UserID = 1, Username = "admin", - PortalID = this._portalController.Object.GetCurrentPortalSettings().PortalId, + PortalID = this.portalController.Object.GetCurrentPortalSettings().PortalId, }; - this._userController.Setup(uc => uc.GetUser(It.IsAny(), It.IsAny())).Returns(userInfo); + this.userController.Setup(uc => uc.GetUser(It.IsAny(), It.IsAny())).Returns(userInfo); } } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs index db407bc4f58..17ff874cb8c 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs @@ -6,14 +6,20 @@ namespace DotNetNuke.Tests.Core.Services.UserRequest { using System.Collections.Specialized; using System.Web; + + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Portals; using DotNetNuke.Services.UserRequest; using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; @@ -21,32 +27,35 @@ namespace DotNetNuke.Tests.Core.Services.UserRequest [TestFixture] internal class UserRequestIPAddressControllerTest { - private Mock _mockPortalController; - private Mock _mockHostController; - private Mock _mockhttpContext; - private Mock _mockRequest; + private Mock mockPortalController; + private Mock mockHostController; + private Mock mockhttpContext; + private Mock mockRequest; - private UserRequestIPAddressController _userRequestIPAddressController; + private UserRequestIPAddressController userRequestIPAddressController; [SetUp] public void Setup() { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - NameValueCollection serverVariables = new NameValueCollection(); // Setup Mock - this._mockhttpContext = HttpContextHelper.RegisterMockHttpContext(); - this._mockRequest = Mock.Get(this._mockhttpContext.Object.Request); - this._mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); - this._mockHostController = MockComponentProvider.CreateNew(); - this._mockPortalController = MockComponentProvider.CreateNew(); - PortalController.SetTestableInstance(this._mockPortalController.Object); + this.mockhttpContext = HttpContextHelper.RegisterMockHttpContext(); + this.mockRequest = Mock.Get(this.mockhttpContext.Object.Request); + this.mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); + this.mockHostController = new Mock(); + this.mockHostController.As(); + this.mockPortalController = MockComponentProvider.CreateNew(); + PortalController.SetTestableInstance(this.mockPortalController.Object); // System under test - this._userRequestIPAddressController = new UserRequestIPAddressController(); + this.userRequestIPAddressController = new UserRequestIPAddressController(); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [TearDown] @@ -67,11 +76,11 @@ public void UserRequestIPAddress_ShouldReturnIP_IfAnyHeaderIsPresent(string requ NameValueCollection headersWithXForwardedHeaders = new NameValueCollection(); headersWithXForwardedHeaders.Add(headerName, requestIp); - this._mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); - this._mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); + this.mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); + this.mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); // Act - string userRequestIPAddress = this._userRequestIPAddressController.GetUserRequestIPAddress(this._mockhttpContext.Object.Request); + string userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); // Assert Assert.AreEqual(expectedIp, userRequestIPAddress); @@ -87,16 +96,16 @@ public void UserRequestIPAddress_ShouldReturnIP_IfRemoteAddrServerVariablePresen NameValueCollection serverVariables = new NameValueCollection(); serverVariables.Add(remoteVariable, requestIp); - this._mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); + this.mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); // Act - var userRequestIPAddress = this._userRequestIPAddressController.GetUserRequestIPAddress(this._mockhttpContext.Object.Request); + var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); // Assert Assert.AreSame(expectedIp, userRequestIPAddress); - this._mockRequest.VerifyGet(r => r.ServerVariables); - this._mockRequest.VerifyGet(r => r.Headers); - this._mockHostController.Verify(hc => hc.GetString(It.IsAny(), It.IsAny())); + this.mockRequest.VerifyGet(r => r.ServerVariables); + this.mockRequest.VerifyGet(r => r.Headers); + this.mockHostController.Verify(hc => hc.GetString(It.IsAny(), It.IsAny())); } [Test] @@ -104,14 +113,14 @@ public void UserRequestIPAddress_ShouldReturnIP_IfUserHostAddress() { // Arrange var expectedIp = "111.111.111.111"; - this._mockRequest.Setup(x => x.UserHostAddress).Returns(expectedIp); + this.mockRequest.Setup(x => x.UserHostAddress).Returns(expectedIp); // Act - var userRequestIPAddress = this._userRequestIPAddressController.GetUserRequestIPAddress(this._mockhttpContext.Object.Request); + var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); // Assert Assert.AreSame(expectedIp, userRequestIPAddress); - this._mockRequest.VerifyGet(r => r.UserHostAddress); + this.mockRequest.VerifyGet(r => r.UserHostAddress); } [TestCase("abc.111.eer")] @@ -124,11 +133,11 @@ public void UserRequestIPAddress_ShouldReturnEmptyString_IfIPAddressIsNotValid(s NameValueCollection headersWithXForwardedHeaders = new NameValueCollection(); headersWithXForwardedHeaders.Add(headerName, requestIp); - this._mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); - this._mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); + this.mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); + this.mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); // Act - var userRequestIPAddress = this._userRequestIPAddressController.GetUserRequestIPAddress(this._mockhttpContext.Object.Request); + var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); // Assert Assert.AreSame(string.Empty, userRequestIPAddress); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs index 875786e47d6..331e9fa4aa0 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs @@ -12,6 +12,7 @@ namespace DotNetNuke.Tests.Web.InternalServices using System.Net.Http; using System.Web.Http; using System.Web.Http.Hosting; + using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; @@ -32,11 +33,15 @@ namespace DotNetNuke.Tests.Web.InternalServices using DotNetNuke.Web.Api; using DotNetNuke.Web.InternalServices; using DotNetNuke.Web.InternalServices.Views.Search; + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; using Constants = DotNetNuke.Services.Search.Internals.Constants; + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing grouping logic of GetGroupedBasicView and GetGroupedDetailView (SearchServiceController methods). @@ -78,19 +83,19 @@ public class SearchServiceControllerTests private const string SearchIndexFolder = @"App_Data\SearchTests"; private const int DefaultSearchRetryTimes = 5; - private readonly double _readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; - private Mock _mockCBO; - private Mock _mockHostController; - private Mock _mockCachingProvider; - private Mock _mockDataProvider; - private Mock _mockLocaleController; - private Mock _mockDataService; - private Mock _mockUserController; - private Mock _mockModuleController; - private Mock _mockTabController; - private SearchServiceController _searchServiceController; - private IInternalSearchController _internalSearchController; - private LuceneControllerImpl _luceneController; + private readonly double readerStaleTimeSpan = TimeSpan.FromMilliseconds(100).TotalSeconds; + private Mock mockCBO; + private Mock mockHostController; + private Mock mockCachingProvider; + private Mock mockDataProvider; + private Mock mockLocaleController; + private Mock mockDataService; + private Mock mockUserController; + private Mock mockModuleController; + private Mock mockTabController; + private SearchServiceController searchServiceController; + private IInternalSearchController internalSearchController; + private LuceneControllerImpl luceneController; [SetUp] public void SetUp() @@ -102,16 +107,17 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - this._mockDataProvider = MockComponentProvider.CreateDataProvider(); - this._mockLocaleController = MockComponentProvider.CreateLocaleController(); - this._mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); - this._mockDataService = new Mock(); - this._mockUserController = new Mock(); - this._mockModuleController = new Mock(); - this._mockTabController = new Mock(); - this._mockHostController = new Mock(); + this.mockDataProvider = MockComponentProvider.CreateDataProvider(); + this.mockLocaleController = MockComponentProvider.CreateLocaleController(); + this.mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); + this.mockDataService = new Mock(); + this.mockUserController = new Mock(); + this.mockModuleController = new Mock(); + this.mockTabController = new Mock(); + this.mockHostController = new Mock(); this.SetupDataProvider(); this.SetupHostController(); @@ -120,15 +126,15 @@ public void SetUp() this.SetupModuleController(); this.DeleteIndexFolder(); - TabController.SetTestableInstance(this._mockTabController.Object); - this._internalSearchController = InternalSearchController.Instance; + TabController.SetTestableInstance(this.mockTabController.Object); + this.internalSearchController = InternalSearchController.Instance; - this._mockCBO = new Mock(); + this.mockCBO = new Mock(); var tabKey = string.Format("{0}-{1}", TabSearchTypeId, 0); var userKey = string.Format("{0}-{1}", UserSearchTypeId, 0); - this._mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) + this.mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new Dictionary() { { tabKey, TabSearchTypeName }, { userKey, UserSearchTypeName } }); - CBO.SetTestableInstance(this._mockCBO.Object); + CBO.SetTestableInstance(this.mockCBO.Object); // create instance of the SearchServiceController var request = new HttpRequestMessage(); @@ -138,7 +144,7 @@ public void SetUp() provider.Setup(x => x.TryFindModuleInfo(request, out expectedModule)).Returns(true); configuration.AddTabAndModuleInfoProvider(provider.Object); request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; - this._searchServiceController = new SearchServiceController(HtmlModDefId) { Request = request }; + this.searchServiceController = new SearchServiceController(HtmlModDefId) { Request = request }; this.CreateNewLuceneControllerInstance(); } @@ -147,7 +153,7 @@ public void SetUp() public void TearDown() { Globals.DependencyProvider = null; - this._luceneController.Dispose(); + this.luceneController.Dispose(); this.DeleteIndexFolder(); CBO.ClearInstance(); TabController.ClearInstance(); @@ -177,12 +183,12 @@ public void GetSearchResultsDetailed() // user doc var userdoc = new SearchDocument { UniqueKey = "key06", Url = userUrl, Title = keyword, SearchTypeId = UserSearchTypeId, ModifiedTimeUtc = DateTime.UtcNow, RoleId = RoleId731 }; - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(doc3); - this._internalSearchController.AddSearchDocument(doc4); - this._internalSearchController.AddSearchDocument(doc5); - this._internalSearchController.AddSearchDocument(userdoc); + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(doc3); + this.internalSearchController.AddSearchDocument(doc4); + this.internalSearchController.AddSearchDocument(doc5); + this.internalSearchController.AddSearchDocument(userdoc); var query = new SearchQuery { @@ -223,10 +229,10 @@ public void GetSearchResultsBasic() var doc2 = new SearchDocument { UniqueKey = "key02", TabId = TabId2, Url = tabUrl2, Title = keyword, SearchTypeId = TabSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId0 }; var userdoc = new SearchDocument { UniqueKey = "key03", Url = userUrl, Title = keyword, SearchTypeId = UserSearchTypeId, ModifiedTimeUtc = now, PortalId = PortalId0, RoleId = RoleId0 }; - this._internalSearchController.AddSearchDocument(doc1); - this._internalSearchController.AddSearchDocument(doc2); - this._internalSearchController.AddSearchDocument(userdoc); - this._internalSearchController.Commit(); + this.internalSearchController.AddSearchDocument(doc1); + this.internalSearchController.AddSearchDocument(doc2); + this.internalSearchController.AddSearchDocument(userdoc); + this.internalSearchController.Commit(); var query = new SearchQuery { @@ -286,8 +292,8 @@ public void ModifyingDocumentsDoesNotCreateDuplicates() NumericKeys = { { "points", 5 } }, }; - this._internalSearchController.AddSearchDocument(originalDocument); - this._internalSearchController.Commit(); + this.internalSearchController.AddSearchDocument(originalDocument); + this.internalSearchController.Commit(); var modifiedDocument = new SearchDocument { @@ -304,8 +310,8 @@ public void ModifyingDocumentsDoesNotCreateDuplicates() NumericKeys = { { "points", 8 }, { "point2", 7 } }, }; - this._internalSearchController.AddSearchDocument(modifiedDocument); - this._internalSearchController.Commit(); + this.internalSearchController.AddSearchDocument(modifiedDocument); + this.internalSearchController.Commit(); var query = new SearchQuery { @@ -334,62 +340,62 @@ public void ModifyingDocumentsDoesNotCreateDuplicates() private void CreateNewLuceneControllerInstance() { - if (this._luceneController != null) + if (this.luceneController != null) { LuceneController.ClearInstance(); - this._luceneController.Dispose(); + this.luceneController.Dispose(); } - this._luceneController = new LuceneControllerImpl(); - LuceneController.SetTestableInstance(this._luceneController); + this.luceneController = new LuceneControllerImpl(); + LuceneController.SetTestableInstance(this.luceneController); } private void SetupUserController() { - this._mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())).Returns( + this.mockUserController.Setup(c => c.GetUserById(It.IsAny(), It.IsAny())).Returns( new UserInfo { UserID = UserId1, Username = UserName1, Profile = new UserProfile { } }); - UserController.SetTestableInstance(this._mockUserController.Object); + UserController.SetTestableInstance(this.mockUserController.Object); } private void SetupHostController() { - this._mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetString(Constants.SearchIndexFolderKey, It.IsAny())).Returns( SearchIndexFolder); - this._mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())). - Returns(this._readerStaleTimeSpan); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetDouble(Constants.SearchReaderRefreshTimeKey, It.IsAny())). + Returns(this.readerStaleTimeSpan); + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTitleBoostSetting, It.IsAny())).Returns( Constants.DefaultSearchTitleBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchTagBoostSetting, It.IsAny())).Returns( Constants.DefaultSearchTagBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchContentBoostSetting, It.IsAny())).Returns( Constants.DefaultSearchKeywordBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())). + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchDescriptionBoostSetting, It.IsAny())). Returns(Constants.DefaultSearchDescriptionBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns( Constants.DefaultSearchAuthorBoost); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns( Constants.DefaultMinLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns( Constants.DefaultMaxLen); - this._mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns( + this.mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns( DefaultSearchRetryTimes); - HostController.RegisterInstance(this._mockHostController.Object); + HostController.RegisterInstance(this.mockHostController.Object); } private void SetupDataProvider() { // Standard DataProvider Path for Logging - this._mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + this.mockDataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - this._mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); - this._mockDataProvider.Setup(d => d.GetSearchModules(It.IsAny())).Returns(this.GetSearchModules); - this._mockDataProvider.Setup(d => d.GetModuleDefinitions()).Returns(this.GetModuleDefinitions); - this._mockDataProvider.Setup(d => d.GetAllSearchTypes()).Returns(this.GetAllSearchTypes); - this._mockDataProvider.Setup(d => d.GetUser(It.IsAny(), It.IsAny())).Returns(this.GetUser); - this._mockDataProvider.Setup(d => d.GetTabs(It.IsAny())).Returns(this.GetTabs); - this._mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(this.GetPortalGroups); + this.mockDataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); + this.mockDataProvider.Setup(d => d.GetSearchModules(It.IsAny())).Returns(this.GetSearchModules); + this.mockDataProvider.Setup(d => d.GetModuleDefinitions()).Returns(this.GetModuleDefinitions); + this.mockDataProvider.Setup(d => d.GetAllSearchTypes()).Returns(this.GetAllSearchTypes); + this.mockDataProvider.Setup(d => d.GetUser(It.IsAny(), It.IsAny())).Returns(this.GetUser); + this.mockDataProvider.Setup(d => d.GetTabs(It.IsAny())).Returns(this.GetTabs); + this.mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(this.GetPortalGroups); - DataService.RegisterInstance(this._mockDataService.Object); + DataService.RegisterInstance(this.mockDataService.Object); } private void SetupPortalSettings() @@ -401,16 +407,16 @@ private void SetupPortalSettings() private void SetupModuleController() { - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId1), It.Is(p => p == PortalId0), false)).Returns( + this.mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId1), It.Is(p => p == PortalId0), false)).Returns( new ModuleInfo { ModuleID = HtmlModuleId1, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle1 }); - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId2), It.Is(p => p == PortalId0), false)).Returns( + this.mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId2), It.Is(p => p == PortalId0), false)).Returns( new ModuleInfo { ModuleID = HtmlModuleId2, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle2 }); - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId3), It.Is(p => p == PortalId0), false)).Returns( + this.mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId3), It.Is(p => p == PortalId0), false)).Returns( new ModuleInfo { ModuleID = HtmlModuleId3, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle3 }); - this._mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId4), It.Is(p => p == PortalId0), false)).Returns( + this.mockModuleController.Setup(mc => mc.GetModule(It.Is(m => m == HtmlModuleId4), It.Is(p => p == PortalId0), false)).Returns( new ModuleInfo { ModuleID = HtmlModuleId4, ModuleDefID = HtmlModDefId, ModuleTitle = HtmlModuleTitle4 }); - ModuleController.SetTestableInstance(this._mockModuleController.Object); + ModuleController.SetTestableInstance(this.mockModuleController.Object); } private void DeleteIndexFolder() @@ -719,7 +725,7 @@ private IEnumerable GetGroupBasicViewResults(SearchQuery query LocalizedName = UserSearchTypeName, ModuleDefinitionId = 0, }; - var results = this._searchServiceController.GetGroupedBasicViews(query, userSearchContentSource, PortalId0); + var results = this.searchServiceController.GetGroupedBasicViews(query, userSearchContentSource, PortalId0); return results; } @@ -727,7 +733,7 @@ private IEnumerable GetGroupedDetailViewResults(SearchQuery s { bool more = false; int totalHits = 0; - var results = this._searchServiceController.GetGroupedDetailViews(searchQuery, UserSearchTypeId, out totalHits, out more); + var results = this.searchServiceController.GetGroupedDetailViews(searchQuery, UserSearchTypeId, out totalHits, out more); return results; } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs index 6f0f488cd7c..26c5dae5cd3 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs @@ -7,16 +7,24 @@ namespace DotNetNuke.Tests.Web.InternalServices using System; using System.Collections; using System.Collections.Generic; - using System.Linq; + using System.Linq; + using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; using DotNetNuke.Entities.Tabs.TabVersions; using DotNetNuke.Entities.Users; - using DotNetNuke.Tests.Utilities.Mocks; + using DotNetNuke.Tests.Utilities.Mocks; + + using Microsoft.Extensions.DependencyInjection; + using Moq; + using NUnit.Framework; + + using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; [TestFixture] public class TabVersionControllerTests @@ -25,9 +33,9 @@ public class TabVersionControllerTests private const int TabID = 99; private readonly DateTime ServerCreateOnDate = new DateTime(2018, 08, 15, 12, 0, 0, DateTimeKind.Unspecified); - private Mock _mockCBO; - private Mock _mockUserController; - private Mock _mockHostController; + private Mock mockCBO; + private Mock mockUserController; + private Mock mockHostController; [SetUp] public void Setup() @@ -35,6 +43,12 @@ public void Setup() MockComponentProvider.ResetContainer(); this.SetupCBO(); this.SetupHostController(); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } [Test] @@ -59,17 +73,17 @@ public void GetTabVersions_Verify_User_Preferred_TimeZone(string userPreferredTi private void SetupCBO() { - this._mockCBO = new Mock(); - this._mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) + this.mockCBO = new Mock(); + this.mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(this.GetMockedTabVersions); - CBO.SetTestableInstance(this._mockCBO.Object); + CBO.SetTestableInstance(this.mockCBO.Object); } private void SetupUserController(string timeZoneId) { - this._mockUserController = new Mock(); - this._mockUserController.Setup(userController => userController.GetCurrentUserInfo()).Returns(this.GetMockedUser(timeZoneId)); - UserController.SetTestableInstance(this._mockUserController.Object); + this.mockUserController = new Mock(); + this.mockUserController.Setup(userController => userController.GetCurrentUserInfo()).Returns(this.GetMockedUser(timeZoneId)); + UserController.SetTestableInstance(this.mockUserController.Object); } private UserInfo GetMockedUser(string timeZoneId) @@ -127,9 +141,9 @@ private List GetMockedTabVersions() private void SetupHostController() { - this._mockHostController = new Mock(); - this._mockHostController.Setup(c => c.GetString(It.IsRegex("PerformanceSetting"))).Returns(Globals.PerformanceSettings.LightCaching.ToString()); - HostController.RegisterInstance(this._mockHostController.Object); + this.mockHostController = new Mock(); + this.mockHostController.Setup(c => c.GetString(It.IsRegex("PerformanceSetting"))).Returns(Globals.PerformanceSettings.LightCaching.ToString()); + this.mockHostController.As(); } private class TabVersionControllerTestable : TabVersionController From 8d0180d7b7ca87c1b1a0cd2a8313fbcb22db6b16 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Thu, 20 Aug 2020 08:55:18 -0400 Subject: [PATCH 17/32] CHanged IHostController DI registration to scoped, this will use the same instance for the life of the request --- DNN Platform/Library/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/Library/Startup.cs b/DNN Platform/Library/Startup.cs index b737c7e7e9a..0310ba58725 100644 --- a/DNN Platform/Library/Startup.cs +++ b/DNN Platform/Library/Startup.cs @@ -30,7 +30,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddTransient(x => PortalController.Instance); - services.AddTransient(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); From 791fe4e44216535ce29b605c4308d3a33c0e8d6e Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Thu, 20 Aug 2020 09:26:17 -0500 Subject: [PATCH 18/32] Fix duplicate line from rebase --- .../DotNetNuke.Tests.Content.csproj | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj b/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj index 603e0919c82..5872a2c4d91 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/DotNetNuke.Tests.Content.csproj @@ -108,7 +108,6 @@ {6928A9B1-F88A-4581-A132-D3EB38669BB0} - {6928a9b1-f88a-4581-a132-d3eb38669bb0} DotNetNuke.Abstractions @@ -154,11 +153,11 @@ - - \ No newline at end of file + From 6ff6c1ffda33863359011c9ed79d658b802f82f0 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Thu, 20 Aug 2020 11:40:21 -0400 Subject: [PATCH 19/32] Renamed IHostController -> IHostSettingsService --- .../DotNetNuke.Abstractions.csproj | 4 + .../{Entities => }/IConfigurationSetting.cs | 2 +- ...tController.cs => IHostSettingsService.cs} | 15 +- .../Library/Entities/ConfigurationSetting.cs | 2 +- .../Entities/Controllers/HostController.cs | 10 +- .../Library/Obsolete/HostController.cs | 19 +- DNN Platform/Library/Startup.cs | 4 +- .../AttachmentControllerTests.cs | 584 ++-- .../ContentControllerTests.cs | 6 +- .../ContentTypeControllerTests.cs | 466 +-- .../ScopeTypeControllerTests.cs | 460 +-- .../TermControllerTests.cs | 1230 ++++---- .../VocabularyControllerTests.cs | 6 +- .../Common/NavigationManagerTests.cs | 810 +++-- .../Controllers/Host/HostControllerTest.cs | 808 ++--- .../Messaging/NotificationsControllerTests.cs | 2607 +++++++++-------- .../SubscriptionTypeControllerTests.cs | 364 ++- .../Portal/PortalGroupControllerTests.cs | 1040 ++++--- .../Search/InternalSearchControllerTests.cs | 5 +- .../Search/LuceneControllerTests.cs | 5 +- .../Search/SearchControllerTests.cs | 6 +- .../Controllers/Search/SearchHelperTests.cs | 792 ++--- .../Social/RelationshipControllerTests.cs | 2532 ++++++++-------- .../Modules/Settings/ModuleSettingsTests.cs | 570 ++-- .../Modules/Settings/NullableSettingsTests.cs | 532 ++-- .../Modules/Settings/PortalSettingsTests.cs | 566 ++-- .../Settings/TabModuleSettingsTests.cs | 568 ++-- .../Portals/PortalSettingsControllerTests.cs | 56 +- .../Folder/FileContentTypeManagerTests.cs | 116 +- .../Providers/Folder/FileManagerTests.cs | 2242 +++++++------- .../Mobile/PreviewProfileControllerTests.cs | 340 ++- .../Mobile/RedirectionControllerTests.cs | 1901 ++++++------ .../Services/Tokens/TokenReplaceTests.cs | 236 +- .../UserRequestIPAddressControllerTest.cs | 260 +- .../SearchServiceControllerTests.cs | 3 +- .../TabVersionControllerTests.cs | 322 +- 36 files changed, 9735 insertions(+), 9754 deletions(-) rename DNN Platform/DotNetNuke.Abstractions/{Entities => }/IConfigurationSetting.cs (94%) rename DNN Platform/DotNetNuke.Abstractions/{Entities/Controllers/IHostController.cs => IHostSettingsService.cs} (93%) diff --git a/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj b/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj index 3c115fff4c4..bfd00629383 100644 --- a/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj +++ b/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj @@ -27,6 +27,10 @@ + + + + diff --git a/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs b/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs similarity index 94% rename from DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs rename to DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs index 0eadf709305..a2304edaabd 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Entities/IConfigurationSetting.cs +++ b/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Abstractions.Entities +namespace DotNetNuke.Abstractions { /// /// The configuration setting. diff --git a/DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs b/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs similarity index 93% rename from DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs rename to DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs index 2cd53b82520..3f1c0e4b637 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Entities/Controllers/IHostController.cs +++ b/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs @@ -2,29 +2,30 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Abstractions.Entities.Controllers +namespace DotNetNuke.Abstractions { using System.Collections.Generic; /// - /// HostController provides business layer of host settings. + /// The provides business layer of the HostSettings + /// Entity. /// /// /// /// /// public class MySampleClass /// { - /// IHostController controller; - /// public MySampleClass(IHostController controller) + /// IHostSettingsService service; + /// public MySampleClass(IHostSettingsService service) /// { - /// this.controller = controller; + /// this.service = service; /// } /// - /// public bool CheckUpgrade { get => this.controller.GetBoolean("CheckUpgrade", true); + /// public bool CheckUpgrade { get => this.service.GetBoolean("CheckUpgrade", true); /// } /// /// - public interface IHostController + public interface IHostSettingsService { /// /// Gets the setting value by the specific key. diff --git a/DNN Platform/Library/Entities/ConfigurationSetting.cs b/DNN Platform/Library/Entities/ConfigurationSetting.cs index bc3c50e8642..2d9eb1eb5a4 100644 --- a/DNN Platform/Library/Entities/ConfigurationSetting.cs +++ b/DNN Platform/Library/Entities/ConfigurationSetting.cs @@ -4,7 +4,7 @@ namespace DotNetNuke.Entities { - using DotNetNuke.Abstractions.Entities; + using DotNetNuke.Abstractions; /// public class ConfigurationSetting : IConfigurationSetting diff --git a/DNN Platform/Library/Entities/Controllers/HostController.cs b/DNN Platform/Library/Entities/Controllers/HostController.cs index f664bdc8f1d..aa4c5c0dafd 100644 --- a/DNN Platform/Library/Entities/Controllers/HostController.cs +++ b/DNN Platform/Library/Entities/Controllers/HostController.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information + namespace DotNetNuke.Entities.Controllers { using System; @@ -8,7 +9,8 @@ namespace DotNetNuke.Entities.Controllers using System.Data; using System.Globalization; using System.Linq; - using DotNetNuke.Abstractions.Entities; + + using DotNetNuke.Abstractions; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; @@ -19,10 +21,8 @@ namespace DotNetNuke.Entities.Controllers using DotNetNuke.Services.Log.EventLog; using DotNetNuke.Web.Client; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - /// - public partial class HostController : INewHostController + public partial class HostController : IHostSettingsService { private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(HostController)); @@ -115,7 +115,7 @@ public int GetInteger(string key, int defaultValue) } /// - Dictionary INewHostController.GetSettings() + Dictionary IHostSettingsService.GetSettings() { return CBO.GetCachedObject>( new CacheItemArgs( diff --git a/DNN Platform/Library/Obsolete/HostController.cs b/DNN Platform/Library/Obsolete/HostController.cs index 8327dec3d42..1260f271286 100644 --- a/DNN Platform/Library/Obsolete/HostController.cs +++ b/DNN Platform/Library/Obsolete/HostController.cs @@ -8,13 +8,12 @@ namespace DotNetNuke.Entities.Controllers using System.Collections.Generic; using System.Linq; + using DotNetNuke.Abstractions; using DotNetNuke.Common; using DotNetNuke.ComponentModel; using Microsoft.Extensions.DependencyInjection; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - // None of the APIs are deprecated, but the IHostController // is deprecated and moved to the abstractions project. When // it is time to remove APIs we should remove the parent @@ -23,32 +22,32 @@ namespace DotNetNuke.Entities.Controllers /// public partial class HostController : ComponentBase, IHostController { - [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.IHostSettingsService instead.")] public static new IHostController Instance { get { - var newHostController = Globals.DependencyProvider.GetRequiredService(); + var newHostController = Globals.DependencyProvider.GetRequiredService(); return newHostController is IHostController castedController ? castedController : new HostController(); } } /// - [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.IHostSettingsService instead.")] public Dictionary GetSettings() => - ((INewHostController)this).GetSettings() + ((IHostSettingsService)this).GetSettings() .Where(setting => setting.Value is ConfigurationSetting) .Select(setting => new KeyValuePair(setting.Key, (ConfigurationSetting)setting.Value)) .ToDictionary(setting => setting.Key, setting => setting.Value); /// - [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.IHostSettingsService instead.")] public void Update(ConfigurationSetting config) => - ((INewHostController)this).Update(config); + ((IHostSettingsService)this).Update(config); /// - [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.Controllers.IHostController instead.")] + [Obsolete("Deprecated in 9.7.1. Scheduled for removal in v11.0.0, use DotNetNuke.Abstractions.IHostSettingsService instead.")] public void Update(ConfigurationSetting config, bool clearCache) => - ((INewHostController)this).Update(config, clearCache); + ((IHostSettingsService)this).Update(config, clearCache); } } diff --git a/DNN Platform/Library/Startup.cs b/DNN Platform/Library/Startup.cs index 0310ba58725..60a96a87f91 100644 --- a/DNN Platform/Library/Startup.cs +++ b/DNN Platform/Library/Startup.cs @@ -16,8 +16,6 @@ namespace DotNetNuke using Microsoft.Extensions.DependencyInjection; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - /// public class Startup : IDnnStartup { @@ -30,7 +28,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddTransient(x => PortalController.Instance); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs index ebf1e4a44ab..3115e60032b 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/AttachmentControllerTests.cs @@ -2,304 +2,306 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Content -{ - using System.Collections.Generic; +namespace DotNetNuke.Tests.Content +{ + using System.Collections.Generic; + using System.Linq; + using DotNetNuke.Abstractions; - using System.Linq; using DotNetNuke.Abstractions.Application; - - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; - using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Data; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.FileSystem; - using DotNetNuke.Tests.Content.Mocks; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; + using DotNetNuke.Entities.Content; + using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.FileSystem; + using DotNetNuke.Tests.Content.Mocks; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - using FileController = DotNetNuke.Entities.Content.AttachmentController; + using Moq; + + using NUnit.Framework; + + using FileController = DotNetNuke.Entities.Content.AttachmentController; using Util = DotNetNuke.Entities.Content.Common.Util; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Common; - [TestFixture] - public class AttachmentControllerTests - { - private Mock mockCache; - - [SetUp] - public void SetUp() - { + [TestFixture] + public class AttachmentControllerTests + { + private Mock mockCache; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - // Register MockCachingProvider - this.mockCache = MockComponentProvider.CreateNew(); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void Test_Add_File_To_Content_Item_Without_Metadata() - { - var dataService = DataServiceFactory(); - - dataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())) - .Returns(Constants.CONTENT_AddContentItemId); - - // Return empty set of metadata. - dataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(MockHelper.CreateEmptyMetaDataReader); - - var content = ContentTestHelper.CreateValidContentItem(); - content.Metadata.Clear(); - - var contentId = Util.GetContentController().AddContentItem(content); - Assert.AreEqual(contentId, Constants.CONTENT_AddContentItemId); - Assert.IsEmpty(content.Metadata); - - dataService.Setup(ds => ds.GetContentItem(It.IsAny())) - .Returns(y => MockHelper.CreateValidContentItemReader(content)); - - var fileController = ComponentFactory.GetComponent(); - - fileController.AddFileToContent(contentId, ContentTestHelper.CreateValidFile(0)); - - dataService.Verify( - ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, new[] { 0 }.ToJson())); - } - - [Test] - public void Test_Load_Attachments_From_DataService() - { - var files = new List - { - ContentTestHelper.CreateValidFile(0), - ContentTestHelper.CreateValidFile(1), - ContentTestHelper.CreateValidFile(2), - }; - - var dataService = DataServiceFactory(); - - dataService.Setup(ds => ds.GetContentItem(It.IsAny())).Returns(MockHelper.CreateValidContentItemReader); - - dataService.Setup( - ds => - ds.GetMetaData(It.IsAny())).Returns( - () => MockHelper.CreateMetaDataReaderWithFiles(files, new IFileInfo[0], new IFileInfo[0])); - - var contentItem = Util.GetContentController().GetContentItem(Constants.CONTENT_ValidContentItemId); - Assert.IsNotNull(contentItem); - - var serialized = contentItem.Metadata[FileController.FilesKey]; - Assert.IsNotEmpty(serialized); - - Assert.IsNotEmpty(contentItem.Files); - Assert.AreEqual(contentItem.Files.Count, 3); - Assert.AreEqual(contentItem.Files[0].FileId, 0); - Assert.AreEqual(contentItem.Files[1].FileId, 1); - Assert.AreEqual(contentItem.Files[2].FileId, 2); - } - - [Test] - public void Test_Add_Attachments_With_FileController() - { - var dataService = DataServiceFactory(); - - dataService.Setup( - ds => - ds.GetContentItem(It.IsAny())).Returns(MockHelper.CreateValidContentItemReader); - - // Use a closure to store the metadata locally in this method. - var data = new Dictionary(); - - dataService.Setup( - ds => - ds.GetMetaData(It.IsAny())).Returns( - () => MockHelper.CreateMetaDataReaderFromDictionary(data)); - - dataService.Setup( - ds => - ds.AddMetaData( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Callback((ci, name, value) => data[name] = value); - - var contentController = Util.GetContentController(); - - var contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); - Assert.IsNotNull(contentItem); - - var serialized = contentItem.Metadata[FileController.FilesKey]; - Assert.IsNull(serialized); - Assert.IsEmpty(contentItem.Files); - - var fileManager = ComponentFactory.GetComponent(); - - // Add some files. - var fileController = ComponentFactory.GetComponent(); - fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(0)); - fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(1)); - - contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); - - Assert.AreEqual(contentItem.Files.Count, 2); - Assert.AreEqual(contentItem.Files[0].FileId, 0); - Assert.AreEqual(contentItem.Files[1].FileId, 1); - - dataService.Verify( - ds => ds.DeleteMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); - - dataService.Verify( - ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); - - dataService.Verify( - ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0,1]"), Times.Once()); - } - - [Test] - public void Set_MetaData_To_Empty_Value_Deletes_Row() - { - var data = new Dictionary(); - - var dataService = DataServiceFactoryWithLocalMetaData(ref data); - - dataService.Setup(ds => ds.GetContentItem(It.IsAny())).Returns(MockHelper.CreateValidContentItemReader); - - var contentController = Util.GetContentController(); - - var fileManager = ComponentFactory.GetComponent(); - - var contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); - Assert.IsNotNull(contentItem); - - var serialized = contentItem.Metadata[FileController.FilesKey]; - Assert.IsNull(serialized); - Assert.IsEmpty(contentItem.Files); - - // Add some files. - var fileController = ComponentFactory.GetComponent(); - fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(0)); - fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(1)); - - contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); - - Assert.AreEqual(contentItem.Files.Count, 2); - Assert.AreEqual(contentItem.Files[0].FileId, 0); - Assert.AreEqual(contentItem.Files[1].FileId, 1); - Assert.IsNotEmpty(contentItem.Metadata[FileController.FilesKey]); - - contentItem.Files.Clear(); - - contentController.UpdateContentItem(contentItem); - - dataService.Verify(ds => ds.DeleteMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); - dataService.Verify(ds => ds.DeleteMetaData(It.IsAny(), FileController.FilesKey, "[0,1]"), Times.Once()); - dataService.Verify(ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); - dataService.Verify(ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0,1]"), Times.Once()); - - var emptyFiles = fileController.GetFilesByContent(contentItem.ContentItemId); - Assert.AreEqual(0, emptyFiles.Count); - } - - /// This test should be moved elsewhere (cb). - [Test] - public void Set_MetaData_To_Same_Value_Doesnt_Update_Database_Entry() - { - var metadata = new Dictionary(); - - var dataService = DataServiceFactoryWithLocalMetaData(ref metadata); - - var contentController = Util.GetContentController(); - - var contentItem = ContentTestHelper.CreateValidContentItem(); - - contentController.AddContentItem(contentItem); - - dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); - dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); - - contentItem.ContentTitle = "Foobar"; - - contentController.UpdateContentItem(contentItem); - - dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Once()); - dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); - - contentItem.ContentTitle = "Foobar"; - - contentController.UpdateContentItem(contentItem); - - // Should be a no-op since no real data changed - dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Once()); - dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); - - // Really update - contentItem.ContentTitle = "SNAFU"; - - contentController.UpdateContentItem(contentItem); - - dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Exactly(2)); - dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Once()); - } - - private static Mock DataServiceFactory() - { - var dataService = new Mock(); - - dataService.Setup(ds => - ds.SynchronizeMetaData( - It.IsAny(), - It.IsAny>>(), - It.IsAny>>())) - .Callback>, IEnumerable>>( - (ci, added, deleted) => - { - deleted.ToList().ForEach( - item => dataService.Object.DeleteMetaData(ci, item.Key, item.Value)); - - added.ToList().ForEach( - item => dataService.Object.AddMetaData(ci, item.Key, item.Value)); - }); - - // Register controller types that are dependent on our IDataService. - var contentController = new ContentController(dataService.Object); - - ComponentFactory.RegisterComponentInstance(new FileController(contentController)); - ComponentFactory.RegisterComponentInstance(contentController); - ComponentFactory.RegisterComponentInstance(MockHelper.CreateMockFileManager().Object); - - return dataService; - } - - private static Mock DataServiceFactoryWithLocalMetaData(ref Dictionary metadata) - { - var dataService = DataServiceFactory(); - - var closure = metadata; - - dataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(() => MockHelper.CreateMetaDataReaderFromDictionary(closure)); - dataService.Setup(ds => ds.AddMetaData(It.IsAny(), It.IsAny(), It.IsAny())). - Callback((ci, name, value) => closure[name] = value); - dataService.Setup(ds => ds.DeleteMetaData(It.IsAny(), It.IsAny(), It.IsAny())) - .Callback((ci, key, val) => closure.Remove(key)); - - return dataService; - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + // Register MockCachingProvider + this.mockCache = MockComponentProvider.CreateNew(); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + public void Test_Add_File_To_Content_Item_Without_Metadata() + { + var dataService = DataServiceFactory(); + + dataService.Setup(ds => ds.AddContentItem(It.IsAny(), It.IsAny())) + .Returns(Constants.CONTENT_AddContentItemId); + + // Return empty set of metadata. + dataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(MockHelper.CreateEmptyMetaDataReader); + + var content = ContentTestHelper.CreateValidContentItem(); + content.Metadata.Clear(); + + var contentId = Util.GetContentController().AddContentItem(content); + Assert.AreEqual(contentId, Constants.CONTENT_AddContentItemId); + Assert.IsEmpty(content.Metadata); + + dataService.Setup(ds => ds.GetContentItem(It.IsAny())) + .Returns(y => MockHelper.CreateValidContentItemReader(content)); + + var fileController = ComponentFactory.GetComponent(); + + fileController.AddFileToContent(contentId, ContentTestHelper.CreateValidFile(0)); + + dataService.Verify( + ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, new[] { 0 }.ToJson())); + } + + [Test] + public void Test_Load_Attachments_From_DataService() + { + var files = new List + { + ContentTestHelper.CreateValidFile(0), + ContentTestHelper.CreateValidFile(1), + ContentTestHelper.CreateValidFile(2), + }; + + var dataService = DataServiceFactory(); + + dataService.Setup(ds => ds.GetContentItem(It.IsAny())).Returns(MockHelper.CreateValidContentItemReader); + + dataService.Setup( + ds => + ds.GetMetaData(It.IsAny())).Returns( + () => MockHelper.CreateMetaDataReaderWithFiles(files, new IFileInfo[0], new IFileInfo[0])); + + var contentItem = Util.GetContentController().GetContentItem(Constants.CONTENT_ValidContentItemId); + Assert.IsNotNull(contentItem); + + var serialized = contentItem.Metadata[FileController.FilesKey]; + Assert.IsNotEmpty(serialized); + + Assert.IsNotEmpty(contentItem.Files); + Assert.AreEqual(contentItem.Files.Count, 3); + Assert.AreEqual(contentItem.Files[0].FileId, 0); + Assert.AreEqual(contentItem.Files[1].FileId, 1); + Assert.AreEqual(contentItem.Files[2].FileId, 2); + } + + [Test] + public void Test_Add_Attachments_With_FileController() + { + var dataService = DataServiceFactory(); + + dataService.Setup( + ds => + ds.GetContentItem(It.IsAny())).Returns(MockHelper.CreateValidContentItemReader); + + // Use a closure to store the metadata locally in this method. + var data = new Dictionary(); + + dataService.Setup( + ds => + ds.GetMetaData(It.IsAny())).Returns( + () => MockHelper.CreateMetaDataReaderFromDictionary(data)); + + dataService.Setup( + ds => + ds.AddMetaData( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Callback((ci, name, value) => data[name] = value); + + var contentController = Util.GetContentController(); + + var contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); + Assert.IsNotNull(contentItem); + + var serialized = contentItem.Metadata[FileController.FilesKey]; + Assert.IsNull(serialized); + Assert.IsEmpty(contentItem.Files); + + var fileManager = ComponentFactory.GetComponent(); + + // Add some files. + var fileController = ComponentFactory.GetComponent(); + fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(0)); + fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(1)); + + contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); + + Assert.AreEqual(contentItem.Files.Count, 2); + Assert.AreEqual(contentItem.Files[0].FileId, 0); + Assert.AreEqual(contentItem.Files[1].FileId, 1); + + dataService.Verify( + ds => ds.DeleteMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); + + dataService.Verify( + ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); + + dataService.Verify( + ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0,1]"), Times.Once()); + } + + [Test] + public void Set_MetaData_To_Empty_Value_Deletes_Row() + { + var data = new Dictionary(); + + var dataService = DataServiceFactoryWithLocalMetaData(ref data); + + dataService.Setup(ds => ds.GetContentItem(It.IsAny())).Returns(MockHelper.CreateValidContentItemReader); + + var contentController = Util.GetContentController(); + + var fileManager = ComponentFactory.GetComponent(); + + var contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); + Assert.IsNotNull(contentItem); + + var serialized = contentItem.Metadata[FileController.FilesKey]; + Assert.IsNull(serialized); + Assert.IsEmpty(contentItem.Files); + + // Add some files. + var fileController = ComponentFactory.GetComponent(); + fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(0)); + fileController.AddFileToContent(contentItem.ContentItemId, fileManager.GetFile(1)); + + contentItem = contentController.GetContentItem(Constants.CONTENT_ValidContentItemId); + + Assert.AreEqual(contentItem.Files.Count, 2); + Assert.AreEqual(contentItem.Files[0].FileId, 0); + Assert.AreEqual(contentItem.Files[1].FileId, 1); + Assert.IsNotEmpty(contentItem.Metadata[FileController.FilesKey]); + + contentItem.Files.Clear(); + + contentController.UpdateContentItem(contentItem); + + dataService.Verify(ds => ds.DeleteMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); + dataService.Verify(ds => ds.DeleteMetaData(It.IsAny(), FileController.FilesKey, "[0,1]"), Times.Once()); + dataService.Verify(ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0]"), Times.Once()); + dataService.Verify(ds => ds.AddMetaData(It.IsAny(), FileController.FilesKey, "[0,1]"), Times.Once()); + + var emptyFiles = fileController.GetFilesByContent(contentItem.ContentItemId); + Assert.AreEqual(0, emptyFiles.Count); + } + + /// This test should be moved elsewhere (cb). + [Test] + public void Set_MetaData_To_Same_Value_Doesnt_Update_Database_Entry() + { + var metadata = new Dictionary(); + + var dataService = DataServiceFactoryWithLocalMetaData(ref metadata); + + var contentController = Util.GetContentController(); + + var contentItem = ContentTestHelper.CreateValidContentItem(); + + contentController.AddContentItem(contentItem); + + dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); + dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); + + contentItem.ContentTitle = "Foobar"; + + contentController.UpdateContentItem(contentItem); + + dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Once()); + dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); + + contentItem.ContentTitle = "Foobar"; + + contentController.UpdateContentItem(contentItem); + + // Should be a no-op since no real data changed + dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Once()); + dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Never()); + + // Really update + contentItem.ContentTitle = "SNAFU"; + + contentController.UpdateContentItem(contentItem); + + dataService.Verify(ds => ds.AddMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Exactly(2)); + dataService.Verify(ds => ds.DeleteMetaData(contentItem, FileController.TitleKey, It.IsAny()), Times.Once()); + } + + private static Mock DataServiceFactory() + { + var dataService = new Mock(); + + dataService.Setup(ds => + ds.SynchronizeMetaData( + It.IsAny(), + It.IsAny>>(), + It.IsAny>>())) + .Callback>, IEnumerable>>( + (ci, added, deleted) => + { + deleted.ToList().ForEach( + item => dataService.Object.DeleteMetaData(ci, item.Key, item.Value)); + + added.ToList().ForEach( + item => dataService.Object.AddMetaData(ci, item.Key, item.Value)); + }); + + // Register controller types that are dependent on our IDataService. + var contentController = new ContentController(dataService.Object); + + ComponentFactory.RegisterComponentInstance(new FileController(contentController)); + ComponentFactory.RegisterComponentInstance(contentController); + ComponentFactory.RegisterComponentInstance(MockHelper.CreateMockFileManager().Object); + + return dataService; + } + + private static Mock DataServiceFactoryWithLocalMetaData(ref Dictionary metadata) + { + var dataService = DataServiceFactory(); + + var closure = metadata; + + dataService.Setup(ds => ds.GetMetaData(It.IsAny())).Returns(() => MockHelper.CreateMetaDataReaderFromDictionary(closure)); + dataService.Setup(ds => ds.AddMetaData(It.IsAny(), It.IsAny(), It.IsAny())). + Callback((ci, name, value) => closure[name] = value); + dataService.Setup(ds => ds.DeleteMetaData(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((ci, key, val) => closure.Remove(key)); + + return dataService; + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs index a269ae38413..1dff4256244 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentControllerTests.cs @@ -10,8 +10,8 @@ namespace DotNetNuke.Tests.Content using System.Linq; using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; using DotNetNuke.Data; @@ -30,8 +30,6 @@ namespace DotNetNuke.Tests.Content using NUnit.Framework; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - /// /// Summary description for ContentItemTests. /// @@ -62,7 +60,7 @@ public void SetUp() serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs index d90f1708941..95b3c6e8fcf 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ContentTypeControllerTests.cs @@ -2,245 +2,247 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Content -{ - using System; +namespace DotNetNuke.Tests.Content +{ + using System; using System.Linq; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Content; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Content; using DotNetNuke.Entities.Content.Data; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Cache; - using DotNetNuke.Tests.Content.Mocks; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Services.Cache; + using DotNetNuke.Tests.Content.Mocks; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Summary description for ContentTypeTests. - /// - [TestFixture] - public class ContentTypeControllerTests - { - private Mock mockCache; - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + /// + /// Summary description for ContentTypeTests. + /// + [TestFixture] + public class ContentTypeControllerTests + { + private Mock mockCache; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - // Register MockCachingProvider - this.mockCache = MockComponentProvider.CreateNew(); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void ContentTypeController_AddContentType_Throws_On_Null_ContentType() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => contentTypeController.AddContentType(null)); - } - - [Test] - public void ContentTypeController_AddContentType_Calls_DataService_On_Valid_Arguments() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - ContentType contentType = ContentTestHelper.CreateValidContentType(); - - // Act - int contentTypeId = contentTypeController.AddContentType(contentType); - - // Assert - mockDataService.Verify(ds => ds.AddContentType(contentType)); - } - - [Test] - public void ContentTypeController_AddContentType_Returns_ValidId_On_Valid_ContentType() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddContentType(It.IsAny())).Returns(Constants.CONTENTTYPE_AddContentTypeId); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - var contentType = ContentTestHelper.CreateValidContentType(); - - // Act - int contentTypeId = contentTypeController.AddContentType(contentType); - - // Assert - Assert.AreEqual(Constants.CONTENTTYPE_AddContentTypeId, contentTypeId); - } - - [Test] - public void ContentTypeController_AddContentType_Sets_ValidId_On_Valid_ContentType() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddContentType(It.IsAny())).Returns(Constants.CONTENTTYPE_AddContentTypeId); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - var contentType = ContentTestHelper.CreateValidContentType(); - - // Act - contentTypeController.AddContentType(contentType); - - // Assert - Assert.AreEqual(Constants.CONTENTTYPE_AddContentTypeId, contentType.ContentTypeId); - } - - [Test] - public void ContentTypeController_DeleteContentType_Throws_On_Null_ContentType() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => contentTypeController.DeleteContentType(null)); - } - - [Test] - public void ContentTypeController_DeleteContentType_Throws_On_Negative_ContentTypeId() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - ContentType contentType = ContentTestHelper.CreateValidContentType(); - contentType.ContentTypeId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => contentTypeController.DeleteContentType(contentType)); - } - - [Test] - public void ContentTypeController_DeleteContentType_Calls_DataService_On_Valid_ContentTypeId() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - var contentType = ContentTestHelper.CreateValidContentType(); - contentType.ContentTypeId = Constants.CONTENTTYPE_ValidContentTypeId; - - // Act - contentTypeController.DeleteContentType(contentType); - - // Assert - mockDataService.Verify(ds => ds.DeleteContentType(contentType)); - } - - [Test] - public void ContentTypeController_GetContentTypes_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentTypes()).Returns(MockHelper.CreateValidContentTypesReader(Constants.CONTENTTYPE_ValidContentTypeCount)); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - // Act - var contentTypes = contentTypeController.GetContentTypes(); - - // Assert - mockDataService.Verify(ds => ds.GetContentTypes()); - } - - [Test] - public void ContentTypeController_GetContentTypes_Returns_Empty_List_Of_ContentTypes_If_No_ContentTypes() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentTypes()).Returns(MockHelper.CreateEmptyContentTypeReader()); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - // Act - var contentTypes = contentTypeController.GetContentTypes(); - - // Assert - Assert.IsNotNull(contentTypes); - Assert.AreEqual(0, contentTypes.Count()); - } - - [Test] - public void ContentTypeController_GetContentTypes_Returns_List_Of_ContentTypes() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetContentTypes()).Returns(MockHelper.CreateValidContentTypesReader(Constants.CONTENTTYPE_ValidContentTypeCount)); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - // Act - var contentTypes = contentTypeController.GetContentTypes(); - - // Assert - Assert.AreEqual(Constants.CONTENTTYPE_ValidContentTypeCount, contentTypes.Count()); - } - - [Test] - public void ContentTypeController_UpdateContentType_Throws_On_Null_ContentType() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => contentTypeController.UpdateContentType(null)); - } - - [Test] - public void ContentTypeController_UpdateContentType_Throws_On_Negative_ContentTypeId() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - var contentType = ContentTestHelper.CreateValidContentType(); - contentType.ContentType = Constants.CONTENTTYPE_InValidContentType; - - Assert.Throws(() => contentTypeController.UpdateContentType(contentType)); - } - - [Test] - public void ContentTypeController_UpdateContentType_Calls_DataService_On_Valid_ContentType() - { - // Arrange - var mockDataService = new Mock(); - var contentTypeController = new ContentTypeController(mockDataService.Object); - - var contentType = ContentTestHelper.CreateValidContentType(); - contentType.ContentTypeId = Constants.CONTENTTYPE_UpdateContentTypeId; - contentType.ContentType = Constants.CONTENTTYPE_UpdateContentType; - - // Act - contentTypeController.UpdateContentType(contentType); - - // Assert - mockDataService.Verify(ds => ds.UpdateContentType(contentType)); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + // Register MockCachingProvider + this.mockCache = MockComponentProvider.CreateNew(); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + public void ContentTypeController_AddContentType_Throws_On_Null_ContentType() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => contentTypeController.AddContentType(null)); + } + + [Test] + public void ContentTypeController_AddContentType_Calls_DataService_On_Valid_Arguments() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + ContentType contentType = ContentTestHelper.CreateValidContentType(); + + // Act + int contentTypeId = contentTypeController.AddContentType(contentType); + + // Assert + mockDataService.Verify(ds => ds.AddContentType(contentType)); + } + + [Test] + public void ContentTypeController_AddContentType_Returns_ValidId_On_Valid_ContentType() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddContentType(It.IsAny())).Returns(Constants.CONTENTTYPE_AddContentTypeId); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + var contentType = ContentTestHelper.CreateValidContentType(); + + // Act + int contentTypeId = contentTypeController.AddContentType(contentType); + + // Assert + Assert.AreEqual(Constants.CONTENTTYPE_AddContentTypeId, contentTypeId); + } + + [Test] + public void ContentTypeController_AddContentType_Sets_ValidId_On_Valid_ContentType() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddContentType(It.IsAny())).Returns(Constants.CONTENTTYPE_AddContentTypeId); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + var contentType = ContentTestHelper.CreateValidContentType(); + + // Act + contentTypeController.AddContentType(contentType); + + // Assert + Assert.AreEqual(Constants.CONTENTTYPE_AddContentTypeId, contentType.ContentTypeId); + } + + [Test] + public void ContentTypeController_DeleteContentType_Throws_On_Null_ContentType() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => contentTypeController.DeleteContentType(null)); + } + + [Test] + public void ContentTypeController_DeleteContentType_Throws_On_Negative_ContentTypeId() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + ContentType contentType = ContentTestHelper.CreateValidContentType(); + contentType.ContentTypeId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => contentTypeController.DeleteContentType(contentType)); + } + + [Test] + public void ContentTypeController_DeleteContentType_Calls_DataService_On_Valid_ContentTypeId() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + var contentType = ContentTestHelper.CreateValidContentType(); + contentType.ContentTypeId = Constants.CONTENTTYPE_ValidContentTypeId; + + // Act + contentTypeController.DeleteContentType(contentType); + + // Assert + mockDataService.Verify(ds => ds.DeleteContentType(contentType)); + } + + [Test] + public void ContentTypeController_GetContentTypes_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentTypes()).Returns(MockHelper.CreateValidContentTypesReader(Constants.CONTENTTYPE_ValidContentTypeCount)); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + // Act + var contentTypes = contentTypeController.GetContentTypes(); + + // Assert + mockDataService.Verify(ds => ds.GetContentTypes()); + } + + [Test] + public void ContentTypeController_GetContentTypes_Returns_Empty_List_Of_ContentTypes_If_No_ContentTypes() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentTypes()).Returns(MockHelper.CreateEmptyContentTypeReader()); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + // Act + var contentTypes = contentTypeController.GetContentTypes(); + + // Assert + Assert.IsNotNull(contentTypes); + Assert.AreEqual(0, contentTypes.Count()); + } + + [Test] + public void ContentTypeController_GetContentTypes_Returns_List_Of_ContentTypes() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetContentTypes()).Returns(MockHelper.CreateValidContentTypesReader(Constants.CONTENTTYPE_ValidContentTypeCount)); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + // Act + var contentTypes = contentTypeController.GetContentTypes(); + + // Assert + Assert.AreEqual(Constants.CONTENTTYPE_ValidContentTypeCount, contentTypes.Count()); + } + + [Test] + public void ContentTypeController_UpdateContentType_Throws_On_Null_ContentType() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => contentTypeController.UpdateContentType(null)); + } + + [Test] + public void ContentTypeController_UpdateContentType_Throws_On_Negative_ContentTypeId() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + var contentType = ContentTestHelper.CreateValidContentType(); + contentType.ContentType = Constants.CONTENTTYPE_InValidContentType; + + Assert.Throws(() => contentTypeController.UpdateContentType(contentType)); + } + + [Test] + public void ContentTypeController_UpdateContentType_Calls_DataService_On_Valid_ContentType() + { + // Arrange + var mockDataService = new Mock(); + var contentTypeController = new ContentTypeController(mockDataService.Object); + + var contentType = ContentTestHelper.CreateValidContentType(); + contentType.ContentTypeId = Constants.CONTENTTYPE_UpdateContentTypeId; + contentType.ContentType = Constants.CONTENTTYPE_UpdateContentType; + + // Act + contentTypeController.UpdateContentType(contentType); + + // Assert + mockDataService.Verify(ds => ds.UpdateContentType(contentType)); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs index 8a33c4e9552..e81b717b324 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/ScopeTypeControllerTests.cs @@ -2,242 +2,244 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Content -{ - using System; +namespace DotNetNuke.Tests.Content +{ + using System; using System.Linq; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Content.Data; using DotNetNuke.Entities.Content.Taxonomy; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Cache; - using DotNetNuke.Tests.Content.Mocks; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Services.Cache; + using DotNetNuke.Tests.Content.Mocks; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Summary description for ScopeTypeTests. - /// - [TestFixture] - public class ScopeTypeControllerTests - { - private Mock mockCache; - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + /// + /// Summary description for ScopeTypeTests. + /// + [TestFixture] + public class ScopeTypeControllerTests + { + private Mock mockCache; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - // Register MockCachingProvider - this.mockCache = MockComponentProvider.CreateNew(); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void ScopeTypeController_AddScopeType_Throws_On_Null_ScopeType() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => scopeTypeController.AddScopeType(null)); - } - - [Test] - public void ScopeTypeController_AddScopeType_Calls_DataService_On_Valid_Arguments() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - var scopeType = ContentTestHelper.CreateValidScopeType(); - - // Act - int scopeTypeId = scopeTypeController.AddScopeType(scopeType); - - // Assert - mockDataService.Verify(ds => ds.AddScopeType(scopeType)); - } - - [Test] - public void ScopeTypeController_AddScopeType_Returns_ValidId_On_Valid_ScopeType() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddScopeType(It.IsAny())).Returns(Constants.SCOPETYPE_AddScopeTypeId); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); - - // Act - int scopeTypeId = scopeTypeController.AddScopeType(scopeType); - - // Assert - Assert.AreEqual(Constants.SCOPETYPE_AddScopeTypeId, scopeTypeId); - } - - [Test] - public void ScopeTypeController_AddScopeType_Sets_ValidId_On_Valid_ScopeType() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddScopeType(It.IsAny())).Returns(Constants.SCOPETYPE_AddScopeTypeId); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - var scopeType = ContentTestHelper.CreateValidScopeType(); - - // Act - scopeTypeController.AddScopeType(scopeType); - - // Assert - Assert.AreEqual(Constants.SCOPETYPE_AddScopeTypeId, scopeType.ScopeTypeId); - } - - [Test] - public void ScopeTypeController_DeleteScopeType_Throws_On_Null_ScopeType() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => scopeTypeController.DeleteScopeType(null)); - } - - [Test] - public void ScopeTypeController_DeleteScopeType_Throws_On_Negative_ScopeTypeId() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); - scopeType.ScopeTypeId = Null.NullInteger; - - Assert.Throws(() => scopeTypeController.DeleteScopeType(scopeType)); - } - - [Test] - public void ScopeTypeController_DeleteScopeType_Calls_DataService_On_Valid_ContentTypeId() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - var scopeType = ContentTestHelper.CreateValidScopeType(); - scopeType.ScopeTypeId = Constants.SCOPETYPE_ValidScopeTypeId; - - // Act - scopeTypeController.DeleteScopeType(scopeType); - - // Assert - mockDataService.Verify(ds => ds.DeleteScopeType(scopeType)); - } - - [Test] - public void ScopeTypeController_GetScopeTypes_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetScopeTypes()).Returns(MockHelper.CreateValidScopeTypesReader(Constants.SCOPETYPE_ValidScopeTypeCount)); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - // Act - IQueryable scopeTypes = scopeTypeController.GetScopeTypes(); - - // Assert - mockDataService.Verify(ds => ds.GetScopeTypes()); - } - - [Test] - public void ScopeTypeController_GetScopeTypes_Returns_Empty_List_Of_ScopeTypes_If_No_ScopeTypes() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetScopeTypes()).Returns(MockHelper.CreateEmptyScopeTypeReader()); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - // Act - var scopeTypes = scopeTypeController.GetScopeTypes(); - - // Assert - Assert.IsNotNull(scopeTypes); - Assert.AreEqual(0, scopeTypes.Count()); - } - - [Test] - public void ScopeTypeController_GetScopeTypes_Returns_List_Of_ScopeTypes() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetScopeTypes()).Returns(MockHelper.CreateValidScopeTypesReader(Constants.SCOPETYPE_ValidScopeTypeCount)); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - // Act - var scopeTypes = scopeTypeController.GetScopeTypes(); - - // Assert - Assert.AreEqual(Constants.SCOPETYPE_ValidScopeTypeCount, scopeTypes.Count()); - } - - [Test] - public void ScopeTypeController_UpdateScopeType_Throws_On_Null_ScopeType() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => scopeTypeController.UpdateScopeType(null)); - } - - [Test] - public void ScopeTypeController_UpdateScopeType_Throws_On_Negative_ScopeTypeId() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); - scopeType.ScopeType = Constants.SCOPETYPE_InValidScopeType; - - Assert.Throws(() => scopeTypeController.UpdateScopeType(scopeType)); - } - - [Test] - public void ScopeTypeController_UpdateScopeType_Calls_DataService_On_Valid_ContentType() - { - // Arrange - var mockDataService = new Mock(); - var scopeTypeController = new ScopeTypeController(mockDataService.Object); - - ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); - scopeType.ScopeTypeId = Constants.SCOPETYPE_UpdateScopeTypeId; - scopeType.ScopeType = Constants.SCOPETYPE_UpdateScopeType; - - // Act - scopeTypeController.UpdateScopeType(scopeType); - - // Assert - mockDataService.Verify(ds => ds.UpdateScopeType(scopeType)); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + // Register MockCachingProvider + this.mockCache = MockComponentProvider.CreateNew(); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + public void ScopeTypeController_AddScopeType_Throws_On_Null_ScopeType() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => scopeTypeController.AddScopeType(null)); + } + + [Test] + public void ScopeTypeController_AddScopeType_Calls_DataService_On_Valid_Arguments() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + var scopeType = ContentTestHelper.CreateValidScopeType(); + + // Act + int scopeTypeId = scopeTypeController.AddScopeType(scopeType); + + // Assert + mockDataService.Verify(ds => ds.AddScopeType(scopeType)); + } + + [Test] + public void ScopeTypeController_AddScopeType_Returns_ValidId_On_Valid_ScopeType() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddScopeType(It.IsAny())).Returns(Constants.SCOPETYPE_AddScopeTypeId); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); + + // Act + int scopeTypeId = scopeTypeController.AddScopeType(scopeType); + + // Assert + Assert.AreEqual(Constants.SCOPETYPE_AddScopeTypeId, scopeTypeId); + } + + [Test] + public void ScopeTypeController_AddScopeType_Sets_ValidId_On_Valid_ScopeType() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddScopeType(It.IsAny())).Returns(Constants.SCOPETYPE_AddScopeTypeId); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + var scopeType = ContentTestHelper.CreateValidScopeType(); + + // Act + scopeTypeController.AddScopeType(scopeType); + + // Assert + Assert.AreEqual(Constants.SCOPETYPE_AddScopeTypeId, scopeType.ScopeTypeId); + } + + [Test] + public void ScopeTypeController_DeleteScopeType_Throws_On_Null_ScopeType() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => scopeTypeController.DeleteScopeType(null)); + } + + [Test] + public void ScopeTypeController_DeleteScopeType_Throws_On_Negative_ScopeTypeId() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); + scopeType.ScopeTypeId = Null.NullInteger; + + Assert.Throws(() => scopeTypeController.DeleteScopeType(scopeType)); + } + + [Test] + public void ScopeTypeController_DeleteScopeType_Calls_DataService_On_Valid_ContentTypeId() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + var scopeType = ContentTestHelper.CreateValidScopeType(); + scopeType.ScopeTypeId = Constants.SCOPETYPE_ValidScopeTypeId; + + // Act + scopeTypeController.DeleteScopeType(scopeType); + + // Assert + mockDataService.Verify(ds => ds.DeleteScopeType(scopeType)); + } + + [Test] + public void ScopeTypeController_GetScopeTypes_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetScopeTypes()).Returns(MockHelper.CreateValidScopeTypesReader(Constants.SCOPETYPE_ValidScopeTypeCount)); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + // Act + IQueryable scopeTypes = scopeTypeController.GetScopeTypes(); + + // Assert + mockDataService.Verify(ds => ds.GetScopeTypes()); + } + + [Test] + public void ScopeTypeController_GetScopeTypes_Returns_Empty_List_Of_ScopeTypes_If_No_ScopeTypes() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetScopeTypes()).Returns(MockHelper.CreateEmptyScopeTypeReader()); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + // Act + var scopeTypes = scopeTypeController.GetScopeTypes(); + + // Assert + Assert.IsNotNull(scopeTypes); + Assert.AreEqual(0, scopeTypes.Count()); + } + + [Test] + public void ScopeTypeController_GetScopeTypes_Returns_List_Of_ScopeTypes() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetScopeTypes()).Returns(MockHelper.CreateValidScopeTypesReader(Constants.SCOPETYPE_ValidScopeTypeCount)); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + // Act + var scopeTypes = scopeTypeController.GetScopeTypes(); + + // Assert + Assert.AreEqual(Constants.SCOPETYPE_ValidScopeTypeCount, scopeTypes.Count()); + } + + [Test] + public void ScopeTypeController_UpdateScopeType_Throws_On_Null_ScopeType() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => scopeTypeController.UpdateScopeType(null)); + } + + [Test] + public void ScopeTypeController_UpdateScopeType_Throws_On_Negative_ScopeTypeId() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); + scopeType.ScopeType = Constants.SCOPETYPE_InValidScopeType; + + Assert.Throws(() => scopeTypeController.UpdateScopeType(scopeType)); + } + + [Test] + public void ScopeTypeController_UpdateScopeType_Calls_DataService_On_Valid_ContentType() + { + // Arrange + var mockDataService = new Mock(); + var scopeTypeController = new ScopeTypeController(mockDataService.Object); + + ScopeType scopeType = ContentTestHelper.CreateValidScopeType(); + scopeType.ScopeTypeId = Constants.SCOPETYPE_UpdateScopeTypeId; + scopeType.ScopeType = Constants.SCOPETYPE_UpdateScopeType; + + // Act + scopeTypeController.UpdateScopeType(scopeType); + + // Assert + mockDataService.Verify(ds => ds.UpdateScopeType(scopeType)); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs index c42ce8e0211..0b45b390503 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/TermControllerTests.cs @@ -2,627 +2,629 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Content -{ - using System; +namespace DotNetNuke.Tests.Content +{ + using System; using System.Linq; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Data; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Content; + using DotNetNuke.Entities.Content.Data; using DotNetNuke.Entities.Content.Taxonomy; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Cache; - using DotNetNuke.Tests.Content.Mocks; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Entities.Users; + using DotNetNuke.Services.Cache; + using DotNetNuke.Tests.Content.Mocks; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Summary description for TermTests. - /// - [TestFixture] - public class TermControllerTests - { - private Mock mockCache; - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + /// + /// Summary description for TermTests. + /// + [TestFixture] + public class TermControllerTests + { + private Mock mockCache; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - Mock vocabularyController = MockHelper.CreateMockVocabularyController(); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - - // Register MockCachingProvider - this.mockCache = MockComponentProvider.CreateNew(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void TermController_AddTerm_Throws_On_Null_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.AddTerm(null)); - } - - [Test] - public void TermController_AddTerm_Throws_On_Invalid_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - term.Name = Constants.TERM_InValidName; - - // Act, Arrange - Assert.Throws(() => termController.AddTerm(term)); - } - - [Test] - public void TermController_AddTerm_Throws_On_Negative_VocabularyId() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Null.NullInteger); - - // Act, Arrange - Assert.Throws(() => termController.AddTerm(term)); - } - - [Test] - public void TermController_AddTerm_Should_Call_DataService_AddSimpleTerm_If_Term_Is_Simple_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - - // Act - int termId = termController.AddTerm(term); - - // Assert - mockDataService.Verify(ds => ds.AddSimpleTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); - } - - [Test] - public void TermController_AddTerm_Should_Call_DataService_AddHeirarchicalTerm_If_Term_Is_Heirarchical_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); - - // Act - int termId = termController.AddTerm(term); - - // Assert - mockDataService.Verify(ds => ds.AddHeirarchicalTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); - } - - [Test] - public void TermController_AddTerm_Returns_Valid_Id_On_Valid_Term_If_Term_Is_Simple_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - mockDataService.Setup(ds => ds.AddSimpleTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - - // Act - int termId = termController.AddTerm(term); - - // Assert - Assert.AreEqual(Constants.TERM_AddTermId, termId); - } - - [Test] - public void TermController_AddTerm_Sets_Valid_Id_On_Valid_Term_If_Term_Is_Simple_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - mockDataService.Setup(ds => ds.AddSimpleTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - - // Act - termController.AddTerm(term); - - // Assert - Assert.AreEqual(Constants.TERM_AddTermId, term.TermId); - } - - [Test] - public void TermController_AddTerm_Returns_Valid_Id_On_Valid_Term_If_Term_Is_Heirarchical_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - mockDataService.Setup(ds => ds.AddHeirarchicalTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); - - Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); - - // Act - int termId = termController.AddTerm(term); - - // Assert - Assert.AreEqual(Constants.TERM_AddTermId, termId); - } - - [Test] - public void TermController_AddTerm_Sets_Valid_Id_On_Valid_Term_If_Term_Is_Heirarchical_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - mockDataService.Setup(ds => ds.AddHeirarchicalTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); - - Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); - - // Act - termController.AddTerm(term); - - // Assert - Assert.AreEqual(Constants.TERM_AddTermId, term.TermId); - } - - [Test] - public void TermController_AddTerm_Clears_Term_Cache_On_Valid_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - - // Act - termController.AddTerm(term); - - // Assert - this.mockCache.Verify(cache => cache.Remove(string.Format(Constants.TERM_CacheKey, Constants.VOCABULARY_ValidVocabularyId))); - } - - [Test] - public void TermController_AddTermToContent_Throws_On_Null_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - - // Act, Arrange - Assert.Throws(() => termController.AddTermToContent(null, content)); - } - - [Test] - public void TermController_AddTermToContent_Throws_On_Null_ContentItem() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - - // Act, Arrange - Assert.Throws(() => termController.AddTermToContent(term, null)); - } - - [Test] - public void TermController_AddTermToContent_Should_Call_DataService_If_Valid_Params() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - - // Act - termController.AddTermToContent(term, content); - - // Assert - mockDataService.Verify(ds => ds.AddTermToContent(term, content)); - } - - [Test] - public void TermController_DeleteTerm_Throws_On_Null_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.DeleteTerm(null)); - } - - [Test] - public void TermController_DeleteTerm_Throws_On_Negative_TermId() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - var term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - term.TermId = Null.NullInteger; - - // Act, Arrange - Assert.Throws(() => termController.DeleteTerm(term)); - } - - [Test] - public void TermController_DeleteTerm_Should_Call_DataService_DeleteSimpleTerm_If_Term_Is_Simple_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - var term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - term.TermId = Constants.TERM_DeleteTermId; - - // Act - termController.DeleteTerm(term); - - // Assert - mockDataService.Verify(ds => ds.DeleteSimpleTerm(term)); - } - - [Test] - public void TermController_DeleteTerm_Should_Call_DataService_DeleteHeirarchicalTerm_If_Term_Is_Heirarchical_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - var term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); - term.TermId = Constants.TERM_DeleteTermId; - - // Act - termController.DeleteTerm(term); - - // Assert - mockDataService.Verify(ds => ds.DeleteHeirarchicalTerm(term)); - } - - [Test] - public void TermController_DeleteTerm_Clears_Term_Cache_On_Valid_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - var term = new Term(Constants.VOCABULARY_ValidVocabularyId) { TermId = Constants.TERM_DeleteTermId }; - - // Act - termController.DeleteTerm(term); - - // Assert - this.mockCache.Verify(cache => cache.Remove(string.Format(Constants.TERM_CacheKey, Constants.VOCABULARY_ValidVocabularyId))); - } - - [Test] - public void TermController_GetTerm_Throws_On_Negative_TermId() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.GetTerm(Null.NullInteger)); - } - - [Test] - public void TermController_GetTerm_Returns_Null_On_InValidTermId() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetTerm(Constants.TERM_InValidTermId)).Returns(MockHelper.CreateEmptyTermReader()); - - var termController = new TermController(mockDataService.Object); - - // Act - Term term = termController.GetTerm(Constants.TERM_InValidTermId); - - // Assert - Assert.IsNull(term); - } - - [Test] - public void TermController_GetTerm_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetTerm(Constants.TERM_ValidTermId)).Returns(MockHelper.CreateValidTermReader()); - var termController = new TermController(mockDataService.Object); - - // Act - Term term = termController.GetTerm(Constants.TERM_ValidTermId); - - // Assert - mockDataService.Verify(ds => ds.GetTerm(Constants.TERM_ValidTermId)); - } - - [Test] - public void TermController_GetTerm_Returns_Term_On_Valid_TermId() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetTerm(Constants.TERM_ValidTermId)).Returns(MockHelper.CreateValidTermReader()); - - var termController = new TermController(mockDataService.Object); - - // Act - var term = termController.GetTerm(Constants.TERM_ValidTermId); - - // Assert - Assert.AreEqual(Constants.TERM_ValidTermId, term.TermId); - Assert.AreEqual(Constants.TERM_ValidName, term.Name); - } - - [Test] - public void TermController_GetTermsByContent_Throws_On_Invalid_ContentItemId() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.GetTermsByContent(Null.NullInteger)); - } - - [Test] - public void TermController_GetTermsByContent_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetTermsByContent(Constants.TERM_ValidContent1)).Returns(MockHelper.CreateValidTermsReader( - Constants.TERM_ValidCountForContent1, - v => Constants.TERM_ValidVocabularyId, - c => Constants.TERM_ValidContent1)); - var termController = new TermController(mockDataService.Object); - - // Act - IQueryable terms = termController.GetTermsByContent(Constants.TERM_ValidContent1); - - // Assert - mockDataService.Verify(ds => ds.GetTermsByContent(Constants.TERM_ValidContent1)); - } - - [Test] - public void TermController_GetTermsByContent_Returns_Terms_On_Valid_ContentItemId() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetTermsByContent(Constants.TERM_ValidContent1)).Returns(MockHelper.CreateValidTermsReader( - Constants.TERM_ValidCountForContent1, - v => Constants.TERM_ValidVocabularyId, - c => Constants.TERM_ValidContent1)); - - var termController = new TermController(mockDataService.Object); - - // Act - var terms = termController.GetTermsByContent(Constants.TERM_ValidContent1).ToList(); - - // Assert - Assert.AreEqual(Constants.TERM_ValidCountForContent1, terms.Count); - - for (int i = 0; i < Constants.TERM_ValidCountForContent1; i++) - { - Assert.AreEqual(i + Constants.TERM_ValidTermId, terms[i].TermId); - Assert.AreEqual(ContentTestHelper.GetTermName(i + Constants.TERM_ValidTermId), terms[i].Name); - } - } - - [Test] - public void TermController_GetTermsByVocabulary_Throws_On_Invalid_VocabularyId() - { - // Arrange - var mockDataService = new Mock(); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.GetTermsByVocabulary(Null.NullInteger)); - } - - [Test] - public void TermController_GetTermsByVocabulary_Returns_Terms_On_Valid_VocabularyId() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetTermsByVocabulary(Constants.TERM_ValidVocabulary1)).Returns(MockHelper.CreateValidTermsReader( - Constants.TERM_ValidCountForVocabulary1, - v => Constants.TERM_ValidVocabulary1, - c => Constants.TERM_ValidContent1)); - MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); - - var termController = new TermController(mockDataService.Object); - - // Act - var terms = termController.GetTermsByVocabulary(Constants.TERM_ValidVocabulary1).ToList(); - - // Assert - Assert.AreEqual(Constants.TERM_ValidCountForVocabulary1, terms.Count); - - for (int i = 0; i < Constants.TERM_ValidCountForVocabulary1; i++) - { - Assert.AreEqual(i + Constants.TERM_ValidTermId, terms[i].TermId); - Assert.AreEqual(ContentTestHelper.GetTermName(i + Constants.TERM_ValidTermId), terms[i].Name); - } - } - - [Test] - public void TermController_GetTermsByVocabulary_Throws_On_Invalid_VocabularyName() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.GetTermsByVocabulary(Null.NullString)); - } - - [Test] - public void TermController_RemoveTermsFromContent_Throws_On_Null_ContentItem() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.RemoveTermsFromContent(null)); - } - - [Test] - public void TermController_RemoveTermsFromContent_Should_Call_DataService_If_Valid_Params() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - ContentItem content = ContentTestHelper.CreateValidContentItem(); - - // Act - termController.RemoveTermsFromContent(content); - - // Assert - mockDataService.Verify(ds => ds.RemoveTermsFromContent(content)); - } - - [Test] - public void TermController_UpdateTerm_Throws_On_Null_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - // Act, Arrange - Assert.Throws(() => termController.UpdateTerm(null)); - } - - [Test] - public void TermController_UpdateTerm_Throws_On_Negative_TermId() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Null.NullInteger); - - // Act, Arrange - Assert.Throws(() => termController.UpdateTerm(term)); - } - - [Test] - public void TermController_UpdateTerm_Throws_On_Invalid_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - term.Name = Constants.TERM_InValidName; - - // Act, Arrange - Assert.Throws(() => termController.UpdateTerm(term)); - } - - [Test] - public void TermController_UpdateTerm_Throws_On_Negative_VocabularyId() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Null.NullInteger); - - // Act, Arrange - Assert.Throws(() => termController.UpdateTerm(term)); - } - - [Test] - public void TermController_UpdateTerm_Should_Call_DataService_UpdateSimpleTerm_If_Term_Is_Simple_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - term.TermId = Constants.TERM_UpdateTermId; - term.Name = Constants.TERM_UpdateName; - term.Weight = Constants.TERM_UpdateWeight; - - // Act - termController.UpdateTerm(term); - - // Assert - mockDataService.Verify(ds => ds.UpdateSimpleTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); - } - - [Test] - public void TermController_UpdateTerm_Should_Call_DataService_UpdateHeirarchicalTerm_If_Term_Is_Heirarchical_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); - term.TermId = Constants.TERM_UpdateTermId; - term.Name = Constants.TERM_UpdateName; - term.Weight = Constants.TERM_UpdateWeight; - - // Act - termController.UpdateTerm(term); - - // Assert - mockDataService.Verify(ds => ds.UpdateHeirarchicalTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); - } - - [Test] - public void TermController_UpdateTerm_Clears_Term_Cache_On_Valid_Term() - { - // Arrange - var mockDataService = new Mock(); - var termController = new TermController(mockDataService.Object); - - Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); - term.TermId = Constants.TERM_UpdateTermId; - term.Name = Constants.TERM_UpdateName; - term.Weight = Constants.TERM_UpdateWeight; - - // Act - termController.UpdateTerm(term); - - // Assert - this.mockCache.Verify(cache => cache.Remove(string.Format(Constants.TERM_CacheKey, Constants.VOCABULARY_ValidVocabularyId))); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + Mock vocabularyController = MockHelper.CreateMockVocabularyController(); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + + // Register MockCachingProvider + this.mockCache = MockComponentProvider.CreateNew(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + public void TermController_AddTerm_Throws_On_Null_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.AddTerm(null)); + } + + [Test] + public void TermController_AddTerm_Throws_On_Invalid_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + term.Name = Constants.TERM_InValidName; + + // Act, Arrange + Assert.Throws(() => termController.AddTerm(term)); + } + + [Test] + public void TermController_AddTerm_Throws_On_Negative_VocabularyId() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Null.NullInteger); + + // Act, Arrange + Assert.Throws(() => termController.AddTerm(term)); + } + + [Test] + public void TermController_AddTerm_Should_Call_DataService_AddSimpleTerm_If_Term_Is_Simple_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + + // Act + int termId = termController.AddTerm(term); + + // Assert + mockDataService.Verify(ds => ds.AddSimpleTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); + } + + [Test] + public void TermController_AddTerm_Should_Call_DataService_AddHeirarchicalTerm_If_Term_Is_Heirarchical_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); + + // Act + int termId = termController.AddTerm(term); + + // Assert + mockDataService.Verify(ds => ds.AddHeirarchicalTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); + } + + [Test] + public void TermController_AddTerm_Returns_Valid_Id_On_Valid_Term_If_Term_Is_Simple_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + mockDataService.Setup(ds => ds.AddSimpleTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + + // Act + int termId = termController.AddTerm(term); + + // Assert + Assert.AreEqual(Constants.TERM_AddTermId, termId); + } + + [Test] + public void TermController_AddTerm_Sets_Valid_Id_On_Valid_Term_If_Term_Is_Simple_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + mockDataService.Setup(ds => ds.AddSimpleTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + + // Act + termController.AddTerm(term); + + // Assert + Assert.AreEqual(Constants.TERM_AddTermId, term.TermId); + } + + [Test] + public void TermController_AddTerm_Returns_Valid_Id_On_Valid_Term_If_Term_Is_Heirarchical_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + mockDataService.Setup(ds => ds.AddHeirarchicalTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); + + Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); + + // Act + int termId = termController.AddTerm(term); + + // Assert + Assert.AreEqual(Constants.TERM_AddTermId, termId); + } + + [Test] + public void TermController_AddTerm_Sets_Valid_Id_On_Valid_Term_If_Term_Is_Heirarchical_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + mockDataService.Setup(ds => ds.AddHeirarchicalTerm(It.IsAny(), It.IsAny())).Returns(Constants.TERM_AddTermId); + + Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); + + // Act + termController.AddTerm(term); + + // Assert + Assert.AreEqual(Constants.TERM_AddTermId, term.TermId); + } + + [Test] + public void TermController_AddTerm_Clears_Term_Cache_On_Valid_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + + // Act + termController.AddTerm(term); + + // Assert + this.mockCache.Verify(cache => cache.Remove(string.Format(Constants.TERM_CacheKey, Constants.VOCABULARY_ValidVocabularyId))); + } + + [Test] + public void TermController_AddTermToContent_Throws_On_Null_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + + // Act, Arrange + Assert.Throws(() => termController.AddTermToContent(null, content)); + } + + [Test] + public void TermController_AddTermToContent_Throws_On_Null_ContentItem() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + + // Act, Arrange + Assert.Throws(() => termController.AddTermToContent(term, null)); + } + + [Test] + public void TermController_AddTermToContent_Should_Call_DataService_If_Valid_Params() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + + // Act + termController.AddTermToContent(term, content); + + // Assert + mockDataService.Verify(ds => ds.AddTermToContent(term, content)); + } + + [Test] + public void TermController_DeleteTerm_Throws_On_Null_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.DeleteTerm(null)); + } + + [Test] + public void TermController_DeleteTerm_Throws_On_Negative_TermId() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + var term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + term.TermId = Null.NullInteger; + + // Act, Arrange + Assert.Throws(() => termController.DeleteTerm(term)); + } + + [Test] + public void TermController_DeleteTerm_Should_Call_DataService_DeleteSimpleTerm_If_Term_Is_Simple_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + var term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + term.TermId = Constants.TERM_DeleteTermId; + + // Act + termController.DeleteTerm(term); + + // Assert + mockDataService.Verify(ds => ds.DeleteSimpleTerm(term)); + } + + [Test] + public void TermController_DeleteTerm_Should_Call_DataService_DeleteHeirarchicalTerm_If_Term_Is_Heirarchical_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + var term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); + term.TermId = Constants.TERM_DeleteTermId; + + // Act + termController.DeleteTerm(term); + + // Assert + mockDataService.Verify(ds => ds.DeleteHeirarchicalTerm(term)); + } + + [Test] + public void TermController_DeleteTerm_Clears_Term_Cache_On_Valid_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + var term = new Term(Constants.VOCABULARY_ValidVocabularyId) { TermId = Constants.TERM_DeleteTermId }; + + // Act + termController.DeleteTerm(term); + + // Assert + this.mockCache.Verify(cache => cache.Remove(string.Format(Constants.TERM_CacheKey, Constants.VOCABULARY_ValidVocabularyId))); + } + + [Test] + public void TermController_GetTerm_Throws_On_Negative_TermId() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.GetTerm(Null.NullInteger)); + } + + [Test] + public void TermController_GetTerm_Returns_Null_On_InValidTermId() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetTerm(Constants.TERM_InValidTermId)).Returns(MockHelper.CreateEmptyTermReader()); + + var termController = new TermController(mockDataService.Object); + + // Act + Term term = termController.GetTerm(Constants.TERM_InValidTermId); + + // Assert + Assert.IsNull(term); + } + + [Test] + public void TermController_GetTerm_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetTerm(Constants.TERM_ValidTermId)).Returns(MockHelper.CreateValidTermReader()); + var termController = new TermController(mockDataService.Object); + + // Act + Term term = termController.GetTerm(Constants.TERM_ValidTermId); + + // Assert + mockDataService.Verify(ds => ds.GetTerm(Constants.TERM_ValidTermId)); + } + + [Test] + public void TermController_GetTerm_Returns_Term_On_Valid_TermId() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetTerm(Constants.TERM_ValidTermId)).Returns(MockHelper.CreateValidTermReader()); + + var termController = new TermController(mockDataService.Object); + + // Act + var term = termController.GetTerm(Constants.TERM_ValidTermId); + + // Assert + Assert.AreEqual(Constants.TERM_ValidTermId, term.TermId); + Assert.AreEqual(Constants.TERM_ValidName, term.Name); + } + + [Test] + public void TermController_GetTermsByContent_Throws_On_Invalid_ContentItemId() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.GetTermsByContent(Null.NullInteger)); + } + + [Test] + public void TermController_GetTermsByContent_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetTermsByContent(Constants.TERM_ValidContent1)).Returns(MockHelper.CreateValidTermsReader( + Constants.TERM_ValidCountForContent1, + v => Constants.TERM_ValidVocabularyId, + c => Constants.TERM_ValidContent1)); + var termController = new TermController(mockDataService.Object); + + // Act + IQueryable terms = termController.GetTermsByContent(Constants.TERM_ValidContent1); + + // Assert + mockDataService.Verify(ds => ds.GetTermsByContent(Constants.TERM_ValidContent1)); + } + + [Test] + public void TermController_GetTermsByContent_Returns_Terms_On_Valid_ContentItemId() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetTermsByContent(Constants.TERM_ValidContent1)).Returns(MockHelper.CreateValidTermsReader( + Constants.TERM_ValidCountForContent1, + v => Constants.TERM_ValidVocabularyId, + c => Constants.TERM_ValidContent1)); + + var termController = new TermController(mockDataService.Object); + + // Act + var terms = termController.GetTermsByContent(Constants.TERM_ValidContent1).ToList(); + + // Assert + Assert.AreEqual(Constants.TERM_ValidCountForContent1, terms.Count); + + for (int i = 0; i < Constants.TERM_ValidCountForContent1; i++) + { + Assert.AreEqual(i + Constants.TERM_ValidTermId, terms[i].TermId); + Assert.AreEqual(ContentTestHelper.GetTermName(i + Constants.TERM_ValidTermId), terms[i].Name); + } + } + + [Test] + public void TermController_GetTermsByVocabulary_Throws_On_Invalid_VocabularyId() + { + // Arrange + var mockDataService = new Mock(); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.GetTermsByVocabulary(Null.NullInteger)); + } + + [Test] + public void TermController_GetTermsByVocabulary_Returns_Terms_On_Valid_VocabularyId() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetTermsByVocabulary(Constants.TERM_ValidVocabulary1)).Returns(MockHelper.CreateValidTermsReader( + Constants.TERM_ValidCountForVocabulary1, + v => Constants.TERM_ValidVocabulary1, + c => Constants.TERM_ValidContent1)); + MockComponentProvider.CreateDataProvider().Setup(c => c.GetProviderPath()).Returns(string.Empty); + + var termController = new TermController(mockDataService.Object); + + // Act + var terms = termController.GetTermsByVocabulary(Constants.TERM_ValidVocabulary1).ToList(); + + // Assert + Assert.AreEqual(Constants.TERM_ValidCountForVocabulary1, terms.Count); + + for (int i = 0; i < Constants.TERM_ValidCountForVocabulary1; i++) + { + Assert.AreEqual(i + Constants.TERM_ValidTermId, terms[i].TermId); + Assert.AreEqual(ContentTestHelper.GetTermName(i + Constants.TERM_ValidTermId), terms[i].Name); + } + } + + [Test] + public void TermController_GetTermsByVocabulary_Throws_On_Invalid_VocabularyName() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.GetTermsByVocabulary(Null.NullString)); + } + + [Test] + public void TermController_RemoveTermsFromContent_Throws_On_Null_ContentItem() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.RemoveTermsFromContent(null)); + } + + [Test] + public void TermController_RemoveTermsFromContent_Should_Call_DataService_If_Valid_Params() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + ContentItem content = ContentTestHelper.CreateValidContentItem(); + + // Act + termController.RemoveTermsFromContent(content); + + // Assert + mockDataService.Verify(ds => ds.RemoveTermsFromContent(content)); + } + + [Test] + public void TermController_UpdateTerm_Throws_On_Null_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + // Act, Arrange + Assert.Throws(() => termController.UpdateTerm(null)); + } + + [Test] + public void TermController_UpdateTerm_Throws_On_Negative_TermId() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Null.NullInteger); + + // Act, Arrange + Assert.Throws(() => termController.UpdateTerm(term)); + } + + [Test] + public void TermController_UpdateTerm_Throws_On_Invalid_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + term.Name = Constants.TERM_InValidName; + + // Act, Arrange + Assert.Throws(() => termController.UpdateTerm(term)); + } + + [Test] + public void TermController_UpdateTerm_Throws_On_Negative_VocabularyId() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Null.NullInteger); + + // Act, Arrange + Assert.Throws(() => termController.UpdateTerm(term)); + } + + [Test] + public void TermController_UpdateTerm_Should_Call_DataService_UpdateSimpleTerm_If_Term_Is_Simple_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + term.TermId = Constants.TERM_UpdateTermId; + term.Name = Constants.TERM_UpdateName; + term.Weight = Constants.TERM_UpdateWeight; + + // Act + termController.UpdateTerm(term); + + // Assert + mockDataService.Verify(ds => ds.UpdateSimpleTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); + } + + [Test] + public void TermController_UpdateTerm_Should_Call_DataService_UpdateHeirarchicalTerm_If_Term_Is_Heirarchical_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidHeirarchicalTerm(Constants.VOCABULARY_HierarchyVocabularyId, Constants.TERM_ValidParentTermId); + term.TermId = Constants.TERM_UpdateTermId; + term.Name = Constants.TERM_UpdateName; + term.Weight = Constants.TERM_UpdateWeight; + + // Act + termController.UpdateTerm(term); + + // Assert + mockDataService.Verify(ds => ds.UpdateHeirarchicalTerm(term, UserController.Instance.GetCurrentUserInfo().UserID)); + } + + [Test] + public void TermController_UpdateTerm_Clears_Term_Cache_On_Valid_Term() + { + // Arrange + var mockDataService = new Mock(); + var termController = new TermController(mockDataService.Object); + + Term term = ContentTestHelper.CreateValidSimpleTerm(Constants.VOCABULARY_ValidVocabularyId); + term.TermId = Constants.TERM_UpdateTermId; + term.Name = Constants.TERM_UpdateName; + term.Weight = Constants.TERM_UpdateWeight; + + // Act + termController.UpdateTerm(term); + + // Assert + this.mockCache.Verify(cache => cache.Remove(string.Format(Constants.TERM_CacheKey, Constants.VOCABULARY_ValidVocabularyId))); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs index 7a9c6e52b80..c141ad0f645 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Content/VocabularyControllerTests.cs @@ -24,8 +24,6 @@ namespace DotNetNuke.Tests.Content using NUnit.Framework; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - /// /// Summary description for VocabularyTests. /// @@ -40,7 +38,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); // Register MockCachingProvider @@ -53,7 +51,7 @@ public void TearDown() { Globals.DependencyProvider = null; MockComponentProvider.ResetContainer(); - } + } [Test] public void VocabularyController_AddVocabulary_Throws_On_Null_Vocabulary() diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs index 7e01607bd27..652f571e410 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs @@ -2,419 +2,417 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Common -{ - using System.Collections.Generic; - using System.Linq; +namespace DotNetNuke.Tests.Core.Common +{ + using System.Collections.Generic; + using System.Linq; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Portals; - using DotNetNuke.Common; + using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Tabs; using DotNetNuke.Services.Localization; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class NavigationManagerTests - { - private const int TabID = 100; - private const int PortalID = 7; - private const string DefaultURLPattern = "/Default.aspx?tabid={0}"; - private const string DefaultSuperTabPattern = "&portalid={0}"; - private const string ControlKeyPattern = "&ctl={0}"; - private const string LanguagePattern = "&language={0}"; - private INavigationManager navigationManager; - - [TestFixtureSetUp] - public void Setup() - { - this.navigationManager = new NavigationManager(PortalControllerMock()); - TabController.SetTestableInstance(TabControllerMock()); - LocaleController.SetTestableInstance(LocaleControllerMock()); - - IPortalController PortalControllerMock() - { - var mockPortalController = new Mock(); - mockPortalController - .Setup(x => x.GetCurrentPortalSettings()) - .Returns(PortalSettingsMock()); - mockPortalController - .Setup(x => x.GetCurrentSettings()) - .Returns(PortalSettingsMock()); - - return mockPortalController.Object; - - PortalSettings PortalSettingsMock() - { - var portalSettings = new PortalSettings - { - PortalId = PortalID, - ActiveTab = new TabInfo - { - TabID = TabID - }, - }; - - return portalSettings; - } - } - - ITabController TabControllerMock() - { - var mockTabController = new Mock(); - mockTabController - .Setup(x => x.GetTabsByPortal(Null.NullInteger)) - .Returns(default(TabCollection)); - mockTabController - .Setup(x => x.GetTab(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new TabInfo - { - CultureCode = "en-US", - }); - - return mockTabController.Object; - } - - ILocaleController LocaleControllerMock() - { - var mockLocaleController = new Mock(); - mockLocaleController - .Setup(x => x.GetLocales(It.IsAny())) - .Returns(new Dictionary - { - { "en-US", new Locale() }, - { "TEST", new Locale() }, - }); - - return mockLocaleController.Object; - } - + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class NavigationManagerTests + { + private const int TabID = 100; + private const int PortalID = 7; + private const string DefaultURLPattern = "/Default.aspx?tabid={0}"; + private const string DefaultSuperTabPattern = "&portalid={0}"; + private const string ControlKeyPattern = "&ctl={0}"; + private const string LanguagePattern = "&language={0}"; + private INavigationManager navigationManager; + + [TestFixtureSetUp] + public void Setup() + { + this.navigationManager = new NavigationManager(PortalControllerMock()); + TabController.SetTestableInstance(TabControllerMock()); + LocaleController.SetTestableInstance(LocaleControllerMock()); + + IPortalController PortalControllerMock() + { + var mockPortalController = new Mock(); + mockPortalController + .Setup(x => x.GetCurrentPortalSettings()) + .Returns(PortalSettingsMock()); + mockPortalController + .Setup(x => x.GetCurrentSettings()) + .Returns(PortalSettingsMock()); + + return mockPortalController.Object; + + PortalSettings PortalSettingsMock() + { + var portalSettings = new PortalSettings + { + PortalId = PortalID, + ActiveTab = new TabInfo + { + TabID = TabID + }, + }; + + return portalSettings; + } + } + + ITabController TabControllerMock() + { + var mockTabController = new Mock(); + mockTabController + .Setup(x => x.GetTabsByPortal(Null.NullInteger)) + .Returns(default(TabCollection)); + mockTabController + .Setup(x => x.GetTab(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(new TabInfo + { + CultureCode = "en-US", + }); + + return mockTabController.Object; + } + + ILocaleController LocaleControllerMock() + { + var mockLocaleController = new Mock(); + mockLocaleController + .Setup(x => x.GetLocales(It.IsAny())) + .Returns(new Dictionary + { + { "en-US", new Locale() }, + { "TEST", new Locale() }, + }); + + return mockLocaleController.Object; + } + var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => this.navigationManager); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TestFixtureTearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - this.navigationManager = null; - TabController.ClearInstance(); - LocaleController.ClearInstance(); - } - - [Test] - public void NavigateUrlTest() - { - var expected = string.Format(DefaultURLPattern, TabID); - var actual = this.navigationManager.NavigateURL(); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(1)] - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - [TestCase(8)] - [TestCase(9)] - [TestCase(10)] - [TestCase(11)] - public void NavigateUrl_CustomTabID(int tabId) - { - var expected = string.Format(DefaultURLPattern, tabId); - var actual = this.navigationManager.NavigateURL(tabId); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [Test] - public void NavigateUrl_CustomTab_NotSuperTab() - { - var customTabId = 55; - var expected = string.Format(DefaultURLPattern, customTabId); - var actual = this.navigationManager.NavigateURL(customTabId, false); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(1)] - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - [TestCase(8)] - [TestCase(9)] - [TestCase(10)] - [TestCase(11)] - public void NavigateUrl_CustomTab_IsSuperTab(int tabId) - { - var expected = string.Format(DefaultURLPattern, tabId) + string.Format(DefaultSuperTabPattern, PortalID); - var actual = this.navigationManager.NavigateURL(tabId, true); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [Test] - [Ignore] - public void NavigateUrl_ControlKey_AccessDenied() - { - // TODO - We can't properly test this until we migrate - // Globals.AccessDeniedURL to an interface in the abstraction - // project. The dependencies go very deep and make it very - // difficult to properly test just the NavigationManager logic. - var actual = this.navigationManager.NavigateURL("Access Denied"); - } - - [Test] - public void NavigateUrl_ControlKey() - { - var controlKey = "My-Control-Key"; - var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey); - var actual = this.navigationManager.NavigateURL(controlKey); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [Test] - public void NavigateUrl_ControlKey_EmptyAdditionalParameter() - { - var controlKey = "My-Control-Key"; - var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey); - var actual = this.navigationManager.NavigateURL(controlKey, new string[0]); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [Test] - public void NavigateUrl_ControlKey_SingleAdditionalParameter() - { - var controlKey = "My-Control-Key"; - var parameters = new string[] { "My-Parameter" }; - var expected = string.Format(DefaultURLPattern, TabID) + - string.Format(ControlKeyPattern, controlKey) + - $"&{parameters[0]}"; - var actual = this.navigationManager.NavigateURL(controlKey, parameters); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - [TestCase(8)] - [TestCase(9)] - [TestCase(10)] - public void NavigateUrl_ControlKey_MultipleAdditionalParameter(int count) - { - string[] parameters = new string[count]; - for (int index = 0; index < count; index++) - { - parameters[index] = $"My-Parameter{index}"; - } - - var controlKey = "My-Control-Key"; - var expected = string.Format(DefaultURLPattern, TabID) + - string.Format(ControlKeyPattern, controlKey) + - parameters.Select(s => $"&{s}").Aggregate((x, y) => $"{x}{y}"); - var actual = this.navigationManager.NavigateURL(controlKey, parameters); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(1)] - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - [TestCase(8)] - [TestCase(9)] - [TestCase(10)] - [TestCase(11)] - public void NavigateUrl_TabID_ControlKey(int tabId) - { - var controlKey = "My-Control-Key"; - var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); - var actual = this.navigationManager.NavigateURL(tabId, controlKey); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(1)] - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - [TestCase(8)] - [TestCase(9)] - [TestCase(10)] - [TestCase(11)] - public void NavigateUrl_TabID_EmptyControlKey(int tabId) - { - var expected = string.Format(DefaultURLPattern, tabId); - var actual = this.navigationManager.NavigateURL(tabId, string.Empty); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(1)] - [TestCase(2)] - [TestCase(3)] - [TestCase(4)] - [TestCase(5)] - [TestCase(6)] - [TestCase(7)] - [TestCase(8)] - [TestCase(9)] - [TestCase(10)] - [TestCase(11)] - public void NavigateUrl_TabID_NullControlKey(int tabId) - { - var expected = string.Format(DefaultURLPattern, tabId); - var actual = this.navigationManager.NavigateURL(tabId, string.Empty); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(0, "My-Control-Key-0")] - [TestCase(1, "My-Control-Key-1")] - [TestCase(2, "My-Control-Key-2")] - [TestCase(3, "My-Control-Key-3")] - [TestCase(4, "My-Control-Key-4")] - [TestCase(5, "My-Control-Key-5")] - [TestCase(6, "My-Control-Key-6")] - [TestCase(7, "My-Control-Key-7")] - [TestCase(8, "My-Control-Key-8")] - [TestCase(9, "My-Control-Key-9")] - [TestCase(10, "My-Control-Key-10")] - public void NavigateUrl_TabID_ControlKey_Parameter(int count, string controlKey) - { - string[] parameters = new string[count]; - for (int index = 0; index < count; index++) - { - parameters[index] = $"My-Parameter{index}"; - } - - var customTabId = 51; - var expected = string.Format(DefaultURLPattern, customTabId) + - string.Format(ControlKeyPattern, controlKey); - - if (parameters.Length > 0) - { - expected += parameters.Select(s => $"&{s}").Aggregate((x, y) => $"{x}{y}"); - } - - var actual = this.navigationManager.NavigateURL(customTabId, controlKey, parameters); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(0, "My-Control-Key-0")] - [TestCase(1, "My-Control-Key-1")] - [TestCase(2, "My-Control-Key-2")] - [TestCase(3, "My-Control-Key-3")] - [TestCase(4, "My-Control-Key-4")] - [TestCase(5, "My-Control-Key-5")] - [TestCase(6, "My-Control-Key-6")] - [TestCase(7, "My-Control-Key-7")] - [TestCase(8, "My-Control-Key-8")] - [TestCase(9, "My-Control-Key-9")] - [TestCase(10, "My-Control-Key-10")] - public void NavigateUrl_TabID_ControlKey_NullParameter(int tabId, string controlKey) - { - var expected = string.Format(DefaultURLPattern, tabId) + - string.Format(ControlKeyPattern, controlKey); - - var actual = this.navigationManager.NavigateURL(tabId, controlKey, null); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(0, "My-Control-Key-0")] - [TestCase(1, "My-Control-Key-1")] - [TestCase(2, "My-Control-Key-2")] - [TestCase(3, "My-Control-Key-3")] - [TestCase(4, "My-Control-Key-4")] - [TestCase(5, "My-Control-Key-5")] - [TestCase(6, "My-Control-Key-6")] - [TestCase(7, "My-Control-Key-7")] - [TestCase(8, "My-Control-Key-8")] - [TestCase(9, "My-Control-Key-9")] - [TestCase(10, "My-Control-Key-10")] - public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlKey) - { - var expected = string.Format(DefaultURLPattern, tabId) + - string.Format(ControlKeyPattern, controlKey); - - var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettings), controlKey, null); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - - [TestCase(0, "My-Control-Key-0")] - [TestCase(1, "My-Control-Key-1")] - [TestCase(2, "My-Control-Key-2")] - [TestCase(3, "My-Control-Key-3")] - [TestCase(4, "My-Control-Key-4")] - [TestCase(5, "My-Control-Key-5")] - [TestCase(6, "My-Control-Key-6")] - [TestCase(7, "My-Control-Key-7")] - [TestCase(8, "My-Control-Key-8")] - [TestCase(9, "My-Control-Key-9")] - [TestCase(10, "My-Control-Key-10")] - public void NavigateUrl_TabId_Settings_ControlKey(int tabId, string controlKey) - { - var mockSettings = new Mock(); - mockSettings - .Setup(x => x.ContentLocalizationEnabled) - .Returns(true); - - var expected = string.Format(DefaultURLPattern, tabId) + - string.Format(ControlKeyPattern, controlKey) + - string.Format(LanguagePattern, "en-US"); - - var actual = this.navigationManager.NavigateURL(tabId, mockSettings.Object, controlKey, null); - - Assert.IsNotNull(actual); - Assert.AreEqual(expected, actual); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TestFixtureTearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + this.navigationManager = null; + TabController.ClearInstance(); + LocaleController.ClearInstance(); + } + + [Test] + public void NavigateUrlTest() + { + var expected = string.Format(DefaultURLPattern, TabID); + var actual = this.navigationManager.NavigateURL(); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [TestCase(5)] + [TestCase(6)] + [TestCase(7)] + [TestCase(8)] + [TestCase(9)] + [TestCase(10)] + [TestCase(11)] + public void NavigateUrl_CustomTabID(int tabId) + { + var expected = string.Format(DefaultURLPattern, tabId); + var actual = this.navigationManager.NavigateURL(tabId); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [Test] + public void NavigateUrl_CustomTab_NotSuperTab() + { + var customTabId = 55; + var expected = string.Format(DefaultURLPattern, customTabId); + var actual = this.navigationManager.NavigateURL(customTabId, false); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [TestCase(5)] + [TestCase(6)] + [TestCase(7)] + [TestCase(8)] + [TestCase(9)] + [TestCase(10)] + [TestCase(11)] + public void NavigateUrl_CustomTab_IsSuperTab(int tabId) + { + var expected = string.Format(DefaultURLPattern, tabId) + string.Format(DefaultSuperTabPattern, PortalID); + var actual = this.navigationManager.NavigateURL(tabId, true); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [Test] + [Ignore] + public void NavigateUrl_ControlKey_AccessDenied() + { + // TODO - We can't properly test this until we migrate + // Globals.AccessDeniedURL to an interface in the abstraction + // project. The dependencies go very deep and make it very + // difficult to properly test just the NavigationManager logic. + var actual = this.navigationManager.NavigateURL("Access Denied"); + } + + [Test] + public void NavigateUrl_ControlKey() + { + var controlKey = "My-Control-Key"; + var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey); + var actual = this.navigationManager.NavigateURL(controlKey); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [Test] + public void NavigateUrl_ControlKey_EmptyAdditionalParameter() + { + var controlKey = "My-Control-Key"; + var expected = string.Format(DefaultURLPattern, TabID) + string.Format(ControlKeyPattern, controlKey); + var actual = this.navigationManager.NavigateURL(controlKey, new string[0]); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [Test] + public void NavigateUrl_ControlKey_SingleAdditionalParameter() + { + var controlKey = "My-Control-Key"; + var parameters = new string[] { "My-Parameter" }; + var expected = string.Format(DefaultURLPattern, TabID) + + string.Format(ControlKeyPattern, controlKey) + + $"&{parameters[0]}"; + var actual = this.navigationManager.NavigateURL(controlKey, parameters); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [TestCase(5)] + [TestCase(6)] + [TestCase(7)] + [TestCase(8)] + [TestCase(9)] + [TestCase(10)] + public void NavigateUrl_ControlKey_MultipleAdditionalParameter(int count) + { + string[] parameters = new string[count]; + for (int index = 0; index < count; index++) + { + parameters[index] = $"My-Parameter{index}"; + } + + var controlKey = "My-Control-Key"; + var expected = string.Format(DefaultURLPattern, TabID) + + string.Format(ControlKeyPattern, controlKey) + + parameters.Select(s => $"&{s}").Aggregate((x, y) => $"{x}{y}"); + var actual = this.navigationManager.NavigateURL(controlKey, parameters); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [TestCase(5)] + [TestCase(6)] + [TestCase(7)] + [TestCase(8)] + [TestCase(9)] + [TestCase(10)] + [TestCase(11)] + public void NavigateUrl_TabID_ControlKey(int tabId) + { + var controlKey = "My-Control-Key"; + var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); + var actual = this.navigationManager.NavigateURL(tabId, controlKey); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [TestCase(5)] + [TestCase(6)] + [TestCase(7)] + [TestCase(8)] + [TestCase(9)] + [TestCase(10)] + [TestCase(11)] + public void NavigateUrl_TabID_EmptyControlKey(int tabId) + { + var expected = string.Format(DefaultURLPattern, tabId); + var actual = this.navigationManager.NavigateURL(tabId, string.Empty); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [TestCase(5)] + [TestCase(6)] + [TestCase(7)] + [TestCase(8)] + [TestCase(9)] + [TestCase(10)] + [TestCase(11)] + public void NavigateUrl_TabID_NullControlKey(int tabId) + { + var expected = string.Format(DefaultURLPattern, tabId); + var actual = this.navigationManager.NavigateURL(tabId, string.Empty); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(0, "My-Control-Key-0")] + [TestCase(1, "My-Control-Key-1")] + [TestCase(2, "My-Control-Key-2")] + [TestCase(3, "My-Control-Key-3")] + [TestCase(4, "My-Control-Key-4")] + [TestCase(5, "My-Control-Key-5")] + [TestCase(6, "My-Control-Key-6")] + [TestCase(7, "My-Control-Key-7")] + [TestCase(8, "My-Control-Key-8")] + [TestCase(9, "My-Control-Key-9")] + [TestCase(10, "My-Control-Key-10")] + public void NavigateUrl_TabID_ControlKey_Parameter(int count, string controlKey) + { + string[] parameters = new string[count]; + for (int index = 0; index < count; index++) + { + parameters[index] = $"My-Parameter{index}"; + } + + var customTabId = 51; + var expected = string.Format(DefaultURLPattern, customTabId) + + string.Format(ControlKeyPattern, controlKey); + + if (parameters.Length > 0) + { + expected += parameters.Select(s => $"&{s}").Aggregate((x, y) => $"{x}{y}"); + } + + var actual = this.navigationManager.NavigateURL(customTabId, controlKey, parameters); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(0, "My-Control-Key-0")] + [TestCase(1, "My-Control-Key-1")] + [TestCase(2, "My-Control-Key-2")] + [TestCase(3, "My-Control-Key-3")] + [TestCase(4, "My-Control-Key-4")] + [TestCase(5, "My-Control-Key-5")] + [TestCase(6, "My-Control-Key-6")] + [TestCase(7, "My-Control-Key-7")] + [TestCase(8, "My-Control-Key-8")] + [TestCase(9, "My-Control-Key-9")] + [TestCase(10, "My-Control-Key-10")] + public void NavigateUrl_TabID_ControlKey_NullParameter(int tabId, string controlKey) + { + var expected = string.Format(DefaultURLPattern, tabId) + + string.Format(ControlKeyPattern, controlKey); + + var actual = this.navigationManager.NavigateURL(tabId, controlKey, null); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(0, "My-Control-Key-0")] + [TestCase(1, "My-Control-Key-1")] + [TestCase(2, "My-Control-Key-2")] + [TestCase(3, "My-Control-Key-3")] + [TestCase(4, "My-Control-Key-4")] + [TestCase(5, "My-Control-Key-5")] + [TestCase(6, "My-Control-Key-6")] + [TestCase(7, "My-Control-Key-7")] + [TestCase(8, "My-Control-Key-8")] + [TestCase(9, "My-Control-Key-9")] + [TestCase(10, "My-Control-Key-10")] + public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlKey) + { + var expected = string.Format(DefaultURLPattern, tabId) + + string.Format(ControlKeyPattern, controlKey); + + var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettings), controlKey, null); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + + [TestCase(0, "My-Control-Key-0")] + [TestCase(1, "My-Control-Key-1")] + [TestCase(2, "My-Control-Key-2")] + [TestCase(3, "My-Control-Key-3")] + [TestCase(4, "My-Control-Key-4")] + [TestCase(5, "My-Control-Key-5")] + [TestCase(6, "My-Control-Key-6")] + [TestCase(7, "My-Control-Key-7")] + [TestCase(8, "My-Control-Key-8")] + [TestCase(9, "My-Control-Key-9")] + [TestCase(10, "My-Control-Key-10")] + public void NavigateUrl_TabId_Settings_ControlKey(int tabId, string controlKey) + { + var mockSettings = new Mock(); + mockSettings + .Setup(x => x.ContentLocalizationEnabled) + .Returns(true); + + var expected = string.Format(DefaultURLPattern, tabId) + + string.Format(ControlKeyPattern, controlKey) + + string.Format(LanguagePattern, "en-US"); + + var actual = this.navigationManager.NavigateURL(tabId, mockSettings.Object, controlKey, null); + + Assert.IsNotNull(actual); + Assert.AreEqual(expected, actual); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs index b9b965a0931..5a4a5698ecb 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Host/HostControllerTest.cs @@ -2,415 +2,417 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Host -{ - using System; - using System.Collections.Generic; - using System.Data; +namespace DotNetNuke.Tests.Core.Controllers.Host +{ + using System; + using System.Collections.Generic; + using System.Data; using System.Linq; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; - using DotNetNuke.Entities; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Cache; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Data; + using DotNetNuke.Entities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Services.Cache; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class HostControllerTest - { - private DataTable _hostSettingsTable; - private Mock _mockCache; - private Mock _mockData; - - [SetUp] - public void SetUp() - { - var serviceCollection = new ServiceCollection(); + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class HostControllerTest + { + private DataTable _hostSettingsTable; + private Mock _mockCache; + private Mock _mockData; + + [SetUp] + public void SetUp() + { + var serviceCollection = new ServiceCollection(); var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this._mockCache = MockComponentProvider.CreateDataCacheProvider(); - MockComponentProvider.CreateEventLogController(); - - this._hostSettingsTable = new DataTable("HostSettings"); - - var nameCol = this._hostSettingsTable.Columns.Add("SettingName"); - this._hostSettingsTable.Columns.Add("SettingValue"); - this._hostSettingsTable.Columns.Add("SettingIsSecure"); - this._hostSettingsTable.PrimaryKey = new[] { nameCol }; - - this._hostSettingsTable.Rows.Add("String_1_S", "String_1_S", true); - this._hostSettingsTable.Rows.Add("String_2_S", "String_1_S", true); - this._hostSettingsTable.Rows.Add("String_3_U", "Value_3_U", false); - this._hostSettingsTable.Rows.Add("String_4_U", "Value_4_U", false); - this._hostSettingsTable.Rows.Add("Int_5_U", "5", false); - this._hostSettingsTable.Rows.Add("Int_6_S", "6", true); - this._hostSettingsTable.Rows.Add("Double_7_S", "7", true); - this._hostSettingsTable.Rows.Add("Double_8_U", "8", false); - this._hostSettingsTable.Rows.Add("Bool_9_U", false, false); - this._hostSettingsTable.Rows.Add("Bool_10_S", false, true); - - this._mockData = MockComponentProvider.CreateDataProvider(); - this._mockData.Setup(c => c.GetHostSettings()).Returns(this._hostSettingsTable.CreateDataReader()); - this._mockData.Setup(c => c.GetProviderPath()).Returns(string.Empty); - - DataCache.ClearCache(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - public void HostController_GetSettings_GetList() - { - // Arrange - var expectedDic = new Dictionary(); - - foreach (DataRow row in this._hostSettingsTable.Rows) - { - var conf = new ConfigurationSetting(); - conf.Key = row["SettingName"].ToString(); - conf.Value = row["SettingValue"].ToString(); - bool IsSecure; - bool.TryParse(row["SettingIsSecure"].ToString(), out IsSecure); - conf.IsSecure = IsSecure; - expectedDic.Add(conf.Key, conf); - } - - // Act - var settingsDic = HostController.Instance.GetSettings(); - - // Assert - foreach (var currentConfig in settingsDic) - { - Assert.AreEqual(currentConfig.Key, currentConfig.Value.Key); - Assert.AreEqual(expectedDic[currentConfig.Key].Value, currentConfig.Value.Value); - Assert.AreEqual(expectedDic[currentConfig.Key].IsSecure, currentConfig.Value.IsSecure); - } - } - - [Test] - public void HostController_GetSettingsDictionary_GetList() - { - // Arrange - // Convert table to Dictionary - var expectedDic = this._hostSettingsTable.Rows.Cast().ToDictionary(row => row["SettingName"].ToString(), row => row["SettingValue"].ToString()); - - // Act - var settingsDic = HostController.Instance.GetSettingsDictionary(); - - // Assert - CollectionAssert.AreEquivalent(expectedDic.Values, settingsDic.Values); - } - - [Test] - public void HostController_Update_ExistingValue() - { - // Arrange - const string key = "String_1_S"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); - - // Act - HostController.Instance.Update(key, value); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny()), Times.Exactly(1)); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Exactly(1)); - } - - [Test] - public void HostController_Update_ExistingValue_ResetCache() - { - // Arrange - const string key = "String_1_S"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); - - // Act - HostController.Instance.Update(key, value); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny()), Times.Exactly(1)); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Exactly(1)); - } - - [Test] - public void HostController_Update_ExistingValue_ResetCache_With_Overload() - { - // Arrange - const string key = "String_1_S"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); - - // Act - HostController.Instance.Update(key, value, true); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny()), Times.Exactly(1)); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Exactly(1)); - } - - [Test] - public void HostController_Update_ExistingValue_Dont_Reset_Cache() - { - // Arrange - const string key = "String_1_S"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); - - // Act - HostController.Instance.Update(key, value, false); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); - - // Clear was not called a second time - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Never); - } - - [Test] - public void HostController_Update_Dictionary() - { - // Arrange - var settings = new Dictionary - { - { "String_1_S", "MyValue" }, - }; - - // Act - HostController.Instance.Update(settings); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting("String_1_S", "MyValue", false, It.IsAny()), Times.Exactly(1)); - this._mockCache.Verify(c => c.Clear("Host", string.Empty), Times.Exactly(1)); - } - - [Test] - public void HostController_Update_NewValue() - { - // Arrange - const string key = "MyKey"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); - - // Act - HostController.Instance.Update(key, value); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Once); - } - - [Test] - public void HostController_Update_NewValue_ResetCache_With_Overload() - { - // Arrange - const string key = "MyKey"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); - - // Act - HostController.Instance.Update(key, value, true); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Once); - } - - [Test] - public void HostController_Update_NewValue_ResetCache() - { - // Arrange - const string key = "MyKey"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); - - // Act - HostController.Instance.Update(key, value); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Once); - } - - [Test] - public void HostController_Update_NewValue_Dont_Reset_Cache() - { - // Arrange - const string key = "MyKey"; - const string value = "MyValue"; - this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); - - // Act - HostController.Instance.Update(key, value, false); - - // Assert - this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); - this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Never); - } - - [Test] - [TestCase("String_1_S")] - [TestCase("String_2_S")] - [TestCase("String_3_U")] - [TestCase("String_4_U")] - public void HostController_GetString_If_Key_Exists(string key) - { - Assert.AreEqual(HostController.Instance.GetString(key), this.GetValue(key)); - Assert.AreEqual(HostController.Instance.GetString(key, "Hello Default"), this.GetValue(key)); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetString_InvalidKey_Returns_Null_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetString(key), Null.NullString); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetString_InvalidKey_Returns_Default_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetString(key, "Hello Default"), "Hello Default"); - } - - [Test] - [TestCase("")] - [TestCase(null)] - [ExpectedException(typeof(ArgumentException))] - public void HostController_GetString_NullEmpty(string key) - { - HostController.Instance.GetString(key); - } - - [Test] - [TestCase("Int_5_U")] - [TestCase("Int_6_S")] - public void HostController_GetInteger_If_Key_Exists(string key) - { - int s = HostController.Instance.GetInteger(key); - Assert.AreEqual(s.ToString(), this.GetValue(key)); - Assert.AreEqual(HostController.Instance.GetInteger(key, 12).ToString(), this.GetValue(key)); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetInteger_InvalidKey_Returns_Null_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetInteger(key), Null.NullInteger); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetInteger_InvalidKey_Returns_Default_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetInteger(key, 6969), 6969); - } - - [Test] - [TestCase("")] - [TestCase(null)] - [ExpectedException(typeof(ArgumentException))] - public void HostController_GetInteger_NullEmpty(string key) - { - HostController.Instance.GetInteger(key); - } - - [Test] - [TestCase("Bool_9_U")] - [TestCase("Bool_10_S")] - public void HostController_GetBoolean_If_Key_Exists(string key) - { - Assert.AreEqual(HostController.Instance.GetBoolean(key).ToString(), this.GetValue(key)); - Assert.AreEqual(HostController.Instance.GetBoolean(key, false).ToString(), this.GetValue(key)); - Assert.AreEqual(HostController.Instance.GetBoolean(key, true).ToString(), this.GetValue(key)); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetBoolean_InvalidKey_Returns_Null_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetBoolean(key), Null.NullBoolean); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetBoolean_InvalidKey_Returns_Default_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetBoolean(key, true), true); - Assert.AreEqual(HostController.Instance.GetBoolean(key, false), false); - } - - [Test] - [TestCase("")] - [TestCase(null)] - [ExpectedException(typeof(ArgumentException))] - public void HostController_GetBoolean_NullEmpty(string key) - { - HostController.Instance.GetBoolean(key); - } - - [Test] - [TestCase("Double_7_S")] - [TestCase("Double_8_U")] - public void HostController_GetDouble_If_Key_Exists(string key) - { - double s = HostController.Instance.GetDouble(key); - Assert.AreEqual(s.ToString(), this.GetValue(key)); - Assert.AreEqual(HostController.Instance.GetDouble(key, 54.54).ToString(), this.GetValue(key)); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetDouble_InvalidKey_Returns_Null_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetDouble(key), Null.NullDouble); - } - - [Test] - [TestCase("BadKey1")] - [TestCase("AAAAAAA")] - public void HostController_GetDouble_InvalidKey_Returns_Default_Value(string key) - { - Assert.AreEqual(HostController.Instance.GetDouble(key, 21.58), 21.58); - } - - [Test] - [TestCase("")] - [TestCase(null)] - [ExpectedException(typeof(ArgumentException))] - public void HostController_GetDouble_NullEmpty(string key) - { - HostController.Instance.GetDouble(key); - } - - private string GetValue(string key) - { - return this._hostSettingsTable.Rows.Find(key)["SettingValue"].ToString(); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + this._mockCache = MockComponentProvider.CreateDataCacheProvider(); + MockComponentProvider.CreateEventLogController(); + + this._hostSettingsTable = new DataTable("HostSettings"); + + var nameCol = this._hostSettingsTable.Columns.Add("SettingName"); + this._hostSettingsTable.Columns.Add("SettingValue"); + this._hostSettingsTable.Columns.Add("SettingIsSecure"); + this._hostSettingsTable.PrimaryKey = new[] { nameCol }; + + this._hostSettingsTable.Rows.Add("String_1_S", "String_1_S", true); + this._hostSettingsTable.Rows.Add("String_2_S", "String_1_S", true); + this._hostSettingsTable.Rows.Add("String_3_U", "Value_3_U", false); + this._hostSettingsTable.Rows.Add("String_4_U", "Value_4_U", false); + this._hostSettingsTable.Rows.Add("Int_5_U", "5", false); + this._hostSettingsTable.Rows.Add("Int_6_S", "6", true); + this._hostSettingsTable.Rows.Add("Double_7_S", "7", true); + this._hostSettingsTable.Rows.Add("Double_8_U", "8", false); + this._hostSettingsTable.Rows.Add("Bool_9_U", false, false); + this._hostSettingsTable.Rows.Add("Bool_10_S", false, true); + + this._mockData = MockComponentProvider.CreateDataProvider(); + this._mockData.Setup(c => c.GetHostSettings()).Returns(this._hostSettingsTable.CreateDataReader()); + this._mockData.Setup(c => c.GetProviderPath()).Returns(string.Empty); + + DataCache.ClearCache(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + public void HostController_GetSettings_GetList() + { + // Arrange + var expectedDic = new Dictionary(); + + foreach (DataRow row in this._hostSettingsTable.Rows) + { + var conf = new ConfigurationSetting(); + conf.Key = row["SettingName"].ToString(); + conf.Value = row["SettingValue"].ToString(); + bool IsSecure; + bool.TryParse(row["SettingIsSecure"].ToString(), out IsSecure); + conf.IsSecure = IsSecure; + expectedDic.Add(conf.Key, conf); + } + + // Act + var settingsDic = HostController.Instance.GetSettings(); + + // Assert + foreach (var currentConfig in settingsDic) + { + Assert.AreEqual(currentConfig.Key, currentConfig.Value.Key); + Assert.AreEqual(expectedDic[currentConfig.Key].Value, currentConfig.Value.Value); + Assert.AreEqual(expectedDic[currentConfig.Key].IsSecure, currentConfig.Value.IsSecure); + } + } + + [Test] + public void HostController_GetSettingsDictionary_GetList() + { + // Arrange + // Convert table to Dictionary + var expectedDic = this._hostSettingsTable.Rows.Cast().ToDictionary(row => row["SettingName"].ToString(), row => row["SettingValue"].ToString()); + + // Act + var settingsDic = HostController.Instance.GetSettingsDictionary(); + + // Assert + CollectionAssert.AreEquivalent(expectedDic.Values, settingsDic.Values); + } + + [Test] + public void HostController_Update_ExistingValue() + { + // Arrange + const string key = "String_1_S"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); + + // Act + HostController.Instance.Update(key, value); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny()), Times.Exactly(1)); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Exactly(1)); + } + + [Test] + public void HostController_Update_ExistingValue_ResetCache() + { + // Arrange + const string key = "String_1_S"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); + + // Act + HostController.Instance.Update(key, value); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny()), Times.Exactly(1)); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Exactly(1)); + } + + [Test] + public void HostController_Update_ExistingValue_ResetCache_With_Overload() + { + // Arrange + const string key = "String_1_S"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); + + // Act + HostController.Instance.Update(key, value, true); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny()), Times.Exactly(1)); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Exactly(1)); + } + + [Test] + public void HostController_Update_ExistingValue_Dont_Reset_Cache() + { + // Arrange + const string key = "String_1_S"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(key).Read()).Returns(true); + + // Act + HostController.Instance.Update(key, value, false); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); + + // Clear was not called a second time + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Never); + } + + [Test] + public void HostController_Update_Dictionary() + { + // Arrange + var settings = new Dictionary + { + { "String_1_S", "MyValue" }, + }; + + // Act + HostController.Instance.Update(settings); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting("String_1_S", "MyValue", false, It.IsAny()), Times.Exactly(1)); + this._mockCache.Verify(c => c.Clear("Host", string.Empty), Times.Exactly(1)); + } + + [Test] + public void HostController_Update_NewValue() + { + // Arrange + const string key = "MyKey"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); + + // Act + HostController.Instance.Update(key, value); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Once); + } + + [Test] + public void HostController_Update_NewValue_ResetCache_With_Overload() + { + // Arrange + const string key = "MyKey"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); + + // Act + HostController.Instance.Update(key, value, true); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Once); + } + + [Test] + public void HostController_Update_NewValue_ResetCache() + { + // Arrange + const string key = "MyKey"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); + + // Act + HostController.Instance.Update(key, value); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Once); + } + + [Test] + public void HostController_Update_NewValue_Dont_Reset_Cache() + { + // Arrange + const string key = "MyKey"; + const string value = "MyValue"; + this._mockData.Setup(c => c.GetHostSetting(It.IsAny()).Read()).Returns(false); + + // Act + HostController.Instance.Update(key, value, false); + + // Assert + this._mockData.Verify(c => c.UpdateHostSetting(key, value, false, It.IsAny())); + this._mockCache.Verify(c => c.Remove("DNN_HostSettings"), Times.Never); + } + + [Test] + [TestCase("String_1_S")] + [TestCase("String_2_S")] + [TestCase("String_3_U")] + [TestCase("String_4_U")] + public void HostController_GetString_If_Key_Exists(string key) + { + Assert.AreEqual(HostController.Instance.GetString(key), this.GetValue(key)); + Assert.AreEqual(HostController.Instance.GetString(key, "Hello Default"), this.GetValue(key)); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetString_InvalidKey_Returns_Null_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetString(key), Null.NullString); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetString_InvalidKey_Returns_Default_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetString(key, "Hello Default"), "Hello Default"); + } + + [Test] + [TestCase("")] + [TestCase(null)] + [ExpectedException(typeof(ArgumentException))] + public void HostController_GetString_NullEmpty(string key) + { + HostController.Instance.GetString(key); + } + + [Test] + [TestCase("Int_5_U")] + [TestCase("Int_6_S")] + public void HostController_GetInteger_If_Key_Exists(string key) + { + int s = HostController.Instance.GetInteger(key); + Assert.AreEqual(s.ToString(), this.GetValue(key)); + Assert.AreEqual(HostController.Instance.GetInteger(key, 12).ToString(), this.GetValue(key)); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetInteger_InvalidKey_Returns_Null_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetInteger(key), Null.NullInteger); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetInteger_InvalidKey_Returns_Default_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetInteger(key, 6969), 6969); + } + + [Test] + [TestCase("")] + [TestCase(null)] + [ExpectedException(typeof(ArgumentException))] + public void HostController_GetInteger_NullEmpty(string key) + { + HostController.Instance.GetInteger(key); + } + + [Test] + [TestCase("Bool_9_U")] + [TestCase("Bool_10_S")] + public void HostController_GetBoolean_If_Key_Exists(string key) + { + Assert.AreEqual(HostController.Instance.GetBoolean(key).ToString(), this.GetValue(key)); + Assert.AreEqual(HostController.Instance.GetBoolean(key, false).ToString(), this.GetValue(key)); + Assert.AreEqual(HostController.Instance.GetBoolean(key, true).ToString(), this.GetValue(key)); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetBoolean_InvalidKey_Returns_Null_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetBoolean(key), Null.NullBoolean); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetBoolean_InvalidKey_Returns_Default_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetBoolean(key, true), true); + Assert.AreEqual(HostController.Instance.GetBoolean(key, false), false); + } + + [Test] + [TestCase("")] + [TestCase(null)] + [ExpectedException(typeof(ArgumentException))] + public void HostController_GetBoolean_NullEmpty(string key) + { + HostController.Instance.GetBoolean(key); + } + + [Test] + [TestCase("Double_7_S")] + [TestCase("Double_8_U")] + public void HostController_GetDouble_If_Key_Exists(string key) + { + double s = HostController.Instance.GetDouble(key); + Assert.AreEqual(s.ToString(), this.GetValue(key)); + Assert.AreEqual(HostController.Instance.GetDouble(key, 54.54).ToString(), this.GetValue(key)); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetDouble_InvalidKey_Returns_Null_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetDouble(key), Null.NullDouble); + } + + [Test] + [TestCase("BadKey1")] + [TestCase("AAAAAAA")] + public void HostController_GetDouble_InvalidKey_Returns_Default_Value(string key) + { + Assert.AreEqual(HostController.Instance.GetDouble(key, 21.58), 21.58); + } + + [Test] + [TestCase("")] + [TestCase(null)] + [ExpectedException(typeof(ArgumentException))] + public void HostController_GetDouble_NullEmpty(string key) + { + HostController.Instance.GetDouble(key); + } + + private string GetValue(string key) + { + return this._hostSettingsTable.Rows.Find(key)["SettingValue"].ToString(); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs index a5416ec1434..f8138cbb0b1 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/NotificationsControllerTests.cs @@ -2,1317 +2,1318 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -// ReSharper disable InconsistentNaming -namespace DotNetNuke.Tests.Core.Controllers.Messaging -{ - using System; - using System.Collections.Generic; - using System.Data; - using System.Globalization; +// ReSharper disable InconsistentNaming +namespace DotNetNuke.Tests.Core.Controllers.Messaging +{ + using System; + using System.Collections.Generic; + using System.Data; + using System.Globalization; using System.Text; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Security.Roles; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Social.Messaging; - using DotNetNuke.Services.Social.Messaging.Exceptions; - using DotNetNuke.Services.Social.Messaging.Internal; - using DotNetNuke.Services.Social.Notifications; - using DotNetNuke.Services.Social.Notifications.Data; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Users; + using DotNetNuke.Security.Roles; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Social.Messaging; + using DotNetNuke.Services.Social.Messaging.Internal; + using DotNetNuke.Services.Social.Notifications; + using DotNetNuke.Services.Social.Notifications.Data; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class NotificationsControllerTests - { - private Mock _mockDataService; - private Mock _portalController; - private Mock _portalGroupController; - private Mock _mockMessagingDataService; - private Mock _mockMessagingController; - private Mock _mockInternalMessagingController; - private NotificationsController _notificationsController; - private Mock _mockNotificationsController; - private Mock _dataProvider; - private Mock _cachingProvider; - private DataTable _dtNotificationTypes; - private DataTable _dtNotificationTypeActions; - private DataTable _dtNotificationActions; - - [SetUp] - public void SetUp() - { - var serviceCollection = new ServiceCollection(); + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class NotificationsControllerTests + { + private Mock _mockDataService; + private Mock _portalController; + private Mock _portalGroupController; + private Mock _mockMessagingDataService; + private Mock _mockMessagingController; + private Mock _mockInternalMessagingController; + private NotificationsController _notificationsController; + private Mock _mockNotificationsController; + private Mock _dataProvider; + private Mock _cachingProvider; + private DataTable _dtNotificationTypes; + private DataTable _dtNotificationTypeActions; + private DataTable _dtNotificationActions; + + [SetUp] + public void SetUp() + { + var serviceCollection = new ServiceCollection(); var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - ComponentFactory.Container = new SimpleContainer(); - - this._mockDataService = new Mock(); - this._portalController = new Mock(); - this._portalGroupController = new Mock(); - - this._mockMessagingDataService = new Mock(); - this._dataProvider = MockComponentProvider.CreateDataProvider(); - this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); - - this._notificationsController = new NotificationsController(this._mockDataService.Object, this._mockMessagingDataService.Object); - this._mockNotificationsController = new Mock { CallBase = true }; - - this._mockMessagingController = new Mock(); - MessagingController.SetTestableInstance(this._mockMessagingController.Object); - PortalController.SetTestableInstance(this._portalController.Object); - PortalGroupController.RegisterInstance(this._portalGroupController.Object); - - this._mockInternalMessagingController = new Mock(); - InternalMessagingController.SetTestableInstance(this._mockInternalMessagingController.Object); - - DataService.RegisterInstance(this._mockDataService.Object); - DotNetNuke.Services.Social.Messaging.Data.DataService.RegisterInstance(this._mockMessagingDataService.Object); - - this.SetupDataProvider(); - this.SetupDataTables(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - ComponentFactory.Container = null; - MessagingController.ClearInstance(); - PortalController.ClearInstance(); - InternalMessagingController.ClearInstance(); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void CreateNotificationType_Throws_On_Null_NotificationType() - { - this._notificationsController.CreateNotificationType(null); - } - - [Test] - [TestCase("")] - [TestCase(null)] - [ExpectedException(typeof(ArgumentException))] - public void CreateNotificationType_Throws_On_Null_Or_Empty_Name(string name) - { - var notificationType = CreateNewNotificationType(); - notificationType.Name = name; - - this._notificationsController.CreateNotificationType(notificationType); - } - - [Test] - public void CreateNotificationType_Calls_DataService_CreateNotificationType() - { - this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); - - this._mockDataService - .Setup(ds => ds.CreateNotificationType(Constants.Messaging_NotificationTypeName, It.IsAny(), It.IsAny(), It.IsAny(), Constants.UserID_User12, It.IsAny())) - .Verifiable(); - - this._mockNotificationsController.Object.CreateNotificationType(CreateNewNotificationType()); - - this._mockDataService.Verify(); - } - - [Test] - [TestCase(int.MaxValue, int.MaxValue)] - [TestCase(1, 1)] - [TestCase(0, 0)] - public void CreateNotificationType_Returns_Object_With_Valid_TimeToLive(int actualTimeToLiveTotalMinutes, int expectedTimeToLiveTotalMinutes) - { - var actualTimeToLive = TimeSpan.FromMinutes(actualTimeToLiveTotalMinutes); - - var notificationType = CreateNewNotificationType(); - notificationType.TimeToLive = actualTimeToLive; - this._notificationsController.CreateNotificationType(notificationType); - - Assert.AreEqual(expectedTimeToLiveTotalMinutes, (int)notificationType.TimeToLive.TotalMinutes); - } - - [Test] - public void CreateNotificationType_Makes_Valid_Object() - { - var expectedNotificationType = CreateValidNotificationType(); - - this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); - - this._mockDataService - .Setup(ds => ds.CreateNotificationType( - expectedNotificationType.Name, - expectedNotificationType.Description, - (int)expectedNotificationType.TimeToLive.TotalMinutes, - expectedNotificationType.DesktopModuleId, - Constants.UserID_User12, false)) - .Returns(Constants.Messaging_NotificationTypeId); - - var actualNotificationType = CreateNewNotificationType(); - this._mockNotificationsController.Object.CreateNotificationType(actualNotificationType); - - Assert.IsTrue(new NotificationTypeComparer().Equals(expectedNotificationType, actualNotificationType)); - } - - [Test] - public void DeleteNotificationType_Calls_DataService_DeleteNotificationType() - { - this._mockDataService.Setup(ds => ds.DeleteNotificationType(Constants.Messaging_NotificationTypeId)).Verifiable(); - this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeCache()); - this._mockNotificationsController.Object.DeleteNotificationType(Constants.Messaging_NotificationTypeId); - this._mockDataService.Verify(); - } - - [Test] - public void DeleteNotificationType_Removes_Cache_Object() - { - this._mockDataService.Setup(ds => ds.DeleteNotificationType(Constants.Messaging_NotificationTypeId)); - this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeCache()).Verifiable(); - this._mockNotificationsController.Object.DeleteNotificationType(Constants.Messaging_NotificationTypeId); - this._mockNotificationsController.Verify(); - } - - [Test] - public void GetNotificationType_By_Id_Gets_Object_From_Cache() - { - this._cachingProvider.Object.PurgeCache(); - this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); - this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeId); - this._cachingProvider.Verify(); - } - - [Test] - public void GetNotificationType_By_Id_Calls_DataService_GetNotificationType_When_Object_Is_Not_In_Cache() - { - this._cachingProvider.Object.PurgeCache(); - - var messageTypeDataTable = new DataTable(); - - this._mockDataService - .Setup(ds => ds.GetNotificationType(Constants.Messaging_NotificationTypeId)) - .Returns(messageTypeDataTable.CreateDataReader()) - .Verifiable(); - - this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeId); - - this._mockDataService.Verify(); - } - - [Test] - public void GetNotificationType_By_Id_Returns_Valid_Object() - { - this._cachingProvider.Object.PurgeCache(); - - var expectedNotificationType = CreateValidNotificationType(); - - this._dtNotificationTypes.Rows.Clear(); - - this._dtNotificationTypes.Rows.Add( - expectedNotificationType.NotificationTypeId, - expectedNotificationType.Name, - expectedNotificationType.Description, - (int)expectedNotificationType.TimeToLive.TotalMinutes, - expectedNotificationType.DesktopModuleId); - - this._mockDataService - .Setup(ds => ds.GetNotificationType(Constants.Messaging_NotificationTypeId)) - .Returns(this._dtNotificationTypes.CreateDataReader()); - - var actualNotificationType = this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeId); - - Assert.IsTrue(new NotificationTypeComparer().Equals(expectedNotificationType, actualNotificationType)); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void GetNotificationType_By_Name_Throws_On_Null_Or_Empty_Name(string name) - { - this._notificationsController.GetNotificationType(name); - } - - [Test] - public void GetNotificationType_By_Name_Gets_Object_From_Cache() - { - this._cachingProvider.Object.PurgeCache(); - this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); - this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeName); - this._cachingProvider.Verify(); - } - - [Test] - public void GetNotificationType_By_Name_Calls_DataService_GetNotificationTypeByName_When_Object_Is_Not_In_Cache() - { - this._cachingProvider.Object.PurgeCache(); - - this._mockDataService - .Setup(ds => ds.GetNotificationTypeByName(Constants.Messaging_NotificationTypeName)) - .Returns(this._dtNotificationTypes.CreateDataReader()) - .Verifiable(); - - this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeName); - - this._mockDataService.Verify(); - } - - [Test] - public void GetNotificationType_By_Name_Returns_Valid_Object() - { - this._cachingProvider.Object.PurgeCache(); - - var expectedNotificationType = CreateValidNotificationType(); - - this._dtNotificationTypes.Rows.Clear(); - - this._dtNotificationTypes.Rows.Add( - expectedNotificationType.NotificationTypeId, - expectedNotificationType.Name, - expectedNotificationType.Description, - (int)expectedNotificationType.TimeToLive.TotalMinutes, - expectedNotificationType.DesktopModuleId); - - this._mockDataService - .Setup(ds => ds.GetNotificationTypeByName(Constants.Messaging_NotificationTypeName)) - .Returns(this._dtNotificationTypes.CreateDataReader()); - - var actualNotificationType = this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeName); - - Assert.IsTrue(new NotificationTypeComparer().Equals(expectedNotificationType, actualNotificationType)); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void SetNotificationTypeActions_Throws_On_Null() - { - this._notificationsController.SetNotificationTypeActions(null, Constants.Messaging_NotificationTypeId); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SetNotificationTypeActions_Throws_On_EmptyList() - { - this._notificationsController.SetNotificationTypeActions(new List(), Constants.Messaging_NotificationTypeId); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void SetNotificationTypeActions_Throws_On_Null_Or_Empty_Name(string name) - { - var action = CreateNewNotificationTypeAction(); - action.NameResourceKey = name; - this._notificationsController.SetNotificationTypeActions(new[] { action }, Constants.Messaging_NotificationTypeId); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void SetNotificationTypeActions_Throws_On_Null_Or_Empty_APICall(string apiCall) - { - var action = CreateNewNotificationTypeAction(); - action.APICall = apiCall; - this._notificationsController.SetNotificationTypeActions(new[] { action }, Constants.Messaging_NotificationTypeId); - } - - [Test] - public void SetNotificationTypeActions_Calls_DataService_AddNotificationTypeAction_For_Each_Of_Two_Actions() - { - this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); - - // _mockDataService - // .Setup(ds => ds.AddNotificationTypeAction( - // Constants.Messaging_NotificationTypeId, - // Constants.Messaging_NotificationTypeActionNameResourceKey, - // Constants.Messaging_NotificationTypeActionDescriptionResourceKey, - // Constants.Messaging_NotificationTypeActionConfirmResourceKey, - // Constants.Messaging_NotificationTypeActionAPICall, - // Constants.UserID_User12)) - // .Verifiable(); - this._mockNotificationsController.Setup(nc => nc.GetNotificationTypeAction(It.IsAny())); - - this._mockNotificationsController.Object.SetNotificationTypeActions( - new[] { CreateNewNotificationTypeAction(), CreateNewNotificationTypeAction() }, - Constants.Messaging_NotificationTypeId); - - this._mockDataService.Verify( - x => x.AddNotificationTypeAction( - Constants.Messaging_NotificationTypeId, - Constants.Messaging_NotificationTypeActionNameResourceKey, - Constants.Messaging_NotificationTypeActionDescriptionResourceKey, - Constants.Messaging_NotificationTypeActionConfirmResourceKey, - Constants.Messaging_NotificationTypeActionAPICall, - Constants.UserID_User12), Times.Exactly(2)); - } - - [Test] - public void SetNotificationTypeActions_Sets_NotificationTypeActionId_And_NotificationTypeId() - { - var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); - - this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); - - this._mockDataService - .Setup(ds => ds.AddNotificationTypeAction( - expectedNotificationTypeAction.NotificationTypeId, - expectedNotificationTypeAction.NameResourceKey, - expectedNotificationTypeAction.DescriptionResourceKey, - expectedNotificationTypeAction.ConfirmResourceKey, - expectedNotificationTypeAction.APICall, - Constants.UserID_User12)) - .Returns(expectedNotificationTypeAction.NotificationTypeActionId); - - this._mockNotificationsController - .Setup(nc => nc.GetNotificationTypeAction(expectedNotificationTypeAction.NotificationTypeActionId)) - .Returns(expectedNotificationTypeAction); - - var action = CreateNewNotificationTypeAction(); - this._mockNotificationsController.Object.SetNotificationTypeActions(new[] { action }, expectedNotificationTypeAction.NotificationTypeId); - - Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, action)); - } - - [Test] - public void DeleteNotificationTypeAction_Calls_DataService_DeleteNotificationTypeAction() - { - this._mockDataService.Setup(ds => ds.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)).Verifiable(); - this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeActionCache()); - this._mockNotificationsController.Object.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); - this._mockDataService.Verify(); - } - - [Test] - public void DeleteNotificationTypeAction_Removes_Cache_Object() - { - this._mockDataService.Setup(ds => ds.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)); - this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeActionCache()).Verifiable(); - this._mockNotificationsController.Object.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); - this._mockNotificationsController.Verify(); - } - - [Test] - public void GetNotificationTypeAction_By_Id_Gets_Object_From_Cache() - { - this._cachingProvider.Object.PurgeCache(); - this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); - this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); - this._cachingProvider.Verify(); - } - - [Test] - public void GetNotificationTypeAction_By_Id_Calls_DataService_GetNotificationTypeAction_When_Object_Is_Not_In_Cache() - { - this._cachingProvider.Object.PurgeCache(); - - this._mockDataService - .Setup(ds => ds.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)) - .Returns(this._dtNotificationTypeActions.CreateDataReader()) - .Verifiable(); - - this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); - - this._mockDataService.Verify(); - } - - [Test] - public void GetNotificationTypeAction_By_Id_Returns_Valid_Object() - { - this._cachingProvider.Object.PurgeCache(); - - var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); - - this._dtNotificationTypeActions.Clear(); - - this._dtNotificationTypeActions.Rows.Add( - expectedNotificationTypeAction.NotificationTypeActionId, - expectedNotificationTypeAction.NotificationTypeId, - expectedNotificationTypeAction.NameResourceKey, - expectedNotificationTypeAction.DescriptionResourceKey, - expectedNotificationTypeAction.ConfirmResourceKey, - expectedNotificationTypeAction.Order, - expectedNotificationTypeAction.APICall); - - this._mockDataService - .Setup(ds => ds.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)) - .Returns(this._dtNotificationTypeActions.CreateDataReader); - - var actualNotificationTypeAction = this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); - - Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, actualNotificationTypeAction)); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void GetNotificationTypeAction_By_Name_Throws_On_Null_Or_Empty_Name(string name) - { - this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, name); - } - - [Test] - public void GetNotificationTypeAction_By_Name_Gets_Object_From_Cache() - { - this._cachingProvider.Object.PurgeCache(); - this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); - this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationTypeActionNameResourceKey); - this._cachingProvider.Verify(); - } - - [Test] - public void GetNotificationTypeAction_By_Name_Calls_DataService_GetNotificationTypeActionByName_When_Object_Is_Not_In_Cache() - { - this._cachingProvider.Object.PurgeCache(); - - this._mockDataService - .Setup(ds => ds.GetNotificationTypeActionByName( - Constants.Messaging_NotificationTypeId, - Constants.Messaging_NotificationTypeActionNameResourceKey)) - .Returns(this._dtNotificationTypeActions.CreateDataReader()) - .Verifiable(); - - this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationTypeActionNameResourceKey); - - this._mockDataService.Verify(); - } - - [Test] - public void GetNotificationTypeAction_By_Name_Returns_Valid_Object() - { - this._cachingProvider.Object.PurgeCache(); - - var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); - - this._dtNotificationTypeActions.Clear(); - - this._dtNotificationTypeActions.Rows.Add( - expectedNotificationTypeAction.NotificationTypeActionId, - expectedNotificationTypeAction.NotificationTypeId, - expectedNotificationTypeAction.NameResourceKey, - expectedNotificationTypeAction.DescriptionResourceKey, - expectedNotificationTypeAction.ConfirmResourceKey, - expectedNotificationTypeAction.Order, - expectedNotificationTypeAction.APICall); - - this._mockDataService - .Setup(ds => ds.GetNotificationTypeActionByName( - Constants.Messaging_NotificationTypeId, - Constants.Messaging_NotificationTypeActionNameResourceKey)) - .Returns(this._dtNotificationTypeActions.CreateDataReader()); - - var actualNotificationTypeAction = this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationTypeActionNameResourceKey); - - Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, actualNotificationTypeAction)); - } - - [Test] - public void GetNotificationTypeActions_Calls_DataService_GetNotificationTypeActions() - { - this._mockDataService - .Setup(ds => ds.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId)) - .Returns(this._dtNotificationTypeActions.CreateDataReader()) - .Verifiable(); - - this._notificationsController.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId); - - this._mockDataService.Verify(); - } - - [Test] - public void GetNotificationTypeActions_Returns_Valid_Object() - { - var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); - - this._dtNotificationTypeActions.Clear(); - - this._dtNotificationTypeActions.Rows.Add( - expectedNotificationTypeAction.NotificationTypeActionId, - expectedNotificationTypeAction.NotificationTypeId, - expectedNotificationTypeAction.NameResourceKey, - expectedNotificationTypeAction.DescriptionResourceKey, - expectedNotificationTypeAction.ConfirmResourceKey, - expectedNotificationTypeAction.Order, - expectedNotificationTypeAction.APICall); - - this._mockDataService.Setup(ds => ds.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId)).Returns(this._dtNotificationTypeActions.CreateDataReader()); - - var actualNotificationTypeActions = this._notificationsController.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId); - - Assert.AreEqual(1, actualNotificationTypeActions.Count); - Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, actualNotificationTypeActions[0])); - } - - [Test] - public void SendNotification_Sets_Empty_SenderUserId_With_Admin() - { - var adminUser = new UserInfo - { - UserID = Constants.UserID_Admin, - DisplayName = Constants.UserDisplayName_Admin, - PortalID = Constants.CONTENT_ValidPortalId, - }; - - this._mockNotificationsController.Setup(nc => nc.GetAdminUser()).Returns(adminUser); - - this._mockNotificationsController - .Setup(nc => nc.SendNotification( - It.IsAny(), - Constants.PORTAL_Zero, - It.IsAny>(), - It.IsAny>())); - - var notification = CreateUnsavedNotification(); - - this._mockNotificationsController.Object.SendNotification( - notification, - Constants.PORTAL_Zero, - new List(), - new List()); - - Assert.AreEqual(adminUser.UserID, notification.SenderUserID); - } - - [Test] - [TestCase(null, null)] - [TestCase(null, "")] - [TestCase("", null)] - [TestCase("", "")] - [ExpectedException(typeof(ArgumentException))] - public void SendNotification_Throws_On_Null_Or_Empty_Subject_And_Body(string subject, string body) - { - var notification = CreateUnsavedNotification(); - notification.Subject = subject; - notification.Body = body; - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - this._notificationsController.SendNotification( - notification, - Constants.PORTAL_Zero, - new List(), - new List()); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SendNotification_Throws_On_Null_Roles_And_Users() - { - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - this._notificationsController.SendNotification( - CreateUnsavedNotification(), - Constants.PORTAL_Zero, - null, - null); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SendNotification_Throws_On_Large_Subject() - { - var notification = CreateUnsavedNotification(); - var subject = new StringBuilder(); - for (var i = 0; i <= 40; i++) - { - subject.Append("1234567890"); - } - - notification.Subject = subject.ToString(); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - this._notificationsController.SendNotification( - notification, - Constants.PORTAL_Zero, - new List(), - new List()); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SendNotification_Throws_On_Roles_And_Users_With_No_DisplayNames() - { - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - this._notificationsController.SendNotification( - CreateUnsavedNotification(), - Constants.PORTAL_Zero, - new List(), - new List()); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void SendNotification_Throws_On_Large_To_List() - { - var roles = new List(); - var users = new List(); - - for (var i = 0; i <= 100; i++) - { - roles.Add(new RoleInfo { RoleName = "1234567890" }); - users.Add(new UserInfo { DisplayName = "1234567890" }); - } - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - this._notificationsController.SendNotification( - CreateUnsavedNotification(), - Constants.PORTAL_Zero, - roles, - users); - } - - [Test] - public void SendNotification_Calls_DataService_On_Valid_Notification() - { - var adminUser = new UserInfo - { - UserID = Constants.UserID_Admin, - DisplayName = Constants.UserDisplayName_Admin, - PortalID = Constants.PORTAL_Zero, - }; - - this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - var roles = new List(); - var users = new List - { - new UserInfo - { - UserID = Constants.UserID_User12, - DisplayName = Constants.UserDisplayName_User12 - }, - }; - - this._mockDataService - .Setup(ds => ds.SendNotification( - It.IsAny(), - Constants.PORTAL_Zero)) - .Verifiable(); - - this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); - - var notification = CreateUnsavedNotification(); - notification.SenderUserID = adminUser.UserID; - notification.SendToast = false; - - this._mockNotificationsController.Object.SendNotification( - notification, - Constants.PORTAL_Zero, - roles, - users); - - this._mockDataService.Verify(); - } - - [Test] - public void SendNotification_Calls_DataService_On_Valid_Notification_When_Portal_Is_In_Group() - { - var adminUser = new UserInfo - { - UserID = Constants.UserID_Admin, - DisplayName = Constants.UserDisplayName_Admin, - PortalID = Constants.PORTAL_Zero, - }; - - this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Constants.PORTALGROUP_ValidPortalGroupId); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - List portalGroups = new List() { CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero) }; // CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero); - this._portalGroupController.Setup(pgc => pgc.GetPortalGroups()).Returns(portalGroups); - - var roles = new List(); - var users = new List - { - new UserInfo - { - UserID = Constants.UserID_User12, - DisplayName = Constants.UserDisplayName_User12 - }, - }; - - this._mockDataService - .Setup(ds => ds.SendNotification( - It.IsAny(), - Constants.PORTAL_Zero)) - .Verifiable(); - - this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); - - var notification = CreateUnsavedNotification(); - notification.SenderUserID = adminUser.UserID; - notification.SendToast = false; - - this._mockNotificationsController.Object.SendNotification( - notification, - Constants.PORTAL_Zero, - roles, - users); - - this._mockDataService.Verify(); - } - - [Test] - public void SendNotification_Calls_Messaging_DataService_CreateSocialMessageRecipientsForRole_When_Passing_Roles() - { - var adminUser = new UserInfo - { - UserID = Constants.UserID_Admin, - DisplayName = Constants.UserDisplayName_Admin, - PortalID = Constants.PORTAL_Zero, - }; - - this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - var roles = new List - { - new RoleInfo - { - RoleID = Constants.RoleID_RegisteredUsers, - RoleName = Constants.RoleName_RegisteredUsers - }, - }; - var users = new List(); - - this._mockDataService - .Setup(ds => ds.SendNotification( - It.IsAny(), - Constants.PORTAL_Zero)) - .Returns(Constants.Messaging_MessageId_1); - - this._mockMessagingDataService - .Setup(mds => mds.CreateMessageRecipientsForRole( - Constants.Messaging_MessageId_1, - Constants.RoleID_RegisteredUsers.ToString(CultureInfo.InvariantCulture), - It.IsAny())) - .Verifiable(); - - this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); - - var notification = CreateUnsavedNotification(); - notification.SenderUserID = adminUser.UserID; - notification.SendToast = false; - - this._mockNotificationsController.Object.SendNotification( - notification, - Constants.PORTAL_Zero, - roles, - users); - - this._mockMessagingDataService.Verify(); - } - - [Test] - public void SendNotification_Calls_Messaging_DataService_SaveSocialMessageRecipient_When_Passing_Users() - { - var adminUser = new UserInfo - { - UserID = Constants.UserID_Admin, - DisplayName = Constants.UserDisplayName_Admin, - PortalID = Constants.PORTAL_Zero, - }; - - this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - var roles = new List(); - var users = new List - { - new UserInfo - { - UserID = Constants.UserID_User12, - DisplayName = Constants.UserDisplayName_User12 - }, - }; - - this._mockDataService - .Setup(ds => ds.SendNotification( - It.IsAny(), - Constants.PORTAL_Zero)) - .Returns(Constants.Messaging_MessageId_1); - - this._mockInternalMessagingController - .Setup(mc => mc.GetMessageRecipient( - Constants.Messaging_MessageId_1, - Constants.UserID_User12)) - .Returns((MessageRecipient)null); - - this._mockMessagingDataService - .Setup(mds => mds.SaveMessageRecipient( - It.Is(mr => - mr.MessageID == Constants.Messaging_MessageId_1 && - mr.UserID == Constants.UserID_User12 && - mr.Read == false && - mr.RecipientID == Null.NullInteger), - It.IsAny())) - .Verifiable(); - - this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); - - var notification = CreateUnsavedNotification(); - notification.SenderUserID = adminUser.UserID; - notification.SendToast = false; - - this._mockNotificationsController.Object.SendNotification( - notification, - Constants.PORTAL_Zero, - roles, - users); - - this._mockMessagingDataService.Verify(); - } - - [Test] - public void SendNotification_Returns_Valid_Object() - { - var expectedNotification = CreateValidNotification(); - - var adminUser = new UserInfo - { - UserID = Constants.UserID_Admin, - DisplayName = Constants.UserDisplayName_Admin, - PortalID = Constants.PORTAL_Zero, - }; - - this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - var roles = new List(); - var users = new List - { - new UserInfo - { - UserID = Constants.UserID_User12, - DisplayName = Constants.UserDisplayName_User12 - }, - }; - - this._mockDataService - .Setup(ds => ds.SendNotification( - It.IsAny(), - Constants.PORTAL_Zero)) - .Returns(Constants.Messaging_MessageId_1); - - this._mockMessagingDataService - .Setup(mds => mds.CreateMessageRecipientsForRole( - Constants.Messaging_MessageId_1, - Constants.RoleID_RegisteredUsers.ToString(CultureInfo.InvariantCulture), - It.IsAny())); - - this._mockInternalMessagingController - .Setup(mc => mc.GetMessageRecipient( - Constants.Messaging_MessageId_1, - Constants.UserID_User12)) - .Returns((MessageRecipient)null); - - this._mockMessagingDataService - .Setup(mds => mds.SaveMessageRecipient( - It.Is(mr => - mr.MessageID == Constants.Messaging_MessageId_1 && - mr.UserID == Constants.UserID_User12 && - mr.Read == false && - mr.RecipientID == Null.NullInteger), - It.IsAny())); - - this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); - - var notification = CreateUnsavedNotification(); - notification.SenderUserID = adminUser.UserID; - notification.SendToast = false; - - this._mockNotificationsController.Object.SendNotification( - notification, - Constants.PORTAL_Zero, - roles, - users); - - Assert.IsTrue(new NotificationComparer().Equals(expectedNotification, notification)); - } - - [Test] - public void DeleteNotification_Calls_DataService_DeleteNotification() - { - var messageRecipients = new List - { - new MessageRecipient(), - }; - - this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(messageRecipients); - - this._mockDataService.Setup(ds => ds.DeleteNotification(Constants.Messaging_MessageId_1)).Verifiable(); - this._notificationsController.DeleteNotification(Constants.Messaging_MessageId_1); - this._mockDataService.Verify(); - } - - [Test] - public void GetNotifications_Calls_DataService_GetNotifications() - { - this._mockDataService - .Setup(ds => ds.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, It.IsAny(), It.IsAny())) - .Returns(new DataTable().CreateDataReader()) - .Verifiable(); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - this._notificationsController.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, 0, 10); - this._mockDataService.Verify(); - } - - [Test] - public void GetNotifications_Calls_DataService_GetNotifications_When_Portal_Is_In_Group() - { - this._mockDataService - .Setup(ds => ds.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, It.IsAny(), It.IsAny())) - .Returns(new DataTable().CreateDataReader()) - .Verifiable(); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Constants.PORTALGROUP_ValidPortalGroupId); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - List portalGroups = new List() { CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero) }; // CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero); - this._portalGroupController.Setup(pgc => pgc.GetPortalGroups()).Returns(portalGroups); - - this._notificationsController.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, 0, 10); - this._mockDataService.Verify(); - } - - [Test] - public void GetNotifications_Calls_DataService_GetNotificationByContext() - { - this._mockDataService - .Setup(ds => ds.GetNotificationByContext(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext)) - .Returns(new DataTable().CreateDataReader()) - .Verifiable(); - - this._notificationsController.GetNotificationByContext(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext); - this._mockDataService.Verify(); - } - - [Test] - public void CountNotifications_Calls_DataService_CountNotifications() - { - this._mockDataService.Setup(ds => ds.CountNotifications(Constants.UserID_User12, Constants.PORTAL_Zero)).Verifiable(); - this._notificationsController.CountNotifications(Constants.UserID_User12, Constants.PORTAL_Zero); - this._mockDataService.Verify(); - } - - [Test] - public void DeleteNotificationRecipient_Calls_MessagingController_DeleteMessageRecipient() - { - this._mockInternalMessagingController.Setup(mc => mc.DeleteMessageRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)).Verifiable(); - this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(new List()); - this._notificationsController.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12); - this._mockMessagingController.Verify(); - } - - [Test] - public void DeleteNotificationRecipientByContext_Calls_DeleteMessageRecipient() - { - this._mockNotificationsController.Setup(mc => mc.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)).Verifiable(); - this._mockNotificationsController.Setup(mc => mc.GetNotificationByContext(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext)) - .Returns(new List { new Notification { NotificationID = Constants.Messaging_MessageId_1 } }); - this._mockNotificationsController.Object.DeleteNotificationRecipient(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext, Constants.UserID_User12); - this._mockMessagingController.Verify(); - } - - [Test] - public void DeleteNotificationRecipient_Does_Not_Delete_Notification_When_There_Are_More_Recipients() - { - var messageRecipients = new List - { - new MessageRecipient(), - }; - - this._mockInternalMessagingController.Setup(mc => mc.DeleteMessageRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)); - this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(messageRecipients); - this._mockNotificationsController.Object.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12); - - this._mockNotificationsController.Verify(nc => nc.DeleteNotification(Constants.Messaging_MessageId_1), Times.Never()); - } - - [Test] - public void DeleteNotificationRecipient_Deletes_Notification_When_There_Are_No_More_Recipients() - { - this._mockInternalMessagingController.Setup(mc => mc.DeleteMessageRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)); - this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(new List()); - this._mockNotificationsController.Object.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12); - this._mockNotificationsController.Verify(nc => nc.DeleteNotification(Constants.Messaging_MessageId_1)); - } - - [Test] - public void DeleteAllNotificationRecipients_Calls_DeleteNotificationRecipient_For_Each_Recipient() - { - var recipients = new List - { - new MessageRecipient { RecipientID = Constants.Messaging_RecipientId_1 }, - new MessageRecipient { RecipientID = Constants.Messaging_RecipientId_2 }, - }; - - this._mockInternalMessagingController.Setup(imc => imc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(recipients); - - this._mockNotificationsController.Object.DeleteAllNotificationRecipients(Constants.Messaging_MessageId_1); - - this._mockNotificationsController.Verify(nc => nc.DeleteNotificationRecipient(It.IsAny(), It.IsAny()), Times.Exactly(2)); - } - - [Test] - public void DeleteAllNotificationRecipients_Does_Not_Call_DeleteNotificationRecipient_When_Notification_Has_No_Recipients() - { - this._mockInternalMessagingController.Setup(imc => imc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(new List()); - this._mockNotificationsController.Object.DeleteAllNotificationRecipients(Constants.Messaging_MessageId_1); - this._mockNotificationsController.Verify(nc => nc.DeleteNotificationRecipient(It.IsAny(), It.IsAny()), Times.Never()); - } - - private static Notification CreateUnsavedNotification() - { - return new Notification - { - NotificationTypeID = Constants.Messaging_NotificationTypeId, - Subject = Constants.Messaging_NotificationSubject, - Body = Constants.Messaging_NotificationBody, - To = Constants.UserDisplayName_User12, - From = Constants.UserDisplayName_Admin, - SenderUserID = Constants.UserID_Admin, - Context = Constants.Messaging_NotificationContext, - SendToast = false, - }; - } - - private static Notification CreateValidNotification() - { - var notification = CreateUnsavedNotification(); - notification.NotificationID = Constants.Messaging_MessageId_1; - - return notification; - } - - private static NotificationType CreateValidNotificationType() - { - var nt = CreateNewNotificationType(); - nt.NotificationTypeId = Constants.Messaging_NotificationTypeId; - return nt; - } - - private static NotificationType CreateNewNotificationType() - { - return new NotificationType - { - Name = Constants.Messaging_NotificationTypeName, - Description = Constants.Messaging_NotificationTypeDescription, - TimeToLive = new TimeSpan(0, Constants.Messaging_NotificationTypeTTL, 0), - DesktopModuleId = Constants.Messaging_NotificationTypeDesktopModuleId, - IsTask = false, - }; - } - - private static NotificationTypeAction CreateValidNotificationTypeAction() - { - var action = CreateNewNotificationTypeAction(); - - action.NotificationTypeActionId = Constants.Messaging_NotificationTypeActionId; - action.NotificationTypeId = Constants.Messaging_NotificationTypeId; - - return action; - } - - private static NotificationTypeAction CreateNewNotificationTypeAction() - { - return new NotificationTypeAction - { - APICall = Constants.Messaging_NotificationTypeActionAPICall, - ConfirmResourceKey = Constants.Messaging_NotificationTypeActionConfirmResourceKey, - DescriptionResourceKey = Constants.Messaging_NotificationTypeActionDescriptionResourceKey, - NameResourceKey = Constants.Messaging_NotificationTypeActionNameResourceKey, - }; - } - - private static PortalInfo CreatePortalInfo(int portalId, int portalGroupId) - { - var mockPortalInfo = new PortalInfo { PortalID = portalId, PortalGroupID = portalGroupId }; - return mockPortalInfo; - } - - private static PortalGroupInfo CreatePortalGroupInfo(int portalGroupId, int masterPortalId) - { - var mockPortalGroupInfo = new PortalGroupInfo - { - PortalGroupId = portalGroupId, - MasterPortalId = masterPortalId, - PortalGroupName = Constants.PORTALGROUP_ValidName, - PortalGroupDescription = Constants.PORTALGROUP_ValidDescription, - }; - - return mockPortalGroupInfo; - } - - private void SetupDataProvider() - { - // Standard DataProvider Path for Logging - this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - } - - private void SetupDataTables() - { - this._dtNotificationTypes = new DataTable(); - this._dtNotificationTypes.Columns.Add("NotificationTypeID", typeof(int)); - this._dtNotificationTypes.Columns.Add("Name", typeof(string)); - this._dtNotificationTypes.Columns.Add("Description", typeof(string)); - this._dtNotificationTypes.Columns.Add("TTL", typeof(int)); - this._dtNotificationTypes.Columns.Add("DesktopModuleID", typeof(int)); - this._dtNotificationTypes.Columns.Add("CreatedByUserID", typeof(int)); - this._dtNotificationTypes.Columns.Add("CreatedOnDate", typeof(DateTime)); - this._dtNotificationTypes.Columns.Add("LastModifiedByUserID", typeof(int)); - this._dtNotificationTypes.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - this._dtNotificationTypes.Columns.Add("IsTask", typeof(bool)); - - this._dtNotificationTypeActions = new DataTable(); - this._dtNotificationTypeActions.Columns.Add("NotificationTypeActionID", typeof(int)); - this._dtNotificationTypeActions.Columns.Add("NotificationTypeID", typeof(int)); - this._dtNotificationTypeActions.Columns.Add("NameResourceKey", typeof(string)); - this._dtNotificationTypeActions.Columns.Add("DescriptionResourceKey", typeof(string)); - this._dtNotificationTypeActions.Columns.Add("ConfirmResourceKey", typeof(string)); - this._dtNotificationTypeActions.Columns.Add("Order", typeof(int)); - this._dtNotificationTypeActions.Columns.Add("APICall", typeof(string)); - this._dtNotificationTypeActions.Columns.Add("CreatedByUserID", typeof(int)); - this._dtNotificationTypeActions.Columns.Add("CreatedOnDate", typeof(DateTime)); - this._dtNotificationTypeActions.Columns.Add("LastModifiedByUserID", typeof(int)); - this._dtNotificationTypeActions.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - - this._dtNotificationActions = new DataTable(); - this._dtNotificationActions.Columns.Add("NotificationActionID"); - this._dtNotificationActions.Columns.Add("MessageID"); - this._dtNotificationActions.Columns.Add("NotificationTypeActionID"); - this._dtNotificationActions.Columns.Add("Key"); - this._dtNotificationActions.Columns.Add("CreatedByUserID", typeof(int)); - this._dtNotificationActions.Columns.Add("CreatedOnDate", typeof(DateTime)); - this._dtNotificationActions.Columns.Add("LastModifiedByUserID", typeof(int)); - this._dtNotificationActions.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - } - - private class NotificationTypeComparer : IEqualityComparer - { - public bool Equals(NotificationType x, NotificationType y) - { - if (x == null) - { - return y == null; - } - - if (y == null) - { - return false; - } - - return - x.NotificationTypeId == y.NotificationTypeId && - x.Name == y.Name && - x.Description == y.Description && - x.TimeToLive == y.TimeToLive && - x.IsTask == y.IsTask && - x.DesktopModuleId == y.DesktopModuleId; - } - - public int GetHashCode(NotificationType obj) - { - throw new NotImplementedException(); - } - } - - private class NotificationTypeActionComparer : IEqualityComparer - { - public bool Equals(NotificationTypeAction x, NotificationTypeAction y) - { - if (x == null) - { - return y == null; - } - - if (y == null) - { - return false; - } - - return - x.NotificationTypeActionId == y.NotificationTypeActionId && - x.NotificationTypeId == y.NotificationTypeId && - x.NameResourceKey == y.NameResourceKey && - x.DescriptionResourceKey == y.DescriptionResourceKey && - x.ConfirmResourceKey == y.ConfirmResourceKey && - x.APICall == y.APICall; - } - - public int GetHashCode(NotificationTypeAction obj) - { - throw new NotImplementedException(); - } - } - - private class NotificationComparer : IEqualityComparer - { - public bool Equals(Notification x, Notification y) - { - if (x == null) - { - return y == null; - } - - if (y == null) - { - return false; - } - - return - x.NotificationID == y.NotificationID && - x.NotificationTypeID == y.NotificationTypeID && - x.Subject == y.Subject && - x.Body == y.Body && - x.To == y.To && - x.From == y.From && - x.SenderUserID == y.SenderUserID && - x.Context == y.Context && - x.IncludeDismissAction == y.IncludeDismissAction; - } - - public int GetHashCode(Notification obj) - { - throw new NotImplementedException(); - } - } - } -} - -// ReSharper restore InconsistentNaming + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + ComponentFactory.Container = new SimpleContainer(); + + this._mockDataService = new Mock(); + this._portalController = new Mock(); + this._portalGroupController = new Mock(); + + this._mockMessagingDataService = new Mock(); + this._dataProvider = MockComponentProvider.CreateDataProvider(); + this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); + + this._notificationsController = new NotificationsController(this._mockDataService.Object, this._mockMessagingDataService.Object); + this._mockNotificationsController = new Mock { CallBase = true }; + + this._mockMessagingController = new Mock(); + MessagingController.SetTestableInstance(this._mockMessagingController.Object); + PortalController.SetTestableInstance(this._portalController.Object); + PortalGroupController.RegisterInstance(this._portalGroupController.Object); + + this._mockInternalMessagingController = new Mock(); + InternalMessagingController.SetTestableInstance(this._mockInternalMessagingController.Object); + + DataService.RegisterInstance(this._mockDataService.Object); + DotNetNuke.Services.Social.Messaging.Data.DataService.RegisterInstance(this._mockMessagingDataService.Object); + + this.SetupDataProvider(); + this.SetupDataTables(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + ComponentFactory.Container = null; + MessagingController.ClearInstance(); + PortalController.ClearInstance(); + InternalMessagingController.ClearInstance(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void CreateNotificationType_Throws_On_Null_NotificationType() + { + this._notificationsController.CreateNotificationType(null); + } + + [Test] + [TestCase("")] + [TestCase(null)] + [ExpectedException(typeof(ArgumentException))] + public void CreateNotificationType_Throws_On_Null_Or_Empty_Name(string name) + { + var notificationType = CreateNewNotificationType(); + notificationType.Name = name; + + this._notificationsController.CreateNotificationType(notificationType); + } + + [Test] + public void CreateNotificationType_Calls_DataService_CreateNotificationType() + { + this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); + + this._mockDataService + .Setup(ds => ds.CreateNotificationType(Constants.Messaging_NotificationTypeName, It.IsAny(), It.IsAny(), It.IsAny(), Constants.UserID_User12, It.IsAny())) + .Verifiable(); + + this._mockNotificationsController.Object.CreateNotificationType(CreateNewNotificationType()); + + this._mockDataService.Verify(); + } + + [Test] + [TestCase(int.MaxValue, int.MaxValue)] + [TestCase(1, 1)] + [TestCase(0, 0)] + public void CreateNotificationType_Returns_Object_With_Valid_TimeToLive(int actualTimeToLiveTotalMinutes, int expectedTimeToLiveTotalMinutes) + { + var actualTimeToLive = TimeSpan.FromMinutes(actualTimeToLiveTotalMinutes); + + var notificationType = CreateNewNotificationType(); + notificationType.TimeToLive = actualTimeToLive; + this._notificationsController.CreateNotificationType(notificationType); + + Assert.AreEqual(expectedTimeToLiveTotalMinutes, (int)notificationType.TimeToLive.TotalMinutes); + } + + [Test] + public void CreateNotificationType_Makes_Valid_Object() + { + var expectedNotificationType = CreateValidNotificationType(); + + this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); + + this._mockDataService + .Setup(ds => ds.CreateNotificationType( + expectedNotificationType.Name, + expectedNotificationType.Description, + (int)expectedNotificationType.TimeToLive.TotalMinutes, + expectedNotificationType.DesktopModuleId, + Constants.UserID_User12, false)) + .Returns(Constants.Messaging_NotificationTypeId); + + var actualNotificationType = CreateNewNotificationType(); + this._mockNotificationsController.Object.CreateNotificationType(actualNotificationType); + + Assert.IsTrue(new NotificationTypeComparer().Equals(expectedNotificationType, actualNotificationType)); + } + + [Test] + public void DeleteNotificationType_Calls_DataService_DeleteNotificationType() + { + this._mockDataService.Setup(ds => ds.DeleteNotificationType(Constants.Messaging_NotificationTypeId)).Verifiable(); + this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeCache()); + this._mockNotificationsController.Object.DeleteNotificationType(Constants.Messaging_NotificationTypeId); + this._mockDataService.Verify(); + } + + [Test] + public void DeleteNotificationType_Removes_Cache_Object() + { + this._mockDataService.Setup(ds => ds.DeleteNotificationType(Constants.Messaging_NotificationTypeId)); + this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeCache()).Verifiable(); + this._mockNotificationsController.Object.DeleteNotificationType(Constants.Messaging_NotificationTypeId); + this._mockNotificationsController.Verify(); + } + + [Test] + public void GetNotificationType_By_Id_Gets_Object_From_Cache() + { + this._cachingProvider.Object.PurgeCache(); + this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); + this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeId); + this._cachingProvider.Verify(); + } + + [Test] + public void GetNotificationType_By_Id_Calls_DataService_GetNotificationType_When_Object_Is_Not_In_Cache() + { + this._cachingProvider.Object.PurgeCache(); + + var messageTypeDataTable = new DataTable(); + + this._mockDataService + .Setup(ds => ds.GetNotificationType(Constants.Messaging_NotificationTypeId)) + .Returns(messageTypeDataTable.CreateDataReader()) + .Verifiable(); + + this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeId); + + this._mockDataService.Verify(); + } + + [Test] + public void GetNotificationType_By_Id_Returns_Valid_Object() + { + this._cachingProvider.Object.PurgeCache(); + + var expectedNotificationType = CreateValidNotificationType(); + + this._dtNotificationTypes.Rows.Clear(); + + this._dtNotificationTypes.Rows.Add( + expectedNotificationType.NotificationTypeId, + expectedNotificationType.Name, + expectedNotificationType.Description, + (int)expectedNotificationType.TimeToLive.TotalMinutes, + expectedNotificationType.DesktopModuleId); + + this._mockDataService + .Setup(ds => ds.GetNotificationType(Constants.Messaging_NotificationTypeId)) + .Returns(this._dtNotificationTypes.CreateDataReader()); + + var actualNotificationType = this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeId); + + Assert.IsTrue(new NotificationTypeComparer().Equals(expectedNotificationType, actualNotificationType)); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void GetNotificationType_By_Name_Throws_On_Null_Or_Empty_Name(string name) + { + this._notificationsController.GetNotificationType(name); + } + + [Test] + public void GetNotificationType_By_Name_Gets_Object_From_Cache() + { + this._cachingProvider.Object.PurgeCache(); + this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); + this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeName); + this._cachingProvider.Verify(); + } + + [Test] + public void GetNotificationType_By_Name_Calls_DataService_GetNotificationTypeByName_When_Object_Is_Not_In_Cache() + { + this._cachingProvider.Object.PurgeCache(); + + this._mockDataService + .Setup(ds => ds.GetNotificationTypeByName(Constants.Messaging_NotificationTypeName)) + .Returns(this._dtNotificationTypes.CreateDataReader()) + .Verifiable(); + + this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeName); + + this._mockDataService.Verify(); + } + + [Test] + public void GetNotificationType_By_Name_Returns_Valid_Object() + { + this._cachingProvider.Object.PurgeCache(); + + var expectedNotificationType = CreateValidNotificationType(); + + this._dtNotificationTypes.Rows.Clear(); + + this._dtNotificationTypes.Rows.Add( + expectedNotificationType.NotificationTypeId, + expectedNotificationType.Name, + expectedNotificationType.Description, + (int)expectedNotificationType.TimeToLive.TotalMinutes, + expectedNotificationType.DesktopModuleId); + + this._mockDataService + .Setup(ds => ds.GetNotificationTypeByName(Constants.Messaging_NotificationTypeName)) + .Returns(this._dtNotificationTypes.CreateDataReader()); + + var actualNotificationType = this._notificationsController.GetNotificationType(Constants.Messaging_NotificationTypeName); + + Assert.IsTrue(new NotificationTypeComparer().Equals(expectedNotificationType, actualNotificationType)); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void SetNotificationTypeActions_Throws_On_Null() + { + this._notificationsController.SetNotificationTypeActions(null, Constants.Messaging_NotificationTypeId); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SetNotificationTypeActions_Throws_On_EmptyList() + { + this._notificationsController.SetNotificationTypeActions(new List(), Constants.Messaging_NotificationTypeId); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void SetNotificationTypeActions_Throws_On_Null_Or_Empty_Name(string name) + { + var action = CreateNewNotificationTypeAction(); + action.NameResourceKey = name; + this._notificationsController.SetNotificationTypeActions(new[] { action }, Constants.Messaging_NotificationTypeId); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void SetNotificationTypeActions_Throws_On_Null_Or_Empty_APICall(string apiCall) + { + var action = CreateNewNotificationTypeAction(); + action.APICall = apiCall; + this._notificationsController.SetNotificationTypeActions(new[] { action }, Constants.Messaging_NotificationTypeId); + } + + [Test] + public void SetNotificationTypeActions_Calls_DataService_AddNotificationTypeAction_For_Each_Of_Two_Actions() + { + this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); + + // _mockDataService + // .Setup(ds => ds.AddNotificationTypeAction( + // Constants.Messaging_NotificationTypeId, + // Constants.Messaging_NotificationTypeActionNameResourceKey, + // Constants.Messaging_NotificationTypeActionDescriptionResourceKey, + // Constants.Messaging_NotificationTypeActionConfirmResourceKey, + // Constants.Messaging_NotificationTypeActionAPICall, + // Constants.UserID_User12)) + // .Verifiable(); + this._mockNotificationsController.Setup(nc => nc.GetNotificationTypeAction(It.IsAny())); + + this._mockNotificationsController.Object.SetNotificationTypeActions( + new[] { CreateNewNotificationTypeAction(), CreateNewNotificationTypeAction() }, + Constants.Messaging_NotificationTypeId); + + this._mockDataService.Verify( + x => x.AddNotificationTypeAction( + Constants.Messaging_NotificationTypeId, + Constants.Messaging_NotificationTypeActionNameResourceKey, + Constants.Messaging_NotificationTypeActionDescriptionResourceKey, + Constants.Messaging_NotificationTypeActionConfirmResourceKey, + Constants.Messaging_NotificationTypeActionAPICall, + Constants.UserID_User12), Times.Exactly(2)); + } + + [Test] + public void SetNotificationTypeActions_Sets_NotificationTypeActionId_And_NotificationTypeId() + { + var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); + + this._mockNotificationsController.Setup(nc => nc.GetCurrentUserId()).Returns(Constants.UserID_User12); + + this._mockDataService + .Setup(ds => ds.AddNotificationTypeAction( + expectedNotificationTypeAction.NotificationTypeId, + expectedNotificationTypeAction.NameResourceKey, + expectedNotificationTypeAction.DescriptionResourceKey, + expectedNotificationTypeAction.ConfirmResourceKey, + expectedNotificationTypeAction.APICall, + Constants.UserID_User12)) + .Returns(expectedNotificationTypeAction.NotificationTypeActionId); + + this._mockNotificationsController + .Setup(nc => nc.GetNotificationTypeAction(expectedNotificationTypeAction.NotificationTypeActionId)) + .Returns(expectedNotificationTypeAction); + + var action = CreateNewNotificationTypeAction(); + this._mockNotificationsController.Object.SetNotificationTypeActions(new[] { action }, expectedNotificationTypeAction.NotificationTypeId); + + Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, action)); + } + + [Test] + public void DeleteNotificationTypeAction_Calls_DataService_DeleteNotificationTypeAction() + { + this._mockDataService.Setup(ds => ds.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)).Verifiable(); + this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeActionCache()); + this._mockNotificationsController.Object.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); + this._mockDataService.Verify(); + } + + [Test] + public void DeleteNotificationTypeAction_Removes_Cache_Object() + { + this._mockDataService.Setup(ds => ds.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)); + this._mockNotificationsController.Setup(nc => nc.RemoveNotificationTypeActionCache()).Verifiable(); + this._mockNotificationsController.Object.DeleteNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); + this._mockNotificationsController.Verify(); + } + + [Test] + public void GetNotificationTypeAction_By_Id_Gets_Object_From_Cache() + { + this._cachingProvider.Object.PurgeCache(); + this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); + this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); + this._cachingProvider.Verify(); + } + + [Test] + public void GetNotificationTypeAction_By_Id_Calls_DataService_GetNotificationTypeAction_When_Object_Is_Not_In_Cache() + { + this._cachingProvider.Object.PurgeCache(); + + this._mockDataService + .Setup(ds => ds.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)) + .Returns(this._dtNotificationTypeActions.CreateDataReader()) + .Verifiable(); + + this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); + + this._mockDataService.Verify(); + } + + [Test] + public void GetNotificationTypeAction_By_Id_Returns_Valid_Object() + { + this._cachingProvider.Object.PurgeCache(); + + var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); + + this._dtNotificationTypeActions.Clear(); + + this._dtNotificationTypeActions.Rows.Add( + expectedNotificationTypeAction.NotificationTypeActionId, + expectedNotificationTypeAction.NotificationTypeId, + expectedNotificationTypeAction.NameResourceKey, + expectedNotificationTypeAction.DescriptionResourceKey, + expectedNotificationTypeAction.ConfirmResourceKey, + expectedNotificationTypeAction.Order, + expectedNotificationTypeAction.APICall); + + this._mockDataService + .Setup(ds => ds.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId)) + .Returns(this._dtNotificationTypeActions.CreateDataReader); + + var actualNotificationTypeAction = this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeActionId); + + Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, actualNotificationTypeAction)); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void GetNotificationTypeAction_By_Name_Throws_On_Null_Or_Empty_Name(string name) + { + this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, name); + } + + [Test] + public void GetNotificationTypeAction_By_Name_Gets_Object_From_Cache() + { + this._cachingProvider.Object.PurgeCache(); + this._cachingProvider.Setup(cp => cp.GetItem(It.IsAny())).Verifiable(); + this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationTypeActionNameResourceKey); + this._cachingProvider.Verify(); + } + + [Test] + public void GetNotificationTypeAction_By_Name_Calls_DataService_GetNotificationTypeActionByName_When_Object_Is_Not_In_Cache() + { + this._cachingProvider.Object.PurgeCache(); + + this._mockDataService + .Setup(ds => ds.GetNotificationTypeActionByName( + Constants.Messaging_NotificationTypeId, + Constants.Messaging_NotificationTypeActionNameResourceKey)) + .Returns(this._dtNotificationTypeActions.CreateDataReader()) + .Verifiable(); + + this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationTypeActionNameResourceKey); + + this._mockDataService.Verify(); + } + + [Test] + public void GetNotificationTypeAction_By_Name_Returns_Valid_Object() + { + this._cachingProvider.Object.PurgeCache(); + + var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); + + this._dtNotificationTypeActions.Clear(); + + this._dtNotificationTypeActions.Rows.Add( + expectedNotificationTypeAction.NotificationTypeActionId, + expectedNotificationTypeAction.NotificationTypeId, + expectedNotificationTypeAction.NameResourceKey, + expectedNotificationTypeAction.DescriptionResourceKey, + expectedNotificationTypeAction.ConfirmResourceKey, + expectedNotificationTypeAction.Order, + expectedNotificationTypeAction.APICall); + + this._mockDataService + .Setup(ds => ds.GetNotificationTypeActionByName( + Constants.Messaging_NotificationTypeId, + Constants.Messaging_NotificationTypeActionNameResourceKey)) + .Returns(this._dtNotificationTypeActions.CreateDataReader()); + + var actualNotificationTypeAction = this._notificationsController.GetNotificationTypeAction(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationTypeActionNameResourceKey); + + Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, actualNotificationTypeAction)); + } + + [Test] + public void GetNotificationTypeActions_Calls_DataService_GetNotificationTypeActions() + { + this._mockDataService + .Setup(ds => ds.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId)) + .Returns(this._dtNotificationTypeActions.CreateDataReader()) + .Verifiable(); + + this._notificationsController.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId); + + this._mockDataService.Verify(); + } + + [Test] + public void GetNotificationTypeActions_Returns_Valid_Object() + { + var expectedNotificationTypeAction = CreateValidNotificationTypeAction(); + + this._dtNotificationTypeActions.Clear(); + + this._dtNotificationTypeActions.Rows.Add( + expectedNotificationTypeAction.NotificationTypeActionId, + expectedNotificationTypeAction.NotificationTypeId, + expectedNotificationTypeAction.NameResourceKey, + expectedNotificationTypeAction.DescriptionResourceKey, + expectedNotificationTypeAction.ConfirmResourceKey, + expectedNotificationTypeAction.Order, + expectedNotificationTypeAction.APICall); + + this._mockDataService.Setup(ds => ds.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId)).Returns(this._dtNotificationTypeActions.CreateDataReader()); + + var actualNotificationTypeActions = this._notificationsController.GetNotificationTypeActions(Constants.Messaging_NotificationTypeId); + + Assert.AreEqual(1, actualNotificationTypeActions.Count); + Assert.IsTrue(new NotificationTypeActionComparer().Equals(expectedNotificationTypeAction, actualNotificationTypeActions[0])); + } + + [Test] + public void SendNotification_Sets_Empty_SenderUserId_With_Admin() + { + var adminUser = new UserInfo + { + UserID = Constants.UserID_Admin, + DisplayName = Constants.UserDisplayName_Admin, + PortalID = Constants.CONTENT_ValidPortalId, + }; + + this._mockNotificationsController.Setup(nc => nc.GetAdminUser()).Returns(adminUser); + + this._mockNotificationsController + .Setup(nc => nc.SendNotification( + It.IsAny(), + Constants.PORTAL_Zero, + It.IsAny>(), + It.IsAny>())); + + var notification = CreateUnsavedNotification(); + + this._mockNotificationsController.Object.SendNotification( + notification, + Constants.PORTAL_Zero, + new List(), + new List()); + + Assert.AreEqual(adminUser.UserID, notification.SenderUserID); + } + + [Test] + [TestCase(null, null)] + [TestCase(null, "")] + [TestCase("", null)] + [TestCase("", "")] + [ExpectedException(typeof(ArgumentException))] + public void SendNotification_Throws_On_Null_Or_Empty_Subject_And_Body(string subject, string body) + { + var notification = CreateUnsavedNotification(); + notification.Subject = subject; + notification.Body = body; + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + this._notificationsController.SendNotification( + notification, + Constants.PORTAL_Zero, + new List(), + new List()); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SendNotification_Throws_On_Null_Roles_And_Users() + { + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + this._notificationsController.SendNotification( + CreateUnsavedNotification(), + Constants.PORTAL_Zero, + null, + null); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SendNotification_Throws_On_Large_Subject() + { + var notification = CreateUnsavedNotification(); + var subject = new StringBuilder(); + for (var i = 0; i <= 40; i++) + { + subject.Append("1234567890"); + } + + notification.Subject = subject.ToString(); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + this._notificationsController.SendNotification( + notification, + Constants.PORTAL_Zero, + new List(), + new List()); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SendNotification_Throws_On_Roles_And_Users_With_No_DisplayNames() + { + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + this._notificationsController.SendNotification( + CreateUnsavedNotification(), + Constants.PORTAL_Zero, + new List(), + new List()); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void SendNotification_Throws_On_Large_To_List() + { + var roles = new List(); + var users = new List(); + + for (var i = 0; i <= 100; i++) + { + roles.Add(new RoleInfo { RoleName = "1234567890" }); + users.Add(new UserInfo { DisplayName = "1234567890" }); + } + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + this._notificationsController.SendNotification( + CreateUnsavedNotification(), + Constants.PORTAL_Zero, + roles, + users); + } + + [Test] + public void SendNotification_Calls_DataService_On_Valid_Notification() + { + var adminUser = new UserInfo + { + UserID = Constants.UserID_Admin, + DisplayName = Constants.UserDisplayName_Admin, + PortalID = Constants.PORTAL_Zero, + }; + + this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + var roles = new List(); + var users = new List + { + new UserInfo + { + UserID = Constants.UserID_User12, + DisplayName = Constants.UserDisplayName_User12 + }, + }; + + this._mockDataService + .Setup(ds => ds.SendNotification( + It.IsAny(), + Constants.PORTAL_Zero)) + .Verifiable(); + + this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); + + var notification = CreateUnsavedNotification(); + notification.SenderUserID = adminUser.UserID; + notification.SendToast = false; + + this._mockNotificationsController.Object.SendNotification( + notification, + Constants.PORTAL_Zero, + roles, + users); + + this._mockDataService.Verify(); + } + + [Test] + public void SendNotification_Calls_DataService_On_Valid_Notification_When_Portal_Is_In_Group() + { + var adminUser = new UserInfo + { + UserID = Constants.UserID_Admin, + DisplayName = Constants.UserDisplayName_Admin, + PortalID = Constants.PORTAL_Zero, + }; + + this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Constants.PORTALGROUP_ValidPortalGroupId); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + List portalGroups = new List() { CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero) }; // CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero); + this._portalGroupController.Setup(pgc => pgc.GetPortalGroups()).Returns(portalGroups); + + var roles = new List(); + var users = new List + { + new UserInfo + { + UserID = Constants.UserID_User12, + DisplayName = Constants.UserDisplayName_User12 + }, + }; + + this._mockDataService + .Setup(ds => ds.SendNotification( + It.IsAny(), + Constants.PORTAL_Zero)) + .Verifiable(); + + this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); + + var notification = CreateUnsavedNotification(); + notification.SenderUserID = adminUser.UserID; + notification.SendToast = false; + + this._mockNotificationsController.Object.SendNotification( + notification, + Constants.PORTAL_Zero, + roles, + users); + + this._mockDataService.Verify(); + } + + [Test] + public void SendNotification_Calls_Messaging_DataService_CreateSocialMessageRecipientsForRole_When_Passing_Roles() + { + var adminUser = new UserInfo + { + UserID = Constants.UserID_Admin, + DisplayName = Constants.UserDisplayName_Admin, + PortalID = Constants.PORTAL_Zero, + }; + + this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + var roles = new List + { + new RoleInfo + { + RoleID = Constants.RoleID_RegisteredUsers, + RoleName = Constants.RoleName_RegisteredUsers + }, + }; + var users = new List(); + + this._mockDataService + .Setup(ds => ds.SendNotification( + It.IsAny(), + Constants.PORTAL_Zero)) + .Returns(Constants.Messaging_MessageId_1); + + this._mockMessagingDataService + .Setup(mds => mds.CreateMessageRecipientsForRole( + Constants.Messaging_MessageId_1, + Constants.RoleID_RegisteredUsers.ToString(CultureInfo.InvariantCulture), + It.IsAny())) + .Verifiable(); + + this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); + + var notification = CreateUnsavedNotification(); + notification.SenderUserID = adminUser.UserID; + notification.SendToast = false; + + this._mockNotificationsController.Object.SendNotification( + notification, + Constants.PORTAL_Zero, + roles, + users); + + this._mockMessagingDataService.Verify(); + } + + [Test] + public void SendNotification_Calls_Messaging_DataService_SaveSocialMessageRecipient_When_Passing_Users() + { + var adminUser = new UserInfo + { + UserID = Constants.UserID_Admin, + DisplayName = Constants.UserDisplayName_Admin, + PortalID = Constants.PORTAL_Zero, + }; + + this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + var roles = new List(); + var users = new List + { + new UserInfo + { + UserID = Constants.UserID_User12, + DisplayName = Constants.UserDisplayName_User12 + }, + }; + + this._mockDataService + .Setup(ds => ds.SendNotification( + It.IsAny(), + Constants.PORTAL_Zero)) + .Returns(Constants.Messaging_MessageId_1); + + this._mockInternalMessagingController + .Setup(mc => mc.GetMessageRecipient( + Constants.Messaging_MessageId_1, + Constants.UserID_User12)) + .Returns((MessageRecipient)null); + + this._mockMessagingDataService + .Setup(mds => mds.SaveMessageRecipient( + It.Is(mr => + mr.MessageID == Constants.Messaging_MessageId_1 && + mr.UserID == Constants.UserID_User12 && + mr.Read == false && + mr.RecipientID == Null.NullInteger), + It.IsAny())) + .Verifiable(); + + this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); + + var notification = CreateUnsavedNotification(); + notification.SenderUserID = adminUser.UserID; + notification.SendToast = false; + + this._mockNotificationsController.Object.SendNotification( + notification, + Constants.PORTAL_Zero, + roles, + users); + + this._mockMessagingDataService.Verify(); + } + + [Test] + public void SendNotification_Returns_Valid_Object() + { + var expectedNotification = CreateValidNotification(); + + var adminUser = new UserInfo + { + UserID = Constants.UserID_Admin, + DisplayName = Constants.UserDisplayName_Admin, + PortalID = Constants.PORTAL_Zero, + }; + + this._mockInternalMessagingController.Setup(mc => mc.RecipientLimit(adminUser.PortalID)).Returns(10); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + var roles = new List(); + var users = new List + { + new UserInfo + { + UserID = Constants.UserID_User12, + DisplayName = Constants.UserDisplayName_User12 + }, + }; + + this._mockDataService + .Setup(ds => ds.SendNotification( + It.IsAny(), + Constants.PORTAL_Zero)) + .Returns(Constants.Messaging_MessageId_1); + + this._mockMessagingDataService + .Setup(mds => mds.CreateMessageRecipientsForRole( + Constants.Messaging_MessageId_1, + Constants.RoleID_RegisteredUsers.ToString(CultureInfo.InvariantCulture), + It.IsAny())); + + this._mockInternalMessagingController + .Setup(mc => mc.GetMessageRecipient( + Constants.Messaging_MessageId_1, + Constants.UserID_User12)) + .Returns((MessageRecipient)null); + + this._mockMessagingDataService + .Setup(mds => mds.SaveMessageRecipient( + It.Is(mr => + mr.MessageID == Constants.Messaging_MessageId_1 && + mr.UserID == Constants.UserID_User12 && + mr.Read == false && + mr.RecipientID == Null.NullInteger), + It.IsAny())); + + this._mockNotificationsController.Setup(nc => nc.GetExpirationDate(It.IsAny())).Returns(DateTime.MinValue); + + var notification = CreateUnsavedNotification(); + notification.SenderUserID = adminUser.UserID; + notification.SendToast = false; + + this._mockNotificationsController.Object.SendNotification( + notification, + Constants.PORTAL_Zero, + roles, + users); + + Assert.IsTrue(new NotificationComparer().Equals(expectedNotification, notification)); + } + + [Test] + public void DeleteNotification_Calls_DataService_DeleteNotification() + { + var messageRecipients = new List + { + new MessageRecipient(), + }; + + this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(messageRecipients); + + this._mockDataService.Setup(ds => ds.DeleteNotification(Constants.Messaging_MessageId_1)).Verifiable(); + this._notificationsController.DeleteNotification(Constants.Messaging_MessageId_1); + this._mockDataService.Verify(); + } + + [Test] + public void GetNotifications_Calls_DataService_GetNotifications() + { + this._mockDataService + .Setup(ds => ds.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, It.IsAny(), It.IsAny())) + .Returns(new DataTable().CreateDataReader()) + .Verifiable(); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + this._notificationsController.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, 0, 10); + this._mockDataService.Verify(); + } + + [Test] + public void GetNotifications_Calls_DataService_GetNotifications_When_Portal_Is_In_Group() + { + this._mockDataService + .Setup(ds => ds.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, It.IsAny(), It.IsAny())) + .Returns(new DataTable().CreateDataReader()) + .Verifiable(); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Constants.PORTALGROUP_ValidPortalGroupId); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + List portalGroups = new List() { CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero) }; // CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero); + this._portalGroupController.Setup(pgc => pgc.GetPortalGroups()).Returns(portalGroups); + + this._notificationsController.GetNotifications(Constants.UserID_User12, Constants.PORTAL_Zero, 0, 10); + this._mockDataService.Verify(); + } + + [Test] + public void GetNotifications_Calls_DataService_GetNotificationByContext() + { + this._mockDataService + .Setup(ds => ds.GetNotificationByContext(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext)) + .Returns(new DataTable().CreateDataReader()) + .Verifiable(); + + this._notificationsController.GetNotificationByContext(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext); + this._mockDataService.Verify(); + } + + [Test] + public void CountNotifications_Calls_DataService_CountNotifications() + { + this._mockDataService.Setup(ds => ds.CountNotifications(Constants.UserID_User12, Constants.PORTAL_Zero)).Verifiable(); + this._notificationsController.CountNotifications(Constants.UserID_User12, Constants.PORTAL_Zero); + this._mockDataService.Verify(); + } + + [Test] + public void DeleteNotificationRecipient_Calls_MessagingController_DeleteMessageRecipient() + { + this._mockInternalMessagingController.Setup(mc => mc.DeleteMessageRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)).Verifiable(); + this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(new List()); + this._notificationsController.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12); + this._mockMessagingController.Verify(); + } + + [Test] + public void DeleteNotificationRecipientByContext_Calls_DeleteMessageRecipient() + { + this._mockNotificationsController.Setup(mc => mc.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)).Verifiable(); + this._mockNotificationsController.Setup(mc => mc.GetNotificationByContext(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext)) + .Returns(new List { new Notification { NotificationID = Constants.Messaging_MessageId_1 } }); + this._mockNotificationsController.Object.DeleteNotificationRecipient(Constants.Messaging_NotificationTypeId, Constants.Messaging_NotificationContext, Constants.UserID_User12); + this._mockMessagingController.Verify(); + } + + [Test] + public void DeleteNotificationRecipient_Does_Not_Delete_Notification_When_There_Are_More_Recipients() + { + var messageRecipients = new List + { + new MessageRecipient(), + }; + + this._mockInternalMessagingController.Setup(mc => mc.DeleteMessageRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)); + this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(messageRecipients); + this._mockNotificationsController.Object.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12); + + this._mockNotificationsController.Verify(nc => nc.DeleteNotification(Constants.Messaging_MessageId_1), Times.Never()); + } + + [Test] + public void DeleteNotificationRecipient_Deletes_Notification_When_There_Are_No_More_Recipients() + { + this._mockInternalMessagingController.Setup(mc => mc.DeleteMessageRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12)); + this._mockInternalMessagingController.Setup(mc => mc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(new List()); + this._mockNotificationsController.Object.DeleteNotificationRecipient(Constants.Messaging_MessageId_1, Constants.UserID_User12); + this._mockNotificationsController.Verify(nc => nc.DeleteNotification(Constants.Messaging_MessageId_1)); + } + + [Test] + public void DeleteAllNotificationRecipients_Calls_DeleteNotificationRecipient_For_Each_Recipient() + { + var recipients = new List + { + new MessageRecipient { RecipientID = Constants.Messaging_RecipientId_1 }, + new MessageRecipient { RecipientID = Constants.Messaging_RecipientId_2 }, + }; + + this._mockInternalMessagingController.Setup(imc => imc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(recipients); + + this._mockNotificationsController.Object.DeleteAllNotificationRecipients(Constants.Messaging_MessageId_1); + + this._mockNotificationsController.Verify(nc => nc.DeleteNotificationRecipient(It.IsAny(), It.IsAny()), Times.Exactly(2)); + } + + [Test] + public void DeleteAllNotificationRecipients_Does_Not_Call_DeleteNotificationRecipient_When_Notification_Has_No_Recipients() + { + this._mockInternalMessagingController.Setup(imc => imc.GetMessageRecipients(Constants.Messaging_MessageId_1)).Returns(new List()); + this._mockNotificationsController.Object.DeleteAllNotificationRecipients(Constants.Messaging_MessageId_1); + this._mockNotificationsController.Verify(nc => nc.DeleteNotificationRecipient(It.IsAny(), It.IsAny()), Times.Never()); + } + + private static Notification CreateUnsavedNotification() + { + return new Notification + { + NotificationTypeID = Constants.Messaging_NotificationTypeId, + Subject = Constants.Messaging_NotificationSubject, + Body = Constants.Messaging_NotificationBody, + To = Constants.UserDisplayName_User12, + From = Constants.UserDisplayName_Admin, + SenderUserID = Constants.UserID_Admin, + Context = Constants.Messaging_NotificationContext, + SendToast = false, + }; + } + + private static Notification CreateValidNotification() + { + var notification = CreateUnsavedNotification(); + notification.NotificationID = Constants.Messaging_MessageId_1; + + return notification; + } + + private static NotificationType CreateValidNotificationType() + { + var nt = CreateNewNotificationType(); + nt.NotificationTypeId = Constants.Messaging_NotificationTypeId; + return nt; + } + + private static NotificationType CreateNewNotificationType() + { + return new NotificationType + { + Name = Constants.Messaging_NotificationTypeName, + Description = Constants.Messaging_NotificationTypeDescription, + TimeToLive = new TimeSpan(0, Constants.Messaging_NotificationTypeTTL, 0), + DesktopModuleId = Constants.Messaging_NotificationTypeDesktopModuleId, + IsTask = false, + }; + } + + private static NotificationTypeAction CreateValidNotificationTypeAction() + { + var action = CreateNewNotificationTypeAction(); + + action.NotificationTypeActionId = Constants.Messaging_NotificationTypeActionId; + action.NotificationTypeId = Constants.Messaging_NotificationTypeId; + + return action; + } + + private static NotificationTypeAction CreateNewNotificationTypeAction() + { + return new NotificationTypeAction + { + APICall = Constants.Messaging_NotificationTypeActionAPICall, + ConfirmResourceKey = Constants.Messaging_NotificationTypeActionConfirmResourceKey, + DescriptionResourceKey = Constants.Messaging_NotificationTypeActionDescriptionResourceKey, + NameResourceKey = Constants.Messaging_NotificationTypeActionNameResourceKey, + }; + } + + private static PortalInfo CreatePortalInfo(int portalId, int portalGroupId) + { + var mockPortalInfo = new PortalInfo { PortalID = portalId, PortalGroupID = portalGroupId }; + return mockPortalInfo; + } + + private static PortalGroupInfo CreatePortalGroupInfo(int portalGroupId, int masterPortalId) + { + var mockPortalGroupInfo = new PortalGroupInfo + { + PortalGroupId = portalGroupId, + MasterPortalId = masterPortalId, + PortalGroupName = Constants.PORTALGROUP_ValidName, + PortalGroupDescription = Constants.PORTALGROUP_ValidDescription, + }; + + return mockPortalGroupInfo; + } + + private void SetupDataProvider() + { + // Standard DataProvider Path for Logging + this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + } + + private void SetupDataTables() + { + this._dtNotificationTypes = new DataTable(); + this._dtNotificationTypes.Columns.Add("NotificationTypeID", typeof(int)); + this._dtNotificationTypes.Columns.Add("Name", typeof(string)); + this._dtNotificationTypes.Columns.Add("Description", typeof(string)); + this._dtNotificationTypes.Columns.Add("TTL", typeof(int)); + this._dtNotificationTypes.Columns.Add("DesktopModuleID", typeof(int)); + this._dtNotificationTypes.Columns.Add("CreatedByUserID", typeof(int)); + this._dtNotificationTypes.Columns.Add("CreatedOnDate", typeof(DateTime)); + this._dtNotificationTypes.Columns.Add("LastModifiedByUserID", typeof(int)); + this._dtNotificationTypes.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + this._dtNotificationTypes.Columns.Add("IsTask", typeof(bool)); + + this._dtNotificationTypeActions = new DataTable(); + this._dtNotificationTypeActions.Columns.Add("NotificationTypeActionID", typeof(int)); + this._dtNotificationTypeActions.Columns.Add("NotificationTypeID", typeof(int)); + this._dtNotificationTypeActions.Columns.Add("NameResourceKey", typeof(string)); + this._dtNotificationTypeActions.Columns.Add("DescriptionResourceKey", typeof(string)); + this._dtNotificationTypeActions.Columns.Add("ConfirmResourceKey", typeof(string)); + this._dtNotificationTypeActions.Columns.Add("Order", typeof(int)); + this._dtNotificationTypeActions.Columns.Add("APICall", typeof(string)); + this._dtNotificationTypeActions.Columns.Add("CreatedByUserID", typeof(int)); + this._dtNotificationTypeActions.Columns.Add("CreatedOnDate", typeof(DateTime)); + this._dtNotificationTypeActions.Columns.Add("LastModifiedByUserID", typeof(int)); + this._dtNotificationTypeActions.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + + this._dtNotificationActions = new DataTable(); + this._dtNotificationActions.Columns.Add("NotificationActionID"); + this._dtNotificationActions.Columns.Add("MessageID"); + this._dtNotificationActions.Columns.Add("NotificationTypeActionID"); + this._dtNotificationActions.Columns.Add("Key"); + this._dtNotificationActions.Columns.Add("CreatedByUserID", typeof(int)); + this._dtNotificationActions.Columns.Add("CreatedOnDate", typeof(DateTime)); + this._dtNotificationActions.Columns.Add("LastModifiedByUserID", typeof(int)); + this._dtNotificationActions.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + } + + private class NotificationTypeComparer : IEqualityComparer + { + public bool Equals(NotificationType x, NotificationType y) + { + if (x == null) + { + return y == null; + } + + if (y == null) + { + return false; + } + + return + x.NotificationTypeId == y.NotificationTypeId && + x.Name == y.Name && + x.Description == y.Description && + x.TimeToLive == y.TimeToLive && + x.IsTask == y.IsTask && + x.DesktopModuleId == y.DesktopModuleId; + } + + public int GetHashCode(NotificationType obj) + { + throw new NotImplementedException(); + } + } + + private class NotificationTypeActionComparer : IEqualityComparer + { + public bool Equals(NotificationTypeAction x, NotificationTypeAction y) + { + if (x == null) + { + return y == null; + } + + if (y == null) + { + return false; + } + + return + x.NotificationTypeActionId == y.NotificationTypeActionId && + x.NotificationTypeId == y.NotificationTypeId && + x.NameResourceKey == y.NameResourceKey && + x.DescriptionResourceKey == y.DescriptionResourceKey && + x.ConfirmResourceKey == y.ConfirmResourceKey && + x.APICall == y.APICall; + } + + public int GetHashCode(NotificationTypeAction obj) + { + throw new NotImplementedException(); + } + } + + private class NotificationComparer : IEqualityComparer + { + public bool Equals(Notification x, Notification y) + { + if (x == null) + { + return y == null; + } + + if (y == null) + { + return false; + } + + return + x.NotificationID == y.NotificationID && + x.NotificationTypeID == y.NotificationTypeID && + x.Subject == y.Subject && + x.Body == y.Body && + x.To == y.To && + x.From == y.From && + x.SenderUserID == y.SenderUserID && + x.Context == y.Context && + x.IncludeDismissAction == y.IncludeDismissAction; + } + + public int GetHashCode(Notification obj) + { + throw new NotImplementedException(); + } + } + } +} + +// ReSharper restore InconsistentNaming diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs index a10b20e8cdd..380de00282e 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Messaging/SubscriptionTypeControllerTests.cs @@ -2,197 +2,195 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Messaging -{ +namespace DotNetNuke.Tests.Core.Controllers.Messaging +{ using System; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Social.Subscriptions; - using DotNetNuke.Services.Social.Subscriptions.Data; - using DotNetNuke.Tests.Core.Controllers.Messaging.Builders; - using DotNetNuke.Tests.Core.Controllers.Messaging.Mocks; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Social.Subscriptions; + using DotNetNuke.Services.Social.Subscriptions.Data; + using DotNetNuke.Tests.Core.Controllers.Messaging.Builders; + using DotNetNuke.Tests.Core.Controllers.Messaging.Mocks; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class SubscriptionTypeControllerTests - { - private const string SubscriptionTypesCacheKey = "DNN_" + DataCache.SubscriptionTypesCacheKey; - - private SubscriptionTypeController subscriptionTypeController; - private Mock mockDataService; - private Mock mockCacheProvider; - private Mock mockHostController; - - [SetUp] - public void SetUp() - { - // Setup Mocks and Stub - this.mockDataService = new Mock(); - this.mockCacheProvider = MockComponentProvider.CreateDataCacheProvider(); - this.mockHostController = new Mock(); - this.mockHostController.As(); - - DataService.SetTestableInstance(this.mockDataService.Object); - + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class SubscriptionTypeControllerTests + { + private const string SubscriptionTypesCacheKey = "DNN_" + DataCache.SubscriptionTypesCacheKey; + + private SubscriptionTypeController subscriptionTypeController; + private Mock mockDataService; + private Mock mockCacheProvider; + private Mock mockHostController; + + [SetUp] + public void SetUp() + { + // Setup Mocks and Stub + this.mockDataService = new Mock(); + this.mockCacheProvider = MockComponentProvider.CreateDataCacheProvider(); + this.mockHostController = new Mock(); + this.mockHostController.As(); + + DataService.SetTestableInstance(this.mockDataService.Object); + var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - // Setup SUT - this.subscriptionTypeController = new SubscriptionTypeController(); - } - - [Test] - public void GetSubscriptionTypes_ShouldCallDataService_WhenNoError() - { - // Arrange - this.mockHostController - .Setup(c => c.GetString("PerformanceSetting")) - .Returns("0"); - - this.mockDataService - .Setup(ds => ds.GetSubscriptionTypes()) - .Returns(SubscriptionTypeDataReaderMockHelper.CreateEmptySubscriptionTypeReader()) - .Verifiable(); - - // Act - this.subscriptionTypeController.GetSubscriptionTypes(); - - // Assert - this.mockDataService.Verify(ds => ds.GetSubscriptionTypes(), Times.Once()); - } - - [Test] - public void GetSubscriptionTypes_ShouldThrowArgumentNullException_WhenPredicateIsNull() - { - // Act, Arrange - Assert.Throws(() => this.subscriptionTypeController.GetSubscriptionTypes(null)); - } - - [Test] - public void GetSubscriptionType_ShouldThrowArgumentNullException_WhenPredicateIsNull() - { - // Act, Assert - Assert.Throws(() => this.subscriptionTypeController.GetSubscriptionType(null)); - } - - [Test] - public void AddSubscriptionType_ShouldThrowArgumentNullException_WhenSubscriptionTypeIsNull() - { - // Act, Arrange - Assert.Throws(() => this.subscriptionTypeController.AddSubscriptionType(null)); - } - - [Test] - public void AddSubscriptionType_ShouldFilledUpTheSubscriptionTypeIdPropertyOfTheInputSubscriptionTypeEntity_WhenNoError() - { - // Arrange - const int expectedSubscriptionTypeId = 12; - var subscriptionType = new SubscriptionTypeBuilder().Build(); - - this.mockDataService - .Setup(ds => ds.AddSubscriptionType( - subscriptionType.SubscriptionName, - subscriptionType.FriendlyName, - subscriptionType.DesktopModuleId)) - .Returns(expectedSubscriptionTypeId); - - // Act - this.subscriptionTypeController.AddSubscriptionType(subscriptionType); - - // Assert - Assert.AreEqual(expectedSubscriptionTypeId, subscriptionType.SubscriptionTypeId); - } - - [Test] - public void AddSubscriptionType_ShouldCleanCache_WhenNoError() - { - // Arrange - this.mockDataService.Setup(ds => ds.AddSubscriptionType(It.IsAny(), It.IsAny(), It.IsAny())); - this.mockCacheProvider.Setup(cp => cp.Remove(SubscriptionTypesCacheKey)).Verifiable(); - - var subscriptionType = new SubscriptionTypeBuilder().Build(); - - // Act - this.subscriptionTypeController.AddSubscriptionType(subscriptionType); - - // Assert - this.mockCacheProvider.Verify(cp => cp.Remove(SubscriptionTypesCacheKey), Times.Once()); - } - - [Test] - public void DeleteSubscriptionType_ShouldThrowArgumentOutOfRangeException_WhenSubscriptionTypeIdIsNegative() - { - // Arrange - var subscriptionType = new SubscriptionTypeBuilder() - .WithSubscriptionTypeId(-1) - .Build(); - - // Act, Assert - Assert.Throws(() => this.subscriptionTypeController.DeleteSubscriptionType(subscriptionType)); - } - - [Test] - public void DeleteSubscriptionType_ShouldThrowNullArgumentException_WhenSubscriptionTypeIsNull() - { - // Act, Assert - Assert.Throws(() => this.subscriptionTypeController.DeleteSubscriptionType(null)); - } - - [Test] - public void DeleteSubscriptionType_ShouldCallDataService_WhenNoError() - { - // Arrange - var subscriptionType = new SubscriptionTypeBuilder().Build(); - - this.mockDataService - .Setup(ds => ds.DeleteSubscriptionType(subscriptionType.SubscriptionTypeId)) - .Verifiable(); - - // Act - this.subscriptionTypeController.DeleteSubscriptionType(subscriptionType); - - // Assert - this.mockDataService.Verify(ds => ds.DeleteSubscriptionType(subscriptionType.SubscriptionTypeId), Times.Once()); - } - - [Test] - public void DeleteSubscriptionType_ShouldCleanCache_WhenNoError() - { - // Arrange - var subscriptionType = new SubscriptionTypeBuilder().Build(); - - this.mockDataService.Setup(ds => ds.DeleteSubscriptionType(subscriptionType.SubscriptionTypeId)); - this.mockCacheProvider.Setup(cp => cp.Remove(SubscriptionTypesCacheKey)).Verifiable(); - - // Act - this.subscriptionTypeController.DeleteSubscriptionType(subscriptionType); - - // Assert - this.mockCacheProvider.Verify(cp => cp.Remove(SubscriptionTypesCacheKey), Times.Once()); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - DataService.ClearInstance(); - MockComponentProvider.ResetContainer(); - } - } -} + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + // Setup SUT + this.subscriptionTypeController = new SubscriptionTypeController(); + } + + [Test] + public void GetSubscriptionTypes_ShouldCallDataService_WhenNoError() + { + // Arrange + this.mockHostController + .Setup(c => c.GetString("PerformanceSetting")) + .Returns("0"); + + this.mockDataService + .Setup(ds => ds.GetSubscriptionTypes()) + .Returns(SubscriptionTypeDataReaderMockHelper.CreateEmptySubscriptionTypeReader()) + .Verifiable(); + + // Act + this.subscriptionTypeController.GetSubscriptionTypes(); + + // Assert + this.mockDataService.Verify(ds => ds.GetSubscriptionTypes(), Times.Once()); + } + + [Test] + public void GetSubscriptionTypes_ShouldThrowArgumentNullException_WhenPredicateIsNull() + { + // Act, Arrange + Assert.Throws(() => this.subscriptionTypeController.GetSubscriptionTypes(null)); + } + + [Test] + public void GetSubscriptionType_ShouldThrowArgumentNullException_WhenPredicateIsNull() + { + // Act, Assert + Assert.Throws(() => this.subscriptionTypeController.GetSubscriptionType(null)); + } + + [Test] + public void AddSubscriptionType_ShouldThrowArgumentNullException_WhenSubscriptionTypeIsNull() + { + // Act, Arrange + Assert.Throws(() => this.subscriptionTypeController.AddSubscriptionType(null)); + } + + [Test] + public void AddSubscriptionType_ShouldFilledUpTheSubscriptionTypeIdPropertyOfTheInputSubscriptionTypeEntity_WhenNoError() + { + // Arrange + const int expectedSubscriptionTypeId = 12; + var subscriptionType = new SubscriptionTypeBuilder().Build(); + + this.mockDataService + .Setup(ds => ds.AddSubscriptionType( + subscriptionType.SubscriptionName, + subscriptionType.FriendlyName, + subscriptionType.DesktopModuleId)) + .Returns(expectedSubscriptionTypeId); + + // Act + this.subscriptionTypeController.AddSubscriptionType(subscriptionType); + + // Assert + Assert.AreEqual(expectedSubscriptionTypeId, subscriptionType.SubscriptionTypeId); + } + + [Test] + public void AddSubscriptionType_ShouldCleanCache_WhenNoError() + { + // Arrange + this.mockDataService.Setup(ds => ds.AddSubscriptionType(It.IsAny(), It.IsAny(), It.IsAny())); + this.mockCacheProvider.Setup(cp => cp.Remove(SubscriptionTypesCacheKey)).Verifiable(); + + var subscriptionType = new SubscriptionTypeBuilder().Build(); + + // Act + this.subscriptionTypeController.AddSubscriptionType(subscriptionType); + + // Assert + this.mockCacheProvider.Verify(cp => cp.Remove(SubscriptionTypesCacheKey), Times.Once()); + } + + [Test] + public void DeleteSubscriptionType_ShouldThrowArgumentOutOfRangeException_WhenSubscriptionTypeIdIsNegative() + { + // Arrange + var subscriptionType = new SubscriptionTypeBuilder() + .WithSubscriptionTypeId(-1) + .Build(); + + // Act, Assert + Assert.Throws(() => this.subscriptionTypeController.DeleteSubscriptionType(subscriptionType)); + } + + [Test] + public void DeleteSubscriptionType_ShouldThrowNullArgumentException_WhenSubscriptionTypeIsNull() + { + // Act, Assert + Assert.Throws(() => this.subscriptionTypeController.DeleteSubscriptionType(null)); + } + + [Test] + public void DeleteSubscriptionType_ShouldCallDataService_WhenNoError() + { + // Arrange + var subscriptionType = new SubscriptionTypeBuilder().Build(); + + this.mockDataService + .Setup(ds => ds.DeleteSubscriptionType(subscriptionType.SubscriptionTypeId)) + .Verifiable(); + + // Act + this.subscriptionTypeController.DeleteSubscriptionType(subscriptionType); + + // Assert + this.mockDataService.Verify(ds => ds.DeleteSubscriptionType(subscriptionType.SubscriptionTypeId), Times.Once()); + } + + [Test] + public void DeleteSubscriptionType_ShouldCleanCache_WhenNoError() + { + // Arrange + var subscriptionType = new SubscriptionTypeBuilder().Build(); + + this.mockDataService.Setup(ds => ds.DeleteSubscriptionType(subscriptionType.SubscriptionTypeId)); + this.mockCacheProvider.Setup(cp => cp.Remove(SubscriptionTypesCacheKey)).Verifiable(); + + // Act + this.subscriptionTypeController.DeleteSubscriptionType(subscriptionType); + + // Assert + this.mockCacheProvider.Verify(cp => cp.Remove(SubscriptionTypesCacheKey), Times.Once()); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + DataService.ClearInstance(); + MockComponentProvider.ResetContainer(); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs index 9ab07cbb896..f4c79d823ca 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Portal/PortalGroupControllerTests.cs @@ -2,537 +2,535 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Portal -{ - using System; - using System.Collections.Generic; - using System.Data; +namespace DotNetNuke.Tests.Core.Controllers.Portal +{ + using System; + using System.Collections.Generic; + using System.Data; using System.Linq; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; + using DotNetNuke.Common.Utilities; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Portals.Data; - using DotNetNuke.Services.Cache; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Portals.Data; + using DotNetNuke.Services.Cache; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - // ReSharper disable InconsistentNaming - [TestFixture] - public class PortalGroupControllerTests - { - private Mock mockData; -#pragma warning disable 649 - private UserCopiedCallback userCopied; -#pragma warning restore 649 - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + // ReSharper disable InconsistentNaming + [TestFixture] + public class PortalGroupControllerTests + { + private Mock mockData; +#pragma warning disable 649 + private UserCopiedCallback userCopied; +#pragma warning restore 649 + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - this.mockData = MockComponentProvider.CreateDataProvider(); - DataTable hostSettingsTable = new DataTable("HostSettings"); - - var nameCol = hostSettingsTable.Columns.Add("SettingName"); - hostSettingsTable.Columns.Add("SettingValue"); - hostSettingsTable.Columns.Add("SettingIsSecure"); - hostSettingsTable.PrimaryKey = new[] { nameCol }; - - hostSettingsTable.Rows.Add("PerformanceSetting", "0", false); - this.mockData.Setup(c => c.GetHostSettings()).Returns(hostSettingsTable.CreateDataReader()); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_Constructor_Throws_On_Null_DataService() - { - // Arrange - var mockPortalController = new Mock(); - - // Act, Assert - new PortalGroupController(null, mockPortalController.Object); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_Constructor_Throws_On_Null_PortalController() - { - // Arrange - var mockDataService = new Mock(); - - // Act, Assert - new PortalGroupController(mockDataService.Object, null); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_AddPortalToGroup_Throws_On_Null_PortalGroup() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; - - // Act, Assert - controller.AddPortalToGroup(portal, null, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_AddPortalToGroup_Throws_On_Null_Portal() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - var portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; - - // Act, Assert - controller.AddPortalToGroup(null, portalGroup, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void PortalGroupController_AddPortalToGroup_Throws_On_Negative_PortalGroupId() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; - - PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = -1 }; - - // Act, Assert - controller.AddPortalToGroup(portal, portalGroup, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void PortalGroupController_AddPortalToGroup_Throws_On_Negative_PortalId() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - var portal = new PortalInfo { PortalID = -1 }; - - PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; - - // Act, Assert - controller.AddPortalToGroup(portal, portalGroup, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_AddPortalGroup_Throws_On_Null_PortalGroup() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - // Act, Assert - controller.AddPortalGroup(null); - } - - [Test] - public void PortalGroupController_AddPortalGroup_Calls_DataService_On_Valid_Arguments() - { - // Arrange - MockComponentProvider.CreateNew(); - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - PortalGroupInfo portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; - - // Act - controller.AddPortalGroup(portalGroup); - - // Assert - mockDataService.Verify(ds => ds.AddPortalGroup(portalGroup, It.IsAny())); - } - - [Test] - public void PortalGroupController_AddPortalGroup_Calls_PortalController_On_Valid_Arguments() - { - // Arrange - MockComponentProvider.CreateNew(); - var mockDataService = new Mock(); - var masterPortal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; - var mockPortalController = new Mock(); - mockPortalController.Setup(pc => pc.GetPortal(Constants.PORTAL_ValidPortalId)) - .Returns(masterPortal); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - PortalGroupInfo portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; - - // Act - controller.AddPortalGroup(portalGroup); - - // Assert - mockPortalController.Verify(pc => pc.GetPortal(portalGroup.MasterPortalId)); - mockPortalController.Verify(pc => pc.UpdatePortalInfo(masterPortal)); - } - - [Test] - public void PortalGroupController_AddPortalGroup_Returns_ValidId_On_Valid_PortalGroup() - { - // Arrange - MockComponentProvider.CreateNew(); - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddPortalGroup(It.IsAny(), It.IsAny())).Returns(Constants.PORTALGROUP_AddPortalGroupId); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - PortalGroupInfo portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; - - // Act - int portalGroupId = controller.AddPortalGroup(portalGroup); - - // Assert - Assert.AreEqual(Constants.PORTALGROUP_AddPortalGroupId, portalGroupId); - } - - [Test] - public void PortalGroupController_AddPortalGroup_Sets_PortalGroupId_Property_On_Valid_PortalGroup() - { - // Arrange - MockComponentProvider.CreateNew(); - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.AddPortalGroup(It.IsAny(), It.IsAny())).Returns(Constants.PORTALGROUP_AddPortalGroupId); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - PortalGroupInfo portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; - - // Act - controller.AddPortalGroup(portalGroup); - - // Assert - Assert.AreEqual(Constants.PORTALGROUP_AddPortalGroupId, portalGroup.PortalGroupId); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_DeletePortalGroup_Throws_On_Null_PortalGroup() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - // Act, Assert - controller.DeletePortalGroup(null); - } - - [Test] - [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void PortalGroupController_DeletePortalGroup_Throws_On_Negative_PortalGroupId() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - PortalGroupInfo portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Null.NullInteger; - - // Act, Assert - controller.DeletePortalGroup(portalGroup); - } - - [Test] - public void PortalGroupController_DeletePortalGroup_Calls_DataService_On_Valid_PortalGroupId() - { - // Arrange - MockComponentProvider.CreateNew(); - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - PortalGroupInfo portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Constants.PORTALGROUP_DeletePortalGroupId; - - // Act - controller.DeletePortalGroup(portalGroup); - - // Assert - mockDataService.Verify(ds => ds.DeletePortalGroup(portalGroup)); - } - - [Test] - - public void PortalGroupController_GetPortalGroups_Calls_DataService() - { - // Arrange - var mockCache = MockComponentProvider.CreateNew(); - mockCache.Setup(c => c.GetItem(CachingProvider.GetCacheKey(DataCache.PortalGroupsCacheKey))).Returns(null); - - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(CreateValidPortalGroupsReader(0, Constants.USER_ValidId)); - - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - // Act - controller.GetPortalGroups(); - - // Assert - mockDataService.Verify(ds => ds.GetPortalGroups()); - } - - [Test] - public void PortalGroupController_GetPortalGroups_Returns_EmptyList_If_No_Items() - { - // Arrange - var mockCache = MockComponentProvider.CreateNew(); - mockCache.Setup(c => c.GetItem(CachingProvider.GetCacheKey(DataCache.PortalGroupsCacheKey))).Returns(null); - - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(CreateValidPortalGroupsReader(0, Constants.USER_ValidId)); - - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - // Act - IEnumerable portalGroups = controller.GetPortalGroups(); - - // Assert - Assert.AreEqual(0, portalGroups.Count()); - } - - [Test] - public void PortalGroupController_GetPortalGroups_Returns_List_Of_PortalGroups() - { - // Arrange - var mockCache = MockComponentProvider.CreateNew(); - mockCache.Setup(c => c.GetItem(CachingProvider.GetCacheKey(DataCache.PortalGroupsCacheKey))).Returns(null); - - Mock mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(CreateValidPortalGroupsReader( - Constants.PORTALGROUP_ValidPortalGroupCount, - Constants.USER_ValidId)); - - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - // Act - IEnumerable portalGroups = controller.GetPortalGroups(); - - // Assert - Assert.AreEqual(Constants.PORTALGROUP_ValidPortalGroupCount, portalGroups.Count()); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_RemovePortalFromGroup_Throws_On_Null_PortalGroup() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; - - // Act, Assert - controller.RemovePortalFromGroup(portal, null, false, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_RemovePortalFromGroup_Throws_On_Null_Portal() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - var portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; - - // Act, Assert - controller.RemovePortalFromGroup(null, portalGroup, false, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void PortalGroupController_RemovePortalFromGroup_Throws_On_Negative_PortalGroupId() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; - - PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = -1 }; - - // Act, Assert - controller.RemovePortalFromGroup(portal, portalGroup, false, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void PortalGroupController_RemovePortalFromGroup_Throws_On_Negative_PortalId() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - var portal = new PortalInfo { PortalID = -1 }; - - PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; - - // Act, Assert - controller.RemovePortalFromGroup(portal, portalGroup, false, this.userCopied); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void PortalGroupController_UpdatePortalGroup_Throws_On_Null_PortalGroup() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - // Act, Assert - controller.UpdatePortalGroup(null); - } - - [Test] - public void PortalGroupController_UpdatePortalGroup_Throws_On_Negative_PortalGroupId() - { - // Arrange - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - var portalGroup = new PortalGroupInfo(); - portalGroup.PortalGroupId = Null.NullInteger; - - Assert.Throws(() => controller.UpdatePortalGroup(portalGroup)); - } - - [Test] - public void PortalGroupController_UpdatePortalGroup_Calls_DataService_On_Valid_PortalGroup() - { - // Arrange - MockComponentProvider.CreateNew(); - var mockDataService = new Mock(); - var mockPortalController = new Mock(); - var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); - - var portalGroup = CreateValidPortalGroup(); - portalGroup.PortalGroupId = Constants.PORTALGROUP_UpdatePortalGroupId; - portalGroup.PortalGroupName = Constants.PORTALGROUP_UpdateName; - portalGroup.PortalGroupDescription = Constants.PORTALGROUP_UpdateDescription; - - // Act - controller.UpdatePortalGroup(portalGroup); - - // Assert - mockDataService.Verify(ds => ds.UpdatePortalGroup(portalGroup, It.IsAny())); - } - - private static DataTable CreatePortalGroupTable() - { - // Create Categories table. - DataTable table = new DataTable(); - - // Create columns, ID and Name. - DataColumn idColumn = table.Columns.Add("PortalGroupID", typeof(int)); - table.Columns.Add("MasterPortalID", typeof(int)); - table.Columns.Add("PortalGroupName", typeof(string)); - table.Columns.Add("PortalGroupDescription", typeof(string)); - table.Columns.Add("AuthenticationDomain", typeof(string)); - table.Columns.Add("CreatedByUserID", typeof(int)); - table.Columns.Add("CreatedOnDate", typeof(DateTime)); - table.Columns.Add("LastModifiedByUserID", typeof(int)); - table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - - // Set the ID column as the primary key column. - table.PrimaryKey = new[] { idColumn }; - - return table; - } - - private static string GetName(int i) - { - return string.Format(string.Format(Constants.PORTALGROUP_ValidNameFormat, i)); - } - - private static string GetDescription(int i) - { - return string.Format(string.Format(Constants.PORTALGROUP_ValidDescriptionFormat, i)); - } - - private static PortalGroupInfo CreateValidPortalGroup() - { - var portalGroup = new PortalGroupInfo - { - PortalGroupName = Constants.PORTALGROUP_ValidName, - PortalGroupDescription = Constants.PORTALGROUP_ValidDescription, - MasterPortalId = Constants.PORTAL_ValidPortalId, - }; - return portalGroup; - } - - private static IDataReader CreateValidPortalGroupsReader(int count, int startUserId) - { - DataTable table = CreatePortalGroupTable(); - for (int i = Constants.PORTALGROUP_ValidPortalGroupId; i < Constants.PORTALGROUP_ValidPortalGroupId + count; i++) - { - string name = (count == 1) ? Constants.PORTALGROUP_ValidName : GetName(i); - string description = (count == 1) ? Constants.PORTALGROUP_ValidDescription : GetDescription(i); - const string domain = "mydomain.com"; - int userId = (startUserId == Null.NullInteger) ? Constants.USER_ValidId + i : startUserId; - - table.Rows.Add(new object[] - { - i, - -1, - name, - description, - domain, - userId, - }); - } - - return table.CreateDataReader(); - } - } - - // ReSharper restore InconsistentNaming -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + this.mockData = MockComponentProvider.CreateDataProvider(); + DataTable hostSettingsTable = new DataTable("HostSettings"); + + var nameCol = hostSettingsTable.Columns.Add("SettingName"); + hostSettingsTable.Columns.Add("SettingValue"); + hostSettingsTable.Columns.Add("SettingIsSecure"); + hostSettingsTable.PrimaryKey = new[] { nameCol }; + + hostSettingsTable.Rows.Add("PerformanceSetting", "0", false); + this.mockData.Setup(c => c.GetHostSettings()).Returns(hostSettingsTable.CreateDataReader()); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_Constructor_Throws_On_Null_DataService() + { + // Arrange + var mockPortalController = new Mock(); + + // Act, Assert + new PortalGroupController(null, mockPortalController.Object); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_Constructor_Throws_On_Null_PortalController() + { + // Arrange + var mockDataService = new Mock(); + + // Act, Assert + new PortalGroupController(mockDataService.Object, null); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_AddPortalToGroup_Throws_On_Null_PortalGroup() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; + + // Act, Assert + controller.AddPortalToGroup(portal, null, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_AddPortalToGroup_Throws_On_Null_Portal() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + var portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; + + // Act, Assert + controller.AddPortalToGroup(null, portalGroup, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void PortalGroupController_AddPortalToGroup_Throws_On_Negative_PortalGroupId() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; + + PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = -1 }; + + // Act, Assert + controller.AddPortalToGroup(portal, portalGroup, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void PortalGroupController_AddPortalToGroup_Throws_On_Negative_PortalId() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + var portal = new PortalInfo { PortalID = -1 }; + + PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; + + // Act, Assert + controller.AddPortalToGroup(portal, portalGroup, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_AddPortalGroup_Throws_On_Null_PortalGroup() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + // Act, Assert + controller.AddPortalGroup(null); + } + + [Test] + public void PortalGroupController_AddPortalGroup_Calls_DataService_On_Valid_Arguments() + { + // Arrange + MockComponentProvider.CreateNew(); + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + PortalGroupInfo portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; + + // Act + controller.AddPortalGroup(portalGroup); + + // Assert + mockDataService.Verify(ds => ds.AddPortalGroup(portalGroup, It.IsAny())); + } + + [Test] + public void PortalGroupController_AddPortalGroup_Calls_PortalController_On_Valid_Arguments() + { + // Arrange + MockComponentProvider.CreateNew(); + var mockDataService = new Mock(); + var masterPortal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; + var mockPortalController = new Mock(); + mockPortalController.Setup(pc => pc.GetPortal(Constants.PORTAL_ValidPortalId)) + .Returns(masterPortal); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + PortalGroupInfo portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; + + // Act + controller.AddPortalGroup(portalGroup); + + // Assert + mockPortalController.Verify(pc => pc.GetPortal(portalGroup.MasterPortalId)); + mockPortalController.Verify(pc => pc.UpdatePortalInfo(masterPortal)); + } + + [Test] + public void PortalGroupController_AddPortalGroup_Returns_ValidId_On_Valid_PortalGroup() + { + // Arrange + MockComponentProvider.CreateNew(); + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddPortalGroup(It.IsAny(), It.IsAny())).Returns(Constants.PORTALGROUP_AddPortalGroupId); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + PortalGroupInfo portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; + + // Act + int portalGroupId = controller.AddPortalGroup(portalGroup); + + // Assert + Assert.AreEqual(Constants.PORTALGROUP_AddPortalGroupId, portalGroupId); + } + + [Test] + public void PortalGroupController_AddPortalGroup_Sets_PortalGroupId_Property_On_Valid_PortalGroup() + { + // Arrange + MockComponentProvider.CreateNew(); + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.AddPortalGroup(It.IsAny(), It.IsAny())).Returns(Constants.PORTALGROUP_AddPortalGroupId); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + PortalGroupInfo portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId; + + // Act + controller.AddPortalGroup(portalGroup); + + // Assert + Assert.AreEqual(Constants.PORTALGROUP_AddPortalGroupId, portalGroup.PortalGroupId); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_DeletePortalGroup_Throws_On_Null_PortalGroup() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + // Act, Assert + controller.DeletePortalGroup(null); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void PortalGroupController_DeletePortalGroup_Throws_On_Negative_PortalGroupId() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + PortalGroupInfo portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Null.NullInteger; + + // Act, Assert + controller.DeletePortalGroup(portalGroup); + } + + [Test] + public void PortalGroupController_DeletePortalGroup_Calls_DataService_On_Valid_PortalGroupId() + { + // Arrange + MockComponentProvider.CreateNew(); + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + PortalGroupInfo portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Constants.PORTALGROUP_DeletePortalGroupId; + + // Act + controller.DeletePortalGroup(portalGroup); + + // Assert + mockDataService.Verify(ds => ds.DeletePortalGroup(portalGroup)); + } + + [Test] + + public void PortalGroupController_GetPortalGroups_Calls_DataService() + { + // Arrange + var mockCache = MockComponentProvider.CreateNew(); + mockCache.Setup(c => c.GetItem(CachingProvider.GetCacheKey(DataCache.PortalGroupsCacheKey))).Returns(null); + + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(CreateValidPortalGroupsReader(0, Constants.USER_ValidId)); + + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + // Act + controller.GetPortalGroups(); + + // Assert + mockDataService.Verify(ds => ds.GetPortalGroups()); + } + + [Test] + public void PortalGroupController_GetPortalGroups_Returns_EmptyList_If_No_Items() + { + // Arrange + var mockCache = MockComponentProvider.CreateNew(); + mockCache.Setup(c => c.GetItem(CachingProvider.GetCacheKey(DataCache.PortalGroupsCacheKey))).Returns(null); + + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(CreateValidPortalGroupsReader(0, Constants.USER_ValidId)); + + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + // Act + IEnumerable portalGroups = controller.GetPortalGroups(); + + // Assert + Assert.AreEqual(0, portalGroups.Count()); + } + + [Test] + public void PortalGroupController_GetPortalGroups_Returns_List_Of_PortalGroups() + { + // Arrange + var mockCache = MockComponentProvider.CreateNew(); + mockCache.Setup(c => c.GetItem(CachingProvider.GetCacheKey(DataCache.PortalGroupsCacheKey))).Returns(null); + + Mock mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetPortalGroups()).Returns(CreateValidPortalGroupsReader( + Constants.PORTALGROUP_ValidPortalGroupCount, + Constants.USER_ValidId)); + + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + // Act + IEnumerable portalGroups = controller.GetPortalGroups(); + + // Assert + Assert.AreEqual(Constants.PORTALGROUP_ValidPortalGroupCount, portalGroups.Count()); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_RemovePortalFromGroup_Throws_On_Null_PortalGroup() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; + + // Act, Assert + controller.RemovePortalFromGroup(portal, null, false, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_RemovePortalFromGroup_Throws_On_Null_Portal() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + var portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; + + // Act, Assert + controller.RemovePortalFromGroup(null, portalGroup, false, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void PortalGroupController_RemovePortalFromGroup_Throws_On_Negative_PortalGroupId() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + var portal = new PortalInfo { PortalID = Constants.PORTAL_ValidPortalId }; + + PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = -1 }; + + // Act, Assert + controller.RemovePortalFromGroup(portal, portalGroup, false, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void PortalGroupController_RemovePortalFromGroup_Throws_On_Negative_PortalId() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + var portal = new PortalInfo { PortalID = -1 }; + + PortalGroupInfo portalGroup = new PortalGroupInfo { PortalGroupId = Constants.PORTALGROUP_ValidPortalGroupId }; + + // Act, Assert + controller.RemovePortalFromGroup(portal, portalGroup, false, this.userCopied); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void PortalGroupController_UpdatePortalGroup_Throws_On_Null_PortalGroup() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + // Act, Assert + controller.UpdatePortalGroup(null); + } + + [Test] + public void PortalGroupController_UpdatePortalGroup_Throws_On_Negative_PortalGroupId() + { + // Arrange + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + var portalGroup = new PortalGroupInfo(); + portalGroup.PortalGroupId = Null.NullInteger; + + Assert.Throws(() => controller.UpdatePortalGroup(portalGroup)); + } + + [Test] + public void PortalGroupController_UpdatePortalGroup_Calls_DataService_On_Valid_PortalGroup() + { + // Arrange + MockComponentProvider.CreateNew(); + var mockDataService = new Mock(); + var mockPortalController = new Mock(); + var controller = new PortalGroupController(mockDataService.Object, mockPortalController.Object); + + var portalGroup = CreateValidPortalGroup(); + portalGroup.PortalGroupId = Constants.PORTALGROUP_UpdatePortalGroupId; + portalGroup.PortalGroupName = Constants.PORTALGROUP_UpdateName; + portalGroup.PortalGroupDescription = Constants.PORTALGROUP_UpdateDescription; + + // Act + controller.UpdatePortalGroup(portalGroup); + + // Assert + mockDataService.Verify(ds => ds.UpdatePortalGroup(portalGroup, It.IsAny())); + } + + private static DataTable CreatePortalGroupTable() + { + // Create Categories table. + DataTable table = new DataTable(); + + // Create columns, ID and Name. + DataColumn idColumn = table.Columns.Add("PortalGroupID", typeof(int)); + table.Columns.Add("MasterPortalID", typeof(int)); + table.Columns.Add("PortalGroupName", typeof(string)); + table.Columns.Add("PortalGroupDescription", typeof(string)); + table.Columns.Add("AuthenticationDomain", typeof(string)); + table.Columns.Add("CreatedByUserID", typeof(int)); + table.Columns.Add("CreatedOnDate", typeof(DateTime)); + table.Columns.Add("LastModifiedByUserID", typeof(int)); + table.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + + // Set the ID column as the primary key column. + table.PrimaryKey = new[] { idColumn }; + + return table; + } + + private static string GetName(int i) + { + return string.Format(string.Format(Constants.PORTALGROUP_ValidNameFormat, i)); + } + + private static string GetDescription(int i) + { + return string.Format(string.Format(Constants.PORTALGROUP_ValidDescriptionFormat, i)); + } + + private static PortalGroupInfo CreateValidPortalGroup() + { + var portalGroup = new PortalGroupInfo + { + PortalGroupName = Constants.PORTALGROUP_ValidName, + PortalGroupDescription = Constants.PORTALGROUP_ValidDescription, + MasterPortalId = Constants.PORTAL_ValidPortalId, + }; + return portalGroup; + } + + private static IDataReader CreateValidPortalGroupsReader(int count, int startUserId) + { + DataTable table = CreatePortalGroupTable(); + for (int i = Constants.PORTALGROUP_ValidPortalGroupId; i < Constants.PORTALGROUP_ValidPortalGroupId + count; i++) + { + string name = (count == 1) ? Constants.PORTALGROUP_ValidName : GetName(i); + string description = (count == 1) ? Constants.PORTALGROUP_ValidDescription : GetDescription(i); + const string domain = "mydomain.com"; + int userId = (startUserId == Null.NullInteger) ? Constants.USER_ValidId + i : startUserId; + + table.Rows.Add(new object[] + { + i, + -1, + name, + description, + domain, + userId, + }); + } + + return table.CreateDataReader(); + } + } + + // ReSharper restore InconsistentNaming +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs index 2c972ea11bf..2d9d7d85549 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/InternalSearchControllerTests.cs @@ -28,7 +28,6 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using Moq; using NUnit.Framework; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of SearchController. @@ -109,7 +108,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); this.mockDataProvider = MockComponentProvider.CreateDataProvider(); @@ -519,7 +518,7 @@ private void SetupHostController() this.mockHostController.Setup(c => c.GetInteger(Constants.SearchAuthorBoostSetting, It.IsAny())).Returns(Constants.DefaultSearchAuthorBoost); this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); - this.mockHostController.As(); + this.mockHostController.As(); } private void SetupLocaleController() diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs index 2f56eec83ca..2a0c20442da 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/LuceneControllerTests.cs @@ -32,7 +32,6 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using NUnit.Framework; using Directory = System.IO.Directory; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing various aspects of LuceneController. @@ -85,7 +84,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); this.mockSearchQuery = new Mock(); @@ -119,7 +118,7 @@ private void MockHostController() this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); this.mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); - this.mockHostController.As(); + this.mockHostController.As(); } [Test] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs index 0bd5f4c46c6..decd86551ad 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchControllerTests.cs @@ -33,8 +33,6 @@ namespace DotNetNuke.Tests.Core.Controllers.Search using Constants = DotNetNuke.Services.Search.Internals.Constants; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - /// /// Testing various aspects of SearchController. /// @@ -166,7 +164,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); this.CreateNewLuceneControllerInstance(); @@ -2489,7 +2487,7 @@ private void SetupHostController() this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMinLengthKey, It.IsAny())).Returns(Constants.DefaultMinLen); this.mockHostController.Setup(c => c.GetInteger(Constants.SearchMaxLengthKey, It.IsAny())).Returns(Constants.DefaultMaxLen); this.mockHostController.Setup(c => c.GetInteger(Constants.SearchRetryTimesKey, It.IsAny())).Returns(DefaultSearchRetryTimes); - this.mockHostController.As(); + this.mockHostController.As(); } private void SetupLocaleController() diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs index 68b06309561..d68bc794382 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Search/SearchHelperTests.cs @@ -2,412 +2,414 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Search -{ - using System; - using System.Data; +namespace DotNetNuke.Tests.Core.Controllers.Search +{ + using System; + using System.Data; using System.Linq; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Search.Internals; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Search.Internals; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Testing various aspects of SearchController. - /// - [TestFixture] - public class SearchHelperTests - { - private const int OtherSearchTypeId = 2; - private const string TermDNN = "DNN"; - private const string TermDotNetNuke = "DotnetNuke"; - private const string TermLaptop = "Laptop"; - private const string TermNotebook = "Notebook"; - private const string TermJump = "Jump"; - private const string TermLeap = "Leap"; - private const string TermHop = "Hop"; - private const int PortalId0 = 0; - private const string CultureEnUs = "en-US"; - private Mock _dataProvider; - private Mock _cachingProvider; - private SearchHelperImpl _searchHelper; - - [SetUp] - public void SetUp() - { - var serviceCollection = new ServiceCollection(); + + using Moq; + + using NUnit.Framework; + + /// + /// Testing various aspects of SearchController. + /// + [TestFixture] + public class SearchHelperTests + { + private const int OtherSearchTypeId = 2; + private const string TermDNN = "DNN"; + private const string TermDotNetNuke = "DotnetNuke"; + private const string TermLaptop = "Laptop"; + private const string TermNotebook = "Notebook"; + private const string TermJump = "Jump"; + private const string TermLeap = "Leap"; + private const string TermHop = "Hop"; + private const int PortalId0 = 0; + private const string CultureEnUs = "en-US"; + private Mock _dataProvider; + private Mock _cachingProvider; + private SearchHelperImpl _searchHelper; + + [SetUp] + public void SetUp() + { + var serviceCollection = new ServiceCollection(); var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - ComponentFactory.Container = new SimpleContainer(); - this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); - this._dataProvider = MockComponentProvider.CreateDataProvider(); - this.SetupDataProvider(); - this._searchHelper = new SearchHelperImpl(); - DataCache.ClearCache(); - } - - [TearDown] + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + ComponentFactory.Container = new SimpleContainer(); + this._cachingProvider = MockComponentProvider.CreateDataCacheProvider(); + this._dataProvider = MockComponentProvider.CreateDataProvider(); + this.SetupDataProvider(); + this._searchHelper = new SearchHelperImpl(); + DataCache.ClearCache(); + } + + [TearDown] public void TearDown() { Globals.DependencyProvider = null; - } - - [Test] - public void SearchHelper_GetSynonyms_Two_Terms_Returns_Correct_Results() - { - // Arrange - - // Act - var synonyms = this._searchHelper.GetSynonyms(PortalId0, CultureEnUs, TermDNN).ToArray(); - - // Assert - Assert.AreEqual(1, synonyms.Count()); - Assert.AreEqual(TermDotNetNuke.ToLowerInvariant(), synonyms[0]); - } - - [Test] - public void SearchHelper_GetSynonyms_Three_Terms_Returns_Correct_Results() - { - // Arrange - - // Act - var synonyms = this._searchHelper.GetSynonyms(PortalId0, CultureEnUs, TermHop).ToArray(); - - // Assert - Assert.AreEqual(2, synonyms.Count()); - Assert.AreEqual(TermJump.ToLowerInvariant(), synonyms[0]); - Assert.AreEqual(TermLeap.ToLowerInvariant(), synonyms[1]); - } - - [Test] - public void SearchHelper_Rephrase_NoWildCardButExact_1() - { - // Arrange - const string inPhrase = "\"brown fox\""; - const string expected = inPhrase; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, false); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_NoWildCardButExact_2() - { - // Arrange - const string inPhrase = "\"brown fox\" -\"(Lazy) dog\" jumps"; - const string expected = inPhrase; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, false); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_NoWildCardNoExact() - { - // Arrange - const string inPhrase = "(brown) OR (fox AND dog) +jumbs"; - const string expected = inPhrase; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, false); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_0() - { - // Arrange - const string inPhrase = "fox dog"; - const string expected = "(fox OR fox*) (dog OR dog*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_1() - { - // Arrange - const string inPhrase = "(lazy-dog)"; - const string expected = "(lazy-dog OR lazy-dog*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_2() - { - // Arrange - const string inPhrase = "fox (dog)"; - const string expected = "(fox OR fox*) (dog OR dog*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_3() - { - // Arrange - const string inPhrase = "(dog) fox"; - const string expected = "(dog OR dog*) (fox OR fox*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_4() - { - // Arrange - const string inPhrase = "brown fox (lazy) dog"; - const string expected = "(brown OR brown*) (fox OR fox*) (lazy OR lazy*) (dog OR dog*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_5() - { - // Arrange - const string inPhrase = "(brown fox) lazy dog"; - const string expected = "((brown OR brown*) (fox OR fox*)) (lazy OR lazy*) (dog OR dog*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_6() - { - // Arrange - const string inPhrase = "brown fox (lazy dog)"; - const string expected = "(brown OR brown*) (fox OR fox*) ((lazy OR lazy*) (dog OR dog*))"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_7() - { - // Arrange - const string inPhrase = "brown fox (lazy AND dog)"; - const string expected = "(brown OR brown*) (fox OR fox*) ((lazy OR lazy*) AND (dog OR dog*))"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardNoExact_8() - { - // Arrange - const string inPhrase = "brown fox (lazy and dog)"; - const string expected = "(brown OR brown*) (fox OR fox*) ((lazy OR lazy*) (and OR and*) (dog OR dog*))"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardWithExact_1() - { - // Arrange - const string inPhrase = "\"brown fox\""; - const string expected = inPhrase; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardWithExact_2() - { - // Arrange - const string inPhrase = "\"brown fox\" dog"; - const string expected = "\"brown fox\" (dog OR dog*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardWithExact_3() - { - // Arrange - const string inPhrase = "The +\"brown fox\" -\"Lazy dog\" jumps"; - const string expected = "(The OR The*) +\"brown fox\" -\"Lazy dog\" (jumps OR jumps*)"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - public void SearchHelper_Rephrase_WildCardWithTilde_4() - { - // Arrange - const string inPhrase = "dog jump~2"; - const string expected = "(dog OR dog*) jump~2"; - - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - [Test] - - // Arrange - [TestCase("Cäu", "(Cau OR Cau*)")] - [TestCase("Cäutätörül", "(Cautatorul OR Cautatorul*)")] - [TestCase("Ãbcdef", "(Abcdef OR Abcdef*)")] - public void SearchHelper_Rephrase_AccentedCharsReplaced_Replaced(string inPhrase, string expected) - { - // Act - var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); - - // Assert - Assert.AreEqual(expected, analyzed); - } - - private void SetupDataProvider() - { - // Standard DataProvider Path for Logging - this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - - this._dataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); - - this._dataProvider.Setup(d => d.GetPortalSettings(It.IsAny(), It.IsAny())).Returns(this.GetPortalSettingsCallBack); - - var dataTable = new DataTable("SynonymsGroups"); - var pkId = dataTable.Columns.Add("SynonymsGroupID", typeof(int)); - dataTable.Columns.Add("SynonymsTags", typeof(string)); - dataTable.Columns.Add("CreatedByUserID", typeof(int)); - dataTable.Columns.Add("CreatedOnDate", typeof(DateTime)); - dataTable.Columns.Add("LastModifiedByUserID", typeof(int)); - dataTable.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - dataTable.Columns.Add("PortalID", typeof(int)); - - dataTable.PrimaryKey = new[] { pkId }; - - // Create some test data - var now = DateTime.Now; - dataTable.Rows.Add(1, string.Join(",", new[] { TermDNN, TermDotNetNuke }), 1, now, 1, now, 0); - dataTable.Rows.Add(2, string.Join(",", new[] { TermLaptop, TermNotebook }), 1, now, 1, now, 0); - dataTable.Rows.Add(3, string.Join(",", new[] { TermJump, TermLeap, TermHop }), 1, now, 1, now, 0); - - this._dataProvider.Setup(x => x.GetAllSynonymsGroups(0, It.IsAny())).Returns(dataTable.CreateDataReader()); - } - - private IDataReader GetPortalSettingsCallBack(int portalId, string culture) - { - var table = new DataTable("PortalSettings"); - - var cols = new string[] - { - "SettingName", "SettingValue", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - table.Rows.Add("SearchAdminInitialization", "true", "-1", DateTime.Now, "-1", DateTime.Now, CultureEnUs); - - return table.CreateDataReader(); - } - - private IDataReader GetPortalsCallBack(string culture) - { - return this.GetPortalCallBack(PortalId0, CultureEnUs); - } - - private IDataReader GetPortalCallBack(int portalId, string culture) - { - DataTable table = new DataTable("Portal"); - - var cols = new string[] - { - "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", - "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", "ProcessorUserId", - "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", - "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - var homePage = 1; - table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", null, homePage.ToString(), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); - - return table.CreateDataReader(); - } - } -} + } + + [Test] + public void SearchHelper_GetSynonyms_Two_Terms_Returns_Correct_Results() + { + // Arrange + + // Act + var synonyms = this._searchHelper.GetSynonyms(PortalId0, CultureEnUs, TermDNN).ToArray(); + + // Assert + Assert.AreEqual(1, synonyms.Count()); + Assert.AreEqual(TermDotNetNuke.ToLowerInvariant(), synonyms[0]); + } + + [Test] + public void SearchHelper_GetSynonyms_Three_Terms_Returns_Correct_Results() + { + // Arrange + + // Act + var synonyms = this._searchHelper.GetSynonyms(PortalId0, CultureEnUs, TermHop).ToArray(); + + // Assert + Assert.AreEqual(2, synonyms.Count()); + Assert.AreEqual(TermJump.ToLowerInvariant(), synonyms[0]); + Assert.AreEqual(TermLeap.ToLowerInvariant(), synonyms[1]); + } + + [Test] + public void SearchHelper_Rephrase_NoWildCardButExact_1() + { + // Arrange + const string inPhrase = "\"brown fox\""; + const string expected = inPhrase; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, false); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_NoWildCardButExact_2() + { + // Arrange + const string inPhrase = "\"brown fox\" -\"(Lazy) dog\" jumps"; + const string expected = inPhrase; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, false); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_NoWildCardNoExact() + { + // Arrange + const string inPhrase = "(brown) OR (fox AND dog) +jumbs"; + const string expected = inPhrase; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, false); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_0() + { + // Arrange + const string inPhrase = "fox dog"; + const string expected = "(fox OR fox*) (dog OR dog*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_1() + { + // Arrange + const string inPhrase = "(lazy-dog)"; + const string expected = "(lazy-dog OR lazy-dog*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_2() + { + // Arrange + const string inPhrase = "fox (dog)"; + const string expected = "(fox OR fox*) (dog OR dog*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_3() + { + // Arrange + const string inPhrase = "(dog) fox"; + const string expected = "(dog OR dog*) (fox OR fox*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_4() + { + // Arrange + const string inPhrase = "brown fox (lazy) dog"; + const string expected = "(brown OR brown*) (fox OR fox*) (lazy OR lazy*) (dog OR dog*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_5() + { + // Arrange + const string inPhrase = "(brown fox) lazy dog"; + const string expected = "((brown OR brown*) (fox OR fox*)) (lazy OR lazy*) (dog OR dog*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_6() + { + // Arrange + const string inPhrase = "brown fox (lazy dog)"; + const string expected = "(brown OR brown*) (fox OR fox*) ((lazy OR lazy*) (dog OR dog*))"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_7() + { + // Arrange + const string inPhrase = "brown fox (lazy AND dog)"; + const string expected = "(brown OR brown*) (fox OR fox*) ((lazy OR lazy*) AND (dog OR dog*))"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardNoExact_8() + { + // Arrange + const string inPhrase = "brown fox (lazy and dog)"; + const string expected = "(brown OR brown*) (fox OR fox*) ((lazy OR lazy*) (and OR and*) (dog OR dog*))"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardWithExact_1() + { + // Arrange + const string inPhrase = "\"brown fox\""; + const string expected = inPhrase; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardWithExact_2() + { + // Arrange + const string inPhrase = "\"brown fox\" dog"; + const string expected = "\"brown fox\" (dog OR dog*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardWithExact_3() + { + // Arrange + const string inPhrase = "The +\"brown fox\" -\"Lazy dog\" jumps"; + const string expected = "(The OR The*) +\"brown fox\" -\"Lazy dog\" (jumps OR jumps*)"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + public void SearchHelper_Rephrase_WildCardWithTilde_4() + { + // Arrange + const string inPhrase = "dog jump~2"; + const string expected = "(dog OR dog*) jump~2"; + + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + [Test] + + // Arrange + [TestCase("Cäu", "(Cau OR Cau*)")] + [TestCase("Cäutätörül", "(Cautatorul OR Cautatorul*)")] + [TestCase("Ãbcdef", "(Abcdef OR Abcdef*)")] + public void SearchHelper_Rephrase_AccentedCharsReplaced_Replaced(string inPhrase, string expected) + { + // Act + var analyzed = this._searchHelper.RephraseSearchText(inPhrase, true); + + // Assert + Assert.AreEqual(expected, analyzed); + } + + private void SetupDataProvider() + { + // Standard DataProvider Path for Logging + this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + + this._dataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); + + this._dataProvider.Setup(d => d.GetPortalSettings(It.IsAny(), It.IsAny())).Returns(this.GetPortalSettingsCallBack); + + var dataTable = new DataTable("SynonymsGroups"); + var pkId = dataTable.Columns.Add("SynonymsGroupID", typeof(int)); + dataTable.Columns.Add("SynonymsTags", typeof(string)); + dataTable.Columns.Add("CreatedByUserID", typeof(int)); + dataTable.Columns.Add("CreatedOnDate", typeof(DateTime)); + dataTable.Columns.Add("LastModifiedByUserID", typeof(int)); + dataTable.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + dataTable.Columns.Add("PortalID", typeof(int)); + + dataTable.PrimaryKey = new[] { pkId }; + + // Create some test data + var now = DateTime.Now; + dataTable.Rows.Add(1, string.Join(",", new[] { TermDNN, TermDotNetNuke }), 1, now, 1, now, 0); + dataTable.Rows.Add(2, string.Join(",", new[] { TermLaptop, TermNotebook }), 1, now, 1, now, 0); + dataTable.Rows.Add(3, string.Join(",", new[] { TermJump, TermLeap, TermHop }), 1, now, 1, now, 0); + + this._dataProvider.Setup(x => x.GetAllSynonymsGroups(0, It.IsAny())).Returns(dataTable.CreateDataReader()); + } + + private IDataReader GetPortalSettingsCallBack(int portalId, string culture) + { + var table = new DataTable("PortalSettings"); + + var cols = new string[] + { + "SettingName", "SettingValue", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + table.Rows.Add("SearchAdminInitialization", "true", "-1", DateTime.Now, "-1", DateTime.Now, CultureEnUs); + + return table.CreateDataReader(); + } + + private IDataReader GetPortalsCallBack(string culture) + { + return this.GetPortalCallBack(PortalId0, CultureEnUs); + } + + private IDataReader GetPortalCallBack(int portalId, string culture) + { + DataTable table = new DataTable("Portal"); + + var cols = new string[] + { + "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", + "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", "ProcessorUserId", + "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", + "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + var homePage = 1; + table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", null, homePage.ToString(), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); + + return table.CreateDataReader(); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs index c59d2a9bb99..988127da998 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Controllers/Social/RelationshipControllerTests.cs @@ -2,1278 +2,1280 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Controllers.Social -{ - using System; - using System.Collections.Generic; +namespace DotNetNuke.Tests.Core.Controllers.Social +{ + using System; + using System.Collections.Generic; using System.Data; + using DotNetNuke.Abstractions; - using DotNetNuke.Common; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common.Utilities; - using DotNetNuke.ComponentModel; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Entities.Users.Social; - using DotNetNuke.Entities.Users.Social.Data; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Log.EventLog; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.ComponentModel; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Users; + using DotNetNuke.Entities.Users.Social; + using DotNetNuke.Entities.Users.Social.Data; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Log.EventLog; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Testing various aspects of RelationshipController. - /// - [TestFixture] - public class RelationshipControllerTests - { - private Mock mockCachingProvider; - private Mock _portalController; - private Mock _portalGroupController; - - private DataTable dtRelationshipTypes; - private DataTable dtRelationships; - private DataTable dtUserRelationships; - private DataTable dtUserRelationshipPreferences; - - [SetUp] - public void SetUp() - { - var serviceCollection = new ServiceCollection(); + + using Moq; + + using NUnit.Framework; + + /// + /// Testing various aspects of RelationshipController. + /// + [TestFixture] + public class RelationshipControllerTests + { + private Mock mockCachingProvider; + private Mock _portalController; + private Mock _portalGroupController; + + private DataTable dtRelationshipTypes; + private DataTable dtRelationships; + private DataTable dtUserRelationships; + private DataTable dtUserRelationshipPreferences; + + [SetUp] + public void SetUp() + { + var serviceCollection = new ServiceCollection(); var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - ComponentFactory.Container = new SimpleContainer(); - var mockDataProvider = MockComponentProvider.CreateDataProvider(); - mockDataProvider.Setup(dp => dp.GetProviderPath()).Returns(string.Empty); - - this.mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); - MockComponentProvider.CreateEventLogController(); - - this._portalController = new Mock(); - PortalController.SetTestableInstance(this._portalController.Object); - - this._portalGroupController = new Mock(); - PortalGroupController.RegisterInstance(this._portalGroupController.Object); - - var mockHostController = new Mock(); - mockHostController.Setup(c => c.GetString("PerformanceSetting")).Returns("0"); - HostController.RegisterInstance(mockHostController.Object); - - var mockUserController = new Mock(); - mockUserController.Setup(c => c.GetCurrentUserInfo()).Returns(new UserInfo() { UserID = 1 }); - UserController.SetTestableInstance(mockUserController.Object); - - this.CreateLocalizationProvider(); - - this.SetupDataTables(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - ComponentFactory.Container = null; - PortalController.ClearInstance(); - UserController.ClearInstance(); - } - - [Test] - public void RelationshipController_Constructor_Throws_On_Null_DataService() - { - // Arrange - var mockEventLogController = new Mock(); - - // Act, Assert - Assert.Throws(() => new RelationshipControllerImpl(null, mockEventLogController.Object)); - } - - [Test] - public void RelationshipController_Constructor_Throws_On_Null_EventLogController() - { - // Arrange - var mockDataService = new Mock(); - - // Act, Assert - Assert.Throws(() => new RelationshipControllerImpl(mockDataService.Object, null)); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_DeleteRelationshipType_Throws_On_Null_RelationshipType() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.DeleteRelationshipType(null); - } - - [Test] - public void RelationshipController_DeleteRelationshipType_Calls_DataService() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - }; - - // Act - relationshipController.DeleteRelationshipType(relationshipType); - - // Assert - mockDataService.Verify(d => d.DeleteRelationshipType(Constants.SOCIAL_FollowerRelationshipTypeID)); - } - - [Test] - public void RelationshipController_DeleteRelationshipType_Calls_EventLogController_AddLog() - { - // Arrange - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - var relationshipController = this.CreateRelationshipController(mockEventLogController); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - Name = Constants.SOCIAL_RelationshipTypeName, - }; - - // Act - relationshipController.DeleteRelationshipType(relationshipType); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_RelationshipType_Deleted, Constants.SOCIAL_RelationshipTypeName, Constants.SOCIAL_FollowerRelationshipTypeID); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - public void RelationshipController_DeleteRelationshipType_Calls_DataCache_RemoveCache() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - var cacheKey = CachingProvider.GetCacheKey(DataCache.RelationshipTypesCacheKey); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - }; - - // Act - relationshipController.DeleteRelationshipType(relationshipType); - - // Assert - this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); - } - - [Test] - public void RelationshipController_GetAllRelationshipTypes_Calls_DataService() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationshipTypes = relationshipController.GetAllRelationshipTypes(); - - // Assert - mockDataService.Verify(d => d.GetAllRelationshipTypes()); - } - - [Test] - public void RelationshipController_GetRelationshipType_Calls_DataService_If_Not_Cached() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationshipTypes = relationshipController.GetRelationshipType(Constants.SOCIAL_FriendRelationshipTypeID); - - // Assert - mockDataService.Verify(d => d.GetAllRelationshipTypes()); - } - - [Test] - [TestCase(Constants.SOCIAL_FriendRelationshipTypeID)] - [TestCase(Constants.SOCIAL_FollowerRelationshipTypeID)] - public void RelationshipController_GetRelationshipType_Returns_RelationshipType_For_Valid_ID(int relationshipTypeId) - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationshipType = relationshipController.GetRelationshipType(relationshipTypeId); - - // Assert - Assert.AreEqual(relationshipTypeId, relationshipType.RelationshipTypeId); - } - - [Test] - public void RelationshipController_GetRelationshipType_Returns_Null_For_InValid_ID() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationshipType = relationshipController.GetRelationshipType(Constants.SOCIAL_InValidRelationshipType); - - // Assert - Assert.IsNull(relationshipType); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_SaveRelationshipType_Throws_On_Null_RelationshipType() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.SaveRelationshipType(null); - } - - [Test] - public void RelationshipController_SaveRelationshipType_Calls_DataService() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - }; - - // Act - relationshipController.SaveRelationshipType(relationshipType); - - // Assert - mockDataService.Verify(d => d.SaveRelationshipType(relationshipType, It.IsAny())); - } - - [Test] - public void RelationshipController_SaveRelationshipType_Calls_EventLogController_AddLog() - { - // Arrange - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = this.CreateRelationshipController(mockEventLogController); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - Name = Constants.SOCIAL_RelationshipTypeName, - }; - - // Act - relationshipController.SaveRelationshipType(relationshipType); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_RelationshipType_Updated, Constants.SOCIAL_RelationshipTypeName); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - public void RelationshipController_SaveRelationshipType_Calls_DataCache_RemoveCache() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - var cacheKey = CachingProvider.GetCacheKey(DataCache.RelationshipTypesCacheKey); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - }; - - // Act - relationshipController.SaveRelationshipType(relationshipType); - - // Assert - this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_DeleteRelationship_Throws_On_Null_Relationship() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.DeleteRelationship(null); - } - - [Test] - public void RelationshipController_DeleteRelationship_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var relationship = new Relationship() - { - RelationshipId = Constants.SOCIAL_FollowerRelationshipID, - }; - - // Act - relationshipController.DeleteRelationship(relationship); - - // Assert - mockDataService.Verify(d => d.DeleteRelationship(Constants.SOCIAL_FollowerRelationshipID)); - } - - [Test] - public void RelationshipController_DeleteRelationship_Calls_EventLogController_AddLog() - { - // Arrange - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = this.CreateRelationshipController(mockEventLogController); - var relationship = new Relationship() - { - RelationshipId = Constants.SOCIAL_FollowerRelationshipID, - Name = Constants.SOCIAL_RelationshipName, - }; - - // Act - relationshipController.DeleteRelationship(relationship); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_Relationship_Deleted, Constants.SOCIAL_RelationshipName, Constants.SOCIAL_FollowerRelationshipID); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - public void RelationshipController_DeleteRelationship_Calls_DataCache_RemoveCache() - { - // Arrange - var portalId = 1; - var relationshipController = this.CreateRelationshipController(); - var cacheKey = CachingProvider.GetCacheKey(string.Format(DataCache.RelationshipByPortalIDCacheKey, portalId)); - var relationship = new Relationship() - { - RelationshipId = Constants.SOCIAL_FollowerRelationshipID, - PortalId = portalId, - UserId = -1, - }; - - // Act - relationshipController.DeleteRelationship(relationship); - - // Assert - this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); - } - - [Test] - [TestCase(Constants.SOCIAL_FriendRelationshipID, DefaultRelationshipTypes.Friends)] - [TestCase(Constants.SOCIAL_FollowerRelationshipID, DefaultRelationshipTypes.Followers)] - public void RelationshipController_GetRelationship_Returns_Relationship_For_Valid_ID(int relationshipId, DefaultRelationshipTypes defaultType) - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - this.dtRelationships.Rows.Add(relationshipId, defaultType, defaultType.ToString(), defaultType.ToString(), Constants.PORTAL_Zero, Constants.USER_Null, RelationshipStatus.None); - mockDataService.Setup(md => md.GetRelationship(relationshipId)).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationship = relationshipController.GetRelationship(relationshipId); - - // Assert - Assert.AreEqual(relationshipId, relationship.RelationshipId); - } - - [Test] - public void RelationshipController_GetRelationship_Returns_Null_For_InValid_ID() - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - mockDataService.Setup(md => md.GetRelationship(It.IsAny())).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationship = relationshipController.GetRelationship(Constants.SOCIAL_InValidRelationship); - - // Assert - Assert.IsNull(relationship); - } - - [Test] - public void RelationshipController_GetRelationshipsByUserID_Returns_List_Of_Relationships_For_Valid_User() - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - for (int i = 1; i <= 5; i++) - { - this.dtRelationships.Rows.Add(i, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), - DefaultRelationshipTypes.Friends.ToString(), - Constants.PORTAL_Zero, - Constants.USER_ValidId, - RelationshipStatus.None); - } - - mockDataService.Setup(md => md.GetRelationshipsByUserId(Constants.USER_ValidId)).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationships = relationshipController.GetRelationshipsByUserId(Constants.USER_ValidId); - - // Assert - Assert.IsInstanceOf>(relationships); - Assert.AreEqual(5, relationships.Count); - } - - [Test] - public void RelationshipController_GetRelationshipsByUserID_Returns_EmptyList_Of_Relationships_For_InValid_User() - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - mockDataService.Setup(md => md.GetRelationshipsByUserId(Constants.USER_InValidId)).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var relationships = relationshipController.GetRelationshipsByUserId(Constants.USER_InValidId); - - // Assert - Assert.IsInstanceOf>(relationships); - Assert.AreEqual(0, relationships.Count); - } - - [Test] - public void RelationshipController_GetRelationshipsByPortalID_Returns_List_Of_Relationships_For_Valid_Portal() - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - for (int i = 1; i <= 5; i++) - { - this.dtRelationships.Rows.Add(i, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), - DefaultRelationshipTypes.Friends.ToString(), - Constants.PORTAL_Zero, - Constants.USER_Null, - RelationshipStatus.None); - } - - mockDataService.Setup(md => md.GetRelationshipsByPortalId(Constants.PORTAL_Zero)).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - // Act - var relationships = relationshipController.GetRelationshipsByPortalId(Constants.PORTAL_Zero); - - // Assert - Assert.IsInstanceOf>(relationships); - Assert.AreEqual(5, relationships.Count); - } - - [Test] - public void RelationshipController_GetRelationshipsByPortalID_Returns_List_Of_Relationships_For_Valid_Portal_When_Portal_Is_In_Group() - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - for (int i = 1; i <= 5; i++) - { - this.dtRelationships.Rows.Add(i, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), - DefaultRelationshipTypes.Friends.ToString(), - Constants.PORTAL_Zero, - Constants.USER_Null, - RelationshipStatus.None); - } - - mockDataService.Setup(md => md.GetRelationshipsByPortalId(Constants.PORTAL_Zero)).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Constants.PORTALGROUP_ValidPortalGroupId); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); - - List portalGroups = new List() { CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero) }; // CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero); - this._portalGroupController.Setup(pgc => pgc.GetPortalGroups()).Returns(portalGroups); - - // Act - var relationships = relationshipController.GetRelationshipsByPortalId(Constants.PORTAL_Zero); - - // Assert - Assert.IsInstanceOf>(relationships); - Assert.AreEqual(5, relationships.Count); - } - - [Test] - public void RelationshipController_GetRelationshipsByPortalID_Returns_EmptyList_Of_Relationships_For_InValid_Portal() - { - // Arrange - var mockDataService = new Mock(); - this.dtRelationships.Clear(); - mockDataService.Setup(md => md.GetRelationshipsByPortalId(Constants.PORTAL_Null)).Returns(this.dtRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Null, Null.NullInteger); - this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Null)).Returns(mockPortalInfo); - - // Act - var relationships = relationshipController.GetRelationshipsByPortalId(Constants.PORTAL_Null); - - // Assert - Assert.IsInstanceOf>(relationships); - Assert.AreEqual(0, relationships.Count); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_SaveRelationship_Throws_On_Null_Relationship() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.SaveRelationship(null); - } - - [Test] - public void RelationshipController_SaveRelationship_Calls_DataService() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var relationship = new Relationship - { - RelationshipId = Constants.SOCIAL_FollowerRelationshipID, - }; - - // Act - relationshipController.SaveRelationship(relationship); - - // Assert - mockDataService.Verify(d => d.SaveRelationship(relationship, It.IsAny())); - } - - [Test] - public void RelationshipController_SaveRelationship_Calls_EventLogController_AddLog() - { - // Arrange - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = this.CreateRelationshipController(mockEventLogController); - var relationship = new Relationship - { - RelationshipId = Constants.SOCIAL_FollowerRelationshipID, - Name = Constants.SOCIAL_RelationshipName, - }; - - // Act - relationshipController.SaveRelationship(relationship); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_Relationship_Updated, Constants.SOCIAL_RelationshipName); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - public void RelationshipController_SaveRelationship_Calls_DataCache_RemoveCache() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - var cacheKey = CachingProvider.GetCacheKey(DataCache.RelationshipTypesCacheKey); - var relationshipType = new RelationshipType() - { - RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, - }; - - // Act - relationshipController.SaveRelationshipType(relationshipType); - - // Assert - this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_DeleteUserRelationship_Throws_On_Null_UserRelationship() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.DeleteUserRelationship(null); - } - - [Test] - public void RelationshipController_DeleteUserRelationship_Calls_DataService() - { - // Arrange - var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var userRelationship = new UserRelationship() - { - UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, - }; - - // Act - relationshipController.DeleteUserRelationship(userRelationship); - - // Assert - mockDataService.Verify(d => d.DeleteUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11)); - } - - [Test] - public void RelationshipController_DeleteUserRelationship_Calls_EventLogController_AddLog() - { - // Arrange - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = this.CreateRelationshipController(mockEventLogController); - var userRelationship = new UserRelationship - { - UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, - UserId = Constants.USER_ElevenId, - RelatedUserId = Constants.USER_TenId, - }; - - // Act - relationshipController.DeleteUserRelationship(userRelationship); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_UserRelationship_Deleted, Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_ElevenId, Constants.USER_TenId); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - [TestCase(Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_TenId, Constants.USER_ElevenId)] - [TestCase(Constants.SOCIAL_UserRelationshipIDUser12User13, 12, 13)] - public void RelationshipController_GetUserRelationship_Returns_Relationship_For_Valid_ID(int userRelationshipId, int userId, int relatedUserId) - { - // Arrange - var mockDataService = new Mock(); - this.dtUserRelationships.Clear(); - this.dtUserRelationships.Rows.Add(userRelationshipId, userId, relatedUserId, Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); - mockDataService.Setup(md => md.GetUserRelationship(userRelationshipId)).Returns(this.dtUserRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var userRelationship = relationshipController.GetUserRelationship(userRelationshipId); - - // Assert - Assert.AreEqual(userRelationshipId, userRelationship.UserRelationshipId); - } - - [Test] - public void RelationshipController_GetUserRelationship_Returns_Null_For_InValid_ID() - { - // Arrange - var mockDataService = new Mock(); - this.dtUserRelationships.Clear(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var userRelationship = relationshipController.GetUserRelationship(Constants.SOCIAL_InValidUserRelationship); - - // Assert - Assert.IsNull(userRelationship); - } - - [Test] - public void RelationshipController_GetUserRelationships_Returns_List_Of_UserRelationships_For_Valid_User() - { - // Arrange - var mockDataService = new Mock(); - this.dtUserRelationships.Clear(); - for (int i = 1; i <= 5; i++) - { - this.dtUserRelationships.Rows.Add(i, Constants.USER_ValidId, Constants.USER_TenId, - Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); - } - - mockDataService.Setup(md => md.GetUserRelationships(Constants.USER_ValidId)).Returns(this.dtUserRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var user = new UserInfo { UserID = Constants.USER_ValidId }; - var userRelationships = relationshipController.GetUserRelationships(user); - - // Assert - Assert.IsInstanceOf>(userRelationships); - Assert.AreEqual(5, userRelationships.Count); - } - - [Test] - public void RelationshipController_GetUserRelationships_Returns_EmptyList_Of_UserRelationships_For_InValid_User() - { - // Arrange - var mockDataService = new Mock(); - this.dtUserRelationships.Clear(); - - mockDataService.Setup(md => md.GetUserRelationships(Constants.USER_InValidId)).Returns(this.dtUserRelationships.CreateDataReader()); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var user = new UserInfo { UserID = Constants.USER_InValidId }; - var userRelationships = relationshipController.GetUserRelationships(user); - - // Assert - Assert.IsInstanceOf>(userRelationships); - Assert.AreEqual(0, userRelationships.Count); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_SaveUserRelationship_Throws_On_Null_UserRelationship() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.SaveUserRelationship(null); - } - - [Test] - public void RelationshipController_SaveUserRelationship_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var userRelationship = new UserRelationship() - { - UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, - }; - - // Act - relationshipController.SaveUserRelationship(userRelationship); - - // Assert - mockDataService.Verify(d => d.SaveUserRelationship(userRelationship, It.IsAny())); - } - - [Test] - public void RelationshipController_SaveUserRelationship_Calls_EventLogController_AddLog() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.SaveUserRelationship(It.IsAny(), It.IsAny())) - .Returns(Constants.SOCIAL_UserRelationshipIDUser10User11); - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); - var userRelationship = new UserRelationship - { - UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, - UserId = Constants.USER_ElevenId, - RelatedUserId = Constants.USER_TenId, - }; - - // Act - relationshipController.SaveUserRelationship(userRelationship); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_UserRelationship_Updated, Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_ElevenId, Constants.USER_TenId); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_DeleteUserRelationshipPreference_Throws_On_Null_UserRelationshipPreference() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.DeleteUserRelationshipPreference(null); - } - - [Test] - public void RelationshipController_DeleteUserRelationshipPreference_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var preference = new UserRelationshipPreference() - { - PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, - }; - - // Act - relationshipController.DeleteUserRelationshipPreference(preference); - - // Assert - mockDataService.Verify(d => d.DeleteUserRelationshipPreference(Constants.SOCIAL_PrefereceIDForUser11)); - } - - [Test] - public void RelationshipController_DeleteUserRelationshipPreference_Calls_EventLogController_AddLog() - { - // Arrange - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = this.CreateRelationshipController(mockEventLogController); - var preference = new UserRelationshipPreference() - { - PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, - UserId = Constants.USER_ElevenId, - RelationshipId = Constants.SOCIAL_FriendRelationshipID, - }; - - // Act - relationshipController.DeleteUserRelationshipPreference(preference); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_UserRelationshipPreference_Deleted, Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - public void RelationshipController_GetUserRelationshipPreference_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetUserRelationshipPreferenceById(It.IsAny())) - .Returns(this.dtUserRelationshipPreferences.CreateDataReader); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var preference = relationshipController.GetUserRelationshipPreference(Constants.SOCIAL_PrefereceIDForUser11); - - // Assert - mockDataService.Verify(d => d.GetUserRelationshipPreferenceById(Constants.SOCIAL_PrefereceIDForUser11)); - } - - [Test] - public void RelationshipController_GetUserRelationshipPreference_Overload_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.GetUserRelationshipPreference(It.IsAny(), It.IsAny())) - .Returns(this.dtUserRelationshipPreferences.CreateDataReader); - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var preference = relationshipController.GetUserRelationshipPreference(Constants.USER_ValidId, Constants.SOCIAL_FriendRelationshipID); - - // Assert - mockDataService.Verify(d => d.GetUserRelationshipPreference(Constants.USER_ValidId, Constants.SOCIAL_FriendRelationshipID)); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RelationshipController_SaveUserRelationshipPreference_Throws_On_Null_UserRelationshipPreference() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - - // Act, Assert - relationshipController.SaveUserRelationshipPreference(null); - } - - [Test] - public void RelationshipController_SaveUserRelationshipPreference_Calls_DataService() - { - // Arrange - var mockDataService = new Mock(); - var relationshipController = this.CreateRelationshipController(mockDataService); - var preference = new UserRelationshipPreference() - { - PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, - UserId = Constants.USER_ElevenId, - RelationshipId = Constants.SOCIAL_FriendRelationshipID, - }; - - // Act - relationshipController.SaveUserRelationshipPreference(preference); - - // Assert - mockDataService.Verify(d => d.SaveUserRelationshipPreference(preference, It.IsAny())); - } - - [Test] - public void RelationshipController_SaveUserRelationshipPreference_Calls_EventLogController_AddLog() - { - // Arrange - var mockDataService = new Mock(); - mockDataService.Setup(ds => ds.SaveUserRelationshipPreference(It.IsAny(), It.IsAny())) - .Returns(Constants.SOCIAL_PrefereceIDForUser11); - var mockEventLogController = new Mock(); - mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); - this.CreateLocalizationProvider(); - - var relationshipController = new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); - var preference = new UserRelationshipPreference() - { - PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, - UserId = Constants.USER_ElevenId, - RelationshipId = Constants.SOCIAL_FriendRelationshipID, - }; - - // Act - relationshipController.SaveUserRelationshipPreference(preference); - - // Assert - var logContent = string.Format(Constants.LOCALIZATION_UserRelationshipPreference_Updated, Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID); - mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); - } - - [Test] - [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void RelationshipController_InitiateUserRelationship_Throws_On_Negative_RelationshipID() - { - // Arrange - var relationshipController = this.CreateRelationshipController(); - var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; - var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; - var relationship = new Relationship(); - - // Act, Assert - relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); - } - - [Test] - public void RelationshipController_InitiateUserRelationship_Returns_Status_Accepted_When_Default_Relationship_Action_Is_Accepted() - { - // Arrange - var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; - var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; - var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.Accepted }; - - this.dtUserRelationships.Rows.Clear(); - this.dtUserRelationshipPreferences.Rows.Clear(); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); - mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); - - // Assert - Assert.AreEqual(userRelationship.Status, RelationshipStatus.Accepted); - } - - [Test] - public void RelationshipController_InitiateUserRelationship_Returns_Status_Initiated_When_Default_Relationship_Action_Is_None() - { - // Arrange - var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; - var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; - var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.None }; - - this.dtUserRelationships.Rows.Clear(); - this.dtUserRelationshipPreferences.Rows.Clear(); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); - mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); - - // Assert - Assert.AreEqual(userRelationship.Status, RelationshipStatus.Pending); - } - - [Test] - public void RelationshipController_InitiateUserRelationship_Returns_Status_Accepted_When_TargetUsers_Relationship_Action_Is_Accepted() - { - // Arrange - var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; - var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; - var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.Accepted }; - - this.dtUserRelationships.Rows.Clear(); - this.dtUserRelationshipPreferences.Rows.Clear(); - this.dtUserRelationshipPreferences.Rows.Add(Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_TenId, Constants.USER_ElevenId, RelationshipStatus.Accepted); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); - mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); - - // Assert - Assert.AreEqual(userRelationship.Status, RelationshipStatus.Accepted); - } - - [Test] - public void RelationshipController_InitiateUserRelationship_Returns_Status_Initiated_When_TargetUsers_Relationship_Action_Is_None() - { - // Arrange - var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; - var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; - var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.Accepted }; - - this.dtUserRelationships.Rows.Clear(); - this.dtUserRelationshipPreferences.Rows.Clear(); - this.dtUserRelationshipPreferences.Rows.Add(Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_TenId, Constants.USER_ElevenId, RelationshipStatus.None); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); - mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); - - // Assert - Assert.AreEqual(userRelationship.Status, RelationshipStatus.Pending); - } - - [Test] - [ExpectedException(typeof(UserRelationshipDoesNotExistException))] - public void RelationshipController_RemoveUserRelationship_Throws_On_NonExistent_Relationship() - { - // Arrange - - // No UserRelationship between user10 and user11 - this.dtUserRelationships.Rows.Clear(); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act, Assert - relationshipController.RemoveUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); - } - - [Test] - [ExpectedException(typeof(UserRelationshipDoesNotExistException))] - public void RelationshipController_AcceptRelationship_Throws_On_NonExistent_Relationship() - { - // Arrange - - // No UserRelationship between user10 and user11 - this.dtUserRelationships.Rows.Clear(); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act, Assert - relationshipController.AcceptUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); - } - - [Test] - public void RelationshipController_AcceptUserRelationship_Calls_DataService_On_Valid_RelationshipID() - { - // Arrange - - // Any UserRelationship between user10 and user11 - this.dtUserRelationships.Rows.Clear(); - this.dtUserRelationships.Rows.Add(Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_TenId, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - mockDataService.Setup(md => md.SaveUserRelationship(It.IsAny(), It.IsAny())); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - relationshipController.AcceptUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); - - // Assert - mockDataService.Verify(ds => ds.SaveUserRelationship(It.IsAny(), It.IsAny())); - } - - [Test] - public void RelationshipController_RemoveUserRelationship_Calls_DataService_On_Valid_RelationshipID() - { - // Arrange - - // Any UserRelationship between user10 and user11 - this.dtUserRelationships.Rows.Clear(); - this.dtUserRelationships.Rows.Add(Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_TenId, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); - - // setup mock DataService - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); - mockDataService.Setup(md => md.DeleteUserRelationship(It.IsAny())); - - var relationshipController = this.CreateRelationshipController(mockDataService); - - // Act - relationshipController.RemoveUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); - - // Assert - mockDataService.Verify(ds => ds.DeleteUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11)); - } - - private static PortalInfo CreatePortalInfo(int portalId, int portalGroupId) - { - var mockPortalInfo = new PortalInfo { PortalID = portalId, PortalGroupID = portalGroupId }; - return mockPortalInfo; - } - - private static PortalGroupInfo CreatePortalGroupInfo(int portalGroupId, int masterPortalId) - { - var mockPortalGroupInfo = new PortalGroupInfo - { - PortalGroupId = portalGroupId, - MasterPortalId = masterPortalId, - PortalGroupName = Constants.PORTALGROUP_ValidName, - PortalGroupDescription = Constants.PORTALGROUP_ValidDescription, - }; - - return mockPortalGroupInfo; - } - - private Mock CreateMockDataServiceWithRelationshipTypes() - { - var mockDataService = new Mock(); - mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); - mockDataService.Setup(md => md.GetRelationshipsByPortalId(It.IsAny())).Returns(this.dtRelationships.CreateDataReader()); - return mockDataService; - } - - private void CreateLocalizationProvider() - { - var mockProvider = MockComponentProvider.CreateLocalizationProvider(); - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_RelationshipType_Deleted_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_RelationshipType_Deleted); - - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_RelationshipType_Updated_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_RelationshipType_Updated); - - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_Relationship_Deleted_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_Relationship_Deleted); - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_Relationship_Updated_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_Relationship_Updated); - - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationshipPreference_Deleted_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_UserRelationshipPreference_Deleted); - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationshipPreference_Updated_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_UserRelationshipPreference_Updated); - - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationship_Deleted_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_UserRelationship_Deleted); - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationship_Added_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_UserRelationship_Added); - mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationship_Updated_Key, It.IsAny())) - .Returns(Constants.LOCALIZATION_UserRelationship_Updated); - } - - private RelationshipControllerImpl CreateRelationshipController() - { - var mockDataService = new Mock(); - return this.CreateRelationshipController(mockDataService); - } - - private RelationshipControllerImpl CreateRelationshipController(Mock mockDataService) - { - var mockEventLogController = new Mock(); - return new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); - } - - private RelationshipControllerImpl CreateRelationshipController(Mock mockEventLogController) - { - var mockDataService = new Mock(); - return new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); - } - - private void SetupDataTables() - { - // RelationshipTypes - this.dtRelationshipTypes = new DataTable("RelationshipTypes"); - var pkRelationshipTypeID = this.dtRelationshipTypes.Columns.Add("RelationshipTypeID", typeof(int)); - this.dtRelationshipTypes.Columns.Add("Name", typeof(string)); - this.dtRelationshipTypes.Columns.Add("Description", typeof(string)); - this.dtRelationshipTypes.Columns.Add("Direction", typeof(int)); - this.dtRelationshipTypes.Columns.Add("CreatedByUserID", typeof(int)); - this.dtRelationshipTypes.Columns.Add("CreatedOnDate", typeof(DateTime)); - this.dtRelationshipTypes.Columns.Add("LastModifiedByUserID", typeof(int)); - this.dtRelationshipTypes.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - - this.dtRelationshipTypes.PrimaryKey = new[] { pkRelationshipTypeID }; - - this.dtRelationshipTypes.Rows.Add(DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), DefaultRelationshipTypes.Friends.ToString(), RelationshipDirection.TwoWay); - this.dtRelationshipTypes.Rows.Add(DefaultRelationshipTypes.Followers, DefaultRelationshipTypes.Followers.ToString(), DefaultRelationshipTypes.Followers.ToString(), RelationshipDirection.OneWay); - - // Relationships - this.dtRelationships = new DataTable("Relationships"); - var pkRelationshipID = this.dtRelationships.Columns.Add("RelationshipID", typeof(int)); - this.dtRelationships.Columns.Add("RelationshipTypeID", typeof(int)); - this.dtRelationships.Columns.Add("Name", typeof(string)); - this.dtRelationships.Columns.Add("Description", typeof(string)); - this.dtRelationships.Columns.Add("PortalID", typeof(int)); - this.dtRelationships.Columns.Add("UserID", typeof(int)); - this.dtRelationships.Columns.Add("DefaultResponse", typeof(int)); - this.dtRelationships.Columns.Add("CreatedByUserID", typeof(int)); - this.dtRelationships.Columns.Add("CreatedOnDate", typeof(DateTime)); - this.dtRelationships.Columns.Add("LastModifiedByUserID", typeof(int)); - this.dtRelationships.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - this.dtRelationships.PrimaryKey = new[] { pkRelationshipID }; - - // Create default Friend and Social Relationships - this.dtRelationships.Rows.Add(Constants.SOCIAL_FriendRelationshipID, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), DefaultRelationshipTypes.Friends.ToString(), Constants.PORTAL_Zero, Constants.USER_Null, RelationshipStatus.None); - this.dtRelationships.Rows.Add(Constants.SOCIAL_FollowerRelationshipID, DefaultRelationshipTypes.Followers, DefaultRelationshipTypes.Followers.ToString(), DefaultRelationshipTypes.Followers.ToString(), Constants.PORTAL_Zero, Constants.USER_Null, RelationshipStatus.None); - - // UserRelationships - this.dtUserRelationships = new DataTable("UserRelationships"); - var pkUserRelationshipID = this.dtUserRelationships.Columns.Add("UserRelationshipID", typeof(int)); - this.dtUserRelationships.Columns.Add("UserID", typeof(int)); - this.dtUserRelationships.Columns.Add("RelatedUserID", typeof(int)); - this.dtUserRelationships.Columns.Add("RelationshipID", typeof(int)); - this.dtUserRelationships.Columns.Add("Status", typeof(int)); - this.dtUserRelationships.Columns.Add("CreatedByUserID", typeof(int)); - this.dtUserRelationships.Columns.Add("CreatedOnDate", typeof(DateTime)); - this.dtUserRelationships.Columns.Add("LastModifiedByUserID", typeof(int)); - this.dtUserRelationships.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - this.dtUserRelationships.PrimaryKey = new[] { pkUserRelationshipID }; - - // UserRelationshipPreferences - this.dtUserRelationshipPreferences = new DataTable("UserRelationshipPreferences"); - var pkPreferenceID = this.dtUserRelationshipPreferences.Columns.Add("PreferenceID", typeof(int)); - this.dtUserRelationshipPreferences.Columns.Add("UserID", typeof(int)); - this.dtUserRelationshipPreferences.Columns.Add("RelationshipID", typeof(int)); - this.dtUserRelationshipPreferences.Columns.Add("DefaultResponse", typeof(int)); - this.dtUserRelationshipPreferences.Columns.Add("CreatedByUserID", typeof(int)); - this.dtUserRelationshipPreferences.Columns.Add("CreatedOnDate", typeof(DateTime)); - this.dtUserRelationshipPreferences.Columns.Add("LastModifiedByUserID", typeof(int)); - this.dtUserRelationshipPreferences.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - this.dtUserRelationshipPreferences.PrimaryKey = new[] { pkPreferenceID }; - } - } + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + ComponentFactory.Container = new SimpleContainer(); + var mockDataProvider = MockComponentProvider.CreateDataProvider(); + mockDataProvider.Setup(dp => dp.GetProviderPath()).Returns(string.Empty); + + this.mockCachingProvider = MockComponentProvider.CreateDataCacheProvider(); + MockComponentProvider.CreateEventLogController(); + + this._portalController = new Mock(); + PortalController.SetTestableInstance(this._portalController.Object); + + this._portalGroupController = new Mock(); + PortalGroupController.RegisterInstance(this._portalGroupController.Object); + + var mockHostController = new Mock(); + mockHostController.Setup(c => c.GetString("PerformanceSetting")).Returns("0"); + HostController.RegisterInstance(mockHostController.Object); + + var mockUserController = new Mock(); + mockUserController.Setup(c => c.GetCurrentUserInfo()).Returns(new UserInfo() { UserID = 1 }); + UserController.SetTestableInstance(mockUserController.Object); + + this.CreateLocalizationProvider(); + + this.SetupDataTables(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + ComponentFactory.Container = null; + PortalController.ClearInstance(); + UserController.ClearInstance(); + } + + [Test] + public void RelationshipController_Constructor_Throws_On_Null_DataService() + { + // Arrange + var mockEventLogController = new Mock(); + + // Act, Assert + Assert.Throws(() => new RelationshipControllerImpl(null, mockEventLogController.Object)); + } + + [Test] + public void RelationshipController_Constructor_Throws_On_Null_EventLogController() + { + // Arrange + var mockDataService = new Mock(); + + // Act, Assert + Assert.Throws(() => new RelationshipControllerImpl(mockDataService.Object, null)); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_DeleteRelationshipType_Throws_On_Null_RelationshipType() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.DeleteRelationshipType(null); + } + + [Test] + public void RelationshipController_DeleteRelationshipType_Calls_DataService() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + }; + + // Act + relationshipController.DeleteRelationshipType(relationshipType); + + // Assert + mockDataService.Verify(d => d.DeleteRelationshipType(Constants.SOCIAL_FollowerRelationshipTypeID)); + } + + [Test] + public void RelationshipController_DeleteRelationshipType_Calls_EventLogController_AddLog() + { + // Arrange + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + var relationshipController = this.CreateRelationshipController(mockEventLogController); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + Name = Constants.SOCIAL_RelationshipTypeName, + }; + + // Act + relationshipController.DeleteRelationshipType(relationshipType); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_RelationshipType_Deleted, Constants.SOCIAL_RelationshipTypeName, Constants.SOCIAL_FollowerRelationshipTypeID); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + public void RelationshipController_DeleteRelationshipType_Calls_DataCache_RemoveCache() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + var cacheKey = CachingProvider.GetCacheKey(DataCache.RelationshipTypesCacheKey); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + }; + + // Act + relationshipController.DeleteRelationshipType(relationshipType); + + // Assert + this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); + } + + [Test] + public void RelationshipController_GetAllRelationshipTypes_Calls_DataService() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationshipTypes = relationshipController.GetAllRelationshipTypes(); + + // Assert + mockDataService.Verify(d => d.GetAllRelationshipTypes()); + } + + [Test] + public void RelationshipController_GetRelationshipType_Calls_DataService_If_Not_Cached() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationshipTypes = relationshipController.GetRelationshipType(Constants.SOCIAL_FriendRelationshipTypeID); + + // Assert + mockDataService.Verify(d => d.GetAllRelationshipTypes()); + } + + [Test] + [TestCase(Constants.SOCIAL_FriendRelationshipTypeID)] + [TestCase(Constants.SOCIAL_FollowerRelationshipTypeID)] + public void RelationshipController_GetRelationshipType_Returns_RelationshipType_For_Valid_ID(int relationshipTypeId) + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationshipType = relationshipController.GetRelationshipType(relationshipTypeId); + + // Assert + Assert.AreEqual(relationshipTypeId, relationshipType.RelationshipTypeId); + } + + [Test] + public void RelationshipController_GetRelationshipType_Returns_Null_For_InValid_ID() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationshipType = relationshipController.GetRelationshipType(Constants.SOCIAL_InValidRelationshipType); + + // Assert + Assert.IsNull(relationshipType); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_SaveRelationshipType_Throws_On_Null_RelationshipType() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.SaveRelationshipType(null); + } + + [Test] + public void RelationshipController_SaveRelationshipType_Calls_DataService() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + }; + + // Act + relationshipController.SaveRelationshipType(relationshipType); + + // Assert + mockDataService.Verify(d => d.SaveRelationshipType(relationshipType, It.IsAny())); + } + + [Test] + public void RelationshipController_SaveRelationshipType_Calls_EventLogController_AddLog() + { + // Arrange + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = this.CreateRelationshipController(mockEventLogController); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + Name = Constants.SOCIAL_RelationshipTypeName, + }; + + // Act + relationshipController.SaveRelationshipType(relationshipType); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_RelationshipType_Updated, Constants.SOCIAL_RelationshipTypeName); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + public void RelationshipController_SaveRelationshipType_Calls_DataCache_RemoveCache() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + var cacheKey = CachingProvider.GetCacheKey(DataCache.RelationshipTypesCacheKey); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + }; + + // Act + relationshipController.SaveRelationshipType(relationshipType); + + // Assert + this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_DeleteRelationship_Throws_On_Null_Relationship() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.DeleteRelationship(null); + } + + [Test] + public void RelationshipController_DeleteRelationship_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var relationship = new Relationship() + { + RelationshipId = Constants.SOCIAL_FollowerRelationshipID, + }; + + // Act + relationshipController.DeleteRelationship(relationship); + + // Assert + mockDataService.Verify(d => d.DeleteRelationship(Constants.SOCIAL_FollowerRelationshipID)); + } + + [Test] + public void RelationshipController_DeleteRelationship_Calls_EventLogController_AddLog() + { + // Arrange + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = this.CreateRelationshipController(mockEventLogController); + var relationship = new Relationship() + { + RelationshipId = Constants.SOCIAL_FollowerRelationshipID, + Name = Constants.SOCIAL_RelationshipName, + }; + + // Act + relationshipController.DeleteRelationship(relationship); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_Relationship_Deleted, Constants.SOCIAL_RelationshipName, Constants.SOCIAL_FollowerRelationshipID); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + public void RelationshipController_DeleteRelationship_Calls_DataCache_RemoveCache() + { + // Arrange + var portalId = 1; + var relationshipController = this.CreateRelationshipController(); + var cacheKey = CachingProvider.GetCacheKey(string.Format(DataCache.RelationshipByPortalIDCacheKey, portalId)); + var relationship = new Relationship() + { + RelationshipId = Constants.SOCIAL_FollowerRelationshipID, + PortalId = portalId, + UserId = -1, + }; + + // Act + relationshipController.DeleteRelationship(relationship); + + // Assert + this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); + } + + [Test] + [TestCase(Constants.SOCIAL_FriendRelationshipID, DefaultRelationshipTypes.Friends)] + [TestCase(Constants.SOCIAL_FollowerRelationshipID, DefaultRelationshipTypes.Followers)] + public void RelationshipController_GetRelationship_Returns_Relationship_For_Valid_ID(int relationshipId, DefaultRelationshipTypes defaultType) + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + this.dtRelationships.Rows.Add(relationshipId, defaultType, defaultType.ToString(), defaultType.ToString(), Constants.PORTAL_Zero, Constants.USER_Null, RelationshipStatus.None); + mockDataService.Setup(md => md.GetRelationship(relationshipId)).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationship = relationshipController.GetRelationship(relationshipId); + + // Assert + Assert.AreEqual(relationshipId, relationship.RelationshipId); + } + + [Test] + public void RelationshipController_GetRelationship_Returns_Null_For_InValid_ID() + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + mockDataService.Setup(md => md.GetRelationship(It.IsAny())).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationship = relationshipController.GetRelationship(Constants.SOCIAL_InValidRelationship); + + // Assert + Assert.IsNull(relationship); + } + + [Test] + public void RelationshipController_GetRelationshipsByUserID_Returns_List_Of_Relationships_For_Valid_User() + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + for (int i = 1; i <= 5; i++) + { + this.dtRelationships.Rows.Add(i, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), + DefaultRelationshipTypes.Friends.ToString(), + Constants.PORTAL_Zero, + Constants.USER_ValidId, + RelationshipStatus.None); + } + + mockDataService.Setup(md => md.GetRelationshipsByUserId(Constants.USER_ValidId)).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationships = relationshipController.GetRelationshipsByUserId(Constants.USER_ValidId); + + // Assert + Assert.IsInstanceOf>(relationships); + Assert.AreEqual(5, relationships.Count); + } + + [Test] + public void RelationshipController_GetRelationshipsByUserID_Returns_EmptyList_Of_Relationships_For_InValid_User() + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + mockDataService.Setup(md => md.GetRelationshipsByUserId(Constants.USER_InValidId)).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var relationships = relationshipController.GetRelationshipsByUserId(Constants.USER_InValidId); + + // Assert + Assert.IsInstanceOf>(relationships); + Assert.AreEqual(0, relationships.Count); + } + + [Test] + public void RelationshipController_GetRelationshipsByPortalID_Returns_List_Of_Relationships_For_Valid_Portal() + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + for (int i = 1; i <= 5; i++) + { + this.dtRelationships.Rows.Add(i, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), + DefaultRelationshipTypes.Friends.ToString(), + Constants.PORTAL_Zero, + Constants.USER_Null, + RelationshipStatus.None); + } + + mockDataService.Setup(md => md.GetRelationshipsByPortalId(Constants.PORTAL_Zero)).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + // Act + var relationships = relationshipController.GetRelationshipsByPortalId(Constants.PORTAL_Zero); + + // Assert + Assert.IsInstanceOf>(relationships); + Assert.AreEqual(5, relationships.Count); + } + + [Test] + public void RelationshipController_GetRelationshipsByPortalID_Returns_List_Of_Relationships_For_Valid_Portal_When_Portal_Is_In_Group() + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + for (int i = 1; i <= 5; i++) + { + this.dtRelationships.Rows.Add(i, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), + DefaultRelationshipTypes.Friends.ToString(), + Constants.PORTAL_Zero, + Constants.USER_Null, + RelationshipStatus.None); + } + + mockDataService.Setup(md => md.GetRelationshipsByPortalId(Constants.PORTAL_Zero)).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Zero, Constants.PORTALGROUP_ValidPortalGroupId); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Zero)).Returns(mockPortalInfo); + + List portalGroups = new List() { CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero) }; // CreatePortalGroupInfo(Constants.PORTALGROUP_ValidPortalGroupId, Constants.PORTAL_Zero); + this._portalGroupController.Setup(pgc => pgc.GetPortalGroups()).Returns(portalGroups); + + // Act + var relationships = relationshipController.GetRelationshipsByPortalId(Constants.PORTAL_Zero); + + // Assert + Assert.IsInstanceOf>(relationships); + Assert.AreEqual(5, relationships.Count); + } + + [Test] + public void RelationshipController_GetRelationshipsByPortalID_Returns_EmptyList_Of_Relationships_For_InValid_Portal() + { + // Arrange + var mockDataService = new Mock(); + this.dtRelationships.Clear(); + mockDataService.Setup(md => md.GetRelationshipsByPortalId(Constants.PORTAL_Null)).Returns(this.dtRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + var mockPortalInfo = CreatePortalInfo(Constants.PORTAL_Null, Null.NullInteger); + this._portalController.Setup(pc => pc.GetPortal(Constants.PORTAL_Null)).Returns(mockPortalInfo); + + // Act + var relationships = relationshipController.GetRelationshipsByPortalId(Constants.PORTAL_Null); + + // Assert + Assert.IsInstanceOf>(relationships); + Assert.AreEqual(0, relationships.Count); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_SaveRelationship_Throws_On_Null_Relationship() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.SaveRelationship(null); + } + + [Test] + public void RelationshipController_SaveRelationship_Calls_DataService() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var relationship = new Relationship + { + RelationshipId = Constants.SOCIAL_FollowerRelationshipID, + }; + + // Act + relationshipController.SaveRelationship(relationship); + + // Assert + mockDataService.Verify(d => d.SaveRelationship(relationship, It.IsAny())); + } + + [Test] + public void RelationshipController_SaveRelationship_Calls_EventLogController_AddLog() + { + // Arrange + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = this.CreateRelationshipController(mockEventLogController); + var relationship = new Relationship + { + RelationshipId = Constants.SOCIAL_FollowerRelationshipID, + Name = Constants.SOCIAL_RelationshipName, + }; + + // Act + relationshipController.SaveRelationship(relationship); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_Relationship_Updated, Constants.SOCIAL_RelationshipName); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + public void RelationshipController_SaveRelationship_Calls_DataCache_RemoveCache() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + var cacheKey = CachingProvider.GetCacheKey(DataCache.RelationshipTypesCacheKey); + var relationshipType = new RelationshipType() + { + RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, + }; + + // Act + relationshipController.SaveRelationshipType(relationshipType); + + // Assert + this.mockCachingProvider.Verify(e => e.Remove(cacheKey)); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_DeleteUserRelationship_Throws_On_Null_UserRelationship() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.DeleteUserRelationship(null); + } + + [Test] + public void RelationshipController_DeleteUserRelationship_Calls_DataService() + { + // Arrange + var mockDataService = this.CreateMockDataServiceWithRelationshipTypes(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var userRelationship = new UserRelationship() + { + UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, + }; + + // Act + relationshipController.DeleteUserRelationship(userRelationship); + + // Assert + mockDataService.Verify(d => d.DeleteUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11)); + } + + [Test] + public void RelationshipController_DeleteUserRelationship_Calls_EventLogController_AddLog() + { + // Arrange + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = this.CreateRelationshipController(mockEventLogController); + var userRelationship = new UserRelationship + { + UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, + UserId = Constants.USER_ElevenId, + RelatedUserId = Constants.USER_TenId, + }; + + // Act + relationshipController.DeleteUserRelationship(userRelationship); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_UserRelationship_Deleted, Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_ElevenId, Constants.USER_TenId); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + [TestCase(Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_TenId, Constants.USER_ElevenId)] + [TestCase(Constants.SOCIAL_UserRelationshipIDUser12User13, 12, 13)] + public void RelationshipController_GetUserRelationship_Returns_Relationship_For_Valid_ID(int userRelationshipId, int userId, int relatedUserId) + { + // Arrange + var mockDataService = new Mock(); + this.dtUserRelationships.Clear(); + this.dtUserRelationships.Rows.Add(userRelationshipId, userId, relatedUserId, Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); + mockDataService.Setup(md => md.GetUserRelationship(userRelationshipId)).Returns(this.dtUserRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var userRelationship = relationshipController.GetUserRelationship(userRelationshipId); + + // Assert + Assert.AreEqual(userRelationshipId, userRelationship.UserRelationshipId); + } + + [Test] + public void RelationshipController_GetUserRelationship_Returns_Null_For_InValid_ID() + { + // Arrange + var mockDataService = new Mock(); + this.dtUserRelationships.Clear(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var userRelationship = relationshipController.GetUserRelationship(Constants.SOCIAL_InValidUserRelationship); + + // Assert + Assert.IsNull(userRelationship); + } + + [Test] + public void RelationshipController_GetUserRelationships_Returns_List_Of_UserRelationships_For_Valid_User() + { + // Arrange + var mockDataService = new Mock(); + this.dtUserRelationships.Clear(); + for (int i = 1; i <= 5; i++) + { + this.dtUserRelationships.Rows.Add(i, Constants.USER_ValidId, Constants.USER_TenId, + Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); + } + + mockDataService.Setup(md => md.GetUserRelationships(Constants.USER_ValidId)).Returns(this.dtUserRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var user = new UserInfo { UserID = Constants.USER_ValidId }; + var userRelationships = relationshipController.GetUserRelationships(user); + + // Assert + Assert.IsInstanceOf>(userRelationships); + Assert.AreEqual(5, userRelationships.Count); + } + + [Test] + public void RelationshipController_GetUserRelationships_Returns_EmptyList_Of_UserRelationships_For_InValid_User() + { + // Arrange + var mockDataService = new Mock(); + this.dtUserRelationships.Clear(); + + mockDataService.Setup(md => md.GetUserRelationships(Constants.USER_InValidId)).Returns(this.dtUserRelationships.CreateDataReader()); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var user = new UserInfo { UserID = Constants.USER_InValidId }; + var userRelationships = relationshipController.GetUserRelationships(user); + + // Assert + Assert.IsInstanceOf>(userRelationships); + Assert.AreEqual(0, userRelationships.Count); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_SaveUserRelationship_Throws_On_Null_UserRelationship() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.SaveUserRelationship(null); + } + + [Test] + public void RelationshipController_SaveUserRelationship_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var userRelationship = new UserRelationship() + { + UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, + }; + + // Act + relationshipController.SaveUserRelationship(userRelationship); + + // Assert + mockDataService.Verify(d => d.SaveUserRelationship(userRelationship, It.IsAny())); + } + + [Test] + public void RelationshipController_SaveUserRelationship_Calls_EventLogController_AddLog() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.SaveUserRelationship(It.IsAny(), It.IsAny())) + .Returns(Constants.SOCIAL_UserRelationshipIDUser10User11); + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); + var userRelationship = new UserRelationship + { + UserRelationshipId = Constants.SOCIAL_UserRelationshipIDUser10User11, + UserId = Constants.USER_ElevenId, + RelatedUserId = Constants.USER_TenId, + }; + + // Act + relationshipController.SaveUserRelationship(userRelationship); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_UserRelationship_Updated, Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_ElevenId, Constants.USER_TenId); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_DeleteUserRelationshipPreference_Throws_On_Null_UserRelationshipPreference() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.DeleteUserRelationshipPreference(null); + } + + [Test] + public void RelationshipController_DeleteUserRelationshipPreference_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var preference = new UserRelationshipPreference() + { + PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, + }; + + // Act + relationshipController.DeleteUserRelationshipPreference(preference); + + // Assert + mockDataService.Verify(d => d.DeleteUserRelationshipPreference(Constants.SOCIAL_PrefereceIDForUser11)); + } + + [Test] + public void RelationshipController_DeleteUserRelationshipPreference_Calls_EventLogController_AddLog() + { + // Arrange + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = this.CreateRelationshipController(mockEventLogController); + var preference = new UserRelationshipPreference() + { + PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, + UserId = Constants.USER_ElevenId, + RelationshipId = Constants.SOCIAL_FriendRelationshipID, + }; + + // Act + relationshipController.DeleteUserRelationshipPreference(preference); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_UserRelationshipPreference_Deleted, Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + public void RelationshipController_GetUserRelationshipPreference_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetUserRelationshipPreferenceById(It.IsAny())) + .Returns(this.dtUserRelationshipPreferences.CreateDataReader); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var preference = relationshipController.GetUserRelationshipPreference(Constants.SOCIAL_PrefereceIDForUser11); + + // Assert + mockDataService.Verify(d => d.GetUserRelationshipPreferenceById(Constants.SOCIAL_PrefereceIDForUser11)); + } + + [Test] + public void RelationshipController_GetUserRelationshipPreference_Overload_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.GetUserRelationshipPreference(It.IsAny(), It.IsAny())) + .Returns(this.dtUserRelationshipPreferences.CreateDataReader); + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var preference = relationshipController.GetUserRelationshipPreference(Constants.USER_ValidId, Constants.SOCIAL_FriendRelationshipID); + + // Assert + mockDataService.Verify(d => d.GetUserRelationshipPreference(Constants.USER_ValidId, Constants.SOCIAL_FriendRelationshipID)); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RelationshipController_SaveUserRelationshipPreference_Throws_On_Null_UserRelationshipPreference() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + + // Act, Assert + relationshipController.SaveUserRelationshipPreference(null); + } + + [Test] + public void RelationshipController_SaveUserRelationshipPreference_Calls_DataService() + { + // Arrange + var mockDataService = new Mock(); + var relationshipController = this.CreateRelationshipController(mockDataService); + var preference = new UserRelationshipPreference() + { + PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, + UserId = Constants.USER_ElevenId, + RelationshipId = Constants.SOCIAL_FriendRelationshipID, + }; + + // Act + relationshipController.SaveUserRelationshipPreference(preference); + + // Assert + mockDataService.Verify(d => d.SaveUserRelationshipPreference(preference, It.IsAny())); + } + + [Test] + public void RelationshipController_SaveUserRelationshipPreference_Calls_EventLogController_AddLog() + { + // Arrange + var mockDataService = new Mock(); + mockDataService.Setup(ds => ds.SaveUserRelationshipPreference(It.IsAny(), It.IsAny())) + .Returns(Constants.SOCIAL_PrefereceIDForUser11); + var mockEventLogController = new Mock(); + mockEventLogController.Setup(c => c.AddLog(It.IsAny(), It.IsAny(), It.IsAny())); + this.CreateLocalizationProvider(); + + var relationshipController = new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); + var preference = new UserRelationshipPreference() + { + PreferenceId = Constants.SOCIAL_PrefereceIDForUser11, + UserId = Constants.USER_ElevenId, + RelationshipId = Constants.SOCIAL_FriendRelationshipID, + }; + + // Act + relationshipController.SaveUserRelationshipPreference(preference); + + // Assert + var logContent = string.Format(Constants.LOCALIZATION_UserRelationshipPreference_Updated, Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID); + mockEventLogController.Verify(e => e.AddLog("Message", logContent, EventLogController.EventLogType.ADMIN_ALERT)); + } + + [Test] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void RelationshipController_InitiateUserRelationship_Throws_On_Negative_RelationshipID() + { + // Arrange + var relationshipController = this.CreateRelationshipController(); + var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; + var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; + var relationship = new Relationship(); + + // Act, Assert + relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); + } + + [Test] + public void RelationshipController_InitiateUserRelationship_Returns_Status_Accepted_When_Default_Relationship_Action_Is_Accepted() + { + // Arrange + var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; + var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; + var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.Accepted }; + + this.dtUserRelationships.Rows.Clear(); + this.dtUserRelationshipPreferences.Rows.Clear(); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); + mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); + + // Assert + Assert.AreEqual(userRelationship.Status, RelationshipStatus.Accepted); + } + + [Test] + public void RelationshipController_InitiateUserRelationship_Returns_Status_Initiated_When_Default_Relationship_Action_Is_None() + { + // Arrange + var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; + var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; + var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.None }; + + this.dtUserRelationships.Rows.Clear(); + this.dtUserRelationshipPreferences.Rows.Clear(); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); + mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); + + // Assert + Assert.AreEqual(userRelationship.Status, RelationshipStatus.Pending); + } + + [Test] + public void RelationshipController_InitiateUserRelationship_Returns_Status_Accepted_When_TargetUsers_Relationship_Action_Is_Accepted() + { + // Arrange + var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; + var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; + var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.Accepted }; + + this.dtUserRelationships.Rows.Clear(); + this.dtUserRelationshipPreferences.Rows.Clear(); + this.dtUserRelationshipPreferences.Rows.Add(Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_TenId, Constants.USER_ElevenId, RelationshipStatus.Accepted); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); + mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); + + // Assert + Assert.AreEqual(userRelationship.Status, RelationshipStatus.Accepted); + } + + [Test] + public void RelationshipController_InitiateUserRelationship_Returns_Status_Initiated_When_TargetUsers_Relationship_Action_Is_None() + { + // Arrange + var initiatingUser = new UserInfo { UserID = Constants.USER_TenId, PortalID = Constants.PORTAL_Zero }; + var targetUser = new UserInfo { UserID = Constants.USER_ElevenId, PortalID = Constants.PORTAL_Zero }; + var relationship = new Relationship { RelationshipId = Constants.SOCIAL_FollowerRelationshipID, RelationshipTypeId = Constants.SOCIAL_FollowerRelationshipTypeID, DefaultResponse = RelationshipStatus.Accepted }; + + this.dtUserRelationships.Rows.Clear(); + this.dtUserRelationshipPreferences.Rows.Clear(); + this.dtUserRelationshipPreferences.Rows.Add(Constants.SOCIAL_PrefereceIDForUser11, Constants.USER_TenId, Constants.USER_ElevenId, RelationshipStatus.None); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + mockDataService.Setup(md => md.GetUserRelationshipPreference(It.IsAny(), It.IsAny())).Returns(this.dtUserRelationshipPreferences.CreateDataReader()); + mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + var userRelationship = relationshipController.InitiateUserRelationship(initiatingUser, targetUser, relationship); + + // Assert + Assert.AreEqual(userRelationship.Status, RelationshipStatus.Pending); + } + + [Test] + [ExpectedException(typeof(UserRelationshipDoesNotExistException))] + public void RelationshipController_RemoveUserRelationship_Throws_On_NonExistent_Relationship() + { + // Arrange + + // No UserRelationship between user10 and user11 + this.dtUserRelationships.Rows.Clear(); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act, Assert + relationshipController.RemoveUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); + } + + [Test] + [ExpectedException(typeof(UserRelationshipDoesNotExistException))] + public void RelationshipController_AcceptRelationship_Throws_On_NonExistent_Relationship() + { + // Arrange + + // No UserRelationship between user10 and user11 + this.dtUserRelationships.Rows.Clear(); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act, Assert + relationshipController.AcceptUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); + } + + [Test] + public void RelationshipController_AcceptUserRelationship_Calls_DataService_On_Valid_RelationshipID() + { + // Arrange + + // Any UserRelationship between user10 and user11 + this.dtUserRelationships.Rows.Clear(); + this.dtUserRelationships.Rows.Add(Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_TenId, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + mockDataService.Setup(md => md.SaveUserRelationship(It.IsAny(), It.IsAny())); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + relationshipController.AcceptUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); + + // Assert + mockDataService.Verify(ds => ds.SaveUserRelationship(It.IsAny(), It.IsAny())); + } + + [Test] + public void RelationshipController_RemoveUserRelationship_Calls_DataService_On_Valid_RelationshipID() + { + // Arrange + + // Any UserRelationship between user10 and user11 + this.dtUserRelationships.Rows.Clear(); + this.dtUserRelationships.Rows.Add(Constants.SOCIAL_UserRelationshipIDUser10User11, Constants.USER_TenId, Constants.USER_ElevenId, Constants.SOCIAL_FriendRelationshipID, RelationshipStatus.None); + + // setup mock DataService + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetUserRelationship(It.IsAny())).Returns(this.dtUserRelationships.CreateDataReader()); + mockDataService.Setup(md => md.DeleteUserRelationship(It.IsAny())); + + var relationshipController = this.CreateRelationshipController(mockDataService); + + // Act + relationshipController.RemoveUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11); + + // Assert + mockDataService.Verify(ds => ds.DeleteUserRelationship(Constants.SOCIAL_UserRelationshipIDUser10User11)); + } + + private static PortalInfo CreatePortalInfo(int portalId, int portalGroupId) + { + var mockPortalInfo = new PortalInfo { PortalID = portalId, PortalGroupID = portalGroupId }; + return mockPortalInfo; + } + + private static PortalGroupInfo CreatePortalGroupInfo(int portalGroupId, int masterPortalId) + { + var mockPortalGroupInfo = new PortalGroupInfo + { + PortalGroupId = portalGroupId, + MasterPortalId = masterPortalId, + PortalGroupName = Constants.PORTALGROUP_ValidName, + PortalGroupDescription = Constants.PORTALGROUP_ValidDescription, + }; + + return mockPortalGroupInfo; + } + + private Mock CreateMockDataServiceWithRelationshipTypes() + { + var mockDataService = new Mock(); + mockDataService.Setup(md => md.GetAllRelationshipTypes()).Returns(this.dtRelationshipTypes.CreateDataReader()); + mockDataService.Setup(md => md.GetRelationshipsByPortalId(It.IsAny())).Returns(this.dtRelationships.CreateDataReader()); + return mockDataService; + } + + private void CreateLocalizationProvider() + { + var mockProvider = MockComponentProvider.CreateLocalizationProvider(); + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_RelationshipType_Deleted_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_RelationshipType_Deleted); + + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_RelationshipType_Updated_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_RelationshipType_Updated); + + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_Relationship_Deleted_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_Relationship_Deleted); + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_Relationship_Updated_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_Relationship_Updated); + + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationshipPreference_Deleted_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_UserRelationshipPreference_Deleted); + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationshipPreference_Updated_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_UserRelationshipPreference_Updated); + + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationship_Deleted_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_UserRelationship_Deleted); + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationship_Added_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_UserRelationship_Added); + mockProvider.Setup(l => l.GetString(Constants.LOCALIZATION_UserRelationship_Updated_Key, It.IsAny())) + .Returns(Constants.LOCALIZATION_UserRelationship_Updated); + } + + private RelationshipControllerImpl CreateRelationshipController() + { + var mockDataService = new Mock(); + return this.CreateRelationshipController(mockDataService); + } + + private RelationshipControllerImpl CreateRelationshipController(Mock mockDataService) + { + var mockEventLogController = new Mock(); + return new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); + } + + private RelationshipControllerImpl CreateRelationshipController(Mock mockEventLogController) + { + var mockDataService = new Mock(); + return new RelationshipControllerImpl(mockDataService.Object, mockEventLogController.Object); + } + + private void SetupDataTables() + { + // RelationshipTypes + this.dtRelationshipTypes = new DataTable("RelationshipTypes"); + var pkRelationshipTypeID = this.dtRelationshipTypes.Columns.Add("RelationshipTypeID", typeof(int)); + this.dtRelationshipTypes.Columns.Add("Name", typeof(string)); + this.dtRelationshipTypes.Columns.Add("Description", typeof(string)); + this.dtRelationshipTypes.Columns.Add("Direction", typeof(int)); + this.dtRelationshipTypes.Columns.Add("CreatedByUserID", typeof(int)); + this.dtRelationshipTypes.Columns.Add("CreatedOnDate", typeof(DateTime)); + this.dtRelationshipTypes.Columns.Add("LastModifiedByUserID", typeof(int)); + this.dtRelationshipTypes.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + + this.dtRelationshipTypes.PrimaryKey = new[] { pkRelationshipTypeID }; + + this.dtRelationshipTypes.Rows.Add(DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), DefaultRelationshipTypes.Friends.ToString(), RelationshipDirection.TwoWay); + this.dtRelationshipTypes.Rows.Add(DefaultRelationshipTypes.Followers, DefaultRelationshipTypes.Followers.ToString(), DefaultRelationshipTypes.Followers.ToString(), RelationshipDirection.OneWay); + + // Relationships + this.dtRelationships = new DataTable("Relationships"); + var pkRelationshipID = this.dtRelationships.Columns.Add("RelationshipID", typeof(int)); + this.dtRelationships.Columns.Add("RelationshipTypeID", typeof(int)); + this.dtRelationships.Columns.Add("Name", typeof(string)); + this.dtRelationships.Columns.Add("Description", typeof(string)); + this.dtRelationships.Columns.Add("PortalID", typeof(int)); + this.dtRelationships.Columns.Add("UserID", typeof(int)); + this.dtRelationships.Columns.Add("DefaultResponse", typeof(int)); + this.dtRelationships.Columns.Add("CreatedByUserID", typeof(int)); + this.dtRelationships.Columns.Add("CreatedOnDate", typeof(DateTime)); + this.dtRelationships.Columns.Add("LastModifiedByUserID", typeof(int)); + this.dtRelationships.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + this.dtRelationships.PrimaryKey = new[] { pkRelationshipID }; + + // Create default Friend and Social Relationships + this.dtRelationships.Rows.Add(Constants.SOCIAL_FriendRelationshipID, DefaultRelationshipTypes.Friends, DefaultRelationshipTypes.Friends.ToString(), DefaultRelationshipTypes.Friends.ToString(), Constants.PORTAL_Zero, Constants.USER_Null, RelationshipStatus.None); + this.dtRelationships.Rows.Add(Constants.SOCIAL_FollowerRelationshipID, DefaultRelationshipTypes.Followers, DefaultRelationshipTypes.Followers.ToString(), DefaultRelationshipTypes.Followers.ToString(), Constants.PORTAL_Zero, Constants.USER_Null, RelationshipStatus.None); + + // UserRelationships + this.dtUserRelationships = new DataTable("UserRelationships"); + var pkUserRelationshipID = this.dtUserRelationships.Columns.Add("UserRelationshipID", typeof(int)); + this.dtUserRelationships.Columns.Add("UserID", typeof(int)); + this.dtUserRelationships.Columns.Add("RelatedUserID", typeof(int)); + this.dtUserRelationships.Columns.Add("RelationshipID", typeof(int)); + this.dtUserRelationships.Columns.Add("Status", typeof(int)); + this.dtUserRelationships.Columns.Add("CreatedByUserID", typeof(int)); + this.dtUserRelationships.Columns.Add("CreatedOnDate", typeof(DateTime)); + this.dtUserRelationships.Columns.Add("LastModifiedByUserID", typeof(int)); + this.dtUserRelationships.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + this.dtUserRelationships.PrimaryKey = new[] { pkUserRelationshipID }; + + // UserRelationshipPreferences + this.dtUserRelationshipPreferences = new DataTable("UserRelationshipPreferences"); + var pkPreferenceID = this.dtUserRelationshipPreferences.Columns.Add("PreferenceID", typeof(int)); + this.dtUserRelationshipPreferences.Columns.Add("UserID", typeof(int)); + this.dtUserRelationshipPreferences.Columns.Add("RelationshipID", typeof(int)); + this.dtUserRelationshipPreferences.Columns.Add("DefaultResponse", typeof(int)); + this.dtUserRelationshipPreferences.Columns.Add("CreatedByUserID", typeof(int)); + this.dtUserRelationshipPreferences.Columns.Add("CreatedOnDate", typeof(DateTime)); + this.dtUserRelationshipPreferences.Columns.Add("LastModifiedByUserID", typeof(int)); + this.dtUserRelationshipPreferences.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + this.dtUserRelationshipPreferences.PrimaryKey = new[] { pkPreferenceID }; + } + } } diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs index 47f037124d6..ba0008297b1 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/ModuleSettingsTests.cs @@ -2,10 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Entities.Modules.Settings -{ - using System; - using System.Collections; +namespace DotNetNuke.Tests.Core.Entities.Modules.Settings +{ + using System; + using System.Collections; using System.Globalization; using DotNetNuke.Abstractions; @@ -15,294 +15,292 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using DotNetNuke.Entities.Modules.Settings; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class ModuleSettingsTests : BaseSettingsTests - { - [SetUp] + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class ModuleSettingsTests : BaseSettingsTests + { + [SetUp] public void Setup() { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] + } + + [TearDown] public void TearDown() { Globals.DependencyProvider = null; - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ar-JO")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ca-ES")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("zh-CN")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("en-US")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("fr-FR")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("he-IL")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ru-RU")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("tr-TR")] - public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - public void SaveSettings_UpdatesCache() - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new ModulesSettings(); - - this.MockModuleSettings(moduleInfo, new Hashtable()); - this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); - var settingsRepository = new ModulesSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - public void GetSettings_CallsGetCachedObject() - { - // Arrange - var moduleInfo = GetModuleInfo; - - this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new ModulesSettings()); - var settingsRepository = new ModulesSettingsRepository(); - - // Act - settingsRepository.GetSettings(moduleInfo); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ar-JO")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ca-ES")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("zh-CN")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("en-US")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("fr-FR")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("he-IL")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ru-RU")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("tr-TR")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection(string stringValue, int integerValue, double doubleValue, - bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var moduleSettings = new Hashtable - { - { SettingNamePrefix + "StringProperty", stringValue }, - { SettingNamePrefix + "IntegerProperty", integerValue.ToString() }, - { SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "BooleanProperty", booleanValue.ToString() }, - { SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "EnumProperty", enumValue.ToString() }, - { SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}" }, - }; - - this.MockModuleSettings(moduleInfo, moduleSettings); - - var settingsRepository = new ModulesSettingsRepository(); - - // Act - var settings = settingsRepository.GetSettings(moduleInfo); - - // Assert - Assert.AreEqual(stringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); - Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); - Assert.AreEqual(doubleValue, settings.DoubleProperty, "The retrieved double property value is not equal to the stored one"); - Assert.AreEqual(booleanValue, settings.BooleanProperty, "The retrieved boolean property value is not equal to the stored one"); - Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); - Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); - Assert.AreEqual(enumValue, settings.EnumProperty, "The retrieved enum property value is not equal to the stored one"); - Assert.AreEqual(complexValue, settings.ComplexProperty, "The retrieved complex property value is not equal to the stored one"); - this.MockRepository.VerifyAll(); - } - - private void SaveSettings_CallsUpdateModuleSetting_WithRightParameters(string stringValue, int integerValue, double doubleValue, - bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new ModulesSettings - { - StringProperty = stringValue, - IntegerProperty = integerValue, - DoubleProperty = doubleValue, - BooleanProperty = booleanValue, - DateTimeProperty = datetimeValue, - TimeSpanProperty = timeSpanValue, - EnumProperty = enumValue, - ComplexProperty = complexValue, - }; - - this.MockModuleSettings(moduleInfo, new Hashtable()); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "StringProperty", stringValue)); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "IntegerProperty", integerValue.ToString())); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture))); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "BooleanProperty", booleanValue.ToString())); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture))); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture))); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "EnumProperty", enumValue.ToString())); - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}")); - - var settingsRepository = new ModulesSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - public class ModulesSettings - { - [ModuleSetting(Prefix = SettingNamePrefix)] - public string StringProperty { get; set; } = string.Empty; - - [ModuleSetting(Prefix = SettingNamePrefix)] - public int IntegerProperty { get; set; } - - [ModuleSetting(Prefix = SettingNamePrefix)] - public double DoubleProperty { get; set; } - - [ModuleSetting(Prefix = SettingNamePrefix)] - public bool BooleanProperty { get; set; } - - [ModuleSetting(Prefix = SettingNamePrefix)] - public DateTime DateTimeProperty { get; set; } = DateTime.Now; - - [ModuleSetting(Prefix = SettingNamePrefix)] - public TimeSpan TimeSpanProperty { get; set; } = TimeSpan.Zero; - - [ModuleSetting(Prefix = SettingNamePrefix)] - public TestingEnum EnumProperty { get; set; } = TestingEnum.Value1; - - [ModuleSetting(Prefix = SettingNamePrefix, Serializer = "DotNetNuke.Tests.Core.Entities.Modules.Settings.ComplexTypeSerializer,DotNetNuke.Tests.Core")] - public ComplexType ComplexProperty { get; set; } = new ComplexType(20, 25); - } - - public class ModulesSettingsRepository : SettingsRepository - {} - } -} + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ar-JO")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ca-ES")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("zh-CN")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("en-US")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("fr-FR")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("he-IL")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ru-RU")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("tr-TR")] + public void SaveSettings_CallsUpdateModuleSetting_WithRightParameters_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + public void SaveSettings_UpdatesCache() + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new ModulesSettings(); + + this.MockModuleSettings(moduleInfo, new Hashtable()); + this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); + var settingsRepository = new ModulesSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + public void GetSettings_CallsGetCachedObject() + { + // Arrange + var moduleInfo = GetModuleInfo; + + this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new ModulesSettings()); + var settingsRepository = new ModulesSettingsRepository(); + + // Act + settingsRepository.GetSettings(moduleInfo); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ar-JO")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ca-ES")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("zh-CN")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("en-US")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("fr-FR")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("he-IL")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ru-RU")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("tr-TR")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection(string stringValue, int integerValue, double doubleValue, + bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var moduleSettings = new Hashtable + { + { SettingNamePrefix + "StringProperty", stringValue }, + { SettingNamePrefix + "IntegerProperty", integerValue.ToString() }, + { SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "BooleanProperty", booleanValue.ToString() }, + { SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "EnumProperty", enumValue.ToString() }, + { SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}" }, + }; + + this.MockModuleSettings(moduleInfo, moduleSettings); + + var settingsRepository = new ModulesSettingsRepository(); + + // Act + var settings = settingsRepository.GetSettings(moduleInfo); + + // Assert + Assert.AreEqual(stringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); + Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); + Assert.AreEqual(doubleValue, settings.DoubleProperty, "The retrieved double property value is not equal to the stored one"); + Assert.AreEqual(booleanValue, settings.BooleanProperty, "The retrieved boolean property value is not equal to the stored one"); + Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); + Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); + Assert.AreEqual(enumValue, settings.EnumProperty, "The retrieved enum property value is not equal to the stored one"); + Assert.AreEqual(complexValue, settings.ComplexProperty, "The retrieved complex property value is not equal to the stored one"); + this.MockRepository.VerifyAll(); + } + + private void SaveSettings_CallsUpdateModuleSetting_WithRightParameters(string stringValue, int integerValue, double doubleValue, + bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new ModulesSettings + { + StringProperty = stringValue, + IntegerProperty = integerValue, + DoubleProperty = doubleValue, + BooleanProperty = booleanValue, + DateTimeProperty = datetimeValue, + TimeSpanProperty = timeSpanValue, + EnumProperty = enumValue, + ComplexProperty = complexValue, + }; + + this.MockModuleSettings(moduleInfo, new Hashtable()); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "StringProperty", stringValue)); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "IntegerProperty", integerValue.ToString())); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture))); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "BooleanProperty", booleanValue.ToString())); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture))); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture))); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "EnumProperty", enumValue.ToString())); + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}")); + + var settingsRepository = new ModulesSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + public class ModulesSettings + { + [ModuleSetting(Prefix = SettingNamePrefix)] + public string StringProperty { get; set; } = string.Empty; + + [ModuleSetting(Prefix = SettingNamePrefix)] + public int IntegerProperty { get; set; } + + [ModuleSetting(Prefix = SettingNamePrefix)] + public double DoubleProperty { get; set; } + + [ModuleSetting(Prefix = SettingNamePrefix)] + public bool BooleanProperty { get; set; } + + [ModuleSetting(Prefix = SettingNamePrefix)] + public DateTime DateTimeProperty { get; set; } = DateTime.Now; + + [ModuleSetting(Prefix = SettingNamePrefix)] + public TimeSpan TimeSpanProperty { get; set; } = TimeSpan.Zero; + + [ModuleSetting(Prefix = SettingNamePrefix)] + public TestingEnum EnumProperty { get; set; } = TestingEnum.Value1; + + [ModuleSetting(Prefix = SettingNamePrefix, Serializer = "DotNetNuke.Tests.Core.Entities.Modules.Settings.ComplexTypeSerializer,DotNetNuke.Tests.Core")] + public ComplexType ComplexProperty { get; set; } = new ComplexType(20, 25); + } + + public class ModulesSettingsRepository : SettingsRepository + {} + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs index 42076f18cc8..dfd8348635d 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/NullableSettingsTests.cs @@ -2,11 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Entities.Modules.Settings -{ - using System; - using System.Collections; - using System.Collections.Generic; +namespace DotNetNuke.Tests.Core.Entities.Modules.Settings +{ + using System; + using System.Collections; + using System.Collections.Generic; using System.Globalization; using DotNetNuke.Abstractions; @@ -19,274 +19,272 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using Microsoft.Extensions.DependencyInjection; using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class NullableSettingsTests : BaseSettingsTests - { - public readonly object[] NullableCases = - { - new object[] { null, null, null, null, }, - new object[] { string.Empty, -1, DateTime.UtcNow, TimeSpan.FromMilliseconds(3215648), }, - new object[] { "lorem ipsum", 456, DateTime.Now, DateTime.Today - DateTime.Now, }, - }; - - [SetUp] + + using NUnit.Framework; + + [TestFixture] + public class NullableSettingsTests : BaseSettingsTests + { + public readonly object[] NullableCases = + { + new object[] { null, null, null, null, }, + new object[] { string.Empty, -1, DateTime.UtcNow, TimeSpan.FromMilliseconds(3215648), }, + new object[] { "lorem ipsum", 456, DateTime.Now, DateTime.Today - DateTime.Now, }, + }; + + [SetUp] public void Setup() { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] + } + + [TearDown] public void TearDown() { Globals.DependencyProvider = null; - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("ar-JO")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_ar_JO(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("ca-ES")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_ca_ES(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("zh-CN")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_zh_CN(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("en-US")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_en_US(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("fr-FR")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_fr_FR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("he-IL")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_he_IL(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("ru-RU")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_ru_RU(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("tr-TR")] - public void SaveSettings_CallsUpdateSetting_WithRightParameters_tr_TR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - public void SaveSettings_UpdatesCache() - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new MyNullableSettings(); - - this.MockModuleSettings(moduleInfo, new Hashtable()); - this.MockTabModuleSettings(moduleInfo, new Hashtable()); - this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); - var settingsRepository = new MyNullableSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - public void GetSettings_CallsGetCachedObject() - { - // Arrange - var moduleInfo = GetModuleInfo; - - this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new MyNullableSettings()); - var settingsRepository = new MyNullableSettingsRepository(); - - // Act - settingsRepository.GetSettings(moduleInfo); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("ar-JO")] - public void GetSettings_GetsValues_FromCorrectSettings_ar_JO(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("ca-ES")] - public void GetSettings_GetsValues_FromCorrectSettings_ca_ES(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("zh-CN")] - public void GetSettings_GetsValues_FromCorrectSettings_zh_CN(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("en-US")] - public void GetSettings_GetsValues_FromCorrectSettings_en_US(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("fr-FR")] - public void GetSettings_GetsValues_FromCorrectSettings_fr_FR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("he-IL")] - public void GetSettings_GetsValues_FromCorrectSettings_he_IL(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("ru-RU")] - public void GetSettings_GetsValues_FromCorrectSettings_ru_RU(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - [Test] - [TestCaseSource(nameof(NullableCases))] - [SetCulture("tr-TR")] - public void GetSettings_GetsValues_FromCorrectSettings_tr_TR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); - } - - private void SaveSettings_CallsUpdateSetting_WithRightParameters(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new MyNullableSettings - { - StringProperty = stringValue, - IntegerProperty = integerValue, - DateTimeProperty = datetimeValue, - TimeSpanProperty = timeSpanValue, - }; - - this.MockModuleSettings(moduleInfo, new Hashtable()); - this.MockTabModuleSettings(moduleInfo, new Hashtable()); - var expectedStringValue = stringValue ?? string.Empty; - this.MockModuleController.Setup(pc => pc.UpdateModuleSetting(ModuleId, "StringProperty", expectedStringValue)); - var integerString = integerValue?.ToString() ?? string.Empty; - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, "IntegerProperty", integerString, true, Null.NullString, false)); - var dateTimeString = datetimeValue?.ToString("o", CultureInfo.InvariantCulture) ?? string.Empty; - this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, "DateTimeProperty", dateTimeString)); - var timeSpanString = timeSpanValue?.ToString("c", CultureInfo.InvariantCulture) ?? string.Empty; - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, "TimeSpanProperty", timeSpanString)); - - var settingsRepository = new MyNullableSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - private void GetSettings_GetsValues_FromCorrectSettings(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) - { - // Arrange - var expectedStringValue = stringValue ?? string.Empty; - var moduleInfo = GetModuleInfo; - var portalSettings = new Dictionary { ["IntegerProperty"] = integerValue?.ToString() ?? string.Empty, }; - var moduleSettings = new Hashtable { ["DateTimeProperty"] = datetimeValue?.ToString("o", CultureInfo.InvariantCulture) ?? string.Empty, ["StringProperty"] = expectedStringValue, }; - var tabModuleSettings = new Hashtable { ["TimeSpanProperty"] = timeSpanValue?.ToString("c", CultureInfo.InvariantCulture) ?? string.Empty, }; - - this.MockPortalSettings(moduleInfo, portalSettings); - this.MockModuleSettings(moduleInfo, moduleSettings); - this.MockTabModuleSettings(moduleInfo, tabModuleSettings); - - var settingsRepository = new MyNullableSettingsRepository(); - - // Act - var settings = settingsRepository.GetSettings(moduleInfo); - - // Assert - Assert.AreEqual(expectedStringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); - Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); - Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); - Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); - this.MockRepository.VerifyAll(); - } - - public class MyNullableSettings - { - [ModuleSetting] - public string StringProperty { get; set; } = "Default Value"; - - [PortalSetting] - public int? IntegerProperty { get; set; } = 500; - - [ModuleSetting] - public DateTime? DateTimeProperty { get; set; } = DateTime.MaxValue; - - [TabModuleSetting] - public TimeSpan? TimeSpanProperty { get; set; } = TimeSpan.FromHours(12); - } - - public class MyNullableSettingsRepository : SettingsRepository - {} - } -} + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("ar-JO")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_ar_JO(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("ca-ES")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_ca_ES(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("zh-CN")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_zh_CN(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("en-US")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_en_US(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("fr-FR")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_fr_FR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("he-IL")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_he_IL(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("ru-RU")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_ru_RU(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("tr-TR")] + public void SaveSettings_CallsUpdateSetting_WithRightParameters_tr_TR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.SaveSettings_CallsUpdateSetting_WithRightParameters(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + public void SaveSettings_UpdatesCache() + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new MyNullableSettings(); + + this.MockModuleSettings(moduleInfo, new Hashtable()); + this.MockTabModuleSettings(moduleInfo, new Hashtable()); + this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); + var settingsRepository = new MyNullableSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + public void GetSettings_CallsGetCachedObject() + { + // Arrange + var moduleInfo = GetModuleInfo; + + this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new MyNullableSettings()); + var settingsRepository = new MyNullableSettingsRepository(); + + // Act + settingsRepository.GetSettings(moduleInfo); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("ar-JO")] + public void GetSettings_GetsValues_FromCorrectSettings_ar_JO(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("ca-ES")] + public void GetSettings_GetsValues_FromCorrectSettings_ca_ES(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("zh-CN")] + public void GetSettings_GetsValues_FromCorrectSettings_zh_CN(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("en-US")] + public void GetSettings_GetsValues_FromCorrectSettings_en_US(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("fr-FR")] + public void GetSettings_GetsValues_FromCorrectSettings_fr_FR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("he-IL")] + public void GetSettings_GetsValues_FromCorrectSettings_he_IL(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("ru-RU")] + public void GetSettings_GetsValues_FromCorrectSettings_ru_RU(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + [Test] + [TestCaseSource(nameof(NullableCases))] + [SetCulture("tr-TR")] + public void GetSettings_GetsValues_FromCorrectSettings_tr_TR(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + this.GetSettings_GetsValues_FromCorrectSettings(stringValue, integerValue, datetimeValue, timeSpanValue); + } + + private void SaveSettings_CallsUpdateSetting_WithRightParameters(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new MyNullableSettings + { + StringProperty = stringValue, + IntegerProperty = integerValue, + DateTimeProperty = datetimeValue, + TimeSpanProperty = timeSpanValue, + }; + + this.MockModuleSettings(moduleInfo, new Hashtable()); + this.MockTabModuleSettings(moduleInfo, new Hashtable()); + var expectedStringValue = stringValue ?? string.Empty; + this.MockModuleController.Setup(pc => pc.UpdateModuleSetting(ModuleId, "StringProperty", expectedStringValue)); + var integerString = integerValue?.ToString() ?? string.Empty; + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, "IntegerProperty", integerString, true, Null.NullString, false)); + var dateTimeString = datetimeValue?.ToString("o", CultureInfo.InvariantCulture) ?? string.Empty; + this.MockModuleController.Setup(mc => mc.UpdateModuleSetting(ModuleId, "DateTimeProperty", dateTimeString)); + var timeSpanString = timeSpanValue?.ToString("c", CultureInfo.InvariantCulture) ?? string.Empty; + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, "TimeSpanProperty", timeSpanString)); + + var settingsRepository = new MyNullableSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + private void GetSettings_GetsValues_FromCorrectSettings(string stringValue, int? integerValue, DateTime? datetimeValue, TimeSpan? timeSpanValue) + { + // Arrange + var expectedStringValue = stringValue ?? string.Empty; + var moduleInfo = GetModuleInfo; + var portalSettings = new Dictionary { ["IntegerProperty"] = integerValue?.ToString() ?? string.Empty, }; + var moduleSettings = new Hashtable { ["DateTimeProperty"] = datetimeValue?.ToString("o", CultureInfo.InvariantCulture) ?? string.Empty, ["StringProperty"] = expectedStringValue, }; + var tabModuleSettings = new Hashtable { ["TimeSpanProperty"] = timeSpanValue?.ToString("c", CultureInfo.InvariantCulture) ?? string.Empty, }; + + this.MockPortalSettings(moduleInfo, portalSettings); + this.MockModuleSettings(moduleInfo, moduleSettings); + this.MockTabModuleSettings(moduleInfo, tabModuleSettings); + + var settingsRepository = new MyNullableSettingsRepository(); + + // Act + var settings = settingsRepository.GetSettings(moduleInfo); + + // Assert + Assert.AreEqual(expectedStringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); + Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); + Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); + Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); + this.MockRepository.VerifyAll(); + } + + public class MyNullableSettings + { + [ModuleSetting] + public string StringProperty { get; set; } = "Default Value"; + + [PortalSetting] + public int? IntegerProperty { get; set; } = 500; + + [ModuleSetting] + public DateTime? DateTimeProperty { get; set; } = DateTime.MaxValue; + + [TabModuleSetting] + public TimeSpan? TimeSpanProperty { get; set; } = TimeSpan.FromHours(12); + } + + public class MyNullableSettingsRepository : SettingsRepository + {} + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs index 79e5aae36a4..d61e3644e80 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/PortalSettingsTests.cs @@ -2,10 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Entities.Modules.Settings -{ - using System; - using System.Collections.Generic; +namespace DotNetNuke.Tests.Core.Entities.Modules.Settings +{ + using System; + using System.Collections.Generic; using System.Globalization; using DotNetNuke.Abstractions; @@ -13,294 +13,292 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Modules.Settings; + using DotNetNuke.Entities.Modules.Settings; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class PortalSettingsTests : BaseSettingsTests - { - [SetUp] + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class PortalSettingsTests : BaseSettingsTests + { + [SetUp] public void Setup() { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] + } + + [TearDown] public void TearDown() { Globals.DependencyProvider = null; - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ar-JO")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ca-ES")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("zh-CN")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("en-US")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("fr-FR")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("he-IL")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ru-RU")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("tr-TR")] - public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - public void SaveSettings_UpdatesCache() - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new MyPortalSettings(); - - this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); - var settingsRepository = new MyPortalSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - public void GetSettings_CallsGetCachedObject() - { - // Arrange - var moduleInfo = GetModuleInfo; - - this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new MyPortalSettings()); - var settingsRepository = new MyPortalSettingsRepository(); - - // Act - settingsRepository.GetSettings(moduleInfo); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ar-JO")] - public void GetSettings_GetsValuesFrom_PortalSettings_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ca-ES")] - public void GetSettings_GetsValuesFrom_PortalSettings_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("zh-CN")] - public void GetSettings_GetsValuesFrom_PortalSettings_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("en-US")] - public void GetSettings_GetsValuesFrom_PortalSettings_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("fr-FR")] - public void GetSettings_GetsValuesFrom_PortalSettings_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("he-IL")] - public void GetSettings_GetsValuesFrom_PortalSettings_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ru-RU")] - public void GetSettings_GetsValuesFrom_PortalSettings_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("tr-TR")] - public void GetSettings_GetsValuesFrom_PortalSettings_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - private void SaveSettings_CallsUpdatePortalSetting_WithRightParameters(string stringValue, int integerValue, double doubleValue, - bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new MyPortalSettings - { - StringProperty = stringValue, - IntegerProperty = integerValue, - DoubleProperty = doubleValue, - BooleanProperty = booleanValue, - DateTimeProperty = datetimeValue, - TimeSpanProperty = timeSpanValue, - EnumProperty = enumValue, - ComplexProperty = complexValue, - }; - - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "StringProperty", stringValue, true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "IntegerProperty", integerValue.ToString(), true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture), true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "BooleanProperty", booleanValue.ToString(), true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture), true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture), true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "EnumProperty", enumValue.ToString(), true, Null.NullString, false)); - this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}", true, Null.NullString, false)); - - var settingsRepository = new MyPortalSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - private void GetSettings_GetsValuesFrom_PortalSettings(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var portalSettings = new Dictionary - { - { SettingNamePrefix + "StringProperty", stringValue }, - { SettingNamePrefix + "IntegerProperty", integerValue.ToString() }, - { SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "BooleanProperty", booleanValue.ToString() }, - { SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "EnumProperty", enumValue.ToString() }, - { SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}" }, - }; - - this.MockPortalSettings(moduleInfo, portalSettings); - - var settingsRepository = new MyPortalSettingsRepository(); - - // Act - var settings = settingsRepository.GetSettings(moduleInfo); - - // Assert - Assert.AreEqual(stringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); - Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); - Assert.AreEqual(doubleValue, settings.DoubleProperty, "The retrieved double property value is not equal to the stored one"); - Assert.AreEqual(booleanValue, settings.BooleanProperty, "The retrieved boolean property value is not equal to the stored one"); - Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); - Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); - Assert.AreEqual(enumValue, settings.EnumProperty, "The retrieved enum property value is not equal to the stored one"); - Assert.AreEqual(complexValue, settings.ComplexProperty, "The retrieved complex property value is not equal to the stored one"); - this.MockRepository.VerifyAll(); - } - - public class MyPortalSettings - { - [PortalSetting(Prefix = SettingNamePrefix)] - public string StringProperty { get; set; } = string.Empty; - - [PortalSetting(Prefix = SettingNamePrefix)] - public int IntegerProperty { get; set; } - - [PortalSetting(Prefix = SettingNamePrefix)] - public double DoubleProperty { get; set; } - - [PortalSetting(Prefix = SettingNamePrefix)] - public bool BooleanProperty { get; set; } - - [PortalSetting(Prefix = SettingNamePrefix)] - public DateTime DateTimeProperty { get; set; } = DateTime.Now; - - [PortalSetting(Prefix = SettingNamePrefix)] - public TimeSpan TimeSpanProperty { get; set; } = TimeSpan.Zero; - - [PortalSetting(Prefix = SettingNamePrefix)] - public TestingEnum EnumProperty { get; set; } = TestingEnum.Value1; - - [PortalSetting(Prefix = SettingNamePrefix, Serializer = "DotNetNuke.Tests.Core.Entities.Modules.Settings.ComplexTypeSerializer,DotNetNuke.Tests.Core")] - public ComplexType ComplexProperty { get; set; } = new ComplexType(20, 25); - } - - public class MyPortalSettingsRepository : SettingsRepository - {} - } -} + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ar-JO")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ca-ES")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("zh-CN")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("en-US")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("fr-FR")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("he-IL")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ru-RU")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("tr-TR")] + public void SaveSettings_CallsUpdatePortalSetting_WithRightParameters_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdatePortalSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + public void SaveSettings_UpdatesCache() + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new MyPortalSettings(); + + this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); + var settingsRepository = new MyPortalSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + public void GetSettings_CallsGetCachedObject() + { + // Arrange + var moduleInfo = GetModuleInfo; + + this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new MyPortalSettings()); + var settingsRepository = new MyPortalSettingsRepository(); + + // Act + settingsRepository.GetSettings(moduleInfo); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ar-JO")] + public void GetSettings_GetsValuesFrom_PortalSettings_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ca-ES")] + public void GetSettings_GetsValuesFrom_PortalSettings_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("zh-CN")] + public void GetSettings_GetsValuesFrom_PortalSettings_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("en-US")] + public void GetSettings_GetsValuesFrom_PortalSettings_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("fr-FR")] + public void GetSettings_GetsValuesFrom_PortalSettings_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("he-IL")] + public void GetSettings_GetsValuesFrom_PortalSettings_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ru-RU")] + public void GetSettings_GetsValuesFrom_PortalSettings_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("tr-TR")] + public void GetSettings_GetsValuesFrom_PortalSettings_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_PortalSettings(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + private void SaveSettings_CallsUpdatePortalSetting_WithRightParameters(string stringValue, int integerValue, double doubleValue, + bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new MyPortalSettings + { + StringProperty = stringValue, + IntegerProperty = integerValue, + DoubleProperty = doubleValue, + BooleanProperty = booleanValue, + DateTimeProperty = datetimeValue, + TimeSpanProperty = timeSpanValue, + EnumProperty = enumValue, + ComplexProperty = complexValue, + }; + + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "StringProperty", stringValue, true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "IntegerProperty", integerValue.ToString(), true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture), true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "BooleanProperty", booleanValue.ToString(), true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture), true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture), true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "EnumProperty", enumValue.ToString(), true, Null.NullString, false)); + this.MockPortalController.Setup(pc => pc.UpdatePortalSetting(PortalId, SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}", true, Null.NullString, false)); + + var settingsRepository = new MyPortalSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + private void GetSettings_GetsValuesFrom_PortalSettings(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var portalSettings = new Dictionary + { + { SettingNamePrefix + "StringProperty", stringValue }, + { SettingNamePrefix + "IntegerProperty", integerValue.ToString() }, + { SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "BooleanProperty", booleanValue.ToString() }, + { SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "EnumProperty", enumValue.ToString() }, + { SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}" }, + }; + + this.MockPortalSettings(moduleInfo, portalSettings); + + var settingsRepository = new MyPortalSettingsRepository(); + + // Act + var settings = settingsRepository.GetSettings(moduleInfo); + + // Assert + Assert.AreEqual(stringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); + Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); + Assert.AreEqual(doubleValue, settings.DoubleProperty, "The retrieved double property value is not equal to the stored one"); + Assert.AreEqual(booleanValue, settings.BooleanProperty, "The retrieved boolean property value is not equal to the stored one"); + Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); + Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); + Assert.AreEqual(enumValue, settings.EnumProperty, "The retrieved enum property value is not equal to the stored one"); + Assert.AreEqual(complexValue, settings.ComplexProperty, "The retrieved complex property value is not equal to the stored one"); + this.MockRepository.VerifyAll(); + } + + public class MyPortalSettings + { + [PortalSetting(Prefix = SettingNamePrefix)] + public string StringProperty { get; set; } = string.Empty; + + [PortalSetting(Prefix = SettingNamePrefix)] + public int IntegerProperty { get; set; } + + [PortalSetting(Prefix = SettingNamePrefix)] + public double DoubleProperty { get; set; } + + [PortalSetting(Prefix = SettingNamePrefix)] + public bool BooleanProperty { get; set; } + + [PortalSetting(Prefix = SettingNamePrefix)] + public DateTime DateTimeProperty { get; set; } = DateTime.Now; + + [PortalSetting(Prefix = SettingNamePrefix)] + public TimeSpan TimeSpanProperty { get; set; } = TimeSpan.Zero; + + [PortalSetting(Prefix = SettingNamePrefix)] + public TestingEnum EnumProperty { get; set; } = TestingEnum.Value1; + + [PortalSetting(Prefix = SettingNamePrefix, Serializer = "DotNetNuke.Tests.Core.Entities.Modules.Settings.ComplexTypeSerializer,DotNetNuke.Tests.Core")] + public ComplexType ComplexProperty { get; set; } = new ComplexType(20, 25); + } + + public class MyPortalSettingsRepository : SettingsRepository + {} + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs index a5a8e1a956c..cc799b4d0bb 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Modules/Settings/TabModuleSettingsTests.cs @@ -2,10 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Entities.Modules.Settings -{ - using System; - using System.Collections; +namespace DotNetNuke.Tests.Core.Entities.Modules.Settings +{ + using System; + using System.Collections; using System.Globalization; using DotNetNuke.Abstractions; @@ -15,293 +15,291 @@ namespace DotNetNuke.Tests.Core.Entities.Modules.Settings using DotNetNuke.Entities.Modules.Settings; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class TabModuleSettingsTests : BaseSettingsTests - { - [SetUp] + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class TabModuleSettingsTests : BaseSettingsTests + { + [SetUp] public void Setup() { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] + } + + [TearDown] public void TearDown() { Globals.DependencyProvider = null; - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ar-JO")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ca-ES")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("zh-CN")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("en-US")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("fr-FR")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("he-IL")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ru-RU")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("tr-TR")] - public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - public void SaveSettings_UpdatesCache() - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new MyTabModuleSettings(); - - this.MockTabModuleSettings(moduleInfo, new Hashtable()); - this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); - var settingsRepository = new MyTabModuleSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - public void GetSettings_CallsGetCachedObject() - { - // Arrange - var moduleInfo = GetModuleInfo; - - this.MockTabModuleSettings(moduleInfo, new Hashtable()); - this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new MyTabModuleSettings()); - var settingsRepository = new MyTabModuleSettingsRepository(); - - // Act - settingsRepository.GetSettings(moduleInfo); - - // Assert - this.MockRepository.VerifyAll(); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ar-JO")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ca-ES")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("zh-CN")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("en-US")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("fr-FR")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("he-IL")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("ru-RU")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - [Test] - [TestCaseSource(nameof(SettingsCases))] - [SetCulture("tr-TR")] - public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); - } - - private void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var settings = new MyTabModuleSettings - { - StringProperty = stringValue, - IntegerProperty = integerValue, - DoubleProperty = doubleValue, - BooleanProperty = booleanValue, - DateTimeProperty = datetimeValue, - TimeSpanProperty = timeSpanValue, - EnumProperty = enumValue, - ComplexProperty = complexValue, - }; - - this.MockTabModuleSettings(moduleInfo, new Hashtable()); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "StringProperty", stringValue)); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "IntegerProperty", integerValue.ToString())); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture))); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "BooleanProperty", booleanValue.ToString())); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture))); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture))); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "EnumProperty", enumValue.ToString())); - this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}")); - - var settingsRepository = new MyTabModuleSettingsRepository(); - - // Act - settingsRepository.SaveSettings(moduleInfo, settings); - - // Assert - this.MockRepository.VerifyAll(); - } - - private void GetSettings_GetsValuesFrom_ModuleSettingsCollection(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) - { - // Arrange - var moduleInfo = GetModuleInfo; - var tabModuleSettings = new Hashtable - { - { SettingNamePrefix + "StringProperty", stringValue }, - { SettingNamePrefix + "IntegerProperty", integerValue.ToString() }, - { SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "BooleanProperty", booleanValue.ToString() }, - { SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture) }, - { SettingNamePrefix + "EnumProperty", enumValue.ToString() }, - { SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}" }, - }; - - this.MockTabModuleSettings(moduleInfo, tabModuleSettings); - - var settingsRepository = new MyTabModuleSettingsRepository(); - - // Act - var settings = settingsRepository.GetSettings(moduleInfo); - - // Assert - Assert.AreEqual(stringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); - Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); - Assert.AreEqual(doubleValue, settings.DoubleProperty, "The retrieved double property value is not equal to the stored one"); - Assert.AreEqual(booleanValue, settings.BooleanProperty, "The retrieved boolean property value is not equal to the stored one"); - Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); - Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); - Assert.AreEqual(enumValue, settings.EnumProperty, "The retrieved enum property value is not equal to the stored one"); - Assert.AreEqual(complexValue, settings.ComplexProperty, "The retrieved complex property value is not equal to the stored one"); - this.MockRepository.VerifyAll(); - } - - public class MyTabModuleSettings - { - [TabModuleSetting(Prefix = SettingNamePrefix)] - public string StringProperty { get; set; } = string.Empty; - - [TabModuleSetting(Prefix = SettingNamePrefix)] - public int IntegerProperty { get; set; } - - [TabModuleSetting(Prefix = SettingNamePrefix)] - public double DoubleProperty { get; set; } - - [TabModuleSetting(Prefix = SettingNamePrefix)] - public bool BooleanProperty { get; set; } - - [TabModuleSetting(Prefix = SettingNamePrefix)] - public DateTime DateTimeProperty { get; set; } = DateTime.Now; - - [TabModuleSetting(Prefix = SettingNamePrefix)] - public TimeSpan TimeSpanProperty { get; set; } = TimeSpan.Zero; - - [TabModuleSetting(Prefix = SettingNamePrefix)] - public TestingEnum EnumProperty { get; set; } = TestingEnum.Value1; - - [TabModuleSetting(Prefix = SettingNamePrefix, Serializer = "DotNetNuke.Tests.Core.Entities.Modules.Settings.ComplexTypeSerializer,DotNetNuke.Tests.Core")] - public ComplexType ComplexProperty { get; set; } = new ComplexType(20, 25); - } - - public class MyTabModuleSettingsRepository : SettingsRepository - {} - } -} + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ar-JO")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ca-ES")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("zh-CN")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("en-US")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("fr-FR")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("he-IL")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ru-RU")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("tr-TR")] + public void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + public void SaveSettings_UpdatesCache() + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new MyTabModuleSettings(); + + this.MockTabModuleSettings(moduleInfo, new Hashtable()); + this.MockCache.Setup(c => c.Insert(CacheKey(moduleInfo), settings)); + var settingsRepository = new MyTabModuleSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + public void GetSettings_CallsGetCachedObject() + { + // Arrange + var moduleInfo = GetModuleInfo; + + this.MockTabModuleSettings(moduleInfo, new Hashtable()); + this.MockCache.Setup(c => c.GetItem("DNN_" + CacheKey(moduleInfo))).Returns(new MyTabModuleSettings()); + var settingsRepository = new MyTabModuleSettingsRepository(); + + // Act + settingsRepository.GetSettings(moduleInfo); + + // Assert + this.MockRepository.VerifyAll(); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ar-JO")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ar_JO(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ca-ES")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ca_ES(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("zh-CN")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_zh_CN(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("en-US")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_en_US(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("fr-FR")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_fr_FR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("he-IL")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_he_IL(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("ru-RU")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_ru_RU(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + [Test] + [TestCaseSource(nameof(SettingsCases))] + [SetCulture("tr-TR")] + public void GetSettings_GetsValuesFrom_ModuleSettingsCollection_tr_TR(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + this.GetSettings_GetsValuesFrom_ModuleSettingsCollection(stringValue, integerValue, doubleValue, booleanValue, datetimeValue, timeSpanValue, enumValue, complexValue); + } + + private void SaveSettings_CallsUpdateTabModuleSetting_WithRightParameters(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var settings = new MyTabModuleSettings + { + StringProperty = stringValue, + IntegerProperty = integerValue, + DoubleProperty = doubleValue, + BooleanProperty = booleanValue, + DateTimeProperty = datetimeValue, + TimeSpanProperty = timeSpanValue, + EnumProperty = enumValue, + ComplexProperty = complexValue, + }; + + this.MockTabModuleSettings(moduleInfo, new Hashtable()); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "StringProperty", stringValue)); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "IntegerProperty", integerValue.ToString())); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture))); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "BooleanProperty", booleanValue.ToString())); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture))); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture))); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "EnumProperty", enumValue.ToString())); + this.MockModuleController.Setup(mc => mc.UpdateTabModuleSetting(TabModuleId, SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}")); + + var settingsRepository = new MyTabModuleSettingsRepository(); + + // Act + settingsRepository.SaveSettings(moduleInfo, settings); + + // Assert + this.MockRepository.VerifyAll(); + } + + private void GetSettings_GetsValuesFrom_ModuleSettingsCollection(string stringValue, int integerValue, double doubleValue, bool booleanValue, DateTime datetimeValue, TimeSpan timeSpanValue, TestingEnum enumValue, ComplexType complexValue) + { + // Arrange + var moduleInfo = GetModuleInfo; + var tabModuleSettings = new Hashtable + { + { SettingNamePrefix + "StringProperty", stringValue }, + { SettingNamePrefix + "IntegerProperty", integerValue.ToString() }, + { SettingNamePrefix + "DoubleProperty", doubleValue.ToString(CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "BooleanProperty", booleanValue.ToString() }, + { SettingNamePrefix + "DateTimeProperty", datetimeValue.ToString("o", CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "TimeSpanProperty", timeSpanValue.ToString("c", CultureInfo.InvariantCulture) }, + { SettingNamePrefix + "EnumProperty", enumValue.ToString() }, + { SettingNamePrefix + "ComplexProperty", $"{complexValue.X} | {complexValue.Y}" }, + }; + + this.MockTabModuleSettings(moduleInfo, tabModuleSettings); + + var settingsRepository = new MyTabModuleSettingsRepository(); + + // Act + var settings = settingsRepository.GetSettings(moduleInfo); + + // Assert + Assert.AreEqual(stringValue, settings.StringProperty, "The retrieved string property value is not equal to the stored one"); + Assert.AreEqual(integerValue, settings.IntegerProperty, "The retrieved integer property value is not equal to the stored one"); + Assert.AreEqual(doubleValue, settings.DoubleProperty, "The retrieved double property value is not equal to the stored one"); + Assert.AreEqual(booleanValue, settings.BooleanProperty, "The retrieved boolean property value is not equal to the stored one"); + Assert.AreEqual(datetimeValue, settings.DateTimeProperty, "The retrieved datetime property value is not equal to the stored one"); + Assert.AreEqual(timeSpanValue, settings.TimeSpanProperty, "The retrieved timespan property value is not equal to the stored one"); + Assert.AreEqual(enumValue, settings.EnumProperty, "The retrieved enum property value is not equal to the stored one"); + Assert.AreEqual(complexValue, settings.ComplexProperty, "The retrieved complex property value is not equal to the stored one"); + this.MockRepository.VerifyAll(); + } + + public class MyTabModuleSettings + { + [TabModuleSetting(Prefix = SettingNamePrefix)] + public string StringProperty { get; set; } = string.Empty; + + [TabModuleSetting(Prefix = SettingNamePrefix)] + public int IntegerProperty { get; set; } + + [TabModuleSetting(Prefix = SettingNamePrefix)] + public double DoubleProperty { get; set; } + + [TabModuleSetting(Prefix = SettingNamePrefix)] + public bool BooleanProperty { get; set; } + + [TabModuleSetting(Prefix = SettingNamePrefix)] + public DateTime DateTimeProperty { get; set; } = DateTime.Now; + + [TabModuleSetting(Prefix = SettingNamePrefix)] + public TimeSpan TimeSpanProperty { get; set; } = TimeSpan.Zero; + + [TabModuleSetting(Prefix = SettingNamePrefix)] + public TestingEnum EnumProperty { get; set; } = TestingEnum.Value1; + + [TabModuleSetting(Prefix = SettingNamePrefix, Serializer = "DotNetNuke.Tests.Core.Entities.Modules.Settings.ComplexTypeSerializer,DotNetNuke.Tests.Core")] + public ComplexType ComplexProperty { get; set; } = new ComplexType(20, 25); + } + + public class MyTabModuleSettingsRepository : SettingsRepository + {} + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs index ab09e973f8c..029e2f61718 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Entities/Portals/PortalSettingsControllerTests.cs @@ -24,8 +24,6 @@ namespace DotNetNuke.Tests.Core.Entities.Portals using NUnit.Framework; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - [TestFixture] public class PortalSettingsControllerTests { @@ -47,33 +45,33 @@ public class PortalSettingsControllerTests private const string GlobalTabContainer = "[g]TabContainer"; private Mock mockHostController; - - [SetUp] - public void SetUp() - { - MockComponentProvider.ResetContainer(); - - var serviceCollection = new ServiceCollection(); - var mockApplicationInfo = new Mock(); - mockApplicationInfo.Setup(info => info.ApplicationMapPath).Returns("path/to/application"); - - this.mockHostController = new Mock(); - this.mockHostController.As(); - - serviceCollection.AddTransient(container => mockApplicationInfo.Object); - serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] - public void TearDown() - { - PortalController.ClearInstance(); - TabController.ClearInstance(); - Globals.DependencyProvider = null; - - } + + [SetUp] + public void SetUp() + { + MockComponentProvider.ResetContainer(); + + var serviceCollection = new ServiceCollection(); + var mockApplicationInfo = new Mock(); + mockApplicationInfo.Setup(info => info.ApplicationMapPath).Returns("path/to/application"); + + this.mockHostController = new Mock(); + this.mockHostController.As(); + + serviceCollection.AddTransient(container => mockApplicationInfo.Object); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + PortalController.ClearInstance(); + TabController.ClearInstance(); + Globals.DependencyProvider = null; + + } [Test] [TestCaseSource(typeof(PortalSettingsControllerTestFactory), "LoadPortalSettings_Loads_Default_Value")] diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs index 2ca670969dc..1a2dc6d3357 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileContentTypeManagerTests.cs @@ -2,73 +2,71 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Providers.Folder -{ +namespace DotNetNuke.Tests.Core.Providers.Folder +{ using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.Common.Internal; - using DotNetNuke.Common.Utilities; + using DotNetNuke.Common.Internal; + using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.FileSystem; + using DotNetNuke.Services.FileSystem; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; + using Moq; + using NUnit.Framework; - [TestFixture] - public class FileContentTypeManagerTests - { - [SetUp] - public void Setup() - { - var serviceCollection = new ServiceCollection(); + [TestFixture] + public class FileContentTypeManagerTests + { + [SetUp] + public void Setup() + { + var serviceCollection = new ServiceCollection(); var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - var _mockData = MockComponentProvider.CreateDataProvider(); - var _mockCache = MockComponentProvider.CreateDataCacheProvider(); - var _globals = new Mock(); - var _cbo = new Mock(); - - _mockData.Setup(m => m.GetProviderPath()).Returns(string.Empty); - - TestableGlobals.SetTestableInstance(_globals.Object); - CBO.SetTestableInstance(_cbo.Object); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - TestableGlobals.ClearInstance(); - CBO.ClearInstance(); - } - - [Test] - public void GetContentType_Returns_Known_Value_When_Extension_Is_Not_Managed() - { - const string notManagedExtension = "asdf609vas21AS:F,l/&%/(%$"; - - var contentType = FileContentTypeManager.Instance.GetContentType(notManagedExtension); - - Assert.AreEqual("application/octet-stream", contentType); - } - - [Test] - public void GetContentType_Returns_Correct_Value_For_Extension() - { - const string notManagedExtension = "htm"; - - var contentType = FileContentTypeManager.Instance.GetContentType(notManagedExtension); - - Assert.AreEqual("text/html", contentType); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + var _mockData = MockComponentProvider.CreateDataProvider(); + var _mockCache = MockComponentProvider.CreateDataCacheProvider(); + var _globals = new Mock(); + var _cbo = new Mock(); + + _mockData.Setup(m => m.GetProviderPath()).Returns(string.Empty); + + TestableGlobals.SetTestableInstance(_globals.Object); + CBO.SetTestableInstance(_cbo.Object); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + TestableGlobals.ClearInstance(); + CBO.ClearInstance(); + } + + [Test] + public void GetContentType_Returns_Known_Value_When_Extension_Is_Not_Managed() + { + const string notManagedExtension = "asdf609vas21AS:F,l/&%/(%$"; + + var contentType = FileContentTypeManager.Instance.GetContentType(notManagedExtension); + + Assert.AreEqual("application/octet-stream", contentType); + } + + [Test] + public void GetContentType_Returns_Correct_Value_For_Extension() + { + const string notManagedExtension = "htm"; + + var contentType = FileContentTypeManager.Instance.GetContentType(notManagedExtension); + + Assert.AreEqual("text/html", contentType); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs index 3030d226003..70c8d21367b 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Providers/Folder/FileManagerTests.cs @@ -2,1138 +2,1136 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Providers.Folder -{ - using System; - using System.Data; - using System.Drawing; - using System.IO; +namespace DotNetNuke.Tests.Core.Providers.Folder +{ + using System; + using System.Data; + using System.Drawing; + using System.IO; using System.Text; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.Common.Internal; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; - using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Workflow; - using DotNetNuke.Entities.Content.Workflow.Entities; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.FileSystem; - using DotNetNuke.Services.FileSystem.Internal; - using DotNetNuke.Services.Log.EventLog; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Common.Internal; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Data; + using DotNetNuke.Entities.Content; + using DotNetNuke.Entities.Content.Workflow; + using DotNetNuke.Entities.Content.Workflow.Entities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Security.Permissions; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.FileSystem; + using DotNetNuke.Services.FileSystem.Internal; + using DotNetNuke.Services.Log.EventLog; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class FileManagerTests - { - private FileManager fileManager; - private Mock folderManager; - private Mock folderPermissionController; - private Mock portalController; - private Mock folderMappingController; - private Mock globals; - private Mock cbo; - private Mock mockData; - private Mock mockFolder; - private Mock mockCache; - private Mock mockFileManager; - private Mock folderInfo; - private Mock fileInfo; - private Mock pathUtils; - private Mock fileVersionController; - private Mock workflowManager; - private Mock> fileEventHandlersContainer; - private Mock mockFileLockingController; - private Mock mockFileDeletionController; - private Mock hostController; - - [SetUp] - public void Setup() - { - this.mockData = MockComponentProvider.CreateDataProvider(); - this.mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); - this.mockCache = MockComponentProvider.CreateDataCacheProvider(); - - this.folderManager = new Mock(); - this.folderPermissionController = new Mock(); - this.portalController = new Mock(); - this.hostController = new Mock(); - this.hostController.As(); - this.folderMappingController = new Mock(); - this.fileVersionController = new Mock(); - this.workflowManager = new Mock(); - this.fileEventHandlersContainer = new Mock>(); - this.globals = new Mock(); - this.cbo = new Mock(); - this.pathUtils = new Mock(); - this.mockFileLockingController = new Mock(); - this.mockFileDeletionController = new Mock(); - - EventLogController.SetTestableInstance(Mock.Of()); - FolderManager.RegisterInstance(this.folderManager.Object); - FolderPermissionController.SetTestableInstance(this.folderPermissionController.Object); - PortalController.SetTestableInstance(this.portalController.Object); - FolderMappingController.RegisterInstance(this.folderMappingController.Object); - TestableGlobals.SetTestableInstance(this.globals.Object); - CBO.SetTestableInstance(this.cbo.Object); - PathUtils.RegisterInstance(this.pathUtils.Object); - FileVersionController.RegisterInstance(this.fileVersionController.Object); - WorkflowManager.SetTestableInstance(this.workflowManager.Object); - EventHandlersContainer.RegisterInstance(this.fileEventHandlersContainer.Object); - this.mockFileManager = new Mock { CallBase = true }; - - this.folderInfo = new Mock(); - this.fileInfo = new Mock(); - - this.fileManager = new FileManager(); - - FileLockingController.SetTestableInstance(this.mockFileLockingController.Object); + + using Moq; + + using NUnit.Framework; + + using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; + [TestFixture] + public class FileManagerTests + { + private FileManager fileManager; + private Mock folderManager; + private Mock folderPermissionController; + private Mock portalController; + private Mock folderMappingController; + private Mock globals; + private Mock cbo; + private Mock mockData; + private Mock mockFolder; + private Mock mockCache; + private Mock mockFileManager; + private Mock folderInfo; + private Mock fileInfo; + private Mock pathUtils; + private Mock fileVersionController; + private Mock workflowManager; + private Mock> fileEventHandlersContainer; + private Mock mockFileLockingController; + private Mock mockFileDeletionController; + private Mock hostController; + + [SetUp] + public void Setup() + { + this.mockData = MockComponentProvider.CreateDataProvider(); + this.mockFolder = MockComponentProvider.CreateFolderProvider(Constants.FOLDER_ValidFolderProviderType); + this.mockCache = MockComponentProvider.CreateDataCacheProvider(); + + this.folderManager = new Mock(); + this.folderPermissionController = new Mock(); + this.portalController = new Mock(); + this.hostController = new Mock(); + this.hostController.As(); + this.folderMappingController = new Mock(); + this.fileVersionController = new Mock(); + this.workflowManager = new Mock(); + this.fileEventHandlersContainer = new Mock>(); + this.globals = new Mock(); + this.cbo = new Mock(); + this.pathUtils = new Mock(); + this.mockFileLockingController = new Mock(); + this.mockFileDeletionController = new Mock(); + + EventLogController.SetTestableInstance(Mock.Of()); + FolderManager.RegisterInstance(this.folderManager.Object); + FolderPermissionController.SetTestableInstance(this.folderPermissionController.Object); + PortalController.SetTestableInstance(this.portalController.Object); + FolderMappingController.RegisterInstance(this.folderMappingController.Object); + TestableGlobals.SetTestableInstance(this.globals.Object); + CBO.SetTestableInstance(this.cbo.Object); + PathUtils.RegisterInstance(this.pathUtils.Object); + FileVersionController.RegisterInstance(this.fileVersionController.Object); + WorkflowManager.SetTestableInstance(this.workflowManager.Object); + EventHandlersContainer.RegisterInstance(this.fileEventHandlersContainer.Object); + this.mockFileManager = new Mock { CallBase = true }; + + this.folderInfo = new Mock(); + this.fileInfo = new Mock(); + + this.fileManager = new FileManager(); + + FileLockingController.SetTestableInstance(this.mockFileLockingController.Object); FileDeletionController.SetTestableInstance(this.mockFileDeletionController.Object); var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => (INewHostController)this.hostController.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - TestableGlobals.ClearInstance(); - CBO.ClearInstance(); - - FolderPermissionController.ClearInstance(); - FileLockingController.ClearInstance(); - FileDeletionController.ClearInstance(); - MockComponentProvider.ResetContainer(); - PortalController.ClearInstance(); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void AddFile_Throws_On_Null_Folder() - { - this.fileManager.AddFile(null, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void AddFile_Throws_On_Null_Or_Empty_FileName(string fileName) - { - this.fileManager.AddFile(this.folderInfo.Object, fileName, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void AddFile_Throws_On_Null_FileContent() - { - this.fileManager.AddFile(this.folderInfo.Object, It.IsAny(), null, It.IsAny(), It.IsAny(), It.IsAny()); - } - - [Test] - [ExpectedException(typeof(PermissionsNotMetException))] - public void AddFile_Throws_When_Permissions_Are_Not_Met() - { - this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(false); - - this.fileManager.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, new MemoryStream(), It.IsAny(), true, It.IsAny()); - } - - [Test] - [ExpectedException(typeof(NoSpaceAvailableException))] - public void AddFile_Throws_When_Portal_Has_No_Space_Available() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.mockData.Setup(c => c.GetProviderPath()).Returns(string.Empty); - - var fileContent = new MemoryStream(); - - this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(false); - - this.mockFileManager.Setup(fm => fm.CreateFileContentItem()).Returns(new ContentItem()); - this.mockFileManager.Setup(fm => fm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); - - this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); - } - - [Test] - public void AddFile_Checks_Space_For_Stream_Length() - { - // Arrange - this.PrepareFileSecurityCheck(); - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); - - var fileContent = new MemoryStream(Encoding.ASCII.GetBytes("some data here")); - - this.portalController.Setup(pc => pc.HasSpaceAvailable(It.IsAny(), It.IsAny())).Returns(true); - - this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); - this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); - - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); - this.mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); - this.mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); - - this.workflowManager.Setup(we => we.GetWorkflow(It.IsAny())).Returns((Workflow)null); - - // Act - this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, false, Constants.CONTENTTYPE_ValidContentType); - - // Assert - this.portalController.Verify(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)); - } - - [Test] - [ExpectedException(typeof(InvalidFileExtensionException))] - public void AddFile_Throws_When_Extension_Is_Invalid() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - - var fileContent = new MemoryStream(); - - this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(false); - - this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); - } - - [TestCase("invalid_script.svg")] - [TestCase("invalid_onload.svg")] - [TestCase("invalid_onerror.svg")] - [ExpectedException(typeof(InvalidFileContentException))] - public void AddFile_Throws_When_File_Content_Is_Invalid(string fileName) - { - this.PrepareFileSecurityCheck(); - - using (var fileContent = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources\\{fileName}"))) - { - this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); - - this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); - } - } - - [Test] - public void AddFile_No_Error_When_File_Content_Is_Valid() - { - this.PrepareFileSecurityCheck(); - - using (var fileContent = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources\\valid.svg"))) - { - this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); - this.mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); - - this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); - } - } - - [Test] - public void AddFile_Does_Not_Call_FolderProvider_AddFile_When_Not_Overwritting_And_File_Exists() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); - - var fileContent = new MemoryStream(); - - this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); - - this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); - this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)); - this.mockFolder.Setup(mf => mf.GetHashCode(It.IsAny())).Returns("aaa"); - - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); - this.mockFileManager.Setup(mfm => mfm.UpdateFile(It.IsAny(), It.IsAny())); - this.mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); - - this.workflowManager.Setup(wc => wc.GetWorkflow(It.IsAny())).Returns((Workflow)null); - - this.mockData.Setup( - md => - md.AddFile( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(Constants.FOLDER_ValidFileId); - - this.mockData.Setup(md => md.UpdateFileLastModificationTime(It.IsAny(), It.IsAny())); - - this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); - - this.mockFolder.Verify(mf => mf.AddFile(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void CopyFile_Throws_On_Null_File() - { - this.fileManager.CopyFile(null, this.folderInfo.Object); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void CopyFile_Throws_On_Null_DestinationFolder() - { - this.fileManager.CopyFile(this.fileInfo.Object, null); - } - - [Test] - public void CopyFile_Calls_FileManager_AddFile_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Not_Equal() - { - const int sourceFolderMappingID = Constants.FOLDER_ValidFolderMappingID; - const int destinationFolderMappingID = Constants.FOLDER_ValidFolderMappingID + 1; - - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.ContentType).Returns(Constants.CONTENTTYPE_ValidContentType); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(sourceFolderMappingID); - - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(destinationFolderMappingID); - - var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - var fileContent = new MemoryStream(bytes); - - this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); - this.mockFileManager.Setup(mfm => mfm.CopyContentItem(It.IsAny())).Returns(Constants.CONTENT_ValidContentItemId); - this.mockFileManager.Setup(mfm => mfm.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny(), true, true, Constants.CONTENTTYPE_ValidContentType)); - - this.mockFileManager.Object.CopyFile(this.fileInfo.Object, this.folderInfo.Object); - - this.mockFileManager.Verify(fm => fm.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, true, Constants.CONTENTTYPE_ValidContentType), Times.Once()); - } - - [Test] - [ExpectedException(typeof(PermissionsNotMetException))] - public void CopyFile_Throws_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Equal_And_Cannot_Add_Folder() - { - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(false); - - this.fileManager.CopyFile(this.fileInfo.Object, this.folderInfo.Object); - } - - [Test] - [ExpectedException(typeof(NoSpaceAvailableException))] - public void CopyFile_Throws_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Equal_And_Portal_Has_No_Space_Available() - { - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.fileInfo.Setup(fi => fi.Size).Returns(Constants.FOLDER_ValidFileSize); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - - this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(true); - this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileSize)).Returns(false); - - this.fileManager.CopyFile(this.fileInfo.Object, this.folderInfo.Object); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void DeleteFile_Throws_On_Null_File() - { - this.fileManager.DeleteFile(null); - } - - [Test] - public void DeleteFile_Calls_FileDeletionControllerDeleteFile() - { - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this.fileInfo.Object)).Verifiable(); - - this.mockFileManager.Object.DeleteFile(this.fileInfo.Object); - - this.mockFileDeletionController.Verify(); - } - - [Test] - [ExpectedException(typeof(FolderProviderException))] - public void DeleteFile_Throws_WhenFileDeletionControllerThrows() - { - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this.fileInfo.Object)) - .Throws(); - - this.mockFileManager.Object.DeleteFile(this.fileInfo.Object); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void DownloadFile_Throws_On_Null_File() - { - this.fileManager.WriteFileToResponse(null, ContentDisposition.Inline); - } - - [Test] - [ExpectedException(typeof(PermissionsNotMetException))] - public void DownloadFile_Throws_When_Permissions_Are_Not_Met() - { - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(false); - - this.fileManager.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - } - - [Test] - public void DownloadFile_Calls_FileManager_AutoSyncFile_When_File_AutoSync_Is_Enabled() - { - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); - - this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(true); - this.mockFileManager.Setup(mfm => mfm.AutoSyncFile(this.fileInfo.Object)).Verifiable(); - this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())); - - this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - - this.mockFileManager.Verify(); - } - - [Test] - public void DownloadFile_Does_Not_Call_FileManager_AutoSyncFile_When_File_AutoSync_Is_Not_Enabled() - { - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); - - this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); - this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())); - - this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - - this.mockFileManager.Verify(mfm => mfm.AutoSyncFile(this.fileInfo.Object), Times.Never()); - } - - [Test] - public void DownloadFile_Calls_FileManager_WriteBytesToHttpContext() - { - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); - - this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); - this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())).Verifiable(); - - this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); - - this.mockFileManager.Verify(); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void ExistsFile_Throws_On_Null_Folder() - { - this.fileManager.FileExists(null, It.IsAny()); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void ExistsFile_Throws_On_Null_Or_Empty_FileName(string fileName) - { - this.fileManager.FileExists(this.folderInfo.Object, fileName); - } - - [Test] - public void ExistsFile_Calls_FileManager_GetFile() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - - this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(null).Verifiable(); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - - this.mockFileManager.Verify(); - } - - [Test] - public void ExistsFile_Calls_FolderProvider_ExistsFile() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true).Verifiable(); - - this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - - this.mockFolder.Verify(); - } - - [Test] - public void ExistsFile_Returns_True_When_File_Exists() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); - - var result = this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - - Assert.IsTrue(result); - } - - [Test] - public void ExistsFile_Returns_False_When_File_Does_Not_Exist() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); - - var result = this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - - Assert.IsFalse(result); - } - - [Test] - [ExpectedException(typeof(FolderProviderException))] - public void ExistsFile_Throws_When_FolderProvider_Throws() - { - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Throws(); - - this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void GetFile_Throws_On_Null_Or_Empty_FileName(string fileName) - { - this.fileManager.GetFile(this.folderInfo.Object, fileName); - } - - [Test] - public void GetFile_Calls_DataProvider_GetFile() - { - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - - this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); - - this.fileManager.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName); - - this.mockData.Verify(); - } - - [Test] - public void GetFile_Handles_Path_In_Portal_Root() - { - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, string.Empty)).Returns(this.folderInfo.Object).Verifiable(); - this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); - - this.fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileName); - - this.folderManager.Verify(); - this.mockData.Verify(); - } - - [Test] - public void GetFile_Handles_Path_Beyond_Portal_Root() - { - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); - this.folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this.folderInfo.Object).Verifiable(); - this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); - - this.fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath + Constants.FOLDER_ValidFileName); - - this.folderManager.Verify(); - this.mockData.Verify(); - } - - [Test] - public void GetFileByID_Does_Not_Call_DataCache_GetCache_If_FileId_Is_Not_Valid() - { - this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this.fileInfo.Object).Verifiable(); - - this.fileManager.GetFile(Constants.FOLDER_InvalidFileId); - - this.mockCache.Verify(mc => mc.GetItem(It.IsAny()), Times.Never()); - } - - [Test] - public void GetFileByID_Calls_DataCache_GetCache_First() - { - this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this.fileInfo.Object).Verifiable(); - - this.fileManager.GetFile(Constants.FOLDER_ValidFileId); - - this.mockCache.Verify(); - } - - [Test] - public void GetFileByID_Calls_DataProvider_GetFileById_When_File_Is_Not_In_Cache() - { - this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(null); - - this.fileManager.GetFile(Constants.FOLDER_ValidFileId); - - this.mockData.Verify(md => md.GetFileById(Constants.FOLDER_ValidFileId, It.IsAny()), Times.Once()); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void MoveFile_Throws_On_Null_File() - { - this.fileManager.MoveFile(null, this.folderInfo.Object); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void MoveFile_Throws_On_Null_DestinationFolder() - { - this.fileManager.MoveFile(this.fileInfo.Object, null); - } - - [Test] - public void MoveFile_Calls_FolderProvider_AddFile_And_DeleteFile_And_FileManager_UpdateFile() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - var fileContent = new MemoryStream(); - - this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); - string someString; - this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); - this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); - - this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); - this.mockFolder.Setup(mf => mf.DeleteFile(this.fileInfo.Object)).Verifiable(); - - this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)).Verifiable(); - - this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); - - this.mockFolder.Verify(); - this.mockFileManager.Verify(); - } - - [Test] - public void MoveFile_Updates_FolderId_And_Folder() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this.fileInfo.Setup(fi => fi.Folder).Returns(Constants.FOLDER_ValidFolderRelativePath); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_OtherValidFolderRelativePath); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.fileInfo.SetupSet(fi => fi.FolderId = Constants.FOLDER_OtherValidFolderId).Verifiable(); - this.fileInfo.SetupSet(fi => fi.Folder = Constants.FOLDER_OtherValidFolderRelativePath).Verifiable(); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - var fileContent = new MemoryStream(); - - this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); - string someString; - this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); - this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); - this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); - - this.fileInfo.Verify(); - } - - [Test] - public void MoveFile_Calls_DeleteFile_When_A_File_With_The_Same_Name_Exists_On_The_Destination_Folder() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - var fileContent = new MemoryStream(); - - this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); - string someString; - this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); - this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); - - var existingFile = new FileInfo(); - this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(existingFile); - - this.mockFileManager.Setup(mfm => mfm.DeleteFile(existingFile)).Verifiable(); - - this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); - - this.mockFileManager.Verify(); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void RenameFile_Throws_On_Null_File() - { - this.fileManager.RenameFile(null, It.IsAny()); - } - - [Test] - [TestCase(null)] - [TestCase("")] - [ExpectedException(typeof(ArgumentException))] - public void RenameFile_Throws_On_Null_Or_Empty_NewFileName(string newFileName) - { - this.fileManager.RenameFile(this.fileInfo.Object, newFileName); - } - - [Test] - public void RenameFile_Calls_FolderProvider_RenameFile_When_FileNames_Are_Distinct_And_NewFileName_Does_Not_Exist() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); - this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)); - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); - - var folderMapping = new FolderMappingInfo(); - folderMapping.FolderProviderType = Constants.FOLDER_ValidFolderProviderType; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); - - this.mockFolder.Verify(mf => mf.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName), Times.Once()); - } - - [Test] - public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_FileNames_Are_Equal() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - - this.fileManager.RenameFile(this.fileInfo.Object, Constants.FOLDER_ValidFileName); - - this.mockFolder.Verify(mf => mf.RenameFile(this.fileInfo.Object, It.IsAny()), Times.Never()); - } - - [Test] - [ExpectedException(typeof(FileAlreadyExistsException))] - public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_NewFileName_Exists() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(true); - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); - - this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); - } - - [Test] - [ExpectedException(typeof(InvalidFileExtensionException))] - public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_InvalidExtensionType() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - this.mockFileManager.Setup(fm => fm.IsAllowedExtension(It.IsAny())).Returns(false); - - this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherInvalidFileNameExtension); - } - - [Test] - [ExpectedException(typeof(FolderProviderException))] - public void RenameFile_Throws_When_FolderProvider_Throws() - { - this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); - this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); - this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); - this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - - this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); - - this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); - this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)); - this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); - - var folderMapping = new FolderMappingInfo(); - folderMapping.FolderProviderType = Constants.FOLDER_ValidFolderProviderType; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.mockFolder.Setup(mf => mf.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName)).Throws(); - - this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void UnzipFile_Throws_On_Null_File() - { - this.fileManager.UnzipFile(null, It.IsAny()); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void UnzipFile_Throws_On_Null_DestinationFolder() - { - this.fileManager.UnzipFile(It.IsAny(), null); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void UnzipFile_Throws_When_File_Extension_Is_Not_Zip() - { - this.fileInfo.Setup(fi => fi.Extension).Returns("txt"); - - this.fileManager.UnzipFile(this.fileInfo.Object, It.IsAny()); - } - - [Test] - public void UnzipFile_Calls_FileManager_ExtractFiles() - { - this.fileInfo.Setup(fi => fi.Extension).Returns("zip"); - - this.mockFileManager.Setup(mfm => mfm.ExtractFiles(this.fileInfo.Object, this.folderInfo.Object, null)).Verifiable(); - - this.mockFileManager.Object.UnzipFile(this.fileInfo.Object, this.folderInfo.Object); - - this.mockFileManager.Verify(); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void UpdateFile_Throws_On_Null_File() - { - this.fileManager.UpdateFile(null); - } - - [Test] - public void UpdateFile_Calls_DataProvider_UpdateFile() - { - this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - this.mockFileManager.Object.UpdateFile(this.fileInfo.Object); - - this.mockData.Verify( - md => md.UpdateFile( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny()), - Times.Once()); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void UpdateFile_Throws_On_Null_File_Overload() - { - this.fileManager.UpdateFile(null, It.IsAny()); - } - - [Test] - public void UpdateFile_Sets_With_And_Height_When_File_Is_Image() - { - var image = new Bitmap(10, 20); - - this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(true); - this.mockFileManager.Setup(mfm => mfm.GetImageFromStream(It.IsAny())).Returns(image); - this.mockFileManager.Setup(mfm => mfm.GetHash(this.fileInfo.Object)); - - var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - var stream = new MemoryStream(bytes); - - this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - - this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); - this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); - - this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); - - this.fileInfo.VerifySet(fi => fi.Width = 10); - this.fileInfo.VerifySet(fi => fi.Height = 20); - } - - [Test] - public void UpdateFile_Sets_SHA1Hash() - { - var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - var stream = new MemoryStream(bytes); - - this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(false); - this.mockFileManager.Setup(mfm => mfm.GetHash(stream)).Returns(Constants.FOLDER_UnmodifiedFileHash); - - this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - - this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); - this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); - - this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); - - this.fileInfo.VerifySet(fi => fi.SHA1Hash = Constants.FOLDER_UnmodifiedFileHash); - } - - [Test] - public void UpdateFile_Calls_FileManager_UpdateFile_Overload() - { - var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - var stream = new MemoryStream(bytes); - - this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(false); - this.mockFileManager.Setup(mfm => mfm.GetHash(this.fileInfo.Object)).Returns(Constants.FOLDER_UnmodifiedFileHash); - - this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); - - this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); - this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); - - this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); - - this.mockFileManager.Verify(mfm => mfm.UpdateFile(this.fileInfo.Object), Times.Once()); - } - - [Test] - [ExpectedException(typeof(ArgumentNullException))] - public void GetSeekableStream_Throws_On_Null_Stream() - { - this.fileManager.GetSeekableStream(null); - } - - [Test] - public void GetSeekableStream_Returns_The_Same_Stream_If_It_Is_Seekable() - { - var inputStream = new MemoryStream(); - var seekableStream = this.fileManager.GetSeekableStream(inputStream); - - Assert.AreEqual(inputStream, seekableStream); - } - - [Test] - public void GetSeekableStream_Calls_GetHostMapPath_And_Creates_A_Temporary_FileStream_With_Resx_Extension() - { - var inputStream = new Mock(); - inputStream.Setup(s => s.CanSeek).Returns(false); - inputStream.Setup(s => s.Read(It.IsAny(), It.IsAny(), It.IsAny())).Returns(0); - - this.mockFileManager.Setup(mfm => mfm.GetHostMapPath()).Returns(string.Empty).Verifiable(); - this.mockFileManager.Setup(mfm => mfm.GetAutoDeleteFileStream(It.Is((string x) => x.EndsWith(".resx")))).Returns(new MemoryStream()).Verifiable(); - - this.mockFileManager.Object.GetSeekableStream(inputStream.Object); - - this.mockFileManager.Verify(); - } - - private void PrepareFileSecurityCheck() - { - this.mockData.Setup(p => p.GetListEntriesByListName("FileSecurityChecker", string.Empty, Null.NullInteger)).Returns(() => - { - var dataTable = new DataTable(); - dataTable.Columns.Add("EntryID", typeof(int)); - dataTable.Columns.Add("ListName", typeof(string)); - dataTable.Columns.Add("Value", typeof(string)); - dataTable.Columns.Add("Text", typeof(string)); - dataTable.Columns.Add("Level", typeof(int)); - dataTable.Columns.Add("SortOrder", typeof(int)); - dataTable.Columns.Add("DefinitionID", typeof(int)); - dataTable.Columns.Add("ParentID", typeof(int)); - dataTable.Columns.Add("Description", typeof(string)); - dataTable.Columns.Add("PortalID", typeof(int)); - dataTable.Columns.Add("SystemList", typeof(bool)); - dataTable.Columns.Add("ParentKey", typeof(string)); - dataTable.Columns.Add("Parent", typeof(string)); - dataTable.Columns.Add("ParentList", typeof(string)); - dataTable.Columns.Add("MaxSortOrder", typeof(int)); - dataTable.Columns.Add("EntryCount", typeof(int)); - dataTable.Columns.Add("HasChildren", typeof(int)); - dataTable.Columns.Add("CreatedByUserID", typeof(int)); - dataTable.Columns.Add("CreatedOnDate", typeof(DateTime)); - dataTable.Columns.Add("LastModifiedByUserID", typeof(int)); - dataTable.Columns.Add("LastModifiedOnDate", typeof(DateTime)); - - dataTable.Rows.Add(1, "FileSecurityChecker", "svg", - "DotNetNuke.Services.FileSystem.Internal.SecurityCheckers.SvgFileChecker, DotNetNuke", - 0, 0, -1, -0, string.Empty, -1, 1, string.Empty, string.Empty, string.Empty, 0, 1, 0, -1, DateTime.Now, -1, DateTime.Now); - - return dataTable.CreateDataReader(); - }); - this.hostController.Setup(c => c.GetString("PerformanceSetting")).Returns("NoCaching"); - this.globals.Setup(g => g.HostMapPath).Returns(AppDomain.CurrentDomain.BaseDirectory); - - var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; - - this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); - - this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); - this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); - } - - private class UnSeekableStream : MemoryStream - { - public override bool CanSeek - { - get { return false; } - } - } - } -} + serviceCollection.AddTransient(container => (IHostSettingsService)this.hostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + TestableGlobals.ClearInstance(); + CBO.ClearInstance(); + + FolderPermissionController.ClearInstance(); + FileLockingController.ClearInstance(); + FileDeletionController.ClearInstance(); + MockComponentProvider.ResetContainer(); + PortalController.ClearInstance(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void AddFile_Throws_On_Null_Folder() + { + this.fileManager.AddFile(null, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void AddFile_Throws_On_Null_Or_Empty_FileName(string fileName) + { + this.fileManager.AddFile(this.folderInfo.Object, fileName, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void AddFile_Throws_On_Null_FileContent() + { + this.fileManager.AddFile(this.folderInfo.Object, It.IsAny(), null, It.IsAny(), It.IsAny(), It.IsAny()); + } + + [Test] + [ExpectedException(typeof(PermissionsNotMetException))] + public void AddFile_Throws_When_Permissions_Are_Not_Met() + { + this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(false); + + this.fileManager.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, new MemoryStream(), It.IsAny(), true, It.IsAny()); + } + + [Test] + [ExpectedException(typeof(NoSpaceAvailableException))] + public void AddFile_Throws_When_Portal_Has_No_Space_Available() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.mockData.Setup(c => c.GetProviderPath()).Returns(string.Empty); + + var fileContent = new MemoryStream(); + + this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(false); + + this.mockFileManager.Setup(fm => fm.CreateFileContentItem()).Returns(new ContentItem()); + this.mockFileManager.Setup(fm => fm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); + + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + } + + [Test] + public void AddFile_Checks_Space_For_Stream_Length() + { + // Arrange + this.PrepareFileSecurityCheck(); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); + + var fileContent = new MemoryStream(Encoding.ASCII.GetBytes("some data here")); + + this.portalController.Setup(pc => pc.HasSpaceAvailable(It.IsAny(), It.IsAny())).Returns(true); + + this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); + this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); + + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); + + this.workflowManager.Setup(we => we.GetWorkflow(It.IsAny())).Returns((Workflow)null); + + // Act + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, false, Constants.CONTENTTYPE_ValidContentType); + + // Assert + this.portalController.Verify(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)); + } + + [Test] + [ExpectedException(typeof(InvalidFileExtensionException))] + public void AddFile_Throws_When_Extension_Is_Invalid() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + + var fileContent = new MemoryStream(); + + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(false); + + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + } + + [TestCase("invalid_script.svg")] + [TestCase("invalid_onload.svg")] + [TestCase("invalid_onerror.svg")] + [ExpectedException(typeof(InvalidFileContentException))] + public void AddFile_Throws_When_File_Content_Is_Invalid(string fileName) + { + this.PrepareFileSecurityCheck(); + + using (var fileContent = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources\\{fileName}"))) + { + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); + + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + } + } + + [Test] + public void AddFile_No_Error_When_File_Content_Is_Valid() + { + this.PrepareFileSecurityCheck(); + + using (var fileContent = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources\\valid.svg"))) + { + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidSvgFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsImageFile(It.IsAny())).Returns(false); + + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidSvgFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + } + } + + [Test] + public void AddFile_Does_Not_Call_FolderProvider_AddFile_When_Not_Overwritting_And_File_Exists() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.PhysicalPath).Returns(Constants.FOLDER_ValidFolderPath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.WorkflowID).Returns(Null.NullInteger); + + var fileContent = new MemoryStream(); + + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, fileContent.Length)).Returns(true); + + this.globals.Setup(g => g.GetSubFolderPath(Constants.FOLDER_ValidFilePath, Constants.CONTENT_ValidPortalId)).Returns(Constants.FOLDER_ValidFolderRelativePath); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)); + this.mockFolder.Setup(mf => mf.GetHashCode(It.IsAny())).Returns("aaa"); + + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_ValidFileName)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(It.IsAny(), It.IsAny())); + this.mockFileManager.Setup(mfm => mfm.CreateFileContentItem()).Returns(new ContentItem()); + + this.workflowManager.Setup(wc => wc.GetWorkflow(It.IsAny())).Returns((Workflow)null); + + this.mockData.Setup( + md => + md.AddFile( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(Constants.FOLDER_ValidFileId); + + this.mockData.Setup(md => md.UpdateFileLastModificationTime(It.IsAny(), It.IsAny())); + + this.mockFileManager.Object.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, false, false, Constants.CONTENTTYPE_ValidContentType); + + this.mockFolder.Verify(mf => mf.AddFile(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void CopyFile_Throws_On_Null_File() + { + this.fileManager.CopyFile(null, this.folderInfo.Object); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void CopyFile_Throws_On_Null_DestinationFolder() + { + this.fileManager.CopyFile(this.fileInfo.Object, null); + } + + [Test] + public void CopyFile_Calls_FileManager_AddFile_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Not_Equal() + { + const int sourceFolderMappingID = Constants.FOLDER_ValidFolderMappingID; + const int destinationFolderMappingID = Constants.FOLDER_ValidFolderMappingID + 1; + + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.ContentType).Returns(Constants.CONTENTTYPE_ValidContentType); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(sourceFolderMappingID); + + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(destinationFolderMappingID); + + var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + var fileContent = new MemoryStream(bytes); + + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); + this.mockFileManager.Setup(mfm => mfm.CopyContentItem(It.IsAny())).Returns(Constants.CONTENT_ValidContentItemId); + this.mockFileManager.Setup(mfm => mfm.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny(), true, true, Constants.CONTENTTYPE_ValidContentType)); + + this.mockFileManager.Object.CopyFile(this.fileInfo.Object, this.folderInfo.Object); + + this.mockFileManager.Verify(fm => fm.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent, true, true, Constants.CONTENTTYPE_ValidContentType), Times.Once()); + } + + [Test] + [ExpectedException(typeof(PermissionsNotMetException))] + public void CopyFile_Throws_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Equal_And_Cannot_Add_Folder() + { + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(false); + + this.fileManager.CopyFile(this.fileInfo.Object, this.folderInfo.Object); + } + + [Test] + [ExpectedException(typeof(NoSpaceAvailableException))] + public void CopyFile_Throws_When_FolderMapping_Of_Source_And_Destination_Folders_Are_Equal_And_Portal_Has_No_Space_Available() + { + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.Size).Returns(Constants.FOLDER_ValidFileSize); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + + this.folderPermissionController.Setup(fpc => fpc.CanAddFolder(this.folderInfo.Object)).Returns(true); + this.portalController.Setup(pc => pc.HasSpaceAvailable(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileSize)).Returns(false); + + this.fileManager.CopyFile(this.fileInfo.Object, this.folderInfo.Object); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void DeleteFile_Throws_On_Null_File() + { + this.fileManager.DeleteFile(null); + } + + [Test] + public void DeleteFile_Calls_FileDeletionControllerDeleteFile() + { + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this.fileInfo.Object)).Verifiable(); + + this.mockFileManager.Object.DeleteFile(this.fileInfo.Object); + + this.mockFileDeletionController.Verify(); + } + + [Test] + [ExpectedException(typeof(FolderProviderException))] + public void DeleteFile_Throws_WhenFileDeletionControllerThrows() + { + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.mockFileDeletionController.Setup(mfdc => mfdc.DeleteFile(this.fileInfo.Object)) + .Throws(); + + this.mockFileManager.Object.DeleteFile(this.fileInfo.Object); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void DownloadFile_Throws_On_Null_File() + { + this.fileManager.WriteFileToResponse(null, ContentDisposition.Inline); + } + + [Test] + [ExpectedException(typeof(PermissionsNotMetException))] + public void DownloadFile_Throws_When_Permissions_Are_Not_Met() + { + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(false); + + this.fileManager.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); + } + + [Test] + public void DownloadFile_Calls_FileManager_AutoSyncFile_When_File_AutoSync_Is_Enabled() + { + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); + + this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(true); + this.mockFileManager.Setup(mfm => mfm.AutoSyncFile(this.fileInfo.Object)).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())); + + this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); + + this.mockFileManager.Verify(); + } + + [Test] + public void DownloadFile_Does_Not_Call_FileManager_AutoSyncFile_When_File_AutoSync_Is_Not_Enabled() + { + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); + + this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); + this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())); + + this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); + + this.mockFileManager.Verify(mfm => mfm.AutoSyncFile(this.fileInfo.Object), Times.Never()); + } + + [Test] + public void DownloadFile_Calls_FileManager_WriteBytesToHttpContext() + { + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.folderPermissionController.Setup(fpc => fpc.CanViewFolder(this.folderInfo.Object)).Returns(true); + + this.mockFileManager.Setup(mfm => mfm.IsFileAutoSyncEnabled()).Returns(false); + this.mockFileManager.Setup(mfm => mfm.WriteFileToHttpContext(this.fileInfo.Object, It.IsAny())).Verifiable(); + + this.mockFileManager.Object.WriteFileToResponse(this.fileInfo.Object, ContentDisposition.Inline); + + this.mockFileManager.Verify(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void ExistsFile_Throws_On_Null_Folder() + { + this.fileManager.FileExists(null, It.IsAny()); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void ExistsFile_Throws_On_Null_Or_Empty_FileName(string fileName) + { + this.fileManager.FileExists(this.folderInfo.Object, fileName); + } + + [Test] + public void ExistsFile_Calls_FileManager_GetFile() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(null).Verifiable(); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); + + this.mockFileManager.Verify(); + } + + [Test] + public void ExistsFile_Calls_FolderProvider_ExistsFile() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true).Verifiable(); + + this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); + + this.mockFolder.Verify(); + } + + [Test] + public void ExistsFile_Returns_True_When_File_Exists() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(true); + + var result = this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); + + Assert.IsTrue(result); + } + + [Test] + public void ExistsFile_Returns_False_When_File_Does_Not_Exist() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Returns(false); + + var result = this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); + + Assert.IsFalse(result); + } + + [Test] + [ExpectedException(typeof(FolderProviderException))] + public void ExistsFile_Throws_When_FolderProvider_Throws() + { + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(this.fileInfo.Object); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName)).Throws(); + + this.mockFileManager.Object.FileExists(this.folderInfo.Object, Constants.FOLDER_ValidFileName); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void GetFile_Throws_On_Null_Or_Empty_FileName(string fileName) + { + this.fileManager.GetFile(this.folderInfo.Object, fileName); + } + + [Test] + public void GetFile_Calls_DataProvider_GetFile() + { + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + + this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); + + this.fileManager.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName); + + this.mockData.Verify(); + } + + [Test] + public void GetFile_Handles_Path_In_Portal_Root() + { + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, string.Empty)).Returns(this.folderInfo.Object).Verifiable(); + this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); + + this.fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFileName); + + this.folderManager.Verify(); + this.mockData.Verify(); + } + + [Test] + public void GetFile_Handles_Path_Beyond_Portal_Root() + { + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_ValidFolderId); + this.folderManager.Setup(x => x.GetFolder(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath)).Returns(this.folderInfo.Object).Verifiable(); + this.mockData.Setup(md => md.GetFile(Constants.FOLDER_ValidFileName, Constants.FOLDER_ValidFolderId, It.IsAny())).Returns(It.IsAny()).Verifiable(); + + this.fileManager.GetFile(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderRelativePath + Constants.FOLDER_ValidFileName); + + this.folderManager.Verify(); + this.mockData.Verify(); + } + + [Test] + public void GetFileByID_Does_Not_Call_DataCache_GetCache_If_FileId_Is_Not_Valid() + { + this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this.fileInfo.Object).Verifiable(); + + this.fileManager.GetFile(Constants.FOLDER_InvalidFileId); + + this.mockCache.Verify(mc => mc.GetItem(It.IsAny()), Times.Never()); + } + + [Test] + public void GetFileByID_Calls_DataCache_GetCache_First() + { + this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(this.fileInfo.Object).Verifiable(); + + this.fileManager.GetFile(Constants.FOLDER_ValidFileId); + + this.mockCache.Verify(); + } + + [Test] + public void GetFileByID_Calls_DataProvider_GetFileById_When_File_Is_Not_In_Cache() + { + this.mockCache.Setup(mc => mc.GetItem(It.IsAny())).Returns(null); + + this.fileManager.GetFile(Constants.FOLDER_ValidFileId); + + this.mockData.Verify(md => md.GetFileById(Constants.FOLDER_ValidFileId, It.IsAny()), Times.Once()); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void MoveFile_Throws_On_Null_File() + { + this.fileManager.MoveFile(null, this.folderInfo.Object); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void MoveFile_Throws_On_Null_DestinationFolder() + { + this.fileManager.MoveFile(this.fileInfo.Object, null); + } + + [Test] + public void MoveFile_Calls_FolderProvider_AddFile_And_DeleteFile_And_FileManager_UpdateFile() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + var fileContent = new MemoryStream(); + + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); + string someString; + this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); + + this.mockFolder.Setup(mf => mf.AddFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, fileContent)).Verifiable(); + this.mockFolder.Setup(mf => mf.DeleteFile(this.fileInfo.Object)).Verifiable(); + + this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)).Verifiable(); + + this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); + + this.mockFolder.Verify(); + this.mockFileManager.Verify(); + } + + [Test] + public void MoveFile_Updates_FolderId_And_Folder() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.Folder).Returns(Constants.FOLDER_ValidFolderRelativePath); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderPath).Returns(Constants.FOLDER_OtherValidFolderRelativePath); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.fileInfo.SetupSet(fi => fi.FolderId = Constants.FOLDER_OtherValidFolderId).Verifiable(); + this.fileInfo.SetupSet(fi => fi.Folder = Constants.FOLDER_OtherValidFolderRelativePath).Verifiable(); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + var fileContent = new MemoryStream(); + + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); + string someString; + this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); + this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); + + this.fileInfo.Verify(); + } + + [Test] + public void MoveFile_Calls_DeleteFile_When_A_File_With_The_Same_Name_Exists_On_The_Destination_Folder() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderID).Returns(Constants.FOLDER_OtherValidFolderId); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + var fileContent = new MemoryStream(); + + this.mockFileManager.Setup(mfm => mfm.GetFileContent(this.fileInfo.Object)).Returns(fileContent); + string someString; + this.mockFileLockingController.Setup(mflc => mflc.IsFileLocked(this.fileInfo.Object, out someString)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.MoveVersions(this.fileInfo.Object, It.IsAny(), It.IsAny(), It.IsAny())); + + var existingFile = new FileInfo(); + this.mockFileManager.Setup(mfm => mfm.GetFile(this.folderInfo.Object, Constants.FOLDER_ValidFileName, It.IsAny())).Returns(existingFile); + + this.mockFileManager.Setup(mfm => mfm.DeleteFile(existingFile)).Verifiable(); + + this.mockFileManager.Object.MoveFile(this.fileInfo.Object, this.folderInfo.Object); + + this.mockFileManager.Verify(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void RenameFile_Throws_On_Null_File() + { + this.fileManager.RenameFile(null, It.IsAny()); + } + + [Test] + [TestCase(null)] + [TestCase("")] + [ExpectedException(typeof(ArgumentException))] + public void RenameFile_Throws_On_Null_Or_Empty_NewFileName(string newFileName) + { + this.fileManager.RenameFile(this.fileInfo.Object, newFileName); + } + + [Test] + public void RenameFile_Calls_FolderProvider_RenameFile_When_FileNames_Are_Distinct_And_NewFileName_Does_Not_Exist() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); + + var folderMapping = new FolderMappingInfo(); + folderMapping.FolderProviderType = Constants.FOLDER_ValidFolderProviderType; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); + + this.mockFolder.Verify(mf => mf.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName), Times.Once()); + } + + [Test] + public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_FileNames_Are_Equal() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + + this.fileManager.RenameFile(this.fileInfo.Object, Constants.FOLDER_ValidFileName); + + this.mockFolder.Verify(mf => mf.RenameFile(this.fileInfo.Object, It.IsAny()), Times.Never()); + } + + [Test] + [ExpectedException(typeof(FileAlreadyExistsException))] + public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_NewFileName_Exists() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(true); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); + + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); + } + + [Test] + [ExpectedException(typeof(InvalidFileExtensionException))] + public void RenameFile_Does_Not_Call_FolderProvider_RenameFile_When_InvalidExtensionType() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + this.mockFileManager.Setup(fm => fm.IsAllowedExtension(It.IsAny())).Returns(false); + + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherInvalidFileNameExtension); + } + + [Test] + [ExpectedException(typeof(FolderProviderException))] + public void RenameFile_Throws_When_FolderProvider_Throws() + { + this.fileInfo.Setup(fi => fi.FileName).Returns(Constants.FOLDER_ValidFileName); + this.fileInfo.Setup(fi => fi.PortalId).Returns(Constants.CONTENT_ValidPortalId); + this.fileInfo.Setup(fi => fi.FolderId).Returns(Constants.FOLDER_ValidFolderId); + this.fileInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + + this.folderManager.Setup(fm => fm.GetFolder(Constants.FOLDER_ValidFolderId)).Returns(this.folderInfo.Object); + + this.mockFileManager.Setup(mfm => mfm.FileExists(this.folderInfo.Object, Constants.FOLDER_OtherValidFileName, It.IsAny())).Returns(false); + this.mockFileManager.Setup(mfm => mfm.UpdateFile(this.fileInfo.Object)); + this.mockFileManager.Setup(mfm => mfm.IsAllowedExtension(Constants.FOLDER_OtherValidFileName)).Returns(true); + + var folderMapping = new FolderMappingInfo(); + folderMapping.FolderProviderType = Constants.FOLDER_ValidFolderProviderType; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.mockFolder.Setup(mf => mf.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName)).Throws(); + + this.mockFileManager.Object.RenameFile(this.fileInfo.Object, Constants.FOLDER_OtherValidFileName); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void UnzipFile_Throws_On_Null_File() + { + this.fileManager.UnzipFile(null, It.IsAny()); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void UnzipFile_Throws_On_Null_DestinationFolder() + { + this.fileManager.UnzipFile(It.IsAny(), null); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void UnzipFile_Throws_When_File_Extension_Is_Not_Zip() + { + this.fileInfo.Setup(fi => fi.Extension).Returns("txt"); + + this.fileManager.UnzipFile(this.fileInfo.Object, It.IsAny()); + } + + [Test] + public void UnzipFile_Calls_FileManager_ExtractFiles() + { + this.fileInfo.Setup(fi => fi.Extension).Returns("zip"); + + this.mockFileManager.Setup(mfm => mfm.ExtractFiles(this.fileInfo.Object, this.folderInfo.Object, null)).Verifiable(); + + this.mockFileManager.Object.UnzipFile(this.fileInfo.Object, this.folderInfo.Object); + + this.mockFileManager.Verify(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void UpdateFile_Throws_On_Null_File() + { + this.fileManager.UpdateFile(null); + } + + [Test] + public void UpdateFile_Calls_DataProvider_UpdateFile() + { + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object); + + this.mockData.Verify( + md => md.UpdateFile( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Once()); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void UpdateFile_Throws_On_Null_File_Overload() + { + this.fileManager.UpdateFile(null, It.IsAny()); + } + + [Test] + public void UpdateFile_Sets_With_And_Height_When_File_Is_Image() + { + var image = new Bitmap(10, 20); + + this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(true); + this.mockFileManager.Setup(mfm => mfm.GetImageFromStream(It.IsAny())).Returns(image); + this.mockFileManager.Setup(mfm => mfm.GetHash(this.fileInfo.Object)); + + var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + var stream = new MemoryStream(bytes); + + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + + this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); + this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); + + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); + + this.fileInfo.VerifySet(fi => fi.Width = 10); + this.fileInfo.VerifySet(fi => fi.Height = 20); + } + + [Test] + public void UpdateFile_Sets_SHA1Hash() + { + var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + var stream = new MemoryStream(bytes); + + this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.GetHash(stream)).Returns(Constants.FOLDER_UnmodifiedFileHash); + + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + + this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); + this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); + + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); + + this.fileInfo.VerifySet(fi => fi.SHA1Hash = Constants.FOLDER_UnmodifiedFileHash); + } + + [Test] + public void UpdateFile_Calls_FileManager_UpdateFile_Overload() + { + var bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + var stream = new MemoryStream(bytes); + + this.mockFileManager.Setup(mfm => mfm.IsImageFile(this.fileInfo.Object)).Returns(false); + this.mockFileManager.Setup(mfm => mfm.GetHash(this.fileInfo.Object)).Returns(Constants.FOLDER_UnmodifiedFileHash); + + this.fileInfo.Setup(fi => fi.StartDate).Returns(DateTime.Parse(Constants.FOLDER_FileStartDate)); + + this.folderMappingController.Setup(mp => mp.GetFolderMapping(It.IsAny())).Returns(new FolderMappingInfo() { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }); + this.mockFolder.Setup(fp => fp.GetHashCode(It.IsAny(), It.IsAny())).Returns(Constants.FOLDER_UnmodifiedFileHash); + + this.mockFileManager.Object.UpdateFile(this.fileInfo.Object, stream); + + this.mockFileManager.Verify(mfm => mfm.UpdateFile(this.fileInfo.Object), Times.Once()); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void GetSeekableStream_Throws_On_Null_Stream() + { + this.fileManager.GetSeekableStream(null); + } + + [Test] + public void GetSeekableStream_Returns_The_Same_Stream_If_It_Is_Seekable() + { + var inputStream = new MemoryStream(); + var seekableStream = this.fileManager.GetSeekableStream(inputStream); + + Assert.AreEqual(inputStream, seekableStream); + } + + [Test] + public void GetSeekableStream_Calls_GetHostMapPath_And_Creates_A_Temporary_FileStream_With_Resx_Extension() + { + var inputStream = new Mock(); + inputStream.Setup(s => s.CanSeek).Returns(false); + inputStream.Setup(s => s.Read(It.IsAny(), It.IsAny(), It.IsAny())).Returns(0); + + this.mockFileManager.Setup(mfm => mfm.GetHostMapPath()).Returns(string.Empty).Verifiable(); + this.mockFileManager.Setup(mfm => mfm.GetAutoDeleteFileStream(It.Is((string x) => x.EndsWith(".resx")))).Returns(new MemoryStream()).Verifiable(); + + this.mockFileManager.Object.GetSeekableStream(inputStream.Object); + + this.mockFileManager.Verify(); + } + + private void PrepareFileSecurityCheck() + { + this.mockData.Setup(p => p.GetListEntriesByListName("FileSecurityChecker", string.Empty, Null.NullInteger)).Returns(() => + { + var dataTable = new DataTable(); + dataTable.Columns.Add("EntryID", typeof(int)); + dataTable.Columns.Add("ListName", typeof(string)); + dataTable.Columns.Add("Value", typeof(string)); + dataTable.Columns.Add("Text", typeof(string)); + dataTable.Columns.Add("Level", typeof(int)); + dataTable.Columns.Add("SortOrder", typeof(int)); + dataTable.Columns.Add("DefinitionID", typeof(int)); + dataTable.Columns.Add("ParentID", typeof(int)); + dataTable.Columns.Add("Description", typeof(string)); + dataTable.Columns.Add("PortalID", typeof(int)); + dataTable.Columns.Add("SystemList", typeof(bool)); + dataTable.Columns.Add("ParentKey", typeof(string)); + dataTable.Columns.Add("Parent", typeof(string)); + dataTable.Columns.Add("ParentList", typeof(string)); + dataTable.Columns.Add("MaxSortOrder", typeof(int)); + dataTable.Columns.Add("EntryCount", typeof(int)); + dataTable.Columns.Add("HasChildren", typeof(int)); + dataTable.Columns.Add("CreatedByUserID", typeof(int)); + dataTable.Columns.Add("CreatedOnDate", typeof(DateTime)); + dataTable.Columns.Add("LastModifiedByUserID", typeof(int)); + dataTable.Columns.Add("LastModifiedOnDate", typeof(DateTime)); + + dataTable.Rows.Add(1, "FileSecurityChecker", "svg", + "DotNetNuke.Services.FileSystem.Internal.SecurityCheckers.SvgFileChecker, DotNetNuke", + 0, 0, -1, -0, string.Empty, -1, 1, string.Empty, string.Empty, string.Empty, 0, 1, 0, -1, DateTime.Now, -1, DateTime.Now); + + return dataTable.CreateDataReader(); + }); + this.hostController.Setup(c => c.GetString("PerformanceSetting")).Returns("NoCaching"); + this.globals.Setup(g => g.HostMapPath).Returns(AppDomain.CurrentDomain.BaseDirectory); + + var folderMapping = new FolderMappingInfo { FolderProviderType = Constants.FOLDER_ValidFolderProviderType }; + + this.folderMappingController.Setup(fmc => fmc.GetFolderMapping(Constants.CONTENT_ValidPortalId, Constants.FOLDER_ValidFolderMappingID)).Returns(folderMapping); + + this.folderInfo.Setup(fi => fi.PortalID).Returns(Constants.CONTENT_ValidPortalId); + this.folderInfo.Setup(fi => fi.FolderMappingID).Returns(Constants.FOLDER_ValidFolderMappingID); + } + + private class UnSeekableStream : MemoryStream + { + public override bool CanSeek + { + get { return false; } + } + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs index 38874f3d7cc..b35121031bc 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/PreviewProfileControllerTests.cs @@ -2,190 +2,188 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Services.Mobile -{ - using System; - using System.Collections.Generic; +namespace DotNetNuke.Tests.Core.Services.Mobile +{ + using System; + using System.Collections.Generic; using System.Data; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.ComponentModel; + using DotNetNuke.ComponentModel; using DotNetNuke.Data; using DotNetNuke.Entities.Controllers; - using DotNetNuke.Services.Mobile; + using DotNetNuke.Services.Mobile; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Summary description for PreviewProfileControllerTests. - /// - [TestFixture] - public class PreviewProfileControllerTests - { - private Mock dataProvider; - - private DataTable dtProfiles; - - [SetUp] - public void SetUp() - { + + using Moq; + + using NUnit.Framework; + + /// + /// Summary description for PreviewProfileControllerTests. + /// + [TestFixture] + public class PreviewProfileControllerTests + { + private Mock dataProvider; + + private DataTable dtProfiles; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - ComponentFactory.Container = new SimpleContainer(); - this.dataProvider = MockComponentProvider.CreateDataProvider(); - this.dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - MockComponentProvider.CreateDataCacheProvider(); - MockComponentProvider.CreateEventLogController(); - - this.dtProfiles = new DataTable("PreviewProfiles"); - var pkCol = this.dtProfiles.Columns.Add("Id", typeof(int)); - this.dtProfiles.Columns.Add("PortalId", typeof(int)); - this.dtProfiles.Columns.Add("Name", typeof(string)); - this.dtProfiles.Columns.Add("Width", typeof(int)); - this.dtProfiles.Columns.Add("Height", typeof(int)); - this.dtProfiles.Columns.Add("UserAgent", typeof(string)); - this.dtProfiles.Columns.Add("SortOrder", typeof(int)); - - this.dtProfiles.PrimaryKey = new[] { pkCol }; - - this.dataProvider.Setup(d => - d.SavePreviewProfile( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())).Returns( - (id, portalId, name, width, height, userAgent, sortOrder, userId) => - { - if (id == -1) - { - if (this.dtProfiles.Rows.Count == 0) - { - id = 1; - } - else - { - id = Convert.ToInt32(this.dtProfiles.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; - } - - var row = this.dtProfiles.NewRow(); - row["Id"] = id; - row["PortalId"] = portalId; - row["name"] = name; - row["width"] = width; - row["height"] = height; - row["useragent"] = userAgent; - row["sortorder"] = sortOrder; - - this.dtProfiles.Rows.Add(row); - } - else - { - var rows = this.dtProfiles.Select("Id = " + id); - if (rows.Length == 1) - { - var row = rows[0]; - - row["name"] = name; - row["width"] = width; - row["height"] = height; - row["useragent"] = userAgent; - row["sortorder"] = sortOrder; - } - } - - return id; - }); - - this.dataProvider.Setup(d => d.GetPreviewProfiles(It.IsAny())).Returns((portalId) => { return this.GetProfilesCallBack(portalId); }); - this.dataProvider.Setup(d => d.DeletePreviewProfile(It.IsAny())).Callback((id) => - { - var rows = this.dtProfiles.Select("Id = " + id); - if (rows.Length == 1) - { - this.dtProfiles.Rows.Remove(rows[0]); - } - }); - } - - [TearDown] + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + ComponentFactory.Container = new SimpleContainer(); + this.dataProvider = MockComponentProvider.CreateDataProvider(); + this.dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + MockComponentProvider.CreateDataCacheProvider(); + MockComponentProvider.CreateEventLogController(); + + this.dtProfiles = new DataTable("PreviewProfiles"); + var pkCol = this.dtProfiles.Columns.Add("Id", typeof(int)); + this.dtProfiles.Columns.Add("PortalId", typeof(int)); + this.dtProfiles.Columns.Add("Name", typeof(string)); + this.dtProfiles.Columns.Add("Width", typeof(int)); + this.dtProfiles.Columns.Add("Height", typeof(int)); + this.dtProfiles.Columns.Add("UserAgent", typeof(string)); + this.dtProfiles.Columns.Add("SortOrder", typeof(int)); + + this.dtProfiles.PrimaryKey = new[] { pkCol }; + + this.dataProvider.Setup(d => + d.SavePreviewProfile( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())).Returns( + (id, portalId, name, width, height, userAgent, sortOrder, userId) => + { + if (id == -1) + { + if (this.dtProfiles.Rows.Count == 0) + { + id = 1; + } + else + { + id = Convert.ToInt32(this.dtProfiles.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; + } + + var row = this.dtProfiles.NewRow(); + row["Id"] = id; + row["PortalId"] = portalId; + row["name"] = name; + row["width"] = width; + row["height"] = height; + row["useragent"] = userAgent; + row["sortorder"] = sortOrder; + + this.dtProfiles.Rows.Add(row); + } + else + { + var rows = this.dtProfiles.Select("Id = " + id); + if (rows.Length == 1) + { + var row = rows[0]; + + row["name"] = name; + row["width"] = width; + row["height"] = height; + row["useragent"] = userAgent; + row["sortorder"] = sortOrder; + } + } + + return id; + }); + + this.dataProvider.Setup(d => d.GetPreviewProfiles(It.IsAny())).Returns((portalId) => { return this.GetProfilesCallBack(portalId); }); + this.dataProvider.Setup(d => d.DeletePreviewProfile(It.IsAny())).Callback((id) => + { + var rows = this.dtProfiles.Select("Id = " + id); + if (rows.Length == 1) + { + this.dtProfiles.Rows.Remove(rows[0]); + } + }); + } + + [TearDown] public void TearDown() { Globals.DependencyProvider = null; - } - - [Test] - public void PreviewProfileController_Save_Valid_Profile() - { - var profile = new PreviewProfile { Name = "Test R", PortalId = 0, Width = 800, Height = 480 }; - new PreviewProfileController().Save(profile); - - var dataReader = this.dataProvider.Object.GetPreviewProfiles(0); - var affectedCount = 0; - while (dataReader.Read()) - { - affectedCount++; - } - - Assert.AreEqual(1, affectedCount); - } - - [Test] - public void PreviewProfileController_GetProfilesByPortal_With_Valid_PortalID() - { - this.PrepareData(); - - IList list = new PreviewProfileController().GetProfilesByPortal(0); - - Assert.AreEqual(3, list.Count); - } - - [Test] - public void PreviewProfileController_Delete_With_ValidID() - { - this.PrepareData(); - new PreviewProfileController().Delete(0, 1); - - IList list = new PreviewProfileController().GetProfilesByPortal(0); - - Assert.AreEqual(2, list.Count); - } - - private IDataReader GetProfilesCallBack(int portalId) - { - var dtCheck = this.dtProfiles.Clone(); - foreach (var row in this.dtProfiles.Select("PortalId = " + portalId)) - { - dtCheck.Rows.Add(row.ItemArray); - } - - return dtCheck.CreateDataReader(); - } - - private void PrepareData() - { - this.dtProfiles.Rows.Add(1, 0, "R1", 640, 480, string.Empty, 1); - this.dtProfiles.Rows.Add(2, 0, "R2", 640, 480, string.Empty, 2); - this.dtProfiles.Rows.Add(3, 0, "R3", 640, 480, string.Empty, 3); - this.dtProfiles.Rows.Add(4, 1, "R4", 640, 480, string.Empty, 4); - this.dtProfiles.Rows.Add(5, 1, "R5", 640, 480, string.Empty, 5); - this.dtProfiles.Rows.Add(6, 1, "R6", 640, 480, string.Empty, 6); - } - } -} + } + + [Test] + public void PreviewProfileController_Save_Valid_Profile() + { + var profile = new PreviewProfile { Name = "Test R", PortalId = 0, Width = 800, Height = 480 }; + new PreviewProfileController().Save(profile); + + var dataReader = this.dataProvider.Object.GetPreviewProfiles(0); + var affectedCount = 0; + while (dataReader.Read()) + { + affectedCount++; + } + + Assert.AreEqual(1, affectedCount); + } + + [Test] + public void PreviewProfileController_GetProfilesByPortal_With_Valid_PortalID() + { + this.PrepareData(); + + IList list = new PreviewProfileController().GetProfilesByPortal(0); + + Assert.AreEqual(3, list.Count); + } + + [Test] + public void PreviewProfileController_Delete_With_ValidID() + { + this.PrepareData(); + new PreviewProfileController().Delete(0, 1); + + IList list = new PreviewProfileController().GetProfilesByPortal(0); + + Assert.AreEqual(2, list.Count); + } + + private IDataReader GetProfilesCallBack(int portalId) + { + var dtCheck = this.dtProfiles.Clone(); + foreach (var row in this.dtProfiles.Select("PortalId = " + portalId)) + { + dtCheck.Rows.Add(row.ItemArray); + } + + return dtCheck.CreateDataReader(); + } + + private void PrepareData() + { + this.dtProfiles.Rows.Add(1, 0, "R1", 640, 480, string.Empty, 1); + this.dtProfiles.Rows.Add(2, 0, "R2", 640, 480, string.Empty, 2); + this.dtProfiles.Rows.Add(3, 0, "R3", 640, 480, string.Empty, 3); + this.dtProfiles.Rows.Add(4, 1, "R4", 640, 480, string.Empty, 4); + this.dtProfiles.Rows.Add(5, 1, "R5", 640, 480, string.Empty, 5); + this.dtProfiles.Rows.Add(6, 1, "R6", 640, 480, string.Empty, 6); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs index e704dd7427b..afa656beecc 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Mobile/RedirectionControllerTests.cs @@ -2,961 +2,962 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Services.Mobile -{ - using System; - using System.Collections.Generic; - using System.Collections.Specialized; - using System.Data; - using System.Reflection; - using System.Web; - - using DotNetNuke.Abstractions; +namespace DotNetNuke.Tests.Core.Services.Mobile +{ + using System; + using System.Collections.Generic; + using System.Collections.Specialized; + using System.Data; + using System.Reflection; + using System.Web; + + using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Common.Internal; - using DotNetNuke.ComponentModel; - using DotNetNuke.Data; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Security.Roles; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.ClientCapability; - using DotNetNuke.Services.Mobile; - using DotNetNuke.Tests.Core.Services.ClientCapability; - using DotNetNuke.Tests.Instance.Utilities; + using DotNetNuke.Common; + using DotNetNuke.Common.Internal; + using DotNetNuke.ComponentModel; + using DotNetNuke.Data; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Tabs; + using DotNetNuke.Security.Roles; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.ClientCapability; + using DotNetNuke.Services.Mobile; + using DotNetNuke.Tests.Core.Services.ClientCapability; + using DotNetNuke.Tests.Instance.Utilities; using DotNetNuke.Tests.Utilities.Mocks; + using Microsoft.Extensions.DependencyInjection; - using Moq; - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - /// - /// Summary description for RedirectionControllerTests. - /// - [TestFixture] - public class RedirectionControllerTests - { - public const string iphoneUserAgent = "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7"; - public const string wp7UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6"; - public const string msIE8UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; Creative AutoUpdate v1.40.02)"; - public const string msIE9UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; - public const string msIE10UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; - public const string fireFox5NT61UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0"; - public const string iPadTabletUserAgent = "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10"; - public const string samsungGalaxyTablet = "Mozilla/5.0 (Linux; U; Android 2.2; en-gb; SAMSUNG GT-P1000 Tablet Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; - public const string winTabletPC = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; Tablet PC 2.0)"; - public const string htcDesireVer1Sub22UserAgent = "Mozilla/5.0 (Linux; U; Android 2.2; sv-se; Desire_A8181 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; - public const string blackBerry9105V1 = "BlackBerry9105/5.0.0.696 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133"; - public const string motorolaRIZRSymbianOSOpera865 = "MOTORIZR-Z8/46.00.00 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 356) Opera 8.65 [it] UP.Link/6.3.0.0.0"; - - public const int Portal0 = 0; - public const int Portal1 = 1; - public const int Portal2 = 2; - public const int Page1 = 1; - public const int Page2 = 2; - public const int Page3 = 3; - public const int SortOrder1 = 1; - public const int SortOrder2 = 1; - public const int SortOrder3 = 1; - public const string PortalAlias0 = "www.portal0.com"; - public const string PortalAlias1 = "www.portal1.com"; - public const int AnotherPageOnSamePortal = 56; - public const int DeletedPageOnSamePortal = 59; - public const int DeletedPageOnSamePortal2 = 94; - public const int HomePageOnPortal0 = 55; - public const int HomePageOnPortal1 = 57; - public const int MobileLandingPage = 91; - public const int TabletLandingPage = 92; - public const int AllMobileLandingPage = 93; - public const bool EnabledFlag = true; - public const bool DisabledFlag = false; - public const bool IncludeChildTabsFlag = true; - public const string ExternalSite = "https://dnncommunity.org"; - - private const string DisableMobileRedirectCookieName = "disablemobileredirect"; - private const string DisableRedirectPresistCookieName = "disableredirectpresist"; - private const string DisableMobileRedirectQueryStringName = "nomo"; - - private Mock _dataProvider; - private RedirectionController _redirectionController; - private Mock _clientCapabilityProvider; - private Mock _mockHostController; - - private DataTable _dtRedirections; - private DataTable _dtRules; - - [SetUp] - public void SetUp() - { - this.SetupContianer(); - ComponentFactory.Container = new SimpleContainer(); - UnitTestHelper.ClearHttpContext(); - this._dataProvider = MockComponentProvider.CreateDataProvider(); - MockComponentProvider.CreateDataCacheProvider(); - MockComponentProvider.CreateEventLogController(); - this._clientCapabilityProvider = MockComponentProvider.CreateNew(); - this._mockHostController = new Mock(); - HostController.RegisterInstance(this._mockHostController.Object); - - this._redirectionController = new RedirectionController(); - - this.SetupDataProvider(); - this.SetupClientCapabilityProvider(); - this.SetupRoleProvider(); - - var tabController = TabController.Instance; - var dataProviderField = tabController.GetType().GetField("_dataProvider", BindingFlags.NonPublic | BindingFlags.Instance); - if (dataProviderField != null) - { - dataProviderField.SetValue(tabController, this._dataProvider.Object); - } - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - TestableGlobals.ClearInstance(); - PortalController.ClearInstance(); - CachingProvider.Instance().PurgeCache(); - MockComponentProvider.ResetContainer(); - UnitTestHelper.ClearHttpContext(); - if (this._dtRedirections != null) - { - this._dtRedirections.Dispose(); - this._dtRedirections = null; - } - - if (this._dtRules != null) - { - this._dtRules.Dispose(); - this._dtRules = null; - } - - ComponentFactory.Container = null; - } - - [Test] - public void RedirectionController_Save_Valid_Redirection() - { - var redirection = new Redirection { Name = "Test R", PortalId = Portal0, SortOrder = 1, SourceTabId = -1, Type = RedirectionType.MobilePhone, TargetType = TargetType.Portal, TargetValue = Portal1 }; - this._redirectionController.Save(redirection); - - var dataReader = this._dataProvider.Object.GetRedirections(Portal0); - var affectedCount = 0; - while (dataReader.Read()) - { - affectedCount++; - } - - Assert.AreEqual(1, affectedCount); - } - - [Test] - public void RedirectionController_Save_ValidRedirection_With_Rules() - { - var redirection = new Redirection { Name = "Test R", PortalId = Portal0, SortOrder = 1, SourceTabId = -1, IncludeChildTabs = true, Type = RedirectionType.Other, TargetType = TargetType.Portal, TargetValue = Portal1 }; - redirection.MatchRules.Add(new MatchRule { Capability = "Platform", Expression = "IOS" }); - redirection.MatchRules.Add(new MatchRule { Capability = "Version", Expression = "5" }); - this._redirectionController.Save(redirection); - - var dataReader = this._dataProvider.Object.GetRedirections(Portal0); - var affectedCount = 0; - while (dataReader.Read()) - { - affectedCount++; - } - - Assert.AreEqual(1, affectedCount); - - var getRe = this._redirectionController.GetRedirectionsByPortal(Portal0)[0]; - Assert.AreEqual(2, getRe.MatchRules.Count); - } - - [Test] - public void RedirectionController_GetRedirectionsByPortal_With_Valid_PortalID() - { - this.PrepareData(); - - IList list = this._redirectionController.GetRedirectionsByPortal(Portal0); - - Assert.AreEqual(7, list.Count); - } - - [Test] - public void RedirectionController_Delete_With_ValidID() - { - this.PrepareData(); - this._redirectionController.Delete(Portal0, 1); - - IList list = this._redirectionController.GetRedirectionsByPortal(Portal0); - - Assert.AreEqual(6, list.Count); - } - - [Test] - public void RedirectionController_PurgeInvalidRedirections_DoNotPurgeRuleForNonDeletetedSource() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, HomePageOnPortal0, IncludeChildTabsFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); - this._redirectionController.PurgeInvalidRedirections(0); - Assert.AreEqual(1, this._redirectionController.GetRedirectionsByPortal(0).Count); - } - - [Test] - public void RedirectionController_PurgeInvalidRedirections_DoPurgeRuleForDeletetedSource() - { - this._dtRedirections.Rows.Add(new object[] { 1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, DeletedPageOnSamePortal2, IncludeChildTabsFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag }); - this._redirectionController.PurgeInvalidRedirections(0); - Assert.AreEqual(0, this._redirectionController.GetRedirectionsByPortal(0).Count); - } - - [Test] - public void RedirectionController_PurgeInvalidRedirections_DoPurgeRuleForDeletetedTargetPortal() - { - this._dtRedirections.Rows.Add(new object[] { 1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, HomePageOnPortal0, IncludeChildTabsFlag, (int)TargetType.Portal, Portal2, EnabledFlag }); - this._redirectionController.PurgeInvalidRedirections(0); - Assert.AreEqual(0, this._redirectionController.GetRedirectionsByPortal(0).Count); - } - - [Test] - public void RedirectionController_PurgeInvalidRedirections_DoPurgeRuleForDeletetedTargetTab() - { - this._dtRedirections.Rows.Add(new object[] { 1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, HomePageOnPortal0, IncludeChildTabsFlag, (int)TargetType.Tab, DeletedPageOnSamePortal2, EnabledFlag }); - this._redirectionController.PurgeInvalidRedirections(0); - Assert.AreEqual(0, this._redirectionController.GetRedirectionsByPortal(0).Count); - } - - [Test] - [ExpectedException(typeof(ArgumentException))] - public void RedirectionController_GetRedirectionUrl_Throws_On_Null_UserAgent() - { - this._redirectionController.GetRedirectUrl(null, Portal0, 0); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_Redirection_IsNotSet() - { - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, HomePageOnPortal0)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_Redirection_IsNotEnabled() - { - this.PrepareSingleDisabledRedirectionRule(); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, HomePageOnPortal0)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_UserAgent_Is_Desktop() - { - this.PrepareData(); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(msIE9UserAgent, Portal0, HomePageOnPortal0)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_CurrentPage_IsSameAs_TargetPage_OnMobile() - { - this.PreparePortalToAnotherPageOnSamePortal(); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, AnotherPageOnSamePortal)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_TargetPage_IsDeleted() - { - // prepare rule to a deleted tab on the same portal - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, AnotherPageOnSamePortal, EnabledFlag, (int)TargetType.Tab, DeletedPageOnSamePortal, 1); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, AnotherPageOnSamePortal)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_CurrentPortal_IsSameAs_TargetPortal_OnMobile() - { - this.PrepareSamePortalToSamePortalRedirectionRule(); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, AnotherPageOnSamePortal)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_TargetPageOnSamePortal_When_Surfing_HomePage_OnMobile() - { - this.PreparePortalToAnotherPageOnSamePortal(); - Assert.AreEqual(this.NavigateUrl(AnotherPageOnSamePortal), this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); - } - - // [Test] - // public void RedirectionController_GetRedirectionUrl_Returns_HomePageOfOtherPortal_When_Surfing_AnyPageOfCurrentPortal_OnMobile() - // { - // PrepareHomePageToHomePageRedirectionRule(); - // Assert.AreEqual(DotNetNuke.Common.Globals.AddHTTP(PortalAlias1), _redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); - // Assert.AreEqual(DotNetNuke.Common.Globals.AddHTTP(PortalAlias1), _redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 2)); - // } - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_ExternalSite_When_Surfing_AnyPageOfCurrentPortal_OnMobile() - { - this.PrepareExternalSiteRedirectionRule(); - Assert.AreEqual(ExternalSite, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); - Assert.AreEqual(ExternalSite, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 2)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_MobileLanding_ForMobile_And_TabletLanding_ForTablet() - { - this.PrepareMobileAndTabletRedirectionRuleWithMobileFirst(); - Assert.AreEqual(this.NavigateUrl(MobileLandingPage), this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); - Assert.AreEqual(this.NavigateUrl(TabletLandingPage), this._redirectionController.GetRedirectUrl(iPadTabletUserAgent, Portal0, 1)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_TabletLanding_ForTablet_And_MobileLanding_ForMobile() - { - this.PrepareMobileAndTabletRedirectionRuleWithAndTabletRedirectionRuleTabletFirst(); - Assert.AreEqual(this.NavigateUrl(MobileLandingPage), this._redirectionController.GetRedirectUrl(iphoneUserAgent, 0, 1)); - Assert.AreEqual(this.NavigateUrl(TabletLandingPage), this._redirectionController.GetRedirectUrl(iPadTabletUserAgent, 0, 1)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_SameLandingPage_For_AllMobile() - { - this.PrepareAllMobileRedirectionRule(); - string mobileLandingPage = this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1); - string tabletLandingPage = this._redirectionController.GetRedirectUrl(iPadTabletUserAgent, Portal0, 1); - Assert.AreEqual(this.NavigateUrl(AllMobileLandingPage), mobileLandingPage); - Assert.AreEqual(this.NavigateUrl(AllMobileLandingPage), tabletLandingPage); - Assert.AreEqual(mobileLandingPage, tabletLandingPage); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_Capability_DoesNot_Match() - { - this.PrepareOperaBrowserOnSymbianOSRedirectionRule(); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_ValidUrl_When_Capability_Matches() - { - this.PrepareOperaBrowserOnSymbianOSRedirectionRule(); - Assert.AreEqual(this.NavigateUrl(AnotherPageOnSamePortal), this._redirectionController.GetRedirectUrl(motorolaRIZRSymbianOSOpera865, Portal0, 1)); - } - - [Test] - public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_NotAll_Capability_Matches() - { - this.PrepareOperaBrowserOnIPhoneOSRedirectionRule(); - Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); - } - - [Test] - public void RedirectionController_GetFullSiteUrl_With_NoRedirections() - { - var url = this._redirectionController.GetFullSiteUrl(Portal0, HomePageOnPortal0); - - Assert.AreEqual(string.Empty, url); - } - - // [Test] - // public void RedirectionController_GetFullSiteUrl_When_Redirect_Between_Different_Portals() - // { - // _dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, EnabledFlag, (int)TargetType.Portal, "1", 1); - - // var url = _redirectionController.GetFullSiteUrl(Portal1, HomePageOnPortal1); - - // Assert.AreEqual(Globals.AddHTTP(PortalAlias0), url); - // } - - // [Test] - // public void RedirectionController_GetFullSiteUrl_When_Redirect_In_Same_Portal() - // { - // _dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, HomePageOnPortal0, EnabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, 1); - - // var url = _redirectionController.GetFullSiteUrl(Portal1, AnotherPageOnSamePortal); - - // //Assert.AreEqual(string.Empty, url); - // } - [Test] - public void RedirectionController_GetFullSiteUrl_When_Redirect_To_DifferentUrl() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, HomePageOnPortal0, EnabledFlag, (int)TargetType.Url, ExternalSite, 1); - - var url = this._redirectionController.GetFullSiteUrl(Portal1, AnotherPageOnSamePortal); - - Assert.AreEqual(string.Empty, url); - } - - [Test] - public void RedirectionController_GetMobileSiteUrl_With_NoRedirections() - { - var url = this._redirectionController.GetMobileSiteUrl(Portal0, HomePageOnPortal0); - - Assert.AreEqual(string.Empty, url); - } - - [Test] - public void RedirectionController_GetMobileSiteUrl_Returns_Page_Specific_Url_When_Multiple_PageLevel_Redirects_Defined() - { - string redirectUrlPage1 = "m.yahoo.com"; - string redirectUrlPage2 = "m.cnn.com"; - - // first page goes to one url - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, Page1, EnabledFlag, (int)TargetType.Url, redirectUrlPage1, 1); - - // second page goes to another url (this is Tablet - it should not matter) - this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.Tablet, 2, Page2, EnabledFlag, (int)TargetType.Url, redirectUrlPage2, 1); - - var mobileUrlForPage1 = this._redirectionController.GetMobileSiteUrl(Portal0, Page1); - var mobileUrlForPage2 = this._redirectionController.GetMobileSiteUrl(Portal0, Page2); - var mobileUrlForPage3 = this._redirectionController.GetMobileSiteUrl(Portal0, Page3); - - // First Page returns link to first url - Assert.AreEqual(string.Format("{0}?nomo=0", redirectUrlPage1), mobileUrlForPage1); - - // Second Page returns link to second url - Assert.AreEqual(string.Format("{0}?nomo=0", redirectUrlPage2), mobileUrlForPage2); - - // Third Page returns link to first url - as this is the first found url and third page has no redirect defined - Assert.AreEqual(mobileUrlForPage3, string.Format("{0}?nomo=0", redirectUrlPage1)); - } - - // [Test] - // public void RedirectionController_GetMobileSiteUrl_Works_When_Page_Redirects_To_Another_Portal() - // { - // //first page goes to one second portal - // _dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, EnabledFlag, (int)TargetType.Portal, Portal1, 1); - - // var mobileUrlForPage1 = _redirectionController.GetMobileSiteUrl(Portal0, Page1); - - // //First Page returns link to home page of other portal - // Assert.AreEqual(Globals.AddHTTP(PortalAlias1), mobileUrlForPage1); - // } - [Test] - public void RedirectionController_GetMobileSiteUrl_When_Redirect_To_DifferentUrl() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, HomePageOnPortal0, EnabledFlag, (int)TargetType.Url, ExternalSite, 1); - - var url = this._redirectionController.GetMobileSiteUrl(Portal1, AnotherPageOnSamePortal); - - Assert.AreEqual(string.Empty, url); - } - - [Test] - public void RedirectionController_IsRedirectAllowedForTheSession_In_Normal_Action() - { - var app = this.GenerateApplication(); - - Assert.IsTrue(this._redirectionController.IsRedirectAllowedForTheSession(app)); - } - - [Test] - public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Param_Set_To_1() - { - var app = this.GenerateApplication(); - app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "1"); - - Assert.IsFalse(this._redirectionController.IsRedirectAllowedForTheSession(app)); - Assert.IsNotNull(app.Request.Cookies[DisableMobileRedirectCookieName]); - Assert.IsNotNull(app.Request.Cookies[DisableRedirectPresistCookieName]); - } - - [Test] - public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Param_Set_To_0() - { - var app = this.GenerateApplication(); - app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "0"); - - Assert.IsTrue(this._redirectionController.IsRedirectAllowedForTheSession(app)); - } - - [Test] - public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Param_Set_To_1_And_Then_Setback_To_0() - { - var app = this.GenerateApplication(); - app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "1"); - Assert.IsFalse(this._redirectionController.IsRedirectAllowedForTheSession(app)); - - app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "0"); - Assert.IsTrue(this._redirectionController.IsRedirectAllowedForTheSession(app)); - } - - private void SetupContianer() - { - var serviceCollection = new ServiceCollection(); - - var mockNavigationManager = new Mock(); - mockNavigationManager.Setup(x => x.NavigateURL(It.IsAny())).Returns(x => this.NavigateUrl(x)); - + + using Moq; + + using NUnit.Framework; + + /// + /// Summary description for RedirectionControllerTests. + /// + [TestFixture] + public class RedirectionControllerTests + { + public const string iphoneUserAgent = "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7"; + public const string wp7UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6"; + public const string msIE8UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; Creative AutoUpdate v1.40.02)"; + public const string msIE9UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; + public const string msIE10UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; + public const string fireFox5NT61UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Gecko/20110619 Firefox/5.0"; + public const string iPadTabletUserAgent = "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10"; + public const string samsungGalaxyTablet = "Mozilla/5.0 (Linux; U; Android 2.2; en-gb; SAMSUNG GT-P1000 Tablet Build/MASTER) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; + public const string winTabletPC = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; Tablet PC 2.0)"; + public const string htcDesireVer1Sub22UserAgent = "Mozilla/5.0 (Linux; U; Android 2.2; sv-se; Desire_A8181 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; + public const string blackBerry9105V1 = "BlackBerry9105/5.0.0.696 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133"; + public const string motorolaRIZRSymbianOSOpera865 = "MOTORIZR-Z8/46.00.00 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 356) Opera 8.65 [it] UP.Link/6.3.0.0.0"; + + public const int Portal0 = 0; + public const int Portal1 = 1; + public const int Portal2 = 2; + public const int Page1 = 1; + public const int Page2 = 2; + public const int Page3 = 3; + public const int SortOrder1 = 1; + public const int SortOrder2 = 1; + public const int SortOrder3 = 1; + public const string PortalAlias0 = "www.portal0.com"; + public const string PortalAlias1 = "www.portal1.com"; + public const int AnotherPageOnSamePortal = 56; + public const int DeletedPageOnSamePortal = 59; + public const int DeletedPageOnSamePortal2 = 94; + public const int HomePageOnPortal0 = 55; + public const int HomePageOnPortal1 = 57; + public const int MobileLandingPage = 91; + public const int TabletLandingPage = 92; + public const int AllMobileLandingPage = 93; + public const bool EnabledFlag = true; + public const bool DisabledFlag = false; + public const bool IncludeChildTabsFlag = true; + public const string ExternalSite = "https://dnncommunity.org"; + + private const string DisableMobileRedirectCookieName = "disablemobileredirect"; + private const string DisableRedirectPresistCookieName = "disableredirectpresist"; + private const string DisableMobileRedirectQueryStringName = "nomo"; + + private Mock _dataProvider; + private RedirectionController _redirectionController; + private Mock _clientCapabilityProvider; + private Mock _mockHostController; + + private DataTable _dtRedirections; + private DataTable _dtRules; + + [SetUp] + public void SetUp() + { + this.SetupContianer(); + ComponentFactory.Container = new SimpleContainer(); + UnitTestHelper.ClearHttpContext(); + this._dataProvider = MockComponentProvider.CreateDataProvider(); + MockComponentProvider.CreateDataCacheProvider(); + MockComponentProvider.CreateEventLogController(); + this._clientCapabilityProvider = MockComponentProvider.CreateNew(); + this._mockHostController = new Mock(); + HostController.RegisterInstance(this._mockHostController.Object); + + this._redirectionController = new RedirectionController(); + + this.SetupDataProvider(); + this.SetupClientCapabilityProvider(); + this.SetupRoleProvider(); + + var tabController = TabController.Instance; + var dataProviderField = tabController.GetType().GetField("_dataProvider", BindingFlags.NonPublic | BindingFlags.Instance); + if (dataProviderField != null) + { + dataProviderField.SetValue(tabController, this._dataProvider.Object); + } + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + TestableGlobals.ClearInstance(); + PortalController.ClearInstance(); + CachingProvider.Instance().PurgeCache(); + MockComponentProvider.ResetContainer(); + UnitTestHelper.ClearHttpContext(); + if (this._dtRedirections != null) + { + this._dtRedirections.Dispose(); + this._dtRedirections = null; + } + + if (this._dtRules != null) + { + this._dtRules.Dispose(); + this._dtRules = null; + } + + ComponentFactory.Container = null; + } + + [Test] + public void RedirectionController_Save_Valid_Redirection() + { + var redirection = new Redirection { Name = "Test R", PortalId = Portal0, SortOrder = 1, SourceTabId = -1, Type = RedirectionType.MobilePhone, TargetType = TargetType.Portal, TargetValue = Portal1 }; + this._redirectionController.Save(redirection); + + var dataReader = this._dataProvider.Object.GetRedirections(Portal0); + var affectedCount = 0; + while (dataReader.Read()) + { + affectedCount++; + } + + Assert.AreEqual(1, affectedCount); + } + + [Test] + public void RedirectionController_Save_ValidRedirection_With_Rules() + { + var redirection = new Redirection { Name = "Test R", PortalId = Portal0, SortOrder = 1, SourceTabId = -1, IncludeChildTabs = true, Type = RedirectionType.Other, TargetType = TargetType.Portal, TargetValue = Portal1 }; + redirection.MatchRules.Add(new MatchRule { Capability = "Platform", Expression = "IOS" }); + redirection.MatchRules.Add(new MatchRule { Capability = "Version", Expression = "5" }); + this._redirectionController.Save(redirection); + + var dataReader = this._dataProvider.Object.GetRedirections(Portal0); + var affectedCount = 0; + while (dataReader.Read()) + { + affectedCount++; + } + + Assert.AreEqual(1, affectedCount); + + var getRe = this._redirectionController.GetRedirectionsByPortal(Portal0)[0]; + Assert.AreEqual(2, getRe.MatchRules.Count); + } + + [Test] + public void RedirectionController_GetRedirectionsByPortal_With_Valid_PortalID() + { + this.PrepareData(); + + IList list = this._redirectionController.GetRedirectionsByPortal(Portal0); + + Assert.AreEqual(7, list.Count); + } + + [Test] + public void RedirectionController_Delete_With_ValidID() + { + this.PrepareData(); + this._redirectionController.Delete(Portal0, 1); + + IList list = this._redirectionController.GetRedirectionsByPortal(Portal0); + + Assert.AreEqual(6, list.Count); + } + + [Test] + public void RedirectionController_PurgeInvalidRedirections_DoNotPurgeRuleForNonDeletetedSource() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, HomePageOnPortal0, IncludeChildTabsFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); + this._redirectionController.PurgeInvalidRedirections(0); + Assert.AreEqual(1, this._redirectionController.GetRedirectionsByPortal(0).Count); + } + + [Test] + public void RedirectionController_PurgeInvalidRedirections_DoPurgeRuleForDeletetedSource() + { + this._dtRedirections.Rows.Add(new object[] { 1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, DeletedPageOnSamePortal2, IncludeChildTabsFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag }); + this._redirectionController.PurgeInvalidRedirections(0); + Assert.AreEqual(0, this._redirectionController.GetRedirectionsByPortal(0).Count); + } + + [Test] + public void RedirectionController_PurgeInvalidRedirections_DoPurgeRuleForDeletetedTargetPortal() + { + this._dtRedirections.Rows.Add(new object[] { 1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, HomePageOnPortal0, IncludeChildTabsFlag, (int)TargetType.Portal, Portal2, EnabledFlag }); + this._redirectionController.PurgeInvalidRedirections(0); + Assert.AreEqual(0, this._redirectionController.GetRedirectionsByPortal(0).Count); + } + + [Test] + public void RedirectionController_PurgeInvalidRedirections_DoPurgeRuleForDeletetedTargetTab() + { + this._dtRedirections.Rows.Add(new object[] { 1, Portal0, "R1", (int)RedirectionType.MobilePhone, SortOrder1, HomePageOnPortal0, IncludeChildTabsFlag, (int)TargetType.Tab, DeletedPageOnSamePortal2, EnabledFlag }); + this._redirectionController.PurgeInvalidRedirections(0); + Assert.AreEqual(0, this._redirectionController.GetRedirectionsByPortal(0).Count); + } + + [Test] + [ExpectedException(typeof(ArgumentException))] + public void RedirectionController_GetRedirectionUrl_Throws_On_Null_UserAgent() + { + this._redirectionController.GetRedirectUrl(null, Portal0, 0); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_Redirection_IsNotSet() + { + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, HomePageOnPortal0)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_Redirection_IsNotEnabled() + { + this.PrepareSingleDisabledRedirectionRule(); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, HomePageOnPortal0)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_UserAgent_Is_Desktop() + { + this.PrepareData(); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(msIE9UserAgent, Portal0, HomePageOnPortal0)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_CurrentPage_IsSameAs_TargetPage_OnMobile() + { + this.PreparePortalToAnotherPageOnSamePortal(); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, AnotherPageOnSamePortal)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_TargetPage_IsDeleted() + { + // prepare rule to a deleted tab on the same portal + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, AnotherPageOnSamePortal, EnabledFlag, (int)TargetType.Tab, DeletedPageOnSamePortal, 1); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, AnotherPageOnSamePortal)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_CurrentPortal_IsSameAs_TargetPortal_OnMobile() + { + this.PrepareSamePortalToSamePortalRedirectionRule(); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, AnotherPageOnSamePortal)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_TargetPageOnSamePortal_When_Surfing_HomePage_OnMobile() + { + this.PreparePortalToAnotherPageOnSamePortal(); + Assert.AreEqual(this.NavigateUrl(AnotherPageOnSamePortal), this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); + } + + // [Test] + // public void RedirectionController_GetRedirectionUrl_Returns_HomePageOfOtherPortal_When_Surfing_AnyPageOfCurrentPortal_OnMobile() + // { + // PrepareHomePageToHomePageRedirectionRule(); + // Assert.AreEqual(DotNetNuke.Common.Globals.AddHTTP(PortalAlias1), _redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); + // Assert.AreEqual(DotNetNuke.Common.Globals.AddHTTP(PortalAlias1), _redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 2)); + // } + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_ExternalSite_When_Surfing_AnyPageOfCurrentPortal_OnMobile() + { + this.PrepareExternalSiteRedirectionRule(); + Assert.AreEqual(ExternalSite, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); + Assert.AreEqual(ExternalSite, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 2)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_MobileLanding_ForMobile_And_TabletLanding_ForTablet() + { + this.PrepareMobileAndTabletRedirectionRuleWithMobileFirst(); + Assert.AreEqual(this.NavigateUrl(MobileLandingPage), this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); + Assert.AreEqual(this.NavigateUrl(TabletLandingPage), this._redirectionController.GetRedirectUrl(iPadTabletUserAgent, Portal0, 1)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_TabletLanding_ForTablet_And_MobileLanding_ForMobile() + { + this.PrepareMobileAndTabletRedirectionRuleWithAndTabletRedirectionRuleTabletFirst(); + Assert.AreEqual(this.NavigateUrl(MobileLandingPage), this._redirectionController.GetRedirectUrl(iphoneUserAgent, 0, 1)); + Assert.AreEqual(this.NavigateUrl(TabletLandingPage), this._redirectionController.GetRedirectUrl(iPadTabletUserAgent, 0, 1)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_SameLandingPage_For_AllMobile() + { + this.PrepareAllMobileRedirectionRule(); + string mobileLandingPage = this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1); + string tabletLandingPage = this._redirectionController.GetRedirectUrl(iPadTabletUserAgent, Portal0, 1); + Assert.AreEqual(this.NavigateUrl(AllMobileLandingPage), mobileLandingPage); + Assert.AreEqual(this.NavigateUrl(AllMobileLandingPage), tabletLandingPage); + Assert.AreEqual(mobileLandingPage, tabletLandingPage); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_Capability_DoesNot_Match() + { + this.PrepareOperaBrowserOnSymbianOSRedirectionRule(); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_ValidUrl_When_Capability_Matches() + { + this.PrepareOperaBrowserOnSymbianOSRedirectionRule(); + Assert.AreEqual(this.NavigateUrl(AnotherPageOnSamePortal), this._redirectionController.GetRedirectUrl(motorolaRIZRSymbianOSOpera865, Portal0, 1)); + } + + [Test] + public void RedirectionController_GetRedirectionUrl_Returns_EmptyString_When_NotAll_Capability_Matches() + { + this.PrepareOperaBrowserOnIPhoneOSRedirectionRule(); + Assert.AreEqual(string.Empty, this._redirectionController.GetRedirectUrl(iphoneUserAgent, Portal0, 1)); + } + + [Test] + public void RedirectionController_GetFullSiteUrl_With_NoRedirections() + { + var url = this._redirectionController.GetFullSiteUrl(Portal0, HomePageOnPortal0); + + Assert.AreEqual(string.Empty, url); + } + + // [Test] + // public void RedirectionController_GetFullSiteUrl_When_Redirect_Between_Different_Portals() + // { + // _dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, EnabledFlag, (int)TargetType.Portal, "1", 1); + + // var url = _redirectionController.GetFullSiteUrl(Portal1, HomePageOnPortal1); + + // Assert.AreEqual(Globals.AddHTTP(PortalAlias0), url); + // } + + // [Test] + // public void RedirectionController_GetFullSiteUrl_When_Redirect_In_Same_Portal() + // { + // _dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, HomePageOnPortal0, EnabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, 1); + + // var url = _redirectionController.GetFullSiteUrl(Portal1, AnotherPageOnSamePortal); + + // //Assert.AreEqual(string.Empty, url); + // } + [Test] + public void RedirectionController_GetFullSiteUrl_When_Redirect_To_DifferentUrl() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, HomePageOnPortal0, EnabledFlag, (int)TargetType.Url, ExternalSite, 1); + + var url = this._redirectionController.GetFullSiteUrl(Portal1, AnotherPageOnSamePortal); + + Assert.AreEqual(string.Empty, url); + } + + [Test] + public void RedirectionController_GetMobileSiteUrl_With_NoRedirections() + { + var url = this._redirectionController.GetMobileSiteUrl(Portal0, HomePageOnPortal0); + + Assert.AreEqual(string.Empty, url); + } + + [Test] + public void RedirectionController_GetMobileSiteUrl_Returns_Page_Specific_Url_When_Multiple_PageLevel_Redirects_Defined() + { + string redirectUrlPage1 = "m.yahoo.com"; + string redirectUrlPage2 = "m.cnn.com"; + + // first page goes to one url + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, Page1, EnabledFlag, (int)TargetType.Url, redirectUrlPage1, 1); + + // second page goes to another url (this is Tablet - it should not matter) + this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.Tablet, 2, Page2, EnabledFlag, (int)TargetType.Url, redirectUrlPage2, 1); + + var mobileUrlForPage1 = this._redirectionController.GetMobileSiteUrl(Portal0, Page1); + var mobileUrlForPage2 = this._redirectionController.GetMobileSiteUrl(Portal0, Page2); + var mobileUrlForPage3 = this._redirectionController.GetMobileSiteUrl(Portal0, Page3); + + // First Page returns link to first url + Assert.AreEqual(string.Format("{0}?nomo=0", redirectUrlPage1), mobileUrlForPage1); + + // Second Page returns link to second url + Assert.AreEqual(string.Format("{0}?nomo=0", redirectUrlPage2), mobileUrlForPage2); + + // Third Page returns link to first url - as this is the first found url and third page has no redirect defined + Assert.AreEqual(mobileUrlForPage3, string.Format("{0}?nomo=0", redirectUrlPage1)); + } + + // [Test] + // public void RedirectionController_GetMobileSiteUrl_Works_When_Page_Redirects_To_Another_Portal() + // { + // //first page goes to one second portal + // _dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, EnabledFlag, (int)TargetType.Portal, Portal1, 1); + + // var mobileUrlForPage1 = _redirectionController.GetMobileSiteUrl(Portal0, Page1); + + // //First Page returns link to home page of other portal + // Assert.AreEqual(Globals.AddHTTP(PortalAlias1), mobileUrlForPage1); + // } + [Test] + public void RedirectionController_GetMobileSiteUrl_When_Redirect_To_DifferentUrl() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, HomePageOnPortal0, EnabledFlag, (int)TargetType.Url, ExternalSite, 1); + + var url = this._redirectionController.GetMobileSiteUrl(Portal1, AnotherPageOnSamePortal); + + Assert.AreEqual(string.Empty, url); + } + + [Test] + public void RedirectionController_IsRedirectAllowedForTheSession_In_Normal_Action() + { + var app = this.GenerateApplication(); + + Assert.IsTrue(this._redirectionController.IsRedirectAllowedForTheSession(app)); + } + + [Test] + public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Param_Set_To_1() + { + var app = this.GenerateApplication(); + app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "1"); + + Assert.IsFalse(this._redirectionController.IsRedirectAllowedForTheSession(app)); + Assert.IsNotNull(app.Request.Cookies[DisableMobileRedirectCookieName]); + Assert.IsNotNull(app.Request.Cookies[DisableRedirectPresistCookieName]); + } + + [Test] + public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Param_Set_To_0() + { + var app = this.GenerateApplication(); + app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "0"); + + Assert.IsTrue(this._redirectionController.IsRedirectAllowedForTheSession(app)); + } + + [Test] + public void RedirectionController_IsRedirectAllowedForTheSession_With_Nonmo_Param_Set_To_1_And_Then_Setback_To_0() + { + var app = this.GenerateApplication(); + app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "1"); + Assert.IsFalse(this._redirectionController.IsRedirectAllowedForTheSession(app)); + + app.Context.Request.QueryString.Add(DisableMobileRedirectQueryStringName, "0"); + Assert.IsTrue(this._redirectionController.IsRedirectAllowedForTheSession(app)); + } + + private void SetupContianer() + { + var serviceCollection = new ServiceCollection(); + + var mockNavigationManager = new Mock(); + mockNavigationManager.Setup(x => x.NavigateURL(It.IsAny())).Returns(x => this.NavigateUrl(x)); + var mockApplicationStatusInfo = new Mock(); mockApplicationStatusInfo.Setup(info => info.Status).Returns(UpgradeStatus.Install); serviceCollection.AddTransient(container => mockNavigationManager.Object); serviceCollection.AddTransient(container => mockApplicationStatusInfo.Object); - serviceCollection.AddTransient(); - - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - private void SetupDataProvider() - { - this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); - - this._dtRedirections = new DataTable("Redirections"); - var pkCol = this._dtRedirections.Columns.Add("Id", typeof(int)); - this._dtRedirections.Columns.Add("PortalId", typeof(int)); - this._dtRedirections.Columns.Add("Name", typeof(string)); - this._dtRedirections.Columns.Add("Type", typeof(int)); - this._dtRedirections.Columns.Add("SortOrder", typeof(int)); - this._dtRedirections.Columns.Add("SourceTabId", typeof(int)); - this._dtRedirections.Columns.Add("IncludeChildTabs", typeof(bool)); - this._dtRedirections.Columns.Add("TargetType", typeof(int)); - this._dtRedirections.Columns.Add("TargetValue", typeof(object)); - this._dtRedirections.Columns.Add("Enabled", typeof(bool)); - - this._dtRedirections.PrimaryKey = new[] { pkCol }; - - this._dtRules = new DataTable("Rules"); - var pkCol1 = this._dtRules.Columns.Add("Id", typeof(int)); - this._dtRules.Columns.Add("RedirectionId", typeof(int)); - this._dtRules.Columns.Add("Capability", typeof(string)); - this._dtRules.Columns.Add("Expression", typeof(string)); - - this._dtRules.PrimaryKey = new[] { pkCol1 }; - - this._dataProvider.Setup(d => - d.SaveRedirection( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())).Returns( - (id, portalId, name, type, sortOrder, sourceTabId, includeChildTabs, targetType, targetValue, enabled, userId) => - { - if (id == -1) - { - if (this._dtRedirections.Rows.Count == 0) - { - id = 1; - } - else - { - id = Convert.ToInt32(this._dtRedirections.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; - } - - var row = this._dtRedirections.NewRow(); - row["Id"] = id; - row["PortalId"] = portalId; - row["name"] = name; - row["type"] = type; - row["sortOrder"] = sortOrder; - row["sourceTabId"] = sourceTabId; - row["includeChildTabs"] = includeChildTabs; - row["targetType"] = targetType; - row["targetValue"] = targetValue; - row["enabled"] = enabled; - - this._dtRedirections.Rows.Add(row); - } - else - { - var rows = this._dtRedirections.Select("Id = " + id); - if (rows.Length == 1) - { - var row = rows[0]; - - row["name"] = name; - row["type"] = type; - row["sortOrder"] = sortOrder; - row["sourceTabId"] = sourceTabId; - row["includeChildTabs"] = includeChildTabs; - row["targetType"] = targetType; - row["targetValue"] = targetValue; - row["enabled"] = enabled; - } - } - - return id; - }); - - this._dataProvider.Setup(d => d.GetRedirections(It.IsAny())).Returns(this.GetRedirectionsCallBack); - this._dataProvider.Setup(d => d.DeleteRedirection(It.IsAny())).Callback((id) => - { - var rows = this._dtRedirections.Select("Id = " + id); - if (rows.Length == 1) - { - this._dtRedirections.Rows.Remove(rows[0]); - } - }); - - this._dataProvider.Setup(d => d.SaveRedirectionRule( - It.IsAny(), - It.IsAny(), - It.IsAny(), - It.IsAny())).Callback((id, rid, capbility, expression) => - { - if (id == -1) - { - if (this._dtRules.Rows.Count == 0) - { - id = 1; - } - else - { - id = Convert.ToInt32(this._dtRules.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; - } - - var row = this._dtRules.NewRow(); - row["Id"] = id; - row["RedirectionId"] = rid; - row["capability"] = capbility; - row["expression"] = expression; - - this._dtRules.Rows.Add(row); - } - else - { - var rows = this._dtRules.Select("Id = " + id); - if (rows.Length == 1) - { - var row = rows[0]; - - row["capability"] = capbility; - row["expression"] = expression; - } - } - }); - - this._dataProvider.Setup(d => d.GetRedirectionRules(It.IsAny())).Returns(this.GetRedirectionRulesCallBack); - this._dataProvider.Setup(d => d.DeleteRedirectionRule(It.IsAny())).Callback((id) => - { - var rows = this._dtRules.Select("Id = " + id); - if (rows.Length == 1) - { - this._dtRules.Rows.Remove(rows[0]); - } - }); - - this._dataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); - this._dataProvider.Setup(d => d.GetTabs(It.IsAny())).Returns(this.GetTabsCallBack); - this._dataProvider.Setup(d => d.GetTab(It.IsAny())).Returns(this.GetTabCallBack); - this._dataProvider.Setup(d => d.GetTabModules(It.IsAny())).Returns(this.GetTabModulesCallBack); - this._dataProvider.Setup(d => d.GetPortalSettings(It.IsAny(), It.IsAny())).Returns(this.GetPortalSettingsCallBack); - this._dataProvider.Setup(d => d.GetAllRedirections()).Returns(this.GetAllRedirectionsCallBack); - - var portalDataService = MockComponentProvider.CreateNew(); - portalDataService.Setup(p => p.GetPortalGroups()).Returns(this.GetPortalGroupsCallBack); - } - - private void SetupClientCapabilityProvider() - { - this._clientCapabilityProvider.Setup(p => p.GetClientCapability(It.IsAny())).Returns(this.GetClientCapabilityCallBack); - } - - private void SetupRoleProvider() - { - var mockRoleProvider = MockComponentProvider.CreateNew(); - } - - private IDataReader GetRedirectionsCallBack(int portalId) - { - var dtCheck = this._dtRedirections.Clone(); - foreach (var row in this._dtRedirections.Select("PortalId = " + portalId)) - { - dtCheck.Rows.Add(row.ItemArray); - } - - return dtCheck.CreateDataReader(); - } - - private IDataReader GetRedirectionRulesCallBack(int rid) - { - var dtCheck = this._dtRules.Clone(); - foreach (var row in this._dtRules.Select("RedirectionId = " + rid)) - { - dtCheck.Rows.Add(row.ItemArray); - } - - return dtCheck.CreateDataReader(); - } - - private IDataReader GetPortalsCallBack(string culture) - { - return this.GetPortalCallBack(Portal0, DotNetNuke.Services.Localization.Localization.SystemLocale); - } - - private IDataReader GetPortalCallBack(int portalId, string culture) - { - DataTable table = new DataTable("Portal"); - - var cols = new string[] - { - "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", - "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", "ProcessorUserId", - "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", - "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - int homePage = 55; - if (portalId == Portal0) - { - homePage = HomePageOnPortal0; - } - else if (portalId == Portal1) - { - homePage = HomePageOnPortal1; - } - - table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", null, homePage.ToString(), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); - - return table.CreateDataReader(); - } - - private DataTable GetTabsDataTable() - { - DataTable table = new DataTable("Tabs"); - - var cols = new string[] - { - "TabID", "UniqueId", "VersionGuid", "DefaultLanguageGuid", "LocalizedVersionGuid", "TabOrder", "PortalID", "TabName", "IsVisible", "ParentId", "Level", "IconFile", "IconFileLarge", "DisableLink", "Title", "Description", "KeyWords", "IsDeleted", "SkinSrc", "ContainerSrc", "TabPath", "StartDate", "EndDate", "Url", "HasChildren", "RefreshInterval", "PageHeadText", "IsSecure", "PermanentRedirect", "SiteMapPriority", "ContentItemID", "Content", "ContentTypeID", "ModuleID", "ContentKey", "Indexed", "CultureCode", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "StateID", "HasBeenPublished", "IsSystem", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - table.Rows.Add(HomePageOnPortal1, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "3", Portal1, "HomePageOnPortal1", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//HomePageOnPortal1", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal1", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - table.Rows.Add(HomePageOnPortal0, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "3", Portal0, "HomePageOnPortal0", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//HomePageOnPortal0", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - table.Rows.Add(AnotherPageOnSamePortal, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "4", Portal0, "AnotherPageOnSamePortal", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//AnotherPageOnSamePortal", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - table.Rows.Add(MobileLandingPage, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "5", Portal0, "MobileLandingPage", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//MobileLandingPage", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - table.Rows.Add(TabletLandingPage, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "6", Portal0, "TabletLandingPage", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//TabletLandingPage", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - table.Rows.Add(AllMobileLandingPage, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "7", Portal0, "AllMobileLandingPage", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//AllMobileLandingPage", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - table.Rows.Add(DeletedPageOnSamePortal, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "8", Portal0, "A Deleted Page", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, true, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//DeletedPage", null, null, string.Empty, false, null, null, false, false, "0.5", "90", "Deleted Page", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); - - return table; - } - - private IDataReader GetTabsCallBack(int portalId) - { - var table = this.GetTabsDataTable(); - var newTable = table.Clone(); - foreach (var row in table.Select("PortalID = " + portalId)) - { - newTable.Rows.Add(row.ItemArray); - } - - return newTable.CreateDataReader(); - } - - private IDataReader GetTabCallBack(int tabId) - { - var table = this.GetTabsDataTable(); - var newTable = table.Clone(); - foreach (var row in table.Select("TabID = " + tabId)) - { - newTable.Rows.Add(row.ItemArray); - } - - return newTable.CreateDataReader(); - } - - private IDataReader GetTabModulesCallBack(int tabId) - { - DataTable table = new DataTable("TabModules"); - - var cols = new string[] - { - "PortalID", "TabID", "TabModuleID", "ModuleID", "ModuleDefID", "ModuleOrder", "PaneName", "ModuleTitle", "CacheTime", "CacheMethod", "Alignment", "Color", "Border", "IconFile", "AllTabs", "Visibility", "IsDeleted", "Header", "Footer", "StartDate", "EndDate", "ContainerSrc", "DisplayTitle", "DisplayPrint", "DisplaySyndicate", "IsWebSlice", "WebSliceTitle", "WebSliceExpiryDate", "WebSliceTTL", "InheritViewPermissions", "DesktopModuleID", "DefaultCacheTime", "ModuleControlID", "BusinessControllerClass", "IsAdmin", "SupportedFeatures", "ContentItemID", "Content", "ContentTypeID", "ContentKey", "Indexed", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "LastContentModifiedOnDate", "UniqueId", "VersionGuid", "DefaultLanguageGuid", "LocalizedVersionGuid", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - table.Columns["ModuleID"].DataType = typeof(int); - - var portalId = tabId == HomePageOnPortal0 ? Portal0 : Portal1; - - table.Rows.Add(portalId, tabId, 51, 362, 117, 1, "ContentPane", "DotNetNuke® Enterprise Edition", "3600", "FileModuleCachingProvider", "left", null, null, null, false, "2", false, null, null, null, null, "[G]Containers/DarkKnight/Banner.ascx", true, false, false, false, null, null, "0", true, "75", "1200", "240", "DotNetNuke.Modules.HtmlPro.HtmlTextController", false, "7", "90", "DotNetNuke® Enterprise Edition", "2", null, false, "-1", DateTime.Now, "-1", DateTime.Now, DateTime.Now, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), null); - - return table.CreateDataReader(); - } - - private IDataReader GetPortalSettingsCallBack(int portalId, string culture) - { - DataTable table = new DataTable("PortalSettings"); - - var cols = new string[] - { - "SettingName", "SettingValue", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - var alias = portalId == Portal0 ? PortalAlias0 : PortalAlias1; - - table.Rows.Add("DefaultPortalAlias", alias, "-1", DateTime.Now, "-1", DateTime.Now, "en-us"); - - return table.CreateDataReader(); - } - - private IDataReader GetPortalGroupsCallBack() - { - DataTable table = new DataTable("PortalGroups"); - - var cols = new string[] - { - "PortalGroupID", "MasterPortalID", "PortalGroupName", "PortalGroupDescription", "AuthenticationDomain", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", - }; - - foreach (var col in cols) - { - table.Columns.Add(col); - } - - table.Rows.Add(1, 0, "Portal Group", string.Empty, string.Empty, -1, DateTime.Now, -1, DateTime.Now); - - return table.CreateDataReader(); - } - - private IClientCapability GetClientCapabilityCallBack(string userAgent) - { - IClientCapability clientCapability = new TestClientCapability(); - if (userAgent == iphoneUserAgent) - { - clientCapability.IsMobile = true; - clientCapability.Capabilities.Add("mobile_browser", "Safari"); - clientCapability.Capabilities.Add("device_os", "iPhone OS"); - } - else if (userAgent == iPadTabletUserAgent) - { - clientCapability.IsTablet = true; - clientCapability.Capabilities.Add("mobile_browser", "Safari"); - clientCapability.Capabilities.Add("device_os", "iPhone OS"); - } - else if (userAgent == motorolaRIZRSymbianOSOpera865) - { - clientCapability.IsMobile = true; - clientCapability.Capabilities.Add("mobile_browser", "Opera Mini"); - clientCapability.Capabilities.Add("device_os", "Symbian OS"); - } - - return clientCapability; - } - - private IDataReader GetAllRedirectionsCallBack() - { - return this._dtRedirections.CreateDataReader(); - } - - private void PrepareData() - { - // id, portalId, name, type, sortOrder, sourceTabId, includeChildTabs, targetType, targetValue, enabled - this._dtRedirections.Rows.Add(1, Portal0, "R4", (int)RedirectionType.Other, 4, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); - this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.Tablet, 2, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); - this._dtRedirections.Rows.Add(3, Portal0, "R3", (int)RedirectionType.AllMobile, 3, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); - this._dtRedirections.Rows.Add(4, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); - this._dtRedirections.Rows.Add(5, Portal0, "R5", (int)RedirectionType.MobilePhone, 5, HomePageOnPortal0, EnabledFlag, (int)TargetType.Portal, "1", EnabledFlag); - this._dtRedirections.Rows.Add(6, Portal0, "R6", (int)RedirectionType.MobilePhone, 6, -1, DisabledFlag, (int)TargetType.Tab, HomePageOnPortal0, EnabledFlag); - this._dtRedirections.Rows.Add(7, Portal0, "R7", (int)RedirectionType.MobilePhone, 7, -1, DisabledFlag, (int)TargetType.Url, ExternalSite, EnabledFlag); - - // id, redirectionId, capability, expression - this._dtRules.Rows.Add(1, 1, "mobile_browser", "Safari"); - this._dtRules.Rows.Add(2, 1, "device_os_version", "4.0"); - - this._dtRedirections.Rows.Add(8, Portal1, "R8", (int)RedirectionType.MobilePhone, 1, -1, EnabledFlag, (int)TargetType.Portal, 2, true); - this._dtRedirections.Rows.Add(9, Portal1, "R9", (int)RedirectionType.Tablet, 1, -1, EnabledFlag, (int)TargetType.Portal, 2, true); - this._dtRedirections.Rows.Add(10, Portal1, "R10", (int)RedirectionType.AllMobile, 1, -1, EnabledFlag, (int)TargetType.Portal, 2, true); - } - - private void PrepareOperaBrowserOnSymbianOSRedirectionRule() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.Other, 1, -1, DisabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); - - // id, redirectionId, capability, expression - this._dtRules.Rows.Add(1, 1, "mobile_browser", "Opera Mini"); - this._dtRules.Rows.Add(2, 1, "device_os", "Symbian OS"); - } - - private void PrepareOperaBrowserOnIPhoneOSRedirectionRule() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.Other, 1, -1, DisabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); - - // id, redirectionId, capability, expression - this._dtRules.Rows.Add(1, 1, "mobile_browser", "Opera Mini"); - this._dtRules.Rows.Add(2, 1, "device_os", "iPhone OS"); - } - - private void PreparePortalToAnotherPageOnSamePortal() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); - } - - private void PrepareSamePortalToSamePortalRedirectionRule() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Portal, Portal0, 1); - } - - private void PrepareExternalSiteRedirectionRule() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 7, -1, DisabledFlag, (int)TargetType.Url, ExternalSite, 1); - } - - private void PrepareMobileAndTabletRedirectionRuleWithMobileFirst() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Tab, MobileLandingPage, EnabledFlag); - this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.Tablet, 2, -1, DisabledFlag, (int)TargetType.Tab, TabletLandingPage, EnabledFlag); - } - - private void PrepareMobileAndTabletRedirectionRuleWithAndTabletRedirectionRuleTabletFirst() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.Tablet, 1, -1, DisabledFlag, (int)TargetType.Tab, TabletLandingPage, EnabledFlag); - this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.MobilePhone, 2, -1, DisabledFlag, (int)TargetType.Tab, MobileLandingPage, EnabledFlag); - } - - private void PrepareAllMobileRedirectionRule() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.AllMobile, 1, -1, DisabledFlag, (int)TargetType.Tab, AllMobileLandingPage, EnabledFlag); - } - - private void PrepareSingleDisabledRedirectionRule() - { - this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.AllMobile, 1, -1, DisabledFlag, (int)TargetType.Tab, AllMobileLandingPage, DisabledFlag); - } - - private HttpApplication GenerateApplication() - { - var simulator = new Instance.Utilities.HttpSimulator.HttpSimulator("/", "c:\\"); - simulator.SimulateRequest(new Uri("http://localhost/dnn/Default.aspx")); - - var app = new HttpApplication(); - - var requestProp = typeof(NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); - requestProp.SetValue(HttpContext.Current.Request.QueryString, false, null); - - var stateProp = typeof(HttpApplication).GetField("_context", BindingFlags.Instance | BindingFlags.NonPublic); - stateProp.SetValue(app, HttpContext.Current); - - return app; - } - - private string NavigateUrl(int tabId) - { - return string.Format("/Default.aspx?tabid={0}", tabId); - } - } -} + serviceCollection.AddTransient(); + + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + private void SetupDataProvider() + { + this._dataProvider.Setup(d => d.GetProviderPath()).Returns(string.Empty); + + this._dtRedirections = new DataTable("Redirections"); + var pkCol = this._dtRedirections.Columns.Add("Id", typeof(int)); + this._dtRedirections.Columns.Add("PortalId", typeof(int)); + this._dtRedirections.Columns.Add("Name", typeof(string)); + this._dtRedirections.Columns.Add("Type", typeof(int)); + this._dtRedirections.Columns.Add("SortOrder", typeof(int)); + this._dtRedirections.Columns.Add("SourceTabId", typeof(int)); + this._dtRedirections.Columns.Add("IncludeChildTabs", typeof(bool)); + this._dtRedirections.Columns.Add("TargetType", typeof(int)); + this._dtRedirections.Columns.Add("TargetValue", typeof(object)); + this._dtRedirections.Columns.Add("Enabled", typeof(bool)); + + this._dtRedirections.PrimaryKey = new[] { pkCol }; + + this._dtRules = new DataTable("Rules"); + var pkCol1 = this._dtRules.Columns.Add("Id", typeof(int)); + this._dtRules.Columns.Add("RedirectionId", typeof(int)); + this._dtRules.Columns.Add("Capability", typeof(string)); + this._dtRules.Columns.Add("Expression", typeof(string)); + + this._dtRules.PrimaryKey = new[] { pkCol1 }; + + this._dataProvider.Setup(d => + d.SaveRedirection( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())).Returns( + (id, portalId, name, type, sortOrder, sourceTabId, includeChildTabs, targetType, targetValue, enabled, userId) => + { + if (id == -1) + { + if (this._dtRedirections.Rows.Count == 0) + { + id = 1; + } + else + { + id = Convert.ToInt32(this._dtRedirections.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; + } + + var row = this._dtRedirections.NewRow(); + row["Id"] = id; + row["PortalId"] = portalId; + row["name"] = name; + row["type"] = type; + row["sortOrder"] = sortOrder; + row["sourceTabId"] = sourceTabId; + row["includeChildTabs"] = includeChildTabs; + row["targetType"] = targetType; + row["targetValue"] = targetValue; + row["enabled"] = enabled; + + this._dtRedirections.Rows.Add(row); + } + else + { + var rows = this._dtRedirections.Select("Id = " + id); + if (rows.Length == 1) + { + var row = rows[0]; + + row["name"] = name; + row["type"] = type; + row["sortOrder"] = sortOrder; + row["sourceTabId"] = sourceTabId; + row["includeChildTabs"] = includeChildTabs; + row["targetType"] = targetType; + row["targetValue"] = targetValue; + row["enabled"] = enabled; + } + } + + return id; + }); + + this._dataProvider.Setup(d => d.GetRedirections(It.IsAny())).Returns(this.GetRedirectionsCallBack); + this._dataProvider.Setup(d => d.DeleteRedirection(It.IsAny())).Callback((id) => + { + var rows = this._dtRedirections.Select("Id = " + id); + if (rows.Length == 1) + { + this._dtRedirections.Rows.Remove(rows[0]); + } + }); + + this._dataProvider.Setup(d => d.SaveRedirectionRule( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())).Callback((id, rid, capbility, expression) => + { + if (id == -1) + { + if (this._dtRules.Rows.Count == 0) + { + id = 1; + } + else + { + id = Convert.ToInt32(this._dtRules.Select(string.Empty, "Id Desc")[0]["Id"]) + 1; + } + + var row = this._dtRules.NewRow(); + row["Id"] = id; + row["RedirectionId"] = rid; + row["capability"] = capbility; + row["expression"] = expression; + + this._dtRules.Rows.Add(row); + } + else + { + var rows = this._dtRules.Select("Id = " + id); + if (rows.Length == 1) + { + var row = rows[0]; + + row["capability"] = capbility; + row["expression"] = expression; + } + } + }); + + this._dataProvider.Setup(d => d.GetRedirectionRules(It.IsAny())).Returns(this.GetRedirectionRulesCallBack); + this._dataProvider.Setup(d => d.DeleteRedirectionRule(It.IsAny())).Callback((id) => + { + var rows = this._dtRules.Select("Id = " + id); + if (rows.Length == 1) + { + this._dtRules.Rows.Remove(rows[0]); + } + }); + + this._dataProvider.Setup(d => d.GetPortals(It.IsAny())).Returns(this.GetPortalsCallBack); + this._dataProvider.Setup(d => d.GetTabs(It.IsAny())).Returns(this.GetTabsCallBack); + this._dataProvider.Setup(d => d.GetTab(It.IsAny())).Returns(this.GetTabCallBack); + this._dataProvider.Setup(d => d.GetTabModules(It.IsAny())).Returns(this.GetTabModulesCallBack); + this._dataProvider.Setup(d => d.GetPortalSettings(It.IsAny(), It.IsAny())).Returns(this.GetPortalSettingsCallBack); + this._dataProvider.Setup(d => d.GetAllRedirections()).Returns(this.GetAllRedirectionsCallBack); + + var portalDataService = MockComponentProvider.CreateNew(); + portalDataService.Setup(p => p.GetPortalGroups()).Returns(this.GetPortalGroupsCallBack); + } + + private void SetupClientCapabilityProvider() + { + this._clientCapabilityProvider.Setup(p => p.GetClientCapability(It.IsAny())).Returns(this.GetClientCapabilityCallBack); + } + + private void SetupRoleProvider() + { + var mockRoleProvider = MockComponentProvider.CreateNew(); + } + + private IDataReader GetRedirectionsCallBack(int portalId) + { + var dtCheck = this._dtRedirections.Clone(); + foreach (var row in this._dtRedirections.Select("PortalId = " + portalId)) + { + dtCheck.Rows.Add(row.ItemArray); + } + + return dtCheck.CreateDataReader(); + } + + private IDataReader GetRedirectionRulesCallBack(int rid) + { + var dtCheck = this._dtRules.Clone(); + foreach (var row in this._dtRules.Select("RedirectionId = " + rid)) + { + dtCheck.Rows.Add(row.ItemArray); + } + + return dtCheck.CreateDataReader(); + } + + private IDataReader GetPortalsCallBack(string culture) + { + return this.GetPortalCallBack(Portal0, DotNetNuke.Services.Localization.Localization.SystemLocale); + } + + private IDataReader GetPortalCallBack(int portalId, string culture) + { + DataTable table = new DataTable("Portal"); + + var cols = new string[] + { + "PortalID", "PortalGroupID", "PortalName", "LogoFile", "FooterText", "ExpiryDate", "UserRegistration", "BannerAdvertising", "AdministratorId", "Currency", "HostFee", + "HostSpace", "PageQuota", "UserQuota", "AdministratorRoleId", "RegisteredRoleId", "Description", "KeyWords", "BackgroundFile", "GUID", "PaymentProcessor", "ProcessorUserId", + "ProcessorPassword", "SiteLogHistory", "Email", "DefaultLanguage", "TimezoneOffset", "AdminTabId", "HomeDirectory", "SplashTabId", "HomeTabId", "LoginTabId", "RegisterTabId", + "UserTabId", "SearchTabId", "Custom404TabId", "Custom500TabId", "TermsTabId", "PrivacyTabId", "SuperTabId", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + int homePage = 55; + if (portalId == Portal0) + { + homePage = HomePageOnPortal0; + } + else if (portalId == Portal1) + { + homePage = HomePageOnPortal1; + } + + table.Rows.Add(portalId, null, "My Website", "Logo.png", "Copyright 2011 by DotNetNuke Corporation", null, "2", "0", "2", "USD", "0", "0", "0", "0", "0", "1", "My Website", "DotNetNuke, DNN, Content, Management, CMS", null, "1057AC7A-3C08-4849-A3A6-3D2AB4662020", null, null, null, "0", "admin@changeme.invalid", "en-US", "-8", "58", "Portals/0", null, homePage.ToString(), null, null, "57", "56", "-1", "-1", null, null, "7", "-1", "2011-08-25 07:34:11", "-1", "2011-08-25 07:34:29", culture); + + return table.CreateDataReader(); + } + + private DataTable GetTabsDataTable() + { + DataTable table = new DataTable("Tabs"); + + var cols = new string[] + { + "TabID", "UniqueId", "VersionGuid", "DefaultLanguageGuid", "LocalizedVersionGuid", "TabOrder", "PortalID", "TabName", "IsVisible", "ParentId", "Level", "IconFile", "IconFileLarge", "DisableLink", "Title", "Description", "KeyWords", "IsDeleted", "SkinSrc", "ContainerSrc", "TabPath", "StartDate", "EndDate", "Url", "HasChildren", "RefreshInterval", "PageHeadText", "IsSecure", "PermanentRedirect", "SiteMapPriority", "ContentItemID", "Content", "ContentTypeID", "ModuleID", "ContentKey", "Indexed", "CultureCode", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "StateID", "HasBeenPublished", "IsSystem", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + table.Rows.Add(HomePageOnPortal1, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "3", Portal1, "HomePageOnPortal1", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//HomePageOnPortal1", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal1", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + table.Rows.Add(HomePageOnPortal0, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "3", Portal0, "HomePageOnPortal0", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//HomePageOnPortal0", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + table.Rows.Add(AnotherPageOnSamePortal, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "4", Portal0, "AnotherPageOnSamePortal", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//AnotherPageOnSamePortal", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + table.Rows.Add(MobileLandingPage, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "5", Portal0, "MobileLandingPage", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//MobileLandingPage", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + table.Rows.Add(TabletLandingPage, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "6", Portal0, "TabletLandingPage", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//TabletLandingPage", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + table.Rows.Add(AllMobileLandingPage, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "7", Portal0, "AllMobileLandingPage", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, false, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//AllMobileLandingPage", null, null, string.Empty, false, null, null, false, false, "0.5", "89", "HomePageOnPortal0", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + table.Rows.Add(DeletedPageOnSamePortal, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), "8", Portal0, "A Deleted Page", true, null, "0", null, null, false, string.Empty, string.Empty, string.Empty, true, "[G]Skins/DarkKnight/Home-Mega-Menu.ascx", "[G]Containers/DarkKnight/SubTitle_Grey.ascx", "//DeletedPage", null, null, string.Empty, false, null, null, false, false, "0.5", "90", "Deleted Page", "1", "-1", null, false, null, "-1", DateTime.Now, "-1", DateTime.Now, "0", true, false); + + return table; + } + + private IDataReader GetTabsCallBack(int portalId) + { + var table = this.GetTabsDataTable(); + var newTable = table.Clone(); + foreach (var row in table.Select("PortalID = " + portalId)) + { + newTable.Rows.Add(row.ItemArray); + } + + return newTable.CreateDataReader(); + } + + private IDataReader GetTabCallBack(int tabId) + { + var table = this.GetTabsDataTable(); + var newTable = table.Clone(); + foreach (var row in table.Select("TabID = " + tabId)) + { + newTable.Rows.Add(row.ItemArray); + } + + return newTable.CreateDataReader(); + } + + private IDataReader GetTabModulesCallBack(int tabId) + { + DataTable table = new DataTable("TabModules"); + + var cols = new string[] + { + "PortalID", "TabID", "TabModuleID", "ModuleID", "ModuleDefID", "ModuleOrder", "PaneName", "ModuleTitle", "CacheTime", "CacheMethod", "Alignment", "Color", "Border", "IconFile", "AllTabs", "Visibility", "IsDeleted", "Header", "Footer", "StartDate", "EndDate", "ContainerSrc", "DisplayTitle", "DisplayPrint", "DisplaySyndicate", "IsWebSlice", "WebSliceTitle", "WebSliceExpiryDate", "WebSliceTTL", "InheritViewPermissions", "DesktopModuleID", "DefaultCacheTime", "ModuleControlID", "BusinessControllerClass", "IsAdmin", "SupportedFeatures", "ContentItemID", "Content", "ContentTypeID", "ContentKey", "Indexed", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "LastContentModifiedOnDate", "UniqueId", "VersionGuid", "DefaultLanguageGuid", "LocalizedVersionGuid", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + table.Columns["ModuleID"].DataType = typeof(int); + + var portalId = tabId == HomePageOnPortal0 ? Portal0 : Portal1; + + table.Rows.Add(portalId, tabId, 51, 362, 117, 1, "ContentPane", "DotNetNuke® Enterprise Edition", "3600", "FileModuleCachingProvider", "left", null, null, null, false, "2", false, null, null, null, null, "[G]Containers/DarkKnight/Banner.ascx", true, false, false, false, null, null, "0", true, "75", "1200", "240", "DotNetNuke.Modules.HtmlPro.HtmlTextController", false, "7", "90", "DotNetNuke® Enterprise Edition", "2", null, false, "-1", DateTime.Now, "-1", DateTime.Now, DateTime.Now, Guid.NewGuid(), Guid.NewGuid(), null, Guid.NewGuid(), null); + + return table.CreateDataReader(); + } + + private IDataReader GetPortalSettingsCallBack(int portalId, string culture) + { + DataTable table = new DataTable("PortalSettings"); + + var cols = new string[] + { + "SettingName", "SettingValue", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", "CultureCode", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + var alias = portalId == Portal0 ? PortalAlias0 : PortalAlias1; + + table.Rows.Add("DefaultPortalAlias", alias, "-1", DateTime.Now, "-1", DateTime.Now, "en-us"); + + return table.CreateDataReader(); + } + + private IDataReader GetPortalGroupsCallBack() + { + DataTable table = new DataTable("PortalGroups"); + + var cols = new string[] + { + "PortalGroupID", "MasterPortalID", "PortalGroupName", "PortalGroupDescription", "AuthenticationDomain", "CreatedByUserID", "CreatedOnDate", "LastModifiedByUserID", "LastModifiedOnDate", + }; + + foreach (var col in cols) + { + table.Columns.Add(col); + } + + table.Rows.Add(1, 0, "Portal Group", string.Empty, string.Empty, -1, DateTime.Now, -1, DateTime.Now); + + return table.CreateDataReader(); + } + + private IClientCapability GetClientCapabilityCallBack(string userAgent) + { + IClientCapability clientCapability = new TestClientCapability(); + if (userAgent == iphoneUserAgent) + { + clientCapability.IsMobile = true; + clientCapability.Capabilities.Add("mobile_browser", "Safari"); + clientCapability.Capabilities.Add("device_os", "iPhone OS"); + } + else if (userAgent == iPadTabletUserAgent) + { + clientCapability.IsTablet = true; + clientCapability.Capabilities.Add("mobile_browser", "Safari"); + clientCapability.Capabilities.Add("device_os", "iPhone OS"); + } + else if (userAgent == motorolaRIZRSymbianOSOpera865) + { + clientCapability.IsMobile = true; + clientCapability.Capabilities.Add("mobile_browser", "Opera Mini"); + clientCapability.Capabilities.Add("device_os", "Symbian OS"); + } + + return clientCapability; + } + + private IDataReader GetAllRedirectionsCallBack() + { + return this._dtRedirections.CreateDataReader(); + } + + private void PrepareData() + { + // id, portalId, name, type, sortOrder, sourceTabId, includeChildTabs, targetType, targetValue, enabled + this._dtRedirections.Rows.Add(1, Portal0, "R4", (int)RedirectionType.Other, 4, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); + this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.Tablet, 2, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); + this._dtRedirections.Rows.Add(3, Portal0, "R3", (int)RedirectionType.AllMobile, 3, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); + this._dtRedirections.Rows.Add(4, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Portal, "1", EnabledFlag); + this._dtRedirections.Rows.Add(5, Portal0, "R5", (int)RedirectionType.MobilePhone, 5, HomePageOnPortal0, EnabledFlag, (int)TargetType.Portal, "1", EnabledFlag); + this._dtRedirections.Rows.Add(6, Portal0, "R6", (int)RedirectionType.MobilePhone, 6, -1, DisabledFlag, (int)TargetType.Tab, HomePageOnPortal0, EnabledFlag); + this._dtRedirections.Rows.Add(7, Portal0, "R7", (int)RedirectionType.MobilePhone, 7, -1, DisabledFlag, (int)TargetType.Url, ExternalSite, EnabledFlag); + + // id, redirectionId, capability, expression + this._dtRules.Rows.Add(1, 1, "mobile_browser", "Safari"); + this._dtRules.Rows.Add(2, 1, "device_os_version", "4.0"); + + this._dtRedirections.Rows.Add(8, Portal1, "R8", (int)RedirectionType.MobilePhone, 1, -1, EnabledFlag, (int)TargetType.Portal, 2, true); + this._dtRedirections.Rows.Add(9, Portal1, "R9", (int)RedirectionType.Tablet, 1, -1, EnabledFlag, (int)TargetType.Portal, 2, true); + this._dtRedirections.Rows.Add(10, Portal1, "R10", (int)RedirectionType.AllMobile, 1, -1, EnabledFlag, (int)TargetType.Portal, 2, true); + } + + private void PrepareOperaBrowserOnSymbianOSRedirectionRule() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.Other, 1, -1, DisabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); + + // id, redirectionId, capability, expression + this._dtRules.Rows.Add(1, 1, "mobile_browser", "Opera Mini"); + this._dtRules.Rows.Add(2, 1, "device_os", "Symbian OS"); + } + + private void PrepareOperaBrowserOnIPhoneOSRedirectionRule() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.Other, 1, -1, DisabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); + + // id, redirectionId, capability, expression + this._dtRules.Rows.Add(1, 1, "mobile_browser", "Opera Mini"); + this._dtRules.Rows.Add(2, 1, "device_os", "iPhone OS"); + } + + private void PreparePortalToAnotherPageOnSamePortal() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Tab, AnotherPageOnSamePortal, EnabledFlag); + } + + private void PrepareSamePortalToSamePortalRedirectionRule() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Portal, Portal0, 1); + } + + private void PrepareExternalSiteRedirectionRule() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 7, -1, DisabledFlag, (int)TargetType.Url, ExternalSite, 1); + } + + private void PrepareMobileAndTabletRedirectionRuleWithMobileFirst() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.MobilePhone, 1, -1, DisabledFlag, (int)TargetType.Tab, MobileLandingPage, EnabledFlag); + this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.Tablet, 2, -1, DisabledFlag, (int)TargetType.Tab, TabletLandingPage, EnabledFlag); + } + + private void PrepareMobileAndTabletRedirectionRuleWithAndTabletRedirectionRuleTabletFirst() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.Tablet, 1, -1, DisabledFlag, (int)TargetType.Tab, TabletLandingPage, EnabledFlag); + this._dtRedirections.Rows.Add(2, Portal0, "R2", (int)RedirectionType.MobilePhone, 2, -1, DisabledFlag, (int)TargetType.Tab, MobileLandingPage, EnabledFlag); + } + + private void PrepareAllMobileRedirectionRule() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.AllMobile, 1, -1, DisabledFlag, (int)TargetType.Tab, AllMobileLandingPage, EnabledFlag); + } + + private void PrepareSingleDisabledRedirectionRule() + { + this._dtRedirections.Rows.Add(1, Portal0, "R1", (int)RedirectionType.AllMobile, 1, -1, DisabledFlag, (int)TargetType.Tab, AllMobileLandingPage, DisabledFlag); + } + + private HttpApplication GenerateApplication() + { + var simulator = new Instance.Utilities.HttpSimulator.HttpSimulator("/", "c:\\"); + simulator.SimulateRequest(new Uri("http://localhost/dnn/Default.aspx")); + + var app = new HttpApplication(); + + var requestProp = typeof(NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); + requestProp.SetValue(HttpContext.Current.Request.QueryString, false, null); + + var stateProp = typeof(HttpApplication).GetField("_context", BindingFlags.Instance | BindingFlags.NonPublic); + stateProp.SetValue(app, HttpContext.Current); + + return app; + } + + private string NavigateUrl(int tabId) + { + return string.Format("/Default.aspx?tabid={0}", tabId); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs index b3eaa79fb03..cc1049aeeb0 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/Tokens/TokenReplaceTests.cs @@ -1,136 +1,134 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Services.Tokens +namespace DotNetNuke.Tests.Core.Services.Tokens { using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.ComponentModel; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Cache; - using DotNetNuke.Services.Tokens; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Modules; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Entities.Tabs; + using DotNetNuke.Entities.Users; + using DotNetNuke.Services.Cache; + using DotNetNuke.Services.Tokens; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; + + using Moq; using NUnit.Framework; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class TokenReplaceTests - { - private Mock mockCache; - private Mock portalController; - private Mock moduleController; - private Mock userController; - private Mock mockHostController; - - [SetUp] - public void SetUp() - { + [TestFixture] + public class TokenReplaceTests + { + private Mock mockCache; + private Mock portalController; + private Mock moduleController; + private Mock userController; + private Mock mockHostController; + + [SetUp] + public void SetUp() + { var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - - ComponentFactory.RegisterComponentInstance(new CoreTokenProvider()); - this.mockCache = MockComponentProvider.CreateDataCacheProvider(); - this.mockHostController = new Mock(); - this.portalController = new Mock(); - this.moduleController = new Mock(); - this.userController = new Mock(); - PortalController.SetTestableInstance(this.portalController.Object); - ModuleController.SetTestableInstance(this.moduleController.Object); - UserController.SetTestableInstance(this.userController.Object); - HostController.RegisterInstance(this.mockHostController.Object); - this.SetupPortalSettings(); - this.SetupModuleInfo(); - this.SetupUserInfo(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - PortalController.ClearInstance(); - ModuleController.ClearInstance(); - UserController.ClearInstance(); - } - - [Test] - [TestCase("var myArray = [{ foo: 'bar' }]")] - [TestCase("This is just plain text")] - public void TextInputIsReturnedUnModified(string sourceText) - { - // Arrange - var tokenReplace = new TokenReplace(Scope.DefaultSettings, PortalSettings.Current.DefaultLanguage, - PortalSettings.Current, UserController.Instance.GetUser(1, 1), 1); - - // Act - var outputText = tokenReplace.ReplaceEnvironmentTokens(sourceText); - - // Assert - Assert.AreEqual(outputText, sourceText); - } - - [Test] - [TestCase("[Resx:{key:\"Email\"}]")] - [TestCase("[Css: { path: \"~/DesktopModules/Dnn/ContactList/stylesheets/bootstrap.min.css\"}]")] - [TestCase("[JavaScript:{ jsname: \"Knockout\" }] [JavaScript:{ path: \"~/DesktopModules/Dnn/ContactList/ClientScripts/contacts.js\"}]")] - public void ObjectInputIsReturnedBlank(string sourceText) - { - // Arrange - var tokenReplace = new TokenReplace(Scope.DefaultSettings, PortalSettings.Current.DefaultLanguage, - PortalSettings.Current, UserController.Instance.GetUser(1, 1), 1); - - // Act - var outputText = tokenReplace.ReplaceEnvironmentTokens(sourceText); - - // Assert - Assert.AreEqual(outputText.Trim(), string.Empty); - } - - private void SetupPortalSettings() - { - var portalSettings = new PortalSettings - { - AdministratorRoleName = Utilities.Constants.RoleName_Administrators, - ActiveTab = new TabInfo { ModuleID = 1, TabID = 1 }, - }; - - this.portalController.Setup(pc => pc.GetCurrentPortalSettings()).Returns(portalSettings); - } - - private void SetupModuleInfo() - { - var moduleInfo = new ModuleInfo - { - ModuleID = 1, - PortalID = this.portalController.Object.GetCurrentPortalSettings().PortalId, - }; - - this.moduleController.Setup(mc => mc.GetModule(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(moduleInfo); - } - - private void SetupUserInfo() - { - var userInfo = new UserInfo - { - UserID = 1, - Username = "admin", - PortalID = this.portalController.Object.GetCurrentPortalSettings().PortalId, - }; - this.userController.Setup(uc => uc.GetUser(It.IsAny(), It.IsAny())).Returns(userInfo); - } - } -} + serviceCollection.AddTransient(); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + + ComponentFactory.RegisterComponentInstance(new CoreTokenProvider()); + this.mockCache = MockComponentProvider.CreateDataCacheProvider(); + this.mockHostController = new Mock(); + this.portalController = new Mock(); + this.moduleController = new Mock(); + this.userController = new Mock(); + PortalController.SetTestableInstance(this.portalController.Object); + ModuleController.SetTestableInstance(this.moduleController.Object); + UserController.SetTestableInstance(this.userController.Object); + HostController.RegisterInstance(this.mockHostController.Object); + this.SetupPortalSettings(); + this.SetupModuleInfo(); + this.SetupUserInfo(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + PortalController.ClearInstance(); + ModuleController.ClearInstance(); + UserController.ClearInstance(); + } + + [Test] + [TestCase("var myArray = [{ foo: 'bar' }]")] + [TestCase("This is just plain text")] + public void TextInputIsReturnedUnModified(string sourceText) + { + // Arrange + var tokenReplace = new TokenReplace(Scope.DefaultSettings, PortalSettings.Current.DefaultLanguage, + PortalSettings.Current, UserController.Instance.GetUser(1, 1), 1); + + // Act + var outputText = tokenReplace.ReplaceEnvironmentTokens(sourceText); + + // Assert + Assert.AreEqual(outputText, sourceText); + } + + [Test] + [TestCase("[Resx:{key:\"Email\"}]")] + [TestCase("[Css: { path: \"~/DesktopModules/Dnn/ContactList/stylesheets/bootstrap.min.css\"}]")] + [TestCase("[JavaScript:{ jsname: \"Knockout\" }] [JavaScript:{ path: \"~/DesktopModules/Dnn/ContactList/ClientScripts/contacts.js\"}]")] + public void ObjectInputIsReturnedBlank(string sourceText) + { + // Arrange + var tokenReplace = new TokenReplace(Scope.DefaultSettings, PortalSettings.Current.DefaultLanguage, + PortalSettings.Current, UserController.Instance.GetUser(1, 1), 1); + + // Act + var outputText = tokenReplace.ReplaceEnvironmentTokens(sourceText); + + // Assert + Assert.AreEqual(outputText.Trim(), string.Empty); + } + + private void SetupPortalSettings() + { + var portalSettings = new PortalSettings + { + AdministratorRoleName = Utilities.Constants.RoleName_Administrators, + ActiveTab = new TabInfo { ModuleID = 1, TabID = 1 }, + }; + + this.portalController.Setup(pc => pc.GetCurrentPortalSettings()).Returns(portalSettings); + } + + private void SetupModuleInfo() + { + var moduleInfo = new ModuleInfo + { + ModuleID = 1, + PortalID = this.portalController.Object.GetCurrentPortalSettings().PortalId, + }; + + this.moduleController.Setup(mc => mc.GetModule(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(moduleInfo); + } + + private void SetupUserInfo() + { + var userInfo = new UserInfo + { + UserID = 1, + Username = "admin", + PortalID = this.portalController.Object.GetCurrentPortalSettings().PortalId, + }; + this.userController.Setup(uc => uc.GetUser(It.IsAny(), It.IsAny())).Returns(userInfo); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs index 17ff874cb8c..5ef455fb891 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Services/UserRequest/UserRequestIPAddressControllerTest.cs @@ -2,145 +2,143 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Core.Services.UserRequest -{ - using System.Collections.Specialized; +namespace DotNetNuke.Tests.Core.Services.UserRequest +{ + using System.Collections.Specialized; using System.Web; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Services.UserRequest; - using DotNetNuke.Tests.Utilities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Portals; + using DotNetNuke.Services.UserRequest; + using DotNetNuke.Tests.Utilities; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - internal class UserRequestIPAddressControllerTest - { - private Mock mockPortalController; - private Mock mockHostController; - private Mock mockhttpContext; - private Mock mockRequest; - - private UserRequestIPAddressController userRequestIPAddressController; - - [SetUp] - public void Setup() - { - NameValueCollection serverVariables = new NameValueCollection(); - - // Setup Mock - this.mockhttpContext = HttpContextHelper.RegisterMockHttpContext(); - this.mockRequest = Mock.Get(this.mockhttpContext.Object.Request); - this.mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); - this.mockHostController = new Mock(); - this.mockHostController.As(); - this.mockPortalController = MockComponentProvider.CreateNew(); - PortalController.SetTestableInstance(this.mockPortalController.Object); - - // System under test - this.userRequestIPAddressController = new UserRequestIPAddressController(); - + + using Moq; + + using NUnit.Framework; + + [TestFixture] + internal class UserRequestIPAddressControllerTest + { + private Mock mockPortalController; + private Mock mockHostController; + private Mock mockhttpContext; + private Mock mockRequest; + + private UserRequestIPAddressController userRequestIPAddressController; + + [SetUp] + public void Setup() + { + NameValueCollection serverVariables = new NameValueCollection(); + + // Setup Mock + this.mockhttpContext = HttpContextHelper.RegisterMockHttpContext(); + this.mockRequest = Mock.Get(this.mockhttpContext.Object.Request); + this.mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); + this.mockHostController = new Mock(); + this.mockHostController.As(); + this.mockPortalController = MockComponentProvider.CreateNew(); + PortalController.SetTestableInstance(this.mockPortalController.Object); + + // System under test + this.userRequestIPAddressController = new UserRequestIPAddressController(); + var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => Mock.Of()); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [TearDown] - public void TearDown() - { - Globals.DependencyProvider = null; - MockComponentProvider.ResetContainer(); - } - - [TestCase("111.111.111.111", "X-Forwarded-For")] - [TestCase("111.111.111.111,123.112.11.33", "X-Forwarded-For")] - [TestCase("111.111.111.111", "X-ProxyUser-Ip")] - [TestCase("111.111.111.111,23.112.11.33", "X-ProxyUser-Ip")] - public void UserRequestIPAddress_ShouldReturnIP_IfAnyHeaderIsPresent(string requestIp, string headerName) - { - // Arrange - var expectedIp = "111.111.111.111"; - - NameValueCollection headersWithXForwardedHeaders = new NameValueCollection(); - headersWithXForwardedHeaders.Add(headerName, requestIp); - this.mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); - this.mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); - - // Act - string userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); - - // Assert - Assert.AreEqual(expectedIp, userRequestIPAddress); - } - - [Test] - public void UserRequestIPAddress_ShouldReturnIP_IfRemoteAddrServerVariablePresent() - { - // Arrange - var expectedIp = "111.111.111.111"; - var remoteVariable = "REMOTE_ADDR"; - var requestIp = "111.111.111.111"; - - NameValueCollection serverVariables = new NameValueCollection(); - serverVariables.Add(remoteVariable, requestIp); - this.mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); - - // Act - var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); - - // Assert - Assert.AreSame(expectedIp, userRequestIPAddress); - this.mockRequest.VerifyGet(r => r.ServerVariables); - this.mockRequest.VerifyGet(r => r.Headers); - this.mockHostController.Verify(hc => hc.GetString(It.IsAny(), It.IsAny())); - } - - [Test] - public void UserRequestIPAddress_ShouldReturnIP_IfUserHostAddress() - { - // Arrange - var expectedIp = "111.111.111.111"; - this.mockRequest.Setup(x => x.UserHostAddress).Returns(expectedIp); - - // Act - var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); - - // Assert - Assert.AreSame(expectedIp, userRequestIPAddress); - this.mockRequest.VerifyGet(r => r.UserHostAddress); - } - - [TestCase("abc.111.eer")] - [TestCase("somedomain.com")] - [TestCase("244.275.111.111")] - public void UserRequestIPAddress_ShouldReturnEmptyString_IfIPAddressIsNotValid(string requestIp) - { - // Arrange - var headerName = "X-Forwarded-For"; - - NameValueCollection headersWithXForwardedHeaders = new NameValueCollection(); - headersWithXForwardedHeaders.Add(headerName, requestIp); - this.mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); - this.mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); - - // Act - var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); - - // Assert - Assert.AreSame(string.Empty, userRequestIPAddress); - } - } -} + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [TearDown] + public void TearDown() + { + Globals.DependencyProvider = null; + MockComponentProvider.ResetContainer(); + } + + [TestCase("111.111.111.111", "X-Forwarded-For")] + [TestCase("111.111.111.111,123.112.11.33", "X-Forwarded-For")] + [TestCase("111.111.111.111", "X-ProxyUser-Ip")] + [TestCase("111.111.111.111,23.112.11.33", "X-ProxyUser-Ip")] + public void UserRequestIPAddress_ShouldReturnIP_IfAnyHeaderIsPresent(string requestIp, string headerName) + { + // Arrange + var expectedIp = "111.111.111.111"; + + NameValueCollection headersWithXForwardedHeaders = new NameValueCollection(); + headersWithXForwardedHeaders.Add(headerName, requestIp); + this.mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); + this.mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); + + // Act + string userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); + + // Assert + Assert.AreEqual(expectedIp, userRequestIPAddress); + } + + [Test] + public void UserRequestIPAddress_ShouldReturnIP_IfRemoteAddrServerVariablePresent() + { + // Arrange + var expectedIp = "111.111.111.111"; + var remoteVariable = "REMOTE_ADDR"; + var requestIp = "111.111.111.111"; + + NameValueCollection serverVariables = new NameValueCollection(); + serverVariables.Add(remoteVariable, requestIp); + this.mockRequest.Setup(x => x.ServerVariables).Returns(serverVariables); + + // Act + var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); + + // Assert + Assert.AreSame(expectedIp, userRequestIPAddress); + this.mockRequest.VerifyGet(r => r.ServerVariables); + this.mockRequest.VerifyGet(r => r.Headers); + this.mockHostController.Verify(hc => hc.GetString(It.IsAny(), It.IsAny())); + } + + [Test] + public void UserRequestIPAddress_ShouldReturnIP_IfUserHostAddress() + { + // Arrange + var expectedIp = "111.111.111.111"; + this.mockRequest.Setup(x => x.UserHostAddress).Returns(expectedIp); + + // Act + var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); + + // Assert + Assert.AreSame(expectedIp, userRequestIPAddress); + this.mockRequest.VerifyGet(r => r.UserHostAddress); + } + + [TestCase("abc.111.eer")] + [TestCase("somedomain.com")] + [TestCase("244.275.111.111")] + public void UserRequestIPAddress_ShouldReturnEmptyString_IfIPAddressIsNotValid(string requestIp) + { + // Arrange + var headerName = "X-Forwarded-For"; + + NameValueCollection headersWithXForwardedHeaders = new NameValueCollection(); + headersWithXForwardedHeaders.Add(headerName, requestIp); + this.mockRequest.Setup(x => x.Headers).Returns(headersWithXForwardedHeaders); + this.mockHostController.Setup(hc => hc.GetString(It.IsAny(), It.IsAny())).Returns(headerName); + + // Act + var userRequestIPAddress = this.userRequestIPAddressController.GetUserRequestIPAddress(this.mockhttpContext.Object.Request); + + // Assert + Assert.AreSame(string.Empty, userRequestIPAddress); + } + } +} diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs index 331e9fa4aa0..3264a5adb08 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/SearchServiceControllerTests.cs @@ -41,7 +41,6 @@ namespace DotNetNuke.Tests.Web.InternalServices using NUnit.Framework; using Constants = DotNetNuke.Services.Search.Internals.Constants; - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; /// /// Testing grouping logic of GetGroupedBasicView and GetGroupedDetailView (SearchServiceController methods). @@ -107,7 +106,7 @@ public void SetUp() var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient(container => new DotNetNuke.Application.ApplicationStatusInfo(Mock.Of())); serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(); + serviceCollection.AddTransient(); Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); this.mockDataProvider = MockComponentProvider.CreateDataProvider(); diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs index 26c5dae5cd3..633e76ac5a1 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Web/InternalServices/TabVersionControllerTests.cs @@ -2,172 +2,170 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Tests.Web.InternalServices -{ - using System; - using System.Collections; - using System.Collections.Generic; +namespace DotNetNuke.Tests.Web.InternalServices +{ + using System; + using System.Collections; + using System.Collections.Generic; using System.Linq; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Controllers; - using DotNetNuke.Entities.Tabs.TabVersions; - using DotNetNuke.Entities.Users; + using DotNetNuke.Common; + using DotNetNuke.Common.Utilities; + using DotNetNuke.Entities.Controllers; + using DotNetNuke.Entities.Tabs.TabVersions; + using DotNetNuke.Entities.Users; using DotNetNuke.Tests.Utilities.Mocks; using Microsoft.Extensions.DependencyInjection; - - using Moq; - - using NUnit.Framework; - - using INewHostController = DotNetNuke.Abstractions.Entities.Controllers.IHostController; - - [TestFixture] - public class TabVersionControllerTests - { - private const int UserID = 1; - private const int TabID = 99; - private readonly DateTime ServerCreateOnDate = new DateTime(2018, 08, 15, 12, 0, 0, DateTimeKind.Unspecified); - - private Mock mockCBO; - private Mock mockUserController; - private Mock mockHostController; - - [SetUp] - public void Setup() - { - MockComponentProvider.ResetContainer(); - this.SetupCBO(); - this.SetupHostController(); - - var serviceCollection = new ServiceCollection(); - serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => Mock.Of()); - serviceCollection.AddTransient(container => (INewHostController)this.mockHostController.Object); - Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); - } - - [Test] - [TestCaseSource(typeof(TestCaseFactory), "TestCases")] - public void GetTabVersions_Verify_User_Preferred_TimeZone(string userPreferredTimeZone, DateTime expectedDateTime) - { - // Arrange - this.SetupUserController(userPreferredTimeZone); - - // Act - var tabVersionController = new TabVersionControllerTestable(); - var tabVersions = tabVersionController.GetTabVersions(TabID); - var tabVersion = tabVersions.FirstOrDefault(); - var user = UserController.Instance.GetCurrentUserInfo(); - var userTimeZone = user.Profile.PreferredTimeZone; - - var localizedDate = TimeZoneInfo.ConvertTime(tabVersion.CreatedOnDate, DateUtilsTestable.GetDatabaseDateTimeOffset(), userTimeZone); - - // Assert - Assert.AreEqual(localizedDate, expectedDateTime); - } - - private void SetupCBO() - { - this.mockCBO = new Mock(); - this.mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(this.GetMockedTabVersions); - CBO.SetTestableInstance(this.mockCBO.Object); - } - - private void SetupUserController(string timeZoneId) - { - this.mockUserController = new Mock(); - this.mockUserController.Setup(userController => userController.GetCurrentUserInfo()).Returns(this.GetMockedUser(timeZoneId)); - UserController.SetTestableInstance(this.mockUserController.Object); - } - - private UserInfo GetMockedUser(string timeZoneId) - { - var profile = new UserProfile() - { - PreferredTimeZone = this.GetMockedUserTimeZone(timeZoneId), - }; - - profile.ProfileProperties.Add(new Entities.Profile.ProfilePropertyDefinition(99) - { - CreatedByUserID = UserID, - PropertyDefinitionId = 20, - PropertyCategory = "Preferences", - PropertyName = "PreferredTimeZone", - PropertyValue = this.GetMockedUserTimeZone(timeZoneId).Id, - }); - var user = new UserInfo() - { - Profile = profile, - UserID = UserID, - PortalID = 99, - }; - - return user; - } - - private TimeZoneInfo GetMockedUserTimeZone(string timeZoneId) - { - return TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); - } - - private TabVersion GetMockedTabVersion() - { - var tabVersion = new TabVersion - { - IsPublished = true, - TabId = TabID, - TabVersionId = 1, - Version = 1, - CreatedByUserID = UserID, - }; - tabVersion.GetType().BaseType.GetProperty("CreatedOnDate").SetValue(tabVersion, this.ServerCreateOnDate, null); - - return tabVersion; - } - - private List GetMockedTabVersions() - { - return new List() - { - this.GetMockedTabVersion(), - }; - } - - private void SetupHostController() - { - this.mockHostController = new Mock(); - this.mockHostController.Setup(c => c.GetString(It.IsRegex("PerformanceSetting"))).Returns(Globals.PerformanceSettings.LightCaching.ToString()); - this.mockHostController.As(); - } - - private class TabVersionControllerTestable : TabVersionController - {} - - private class DateUtilsTestable : DateUtils - { - public static new TimeZoneInfo GetDatabaseDateTimeOffset() - { - var timeZoneId = "UTC"; - return TimeZoneInfo.CreateCustomTimeZone(timeZoneId, new TimeSpan(0, 0, 0), timeZoneId, timeZoneId); - } - } - - private class TestCaseFactory - { - public static IEnumerable TestCases() - { - yield return new TestCaseData("Central European Standard Time", new DateTime(2018, 08, 15, 14, 0, 0)); - yield return new TestCaseData("Russian Standard Time", new DateTime(2018, 08, 15, 15, 0, 0)); - yield return new TestCaseData("SE Asia Standard Time", new DateTime(2018, 08, 15, 19, 0, 0)); - } - } - - // Assuming 12:00 Aug 15, 2018 server local time - } -} + + using Moq; + + using NUnit.Framework; + + [TestFixture] + public class TabVersionControllerTests + { + private const int UserID = 1; + private const int TabID = 99; + private readonly DateTime ServerCreateOnDate = new DateTime(2018, 08, 15, 12, 0, 0, DateTimeKind.Unspecified); + + private Mock mockCBO; + private Mock mockUserController; + private Mock mockHostController; + + [SetUp] + public void Setup() + { + MockComponentProvider.ResetContainer(); + this.SetupCBO(); + this.SetupHostController(); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => Mock.Of()); + serviceCollection.AddTransient(container => (IHostSettingsService)this.mockHostController.Object); + Globals.DependencyProvider = serviceCollection.BuildServiceProvider(); + } + + [Test] + [TestCaseSource(typeof(TestCaseFactory), "TestCases")] + public void GetTabVersions_Verify_User_Preferred_TimeZone(string userPreferredTimeZone, DateTime expectedDateTime) + { + // Arrange + this.SetupUserController(userPreferredTimeZone); + + // Act + var tabVersionController = new TabVersionControllerTestable(); + var tabVersions = tabVersionController.GetTabVersions(TabID); + var tabVersion = tabVersions.FirstOrDefault(); + var user = UserController.Instance.GetCurrentUserInfo(); + var userTimeZone = user.Profile.PreferredTimeZone; + + var localizedDate = TimeZoneInfo.ConvertTime(tabVersion.CreatedOnDate, DateUtilsTestable.GetDatabaseDateTimeOffset(), userTimeZone); + + // Assert + Assert.AreEqual(localizedDate, expectedDateTime); + } + + private void SetupCBO() + { + this.mockCBO = new Mock(); + this.mockCBO.Setup(c => c.GetCachedObject>(It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(this.GetMockedTabVersions); + CBO.SetTestableInstance(this.mockCBO.Object); + } + + private void SetupUserController(string timeZoneId) + { + this.mockUserController = new Mock(); + this.mockUserController.Setup(userController => userController.GetCurrentUserInfo()).Returns(this.GetMockedUser(timeZoneId)); + UserController.SetTestableInstance(this.mockUserController.Object); + } + + private UserInfo GetMockedUser(string timeZoneId) + { + var profile = new UserProfile() + { + PreferredTimeZone = this.GetMockedUserTimeZone(timeZoneId), + }; + + profile.ProfileProperties.Add(new Entities.Profile.ProfilePropertyDefinition(99) + { + CreatedByUserID = UserID, + PropertyDefinitionId = 20, + PropertyCategory = "Preferences", + PropertyName = "PreferredTimeZone", + PropertyValue = this.GetMockedUserTimeZone(timeZoneId).Id, + }); + var user = new UserInfo() + { + Profile = profile, + UserID = UserID, + PortalID = 99, + }; + + return user; + } + + private TimeZoneInfo GetMockedUserTimeZone(string timeZoneId) + { + return TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); + } + + private TabVersion GetMockedTabVersion() + { + var tabVersion = new TabVersion + { + IsPublished = true, + TabId = TabID, + TabVersionId = 1, + Version = 1, + CreatedByUserID = UserID, + }; + tabVersion.GetType().BaseType.GetProperty("CreatedOnDate").SetValue(tabVersion, this.ServerCreateOnDate, null); + + return tabVersion; + } + + private List GetMockedTabVersions() + { + return new List() + { + this.GetMockedTabVersion(), + }; + } + + private void SetupHostController() + { + this.mockHostController = new Mock(); + this.mockHostController.Setup(c => c.GetString(It.IsRegex("PerformanceSetting"))).Returns(Globals.PerformanceSettings.LightCaching.ToString()); + this.mockHostController.As(); + } + + private class TabVersionControllerTestable : TabVersionController + {} + + private class DateUtilsTestable : DateUtils + { + public static new TimeZoneInfo GetDatabaseDateTimeOffset() + { + var timeZoneId = "UTC"; + return TimeZoneInfo.CreateCustomTimeZone(timeZoneId, new TimeSpan(0, 0, 0), timeZoneId, timeZoneId); + } + } + + private class TestCaseFactory + { + public static IEnumerable TestCases() + { + yield return new TestCaseData("Central European Standard Time", new DateTime(2018, 08, 15, 14, 0, 0)); + yield return new TestCaseData("Russian Standard Time", new DateTime(2018, 08, 15, 15, 0, 0)); + yield return new TestCaseData("SE Asia Standard Time", new DateTime(2018, 08, 15, 19, 0, 0)); + } + } + + // Assuming 12:00 Aug 15, 2018 server local time + } +} From 4d5aea75c5ff18a41418f1ac27093884454201cf Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Thu, 20 Aug 2020 12:24:39 -0400 Subject: [PATCH 20/32] Fixed typo in xml docs --- DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs b/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs index a2304edaabd..fc1dac0d2d8 100644 --- a/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs +++ b/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs @@ -20,7 +20,7 @@ public interface IConfigurationSetting string Key { get; set; } /// - /// gets or sets the configuraiton value. + /// Gets or sets the configuraiton value. /// string Value { get; set; } } From 391be0915f1093527e8b7f99796fb84bef75a0e5 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Fri, 21 Aug 2020 09:11:39 -0400 Subject: [PATCH 21/32] Removed stale 'entities\controllers' folder that is no longer used --- .../DotNetNuke.Abstractions.csproj | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj b/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj index bfd00629383..1261979bef5 100644 --- a/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj +++ b/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj @@ -10,6 +10,12 @@ false + + + + + + @@ -27,10 +33,6 @@ - - - - From f2cecf3a0b32029a8cf87fec04b025896571eef8 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Mon, 24 Aug 2020 11:16:33 -0400 Subject: [PATCH 22/32] Removed stale from csproj --- .../DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj b/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj index 1261979bef5..3c115fff4c4 100644 --- a/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj +++ b/DNN Platform/DotNetNuke.Abstractions/DotNetNuke.Abstractions.csproj @@ -10,12 +10,6 @@ false - - - - - - From 4664d8cfb35e729f509cb25212310b244c84e791 Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Mon, 24 Aug 2020 18:05:40 -0400 Subject: [PATCH 23/32] Moved IConfigurationSetting to DotNetNuke.Abstractions.Settings --- DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs | 2 ++ .../{ => Settings}/IConfigurationSetting.cs | 2 +- DNN Platform/Library/Entities/ConfigurationSetting.cs | 2 +- DNN Platform/Library/Entities/Controllers/HostController.cs | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) rename DNN Platform/DotNetNuke.Abstractions/{ => Settings}/IConfigurationSetting.cs (94%) diff --git a/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs b/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs index 3f1c0e4b637..fb381b32fec 100644 --- a/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs +++ b/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs @@ -6,6 +6,8 @@ namespace DotNetNuke.Abstractions { using System.Collections.Generic; + using DotNetNuke.Abstractions.Settings; + /// /// The provides business layer of the HostSettings /// Entity. diff --git a/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs b/DNN Platform/DotNetNuke.Abstractions/Settings/IConfigurationSetting.cs similarity index 94% rename from DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs rename to DNN Platform/DotNetNuke.Abstractions/Settings/IConfigurationSetting.cs index fc1dac0d2d8..056652d0b35 100644 --- a/DNN Platform/DotNetNuke.Abstractions/IConfigurationSetting.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Settings/IConfigurationSetting.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Abstractions +namespace DotNetNuke.Abstractions.Settings { /// /// The configuration setting. diff --git a/DNN Platform/Library/Entities/ConfigurationSetting.cs b/DNN Platform/Library/Entities/ConfigurationSetting.cs index 2d9eb1eb5a4..329cadc6e9d 100644 --- a/DNN Platform/Library/Entities/ConfigurationSetting.cs +++ b/DNN Platform/Library/Entities/ConfigurationSetting.cs @@ -4,7 +4,7 @@ namespace DotNetNuke.Entities { - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Settings; /// public class ConfigurationSetting : IConfigurationSetting diff --git a/DNN Platform/Library/Entities/Controllers/HostController.cs b/DNN Platform/Library/Entities/Controllers/HostController.cs index aa4c5c0dafd..93bbef6886f 100644 --- a/DNN Platform/Library/Entities/Controllers/HostController.cs +++ b/DNN Platform/Library/Entities/Controllers/HostController.cs @@ -11,6 +11,7 @@ namespace DotNetNuke.Entities.Controllers using System.Linq; using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Settings; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Data; From c24c66f586d898a1347d683d1fad111df6f5b80a Mon Sep 17 00:00:00 2001 From: Andrew Hoefling Date: Mon, 24 Aug 2020 18:10:06 -0400 Subject: [PATCH 24/32] Moved IHostSettingsService to DotNetNuke.Abstractions.Application --- .../{ => Application}/IHostSettingsService.cs | 2 +- DNN Platform/Library/Entities/Controllers/HostController.cs | 2 +- DNN Platform/Library/Obsolete/HostController.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename DNN Platform/DotNetNuke.Abstractions/{ => Application}/IHostSettingsService.cs (99%) diff --git a/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs b/DNN Platform/DotNetNuke.Abstractions/Application/IHostSettingsService.cs similarity index 99% rename from DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs rename to DNN Platform/DotNetNuke.Abstractions/Application/IHostSettingsService.cs index fb381b32fec..4c913107719 100644 --- a/DNN Platform/DotNetNuke.Abstractions/IHostSettingsService.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Application/IHostSettingsService.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Abstractions +namespace DotNetNuke.Abstractions.Application { using System.Collections.Generic; diff --git a/DNN Platform/Library/Entities/Controllers/HostController.cs b/DNN Platform/Library/Entities/Controllers/HostController.cs index 93bbef6886f..8fe9fa52cad 100644 --- a/DNN Platform/Library/Entities/Controllers/HostController.cs +++ b/DNN Platform/Library/Entities/Controllers/HostController.cs @@ -10,7 +10,7 @@ namespace DotNetNuke.Entities.Controllers using System.Globalization; using System.Linq; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Abstractions.Settings; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; diff --git a/DNN Platform/Library/Obsolete/HostController.cs b/DNN Platform/Library/Obsolete/HostController.cs index 1260f271286..1c23d977c0f 100644 --- a/DNN Platform/Library/Obsolete/HostController.cs +++ b/DNN Platform/Library/Obsolete/HostController.cs @@ -8,7 +8,7 @@ namespace DotNetNuke.Entities.Controllers using System.Collections.Generic; using System.Linq; - using DotNetNuke.Abstractions; + using DotNetNuke.Abstractions.Application; using DotNetNuke.Common; using DotNetNuke.ComponentModel; From 29a0ffe14872368722838ea8a5bf5e50b67e053f Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 25 Aug 2020 14:12:31 -0500 Subject: [PATCH 25/32] Add documentation to new .NET Standard projects (#4001) Co-authored-by: Andrew Hoefling Co-authored-by: Andrew Hoefling --- .../DotNetNuke.Abstractions/README.md | 42 +++++++++++++ .../DotNetNuke.DependencyInjection/README.md | 59 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 DNN Platform/DotNetNuke.Abstractions/README.md create mode 100644 DNN Platform/DotNetNuke.DependencyInjection/README.md diff --git a/DNN Platform/DotNetNuke.Abstractions/README.md b/DNN Platform/DotNetNuke.Abstractions/README.md new file mode 100644 index 00000000000..b50e6ae12a7 --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/README.md @@ -0,0 +1,42 @@ +# DotNetNuke.Abstractions project + +This project is designed to house interfaces (and potentially other types +supporting those interfaces). This project has no dependencies (i.e. it does +_not_ reference other DotNetNuke projects) and is designed to serve as a +foundation upon which other components can build. Most of the interfaces +defined in this project will eventually be exposed via +[dependency injection](../DotNetNuke.DependencyInjection). + +This project targets +[.NET Standard](https://docs.microsoft.com/en-us/dotnet/standard/net-standard) +2.0, meaning that it is compatible with both .NET Framework and .NET Core. Any +interfaces defined in this project cannot reference types which are only +available to .NET Framework (for example, types in the `System.Web` namespace). + +## Structure + +This project is an opportunity to rethink some of the core structure of DNN +Platform, so we are striving to strike a balance which does not give up on +consistency and familiarity but also encourages cleaner, simpler, +better named interfaces. To that end, we're hoping to reduce some of the +unnecessary nesting of namespaces for core types. For example, instead of +`DotNetNuke.Entities.Users.UserInfo`, we have +`DotNetNuke.Abstractions.Users.IUserInfo`. In particular, the `Entities` +namespace is confusing and will not be continued in this project. We plan to +only have one level of namespace nesting (e.g. `Users` or `Portals`) within this +project, and will also have interfaces without any namespace nesting when +appropriate (e.g. `DotNetNuke.Abstractions.INavigationManager`). + +When possible, the interfaces introduced into this project should not solely be +a copy of an existing interface or class. In particular, large interfaces +should be broken up into multiple, smaller interfaces. This will simplify usage +and give more flexibility in overriding components. + +## Naming + +While changes in naming can cause some minor disruption for developers familiar +with the history of DNN Platform, we aim to introduce simpler and more +forward-looking naming. For example, the methods of the `IHostController` +interface could be renamed to `IHostSettingsService`. Using `Service` instead +of `Controller` as the suffix aligns with modern .NET practices and avoids +confusion with MVC and Web API controllers. diff --git a/DNN Platform/DotNetNuke.DependencyInjection/README.md b/DNN Platform/DotNetNuke.DependencyInjection/README.md new file mode 100644 index 00000000000..3c8b9f08eb4 --- /dev/null +++ b/DNN Platform/DotNetNuke.DependencyInjection/README.md @@ -0,0 +1,59 @@ +# DotNetNuke.DependencyInjection project + +This project exposes `IDnnStartup`, which any component can implement in order +to register services with DNN's dependency injection container. It also exposes +an extension method on the `Assembly` class, `SafeGetTypes`, which gets all of +the `Type` objects from the assembly while handling potential load errors. + +This project targets +[.NET Standard](https://docs.microsoft.com/en-us/dotnet/standard/net-standard) +2.0, meaning that it is compatible with both .NET Framework and .NET Core. Any +interfaces defined in this project cannot reference types which are only +available to .NET Framework (for example, types in the `System.Web` namespace). + +## Requesting Dependencies + +DNN supports dependency injection for all of the major module patterns, and is +in the process of adding support in other areas. + +Within a Web API controller or MVC controller, requesting a type from the +dependency injection container is simple. Add a constructor to the controller +class, and any constructor arguments which can be resolved from the container +will be provided automatically. For example: + +```csharp +public class MyController : DnnApiController +{ + private readonly INavigationManager navigationManager; + + public MyController(INavigationManager navigationManager) + { + this.navigationManager = navigationManager; + } + +} +``` + +## Registering Dependencies + +In addition to the types that DNN automatically adds to the dependency injection +container, developers can register their own types as well. Simply create a +class that implements `IDnnStartup` and use the `ConfigureServices` method to +add registrations to the collection of services. For example: + +```csharp +public class Startup : IDnnStartup +{ + public void ConfigureServices(IServiceCollection services) + { + services.AddScoped(); + } +} +``` + +In this example, the `MyEmailCommunicator` class is mapped to the +`IMyEmailCommunicator` interface, using the _scoped_ lifetime. It is also +possible to register concrete types directly, or register factory methods or +specific instances. A registration will use one of the three available +lifetimes, `Transient` (a new instance every time), `Scoped` (a new instance for +each scope, e.g. web request), or `Singleton` (a single shared instance). From 5e0bdfd3e5b5960688e161983f9443bf3047b284 Mon Sep 17 00:00:00 2001 From: Tauqeer Haider Date: Wed, 26 Aug 2020 15:24:05 +0000 Subject: [PATCH 26/32] DNN-41046: disallowed custom form without DisplayName and lacking a DisplayNameFormat --- .../Attributes/RegistrationFieldsAttribute.cs | 24 ++++++++++++++++--- .../Components/Security/Constants.cs | 3 ++- .../DTO/UpdateRegistrationSettingsRequest.cs | 2 +- .../App_LocalResources/Security.resx | 3 +++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Attributes/RegistrationFieldsAttribute.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Attributes/RegistrationFieldsAttribute.cs index ba71ac36922..63fdc3c18b1 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Attributes/RegistrationFieldsAttribute.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Attributes/RegistrationFieldsAttribute.cs @@ -16,14 +16,16 @@ namespace Dnn.PersonaBar.Security.Attributes [AttributeUsage(AttributeTargets.Property)] class RegistrationFieldsAttribute : ValidationAttribute { - public RegistrationFieldsAttribute(string registrationFormType, string requireUniqueDisplayName) + public RegistrationFieldsAttribute(string registrationFormType, string requireUniqueDisplayName, string displayNameFormat) { this.RegistrationFormTypePropertyName = registrationFormType; - this.RequireUniqueDisplayNamePropertyName = requireUniqueDisplayName; + this.RequireUniqueDisplayNamePropertyName = requireUniqueDisplayName; + this.DisplayNameFormatPropertyName = displayNameFormat; } public string RegistrationFormTypePropertyName { get; private set; } - public string RequireUniqueDisplayNamePropertyName { get; private set; } + public string RequireUniqueDisplayNamePropertyName { get; private set; } + public string DisplayNameFormatPropertyName { get; private set; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { @@ -96,6 +98,22 @@ protected override ValidationResult IsValid(object value, ValidationContext vali { PortalController.UpdatePortalSetting(portalId, "Registration_RegistrationFormType", "0", false); return new ValidationResult(Localization.GetString(Constants.NoDisplayName, Constants.LocalResourcesFile)); + } + + var displayNameFormatValue = string.Empty; + + try + { + displayNameFormatValue = validationContext.ObjectType.GetProperty(this.DisplayNameFormatPropertyName).GetValue(validationContext.ObjectInstance, null).ToString(); + } + catch + { + return new ValidationResult(string.Format(Localization.GetString(Constants.NotValid, Constants.LocalResourcesFile), this.DisplayNameFormatPropertyName, displayNameFormatValue)); + } + + if (!registrationFields.Contains("DisplayName") && string.IsNullOrWhiteSpace(displayNameFormatValue)) + { + return new ValidationResult(Localization.GetString(Constants.IncorrectDisplayNameConfiguration, Constants.LocalResourcesFile)); } } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Constants.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Constants.cs index 54df7fbc44a..fd10b9ba99e 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Constants.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Constants.cs @@ -22,7 +22,8 @@ public static class Constants public const string NoEmail = "NoEmail"; public const string ContainsDuplicateAddresses = "ContainsDuplicateAddresses"; public const string DeletedTab = "DeletedTab"; - public const string DisabledTab = "DisabledTab"; + public const string DisabledTab = "DisabledTab"; + public const string IncorrectDisplayNameConfiguration = "IncorrectDisplayNameConfiguration"; public const string LocalResourcesFile = "~/DesktopModules/admin/Dnn.PersonaBar/Modules/Dnn.Security/App_LocalResources/Security.resx"; } } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/UpdateRegistrationSettingsRequest.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/UpdateRegistrationSettingsRequest.cs index fd967102273..f117288955d 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/UpdateRegistrationSettingsRequest.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/UpdateRegistrationSettingsRequest.cs @@ -20,7 +20,7 @@ public class UpdateRegistrationSettingsRequest [RegistrationFormTypeOption] public int RegistrationFormType { get; set; } - [RegistrationFields("RegistrationFormType", "RequireUniqueDisplayName")] + [RegistrationFields("RegistrationFormType", "RequireUniqueDisplayName", "DisplayNameFormat")] public string RegistrationFields { get; set; } public bool RequireUniqueDisplayName { get; set; } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx index b19db47aad6..d7a6077923c 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx @@ -1147,4 +1147,7 @@ Redirection has been moved to Site Settings + + The Display Name configuration is not correct. Either provide Display Name Format or include Display Name in the list of fields. + \ No newline at end of file From f11150e2f08b14a9f16c697fa840f74c5b2f860e Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Wed, 26 Aug 2020 17:52:44 -0400 Subject: [PATCH 27/32] Improves GitVersion speed (#4016) * Improves GitVersion performance Ignores commits before 2020 for GitVersion calculations, thus speeding up builds. * Not a list but a single value * Update gitversion.yml Changing date to `2020-01-01` instead of `2019-01-01` Co-authored-by: David Poindexter --- gitversion.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gitversion.yml b/gitversion.yml index 9da2681ae3e..bf289bdaf60 100644 --- a/gitversion.yml +++ b/gitversion.yml @@ -2,8 +2,9 @@ next-version: 9.6.0 commit-date-format: 'yyyyMMdd' assembly-file-versioning-format: '{Major}.{Minor}.{Patch}.{CommitsSinceVersionSource}' mode: ContinuousDeployment +ignore: + commits-before: 2020-01-01T00:00:00 branches: - future: regex: future?[/-] tag: 'alpha' From 2d6eb3f2732611c6441e4d2d95f5e372c70345a8 Mon Sep 17 00:00:00 2001 From: Tauqeer Haider Date: Fri, 28 Aug 2020 14:16:36 +0000 Subject: [PATCH 28/32] Popup message content changed to avoid plural confusion (#3980) --- .../personaBar/Dnn.Security/App_LocalResources/Security.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx index b19db47aad6..5d73db796b3 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/admin/personaBar/Dnn.Security/App_LocalResources/Security.resx @@ -667,7 +667,7 @@ Allowable File Extensions: - Settings has been updated. + Settings have been updated. Could not update settings. Please try later. From 78907f0381f39361f5e0801fb8a35c64f5d60967 Mon Sep 17 00:00:00 2001 From: ijungleboy Date: Fri, 28 Aug 2020 22:15:08 +0200 Subject: [PATCH 29/32] Fix bug in TokenReplace getting Module by Id https://github.com/dnnsoftware/Dnn.Platform/issues/4003 --- .../Library/Services/Tokens/TokenReplace.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/DNN Platform/Library/Services/Tokens/TokenReplace.cs b/DNN Platform/Library/Services/Tokens/TokenReplace.cs index ce036e67448..e13d579d985 100644 --- a/DNN Platform/Library/Services/Tokens/TokenReplace.cs +++ b/DNN Platform/Library/Services/Tokens/TokenReplace.cs @@ -133,7 +133,16 @@ public int ModuleId { get => TokenContext.Module?.ModuleID ?? Null.NullInteger; set => TokenContext.Module = GetModule(value); } - + + /// + /// Load the module for the Module Token Provider + /// + /// + /// The populated ModuleInfo or null + /// + /// This method is called by the Setter of ModuleId. + /// Because of this, it may NOT access ModuleId itself (which will still be -1) but use moduleId (lower case) + /// private ModuleInfo GetModule(int moduleId) { if (moduleId == TokenContext.Module?.ModuleID) @@ -144,9 +153,9 @@ private ModuleInfo GetModule(int moduleId) var tab = TokenContext.Tab ?? PortalSettings?.ActiveTab; if (tab != null && tab.TabID > 0) - return ModuleController.Instance.GetModule(ModuleId, tab.TabID, false); + return ModuleController.Instance.GetModule(moduleId, tab.TabID, false); - return ModuleController.Instance.GetModule(ModuleId, Null.NullInteger, true); + return ModuleController.Instance.GetModule(moduleId, Null.NullInteger, true); } /// From 469a4ff06b7a9fb1f532302e2f7f4fd4f44ca85e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2020 23:16:14 +0000 Subject: [PATCH 30/32] Updates versions as per release candidate creation --- .github/ISSUE_TEMPLATE/bug-report.md | 1 + Build/Symbols/DotNetNuke_Symbols.dnn | 2 +- .../Admin Modules/Dnn.Modules.Console/dnn_Console.dnn | 2 +- .../Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn | 2 +- DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn | 2 +- DNN Platform/Connectors/Azure/AzureConnector.dnn | 2 +- .../Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn | 2 +- DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn | 2 +- .../DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn | 2 +- DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn | 2 +- .../dnn_Website_Deprecated.dnn | 2 +- DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn | 2 +- DNN Platform/Modules/DDRMenu/DDRMenu.dnn | 2 +- DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn | 2 +- .../Modules/DnnExportImport/dnn_SiteExportImport.dnn | 2 +- DNN Platform/Modules/Groups/SocialGroups.dnn | 2 +- DNN Platform/Modules/HTML/dnn_HTML.dnn | 2 +- .../Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn | 2 +- DNN Platform/Modules/Journal/Journal.dnn | 2 +- DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn | 2 +- DNN Platform/Modules/RazorHost/Manifest.dnn | 2 +- DNN Platform/Modules/RazorHost/RazorHost.dnn | 2 +- .../DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn | 2 +- .../DotNetNuke.Authentication.Google/Google_Auth.dnn | 2 +- .../DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn | 2 +- .../DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn | 2 +- .../SimpleWebFarmCachingProvider.dnn | 2 +- .../Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn | 2 +- DNN Platform/Providers/FolderProviders/FolderProviders.dnn | 2 +- DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn | 4 ++-- Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Bundle.Web/package.json | 4 ++-- .../ClientSide/Dnn.React.Common/package.json | 2 +- Dnn.AdminExperience/ClientSide/Extensions.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Licensing.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Pages.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Prompt.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Roles.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Security.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Seo.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Servers.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json | 4 ++-- .../ClientSide/SiteImportExport.Web/package.json | 4 ++-- .../ClientSide/SiteSettings.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Sites.Web/package.json | 4 ++-- .../ClientSide/Sites.Web/src/_exportables/package.json | 4 ++-- .../ClientSide/TaskScheduler.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Themes.Web/package.json | 4 ++-- Dnn.AdminExperience/ClientSide/Users.Web/package.json | 4 ++-- .../ClientSide/Users.Web/src/_exportables/package.json | 4 ++-- .../ClientSide/Vocabularies.Web/package.json | 4 ++-- .../Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn | 2 +- .../EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn | 2 +- .../Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn | 2 +- SolutionInfo.cs | 6 +++--- package.json | 2 +- 56 files changed, 79 insertions(+), 78 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index ee90d788591..b3af51dfbb5 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -41,6 +41,7 @@ Provide any additional context that may be helpful in understanding and/or resol Please add X in at least one of the boxes as appropriate. In order for an issue to be accepted, a developer needs to be able to reproduce the issue on a currently supported version. If you are looking for a workaround for an issue with an older version, please visit the forums at https://dnncommunity.org/forums --> * [ ] 10.00.00 alpha build +* [ ] 09.07.01 release candidate * [ ] 09.07.00 release candidate * [ ] 09.06.02 latest supported release diff --git a/Build/Symbols/DotNetNuke_Symbols.dnn b/Build/Symbols/DotNetNuke_Symbols.dnn index ffe8163fb1c..a2848a43bae 100644 --- a/Build/Symbols/DotNetNuke_Symbols.dnn +++ b/Build/Symbols/DotNetNuke_Symbols.dnn @@ -1,6 +1,6 @@  - + DNN Platform Symbols This package contains Debug Symbols and Intellisense files for DNN Platform. diff --git a/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn b/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn index b175261e312..610861cb7c3 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn +++ b/DNN Platform/Admin Modules/Dnn.Modules.Console/dnn_Console.dnn @@ -1,6 +1,6 @@  - + Console Display children pages as icon links for navigation. ~/DesktopModules/Admin/Console/console.png diff --git a/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn b/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn index a0c074d43b0..df72488c98b 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn +++ b/DNN Platform/Admin Modules/Dnn.Modules.ModuleCreator/dnn_ModuleCreator.dnn @@ -1,6 +1,6 @@  - + Module Creator Development of modules. ~/Icons/Sigma/ModuleCreator_32x32.png diff --git a/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn b/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn index ed89989b7ca..3eaf44eee27 100644 --- a/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn +++ b/DNN Platform/Components/Telerik/DotNetNuke.Telerik.Web.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Telerik Web Components Provides Telerik Components for DotNetNuke. diff --git a/DNN Platform/Connectors/Azure/AzureConnector.dnn b/DNN Platform/Connectors/Azure/AzureConnector.dnn index 29cacb6b28d..4bc1f9114f3 100644 --- a/DNN Platform/Connectors/Azure/AzureConnector.dnn +++ b/DNN Platform/Connectors/Azure/AzureConnector.dnn @@ -1,6 +1,6 @@  - + Dnn Azure Connector The Azure Connector allows you to integrate Azure as your commenting solution with the Publisher module. ~/DesktopModules/Connectors/Azure/Images/icon-azure-32px.png diff --git a/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn b/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn index 406821d1f05..56d2f701743 100644 --- a/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn +++ b/DNN Platform/Connectors/GoogleAnalytics/GoogleAnalyticsConnector.dnn @@ -1,6 +1,6 @@ - + Google Analytics Connector Configure your sites Google Analytics settings. ~/DesktopModules/Connectors/GoogleAnalytics/Images/GoogleAnalytics_32X32_Standard.png diff --git a/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn b/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn index b193d43a327..c0a18fecec3 100644 --- a/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn +++ b/DNN Platform/Dnn.AuthServices.Jwt/Dnn.Jwt.dnn @@ -1,6 +1,6 @@ - + DNN JWT Auth Handler DNN Json Web Token Authentication (JWT) library for cookie-less Mobile authentication clients diff --git a/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn b/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn index a60c2fabe1e..aec401b2b69 100644 --- a/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn +++ b/DNN Platform/DotNetNuke.Web.Deprecated/dnn_Web_Deprecated.dnn @@ -1,6 +1,6 @@  - + DNN Deprecated Web Controls Library DNN Deprecated Web Controls library for legacy Telerik depepndency diff --git a/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn b/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn index efcd8e9c759..984f6764b87 100644 --- a/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn +++ b/DNN Platform/DotNetNuke.WebUtility/DotNetNuke.ClientAPI.dnn @@ -1,6 +1,6 @@  - + DotNetNuke ClientAPI The DotNetNuke Client API is composed of both server-side and client-side code that works together to enable a simple and reliable interface for the developer to provide a rich client-side experience. diff --git a/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn b/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn index 25d44ec9d9f..42eae0a487c 100644 --- a/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn +++ b/DNN Platform/DotNetNuke.Website.Deprecated/dnn_Website_Deprecated.dnn @@ -1,6 +1,6 @@  - + DNN Deprecated Website Codebehind files DNN Deprecated Website Codebehind files for backward compability. diff --git a/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn b/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn index 290b9b0a819..582bf09dec1 100644 --- a/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn +++ b/DNN Platform/Modules/CoreMessaging/CoreMessaging.dnn @@ -1,6 +1,6 @@ - + Message Center Core Messaging module allows users to message each other. ~/DesktopModules/CoreMessaging/Images/messaging_32X32.png diff --git a/DNN Platform/Modules/DDRMenu/DDRMenu.dnn b/DNN Platform/Modules/DDRMenu/DDRMenu.dnn index 7caea28a48f..81089f7f0cc 100644 --- a/DNN Platform/Modules/DDRMenu/DDRMenu.dnn +++ b/DNN Platform/Modules/DDRMenu/DDRMenu.dnn @@ -1,6 +1,6 @@  - + DDR Menu DotNetNuke Navigation Provider. diff --git a/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn b/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn index 10490de7712..49575d64080 100644 --- a/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn +++ b/DNN Platform/Modules/DigitalAssets/dnn_DigitalAssets.dnn @@ -1,6 +1,6 @@ - + Digital Asset Management DotNetNuke Corporation Digital Asset Management module Images/Files_32x32_Standard.png diff --git a/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn b/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn index 1719629dfdf..df236c52b4e 100644 --- a/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn +++ b/DNN Platform/Modules/DnnExportImport/dnn_SiteExportImport.dnn @@ -1,6 +1,6 @@ - + Site Export Import DotNetNuke Corporation Site Export Import Library Images/Files_32x32_Standard.png diff --git a/DNN Platform/Modules/Groups/SocialGroups.dnn b/DNN Platform/Modules/Groups/SocialGroups.dnn index 7c46b8960fe..c28fc278f13 100644 --- a/DNN Platform/Modules/Groups/SocialGroups.dnn +++ b/DNN Platform/Modules/Groups/SocialGroups.dnn @@ -1,6 +1,6 @@ - + Social Groups DotNetNuke Corporation Social Groups module ~/DesktopModules/SocialGroups/Images/Social_Groups_32X32.png diff --git a/DNN Platform/Modules/HTML/dnn_HTML.dnn b/DNN Platform/Modules/HTML/dnn_HTML.dnn index 680c273167b..e103e7a090a 100644 --- a/DNN Platform/Modules/HTML/dnn_HTML.dnn +++ b/DNN Platform/Modules/HTML/dnn_HTML.dnn @@ -1,6 +1,6 @@  - + HTML This module renders a block of HTML or Text content. The Html/Text module allows authorized users to edit the content either inline or in a separate administration page. Optional tokens can be used that get replaced dynamically during display. All versions of content are stored in the database including the ability to rollback to an older version. DesktopModules\HTML\Images\html.png diff --git a/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn b/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn index bc394c57fe3..4aebc55e41f 100644 --- a/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn +++ b/DNN Platform/Modules/HtmlEditorManager/dnn_HtmlEditorManager.dnn @@ -1,6 +1,6 @@  - + Html Editor Management Images/HtmlEditorManager_Standard_32x32.png A module used to configure toolbar items, behavior, and other options used in the DotNetNuke HtmlEditor Provider. diff --git a/DNN Platform/Modules/Journal/Journal.dnn b/DNN Platform/Modules/Journal/Journal.dnn index a0b1edd9d82..5b6ca0ef27b 100644 --- a/DNN Platform/Modules/Journal/Journal.dnn +++ b/DNN Platform/Modules/Journal/Journal.dnn @@ -1,6 +1,6 @@ - + Journal DotNetNuke Corporation Journal module DesktopModules/Journal/Images/journal_32X32.png diff --git a/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn b/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn index f6887769201..72ebe30799d 100644 --- a/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn +++ b/DNN Platform/Modules/MemberDirectory/MemberDirectory.dnn @@ -1,6 +1,6 @@ - + Member Directory The Member Directory module displays a list of Members based on role, profile property or relationship. ~/DesktopModules/MemberDirectory/Images/member_list_32X32.png diff --git a/DNN Platform/Modules/RazorHost/Manifest.dnn b/DNN Platform/Modules/RazorHost/Manifest.dnn index ba9bb60b52b..5c9651f61cf 100644 --- a/DNN Platform/Modules/RazorHost/Manifest.dnn +++ b/DNN Platform/Modules/RazorHost/Manifest.dnn @@ -1,6 +1,6 @@  - + {0} {1} diff --git a/DNN Platform/Modules/RazorHost/RazorHost.dnn b/DNN Platform/Modules/RazorHost/RazorHost.dnn index 487e17e8968..89ce25027df 100644 --- a/DNN Platform/Modules/RazorHost/RazorHost.dnn +++ b/DNN Platform/Modules/RazorHost/RazorHost.dnn @@ -1,6 +1,6 @@  - + Razor Host The Razor Host module allows developers to host Razor Scripts. diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn index 77f3b08ae4b..a1d92a594fd 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Facebook/Facebook_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Facebook Authentication Project The DotNetNuke Facebook Authentication Project is an Authentication provider for DotNetNuke that uses Facebook authentication to authenticate users. diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn index 7049a0cac24..b404a8cf698 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Google/Google_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Google Authentication Project The DotNetNuke Google Authentication Project is an Authentication provider for DotNetNuke that uses Google authentication to authenticate users. diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn index f2403e42664..ba08326683f 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.LiveConnect/Live_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Live Authentication Project The DotNetNuke Live Authentication Project is an Authentication provider for DotNetNuke that uses diff --git a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn index 3535b3cd587..152f165f4b9 100644 --- a/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn +++ b/DNN Platform/Providers/AuthenticationProviders/DotNetNuke.Authentication.Twitter/Twitter_Auth.dnn @@ -1,6 +1,6 @@ - + DotNetNuke Twitter Authentication Project The DotNetNuke Twitter Authentication Project is an Authentication provider for DotNetNuke that uses diff --git a/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn b/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn index 80e65cc9214..aa142f43c8d 100644 --- a/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn +++ b/DNN Platform/Providers/CachingProviders/DotNetNuke.Providers.Caching.SimpleWebFarmCachingProvider/SimpleWebFarmCachingProvider.dnn @@ -1,6 +1,6 @@  - + DotNetNuke Simple Web Farm Caching Provider DotNetNuke Simple Web Farm Caching Provider diff --git a/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn b/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn index f121f14e896..ce360327eef 100644 --- a/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn +++ b/DNN Platform/Providers/ClientCapabilityProviders/Provider.AspNetCCP/AspNetClientCapabilityProvider.dnn @@ -1,6 +1,6 @@ - + DotNetNuke ASP.NET Client Capability Provider ASP.NET Device Detection / Client Capability Provider ~/Providers/ClientCapabilityProviders/AspNetClientCapabilityProvider/Images/mobiledevicedet_32X32.png diff --git a/DNN Platform/Providers/FolderProviders/FolderProviders.dnn b/DNN Platform/Providers/FolderProviders/FolderProviders.dnn index d21a9ea97e4..ae065a9cd00 100644 --- a/DNN Platform/Providers/FolderProviders/FolderProviders.dnn +++ b/DNN Platform/Providers/FolderProviders/FolderProviders.dnn @@ -1,6 +1,6 @@  - + DotNetNuke Folder Providers Azure Folder Providers for DotNetNuke. diff --git a/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn b/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn index b13e10b8d90..1b6c1226899 100644 --- a/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn +++ b/DNN Platform/Skins/Xcillion/DNN_Skin_Xcillion.dnn @@ -1,6 +1,6 @@ - + Xcillion @@ -29,7 +29,7 @@ - + Xcillion diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index ab137c12936..e999b37bd14 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -1,6 +1,6 @@ { "name": "admin_logs", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "^7.0.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index ac16c6a8a0d..86624c6202f 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -1,6 +1,6 @@ { "name": "export-bundle", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p --progress", @@ -66,6 +66,6 @@ "webpack-dev-server": "3.1.14" }, "dependencies": { - "@dnnsoftware/dnn-react-common": "9.7.0" + "@dnnsoftware/dnn-react-common": "9.7.1" } } \ No newline at end of file diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 84b02eefa83..e689b04ead5 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -1,6 +1,6 @@ { "name": "@dnnsoftware/dnn-react-common", - "version": "9.7.0", + "version": "9.7.1", "private": false, "description": "DNN React Component Library", "main": "dist/dnn-react-common.min.js", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index f9cb2c47744..f6f813835bd 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -1,6 +1,6 @@ { "name": "extensions", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -13,7 +13,7 @@ "@babel/core": "^7.2.0", "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.6", "babel-plugin-transform-object-assign": "6.22.0", "babel-plugin-transform-object-rest-spread": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index 2e9cf6c487e..dab0254ebea 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -1,6 +1,6 @@ { "name": "licensing", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -13,7 +13,7 @@ "@babel/core": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 83486a6faad..8a8e23910a2 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -1,6 +1,6 @@ { "name": "pages", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "start": "npm run webpack", @@ -23,7 +23,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.0.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "@types/knockout": "^3.4.66", "@types/redux": "3.6.31", "babel-eslint": "^10.0.1", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index 2e6afef076d..b3a76b1cfc2 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -1,6 +1,6 @@ { "name": "prompt", - "version": "9.7.0", + "version": "9.7.1", "description": "DNN Prompt", "private": true, "scripts": { @@ -15,7 +15,7 @@ "@babel/core": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-eslint": "^10.0.1", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index 427f56c8712..ca7d895da94 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -1,6 +1,6 @@ { "name": "roles", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -13,7 +13,7 @@ "@babel/core": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "^2.0.0", "array.prototype.findindex": "^2.0.0", "babel-loader": "^8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index d9e0c283643..c0299c7860f 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -1,6 +1,6 @@ { "name": "security_settings", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-react-jsx": "^7.2.0", "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.6", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "create-react-class": "^15.6.3", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index 61bbc6fba8e..00cc6717100 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -1,6 +1,6 @@ { "name": "seo", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index f829260e46a..408dfe35d74 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -1,6 +1,6 @@ { "name": "servers", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "@types/redux": "^3.6.31", "babel-loader": "8.0.6", "babel-plugin-transform-object-assign": "6.22.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index 799ef2f1f2e..4b05b53d552 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -1,6 +1,6 @@ { "name": "dnn-sitegroups", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "7.0.0", "@babel/preset-env": "7.1.6", "@babel/preset-react": "7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.6", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-polyfill": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 3ed7873cb94..a385d30e7eb 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -1,6 +1,6 @@ { "name": "site_import_export", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-react-jsx": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-eslint": "^10.0.1", "babel-loader": "8.0.6", "babel-plugin-transform-class-properties": "^6.22.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 38d4bc96adb..7331cd862ff 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -1,6 +1,6 @@ { "name": "site_settings", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-react-jsx": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "^8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index 60df4b9f9d4..ba9427bf89d 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -1,6 +1,6 @@ { "name": "boilerplate", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "7.0.0", "@babel/preset-env": "7.1.6", "@babel/preset-react": "7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.6", "babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-polyfill": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index fe74be173bc..dcec0214404 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -1,6 +1,6 @@ { "name": "dnn-sites-list-view", - "version": "9.7.0", + "version": "9.7.1", "description": "DNN Sites List View", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -15,7 +15,7 @@ "@babel/plugin-transform-object-assign": "7.0.0", "@babel/preset-env": "7.1.6", "@babel/preset-react": "7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.4", "babel-plugin-transform-react-remove-prop-types": "0.4.20", "babel-polyfill": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index b06a78f5a85..646a2d58777 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -1,6 +1,6 @@ { "name": "task_scheduler", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "8.0.6", diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index def4ecd104d..3ab888bbea1 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -1,6 +1,6 @@ { "name": "themes", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.6", "babel-plugin-transform-object-assign": "6.22.0", "babel-plugin-transform-object-rest-spread": "6.26.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index d10a892948f..7e644980ee3 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -1,6 +1,6 @@ { "name": "users", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "start": "npm run webpack", @@ -51,7 +51,7 @@ "webpack-dev-server": "^3.1.14" }, "dependencies": { - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "localization": "^1.0.2", "react-widgets": "^4.4.6" } diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index 27afb7f3abc..fe908dd9b7a 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -1,6 +1,6 @@ { "name": "dnn-users-exportables", - "version": "9.7.0", + "version": "9.7.1", "description": "DNN Users Exportables", "scripts": { "start": "npm run webpack", @@ -16,7 +16,7 @@ "@babel/plugin-transform-react-jsx": "^7.1.6", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "babel-loader": "8.0.6", "create-react-class": "^15.6.3", "css-loader": "2.1.1", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 94a11e18516..0aa0afdb099 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -1,6 +1,6 @@ { "name": "taxonomy", - "version": "9.7.0", + "version": "9.7.1", "private": true, "scripts": { "build": "set NODE_ENV=production&&webpack -p", @@ -14,7 +14,7 @@ "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@dnnsoftware/dnn-react-common": "9.7.0", + "@dnnsoftware/dnn-react-common": "9.7.1", "array.prototype.find": "2.0.4", "array.prototype.findindex": "2.0.2", "babel-loader": "^8.0.6", diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn index a1cd46c49ba..6fded21fbdd 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Dnn.PersonaBar.Extensions.dnn @@ -1,6 +1,6 @@ - + Dnn.PersonaBar.Extensions ~/Images/icon-personabarapp-32px.png diff --git a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn index 44ba83ed003..04feebebcf5 100644 --- a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn +++ b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/Dnn.EditBar.UI.dnn @@ -1,6 +1,6 @@ - + Dnn.EditBar.UI diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn index 64e3f879532..fdb6e56b61f 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/Dnn.PersonaBar.UI.dnn @@ -1,6 +1,6 @@ - + Dnn.PersonaBar.UI diff --git a/SolutionInfo.cs b/SolutionInfo.cs index 779cb1df27a..5504264c18f 100644 --- a/SolutionInfo.cs +++ b/SolutionInfo.cs @@ -12,6 +12,6 @@ [assembly: AssemblyProduct("https://dnncommunity.org")] [assembly: AssemblyCopyright("DNN Platform is copyright 2002-2020 by .NET Foundation. All Rights Reserved.")] [assembly: AssemblyTrademark("DNN")] -[assembly: AssemblyVersion("9.7.0.0")] -[assembly: AssemblyFileVersion("9.7.0.0")] -[assembly: AssemblyInformationalVersion("9.7.0.0 Custom build")] +[assembly: AssemblyVersion("9.7.1.0")] +[assembly: AssemblyFileVersion("9.7.1.0")] +[assembly: AssemblyInformationalVersion("9.7.1.0 Custom build")] diff --git a/package.json b/package.json index 8d02c2e6a5a..63273bf5839 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dnn-platform", - "version": "9.7.0", + "version": "9.7.1", "private": true, "workspaces": [ "Dnn.AdminExperience/ClientSide/AdminLogs.Web", From 242df3c7121e25ae1ef191bdf2591ed1c46e4b5f Mon Sep 17 00:00:00 2001 From: Daniel Valadas Date: Fri, 28 Aug 2020 21:19:27 -0400 Subject: [PATCH 31/32] Update bug-report.md --- .github/ISSUE_TEMPLATE/bug-report.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index b3af51dfbb5..ccd2e40fce0 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -42,8 +42,7 @@ Please add X in at least one of the boxes as appropriate. In order for an issue --> * [ ] 10.00.00 alpha build * [ ] 09.07.01 release candidate -* [ ] 09.07.00 release candidate -* [ ] 09.06.02 latest supported release +* [ ] 09.07.00 latest supported release ## Affected browser