private void UpdateContentLocalization(bool enabled) { var connector = WebApiTestHelper.LoginHost(); var postData = new { PortalId = this.PortalId, ContentLocalizationEnabled = false, SystemDefaultLanguage = "English (United States)", SystemDefaultLanguageIcon = "/images/Flags/en-US.gif", SiteDefaultLanguage = "en-US", LanguageDisplayMode = "NATIVE", EnableUrlLanguage = true, EnableBrowserLanguage = true, AllowUserUICulture = false, CultureCode = "en-US", AllowContentLocalization = enabled, }; connector.PostJson("API/PersonaBar/SiteSettings/UpdateLanguageSettings", postData); connector.PostJson( enabled ? $"API/PersonaBar/Languages/EnableLocalizedContent?portalId={this.PortalId}&translatePages=false" : $"API/PersonaBar/Languages/DisableLocalizedContent?portalId={this.PortalId}", new { }); }
public void ExtendingTokenWithinLastHourExtendsUpToRenewalExpiry() { var token1 = GetAuthorizationTokenFor(_hostName, _hostPass); var parts = token1.AccessToken.Split('.'); var decoded = DecodeBase64(parts[1]); dynamic claims = JsonConvert.DeserializeObject(decoded); string sessionId = claims.sid; var query = "UPDATE {objectQualifier}JsonWebTokens SET RenewalExpiry=" + $"'{DateTime.UtcNow.AddMinutes(30).ToString("yyyy-MM-dd HH:mm:ss")}' WHERE TokenId='{sessionId}';"; DatabaseHelper.ExecuteNonQuery(query); WebApiTestHelper.ClearHostCache(); var token2 = RenewAuthorizationToken(token1); parts = token2.AccessToken.Split('.'); decoded = DecodeBase64(parts[1]); claims = JsonConvert.DeserializeObject(decoded); long claimExpiry = claims.exp; var expiryInToken = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(claimExpiry); Assert.Less(DateTime.UtcNow, expiryInToken); Assert.LessOrEqual(expiryInToken, DateTime.UtcNow.AddMinutes(31)); // appears the library rounds the time var record = DatabaseHelper.GetRecordById("JsonWebTokens", "TokenId", sessionId); var accessExpiry = (DateTime)record["TokenExpiry"]; var renewalExpiry = (DateTime)record["RenewalExpiry"]; Assert.AreEqual(accessExpiry, renewalExpiry); Assert.Less(DateTime.UtcNow, renewalExpiry); Assert.LessOrEqual(renewalExpiry, DateTime.UtcNow.AddMinutes(31)); Assert.AreEqual(accessExpiry, expiryInToken); }
public void Friend_Request_Should_Match_Target_User_Culture() { PrepareSecondLanguage(); int userId1, userId2, fileId1, fileId2; string userName1, userName2; CreateNewUser(out userId1, out userName1, out fileId1); CreateNewUser(out userId2, out userName2, out fileId2); UpdateUserProfile(userId1, UserProfile.USERPROFILE_PreferredLocale, FirstLanguage); UpdateUserProfile(userId2, UserProfile.USERPROFILE_PreferredLocale, SecondLanguage); WebApiTestHelper.ClearHostCache(); var connector = WebApiTestHelper.LoginUser(userName1); connector.PostJson("API/MemberDirectory/MemberDirectory/AddFriend", new { friendId = userId2 }, GetRequestHeaders()); var notificationTitle = GetNotificationTitle(userId1); //the notification should use french language: testuser8836 veut être amis avec vous Assert.AreEqual($"{userName1} veut être amis", notificationTitle); }
private bool LanguageEnabled(int portalId, string secondLanguage) { var portalLanguages = CBO.FillDictionary <string, Locale>("CultureCode", DataProvider.Instance().GetLanguagesByPortal(portalId)); if (!portalLanguages.ContainsKey(secondLanguage)) { var connector = WebApiTestHelper.LoginHost(); connector.PostJson($"API/PersonaBar/Extensions/ParseLanguagePackage?cultureCode={secondLanguage}", new {}); connector.PostJson($"API/PersonaBar/Extensions/InstallAvailablePackage", new { PackageType = "CoreLanguagePack", FileName = "installlanguage.resources" }); var language = CBO.FillDictionary <string, Locale>("CultureCode", DataProvider.Instance().GetLanguages())[secondLanguage]; connector.PostJson("API/PersonaBar/SiteSettings/UpdateLanguage", new { PortalId = PortalId, LanguageId = language.LanguageId, Code = language.Code, Enabled = true, IsDefault = false, Roles = "Administrators" }); } return(false); }
private IWebApiConnector AddModuleToPage(int tabId, string moduleName, out int moduleId) { var connector = WebApiTestHelper.LoginHost(); var desktopModuleId = DatabaseHelper.ExecuteScalar <int>($"SELECT DesktopModuleId FROM {{objectQualifier}}DesktopModules WHERE ModuleName = '{moduleName}'"); var postData = new { Visibility = 0, Position = -1, Module = desktopModuleId, Pane = "ContentPane", AddExistingModule = false, CopyModule = false, Sort = -1, }; var headers = new Dictionary <string, string> { { "TabId", tabId.ToString() } }; var response = connector.PostJson("API/internalservices/controlbar/AddModule", postData, headers) .Content.ReadAsStringAsync().Result; moduleId = Json.Deserialize <dynamic>(response).TabModuleID; return(connector); }
public void Journal_Should_Only_Able_See_By_Himself_When_Set_Security_To_Private() { int userId, fileId; string username; var connector = this.PrepareNewUser(out userId, out username, out fileId); // POST JOURNAL var journalText = $"{username} Post"; var postData = new { text = journalText, profileId = userId, groupId = -1, journalType = "file", securitySet = "P", itemData = $"{{\"ImageUrl\":\"\",\"Url\":\"fileid={fileId}\"}}", }; connector.PostJson("/API/Journal/Services/Create", postData, this.GetRequestHeaders()); var response = connector.GetContent($"/Activity-Feed/userId/{userId}").Content.ReadAsStringAsync().Result; Assert.Greater(response.IndexOf(journalText), 0); var hostConnector = WebApiTestHelper.LoginHost(); response = hostConnector.GetContent($"/Activity-Feed/userId/{userId}").Content.ReadAsStringAsync().Result; Assert.AreEqual(response.IndexOf(journalText), -1); }
private IWebApiConnector CreateNewPage(int templateTabId, out int tabId) { var pagesExecuter = new PagesExecuter { Connector = WebApiTestHelper.LoginHost() }; var pageSettingsBuilder = new PageSettingsBuilder(); pageSettingsBuilder.WithPermission(new TabPermissionsBuilder().Build()); if (templateTabId > 0) { pageSettingsBuilder.WithTemplateTabId(templateTabId); var modules = DatabaseHelper.ExecuteQuery <CopyModuleItem>($"SELECT ModuleId, ModuleTitle FROM {{objectQualifier}}TabModules WHERE TabId = {templateTabId}"); pageSettingsBuilder.WithCopyModules(modules.ToList()); } var pageDetail = pagesExecuter.SavePageDetails(pageSettingsBuilder.Build()); Assert.NotNull(pageDetail.Page, "The system must create the page and return its details in the response"); tabId = (int)pageDetail.Page.id; return(pagesExecuter.Connector); }
public void ValidatingFailureWhenUsingNonExistingMoniker() { // Arrange const string query1 = @"SELECT TOP(1) TabModuleId FROM {objectQualifier}TabModules WHERE TabId IN (SELECT TabId FROM {objectQualifier}Tabs WHERE TabName='Activity Feed') AND ModuleTitle='Journal';" ; var tabModuleId = DatabaseHelper.ExecuteScalar <int>(query1); Assert.Greater(tabModuleId, 0); // These will set a moniker for the Activity Feed module of the user profile DatabaseHelper.ExecuteNonQuery(@"EXEC {objectQualifier}DeleteTabModuleSetting " + tabModuleId + @", 'Moniker'"); WebApiTestHelper.ClearHostCache(); // Act var token = this.GetAuthorizationTokenFor(this._hostName, this._hostPass); this.SetAuthHeaderToken(token.AccessToken); this.SetMonikerHeader("myjournal"); var postItem = new { ProfileId = 1, GroupId = -1, RowIndex = 0, MaxRows = 1 }; var result = this._httpClient.PostAsJsonAsync( "/API/Journal/Services/GetListForProfile", postItem).Result; var content = result.Content.ReadAsStringAsync().Result; LogText(@"content => " + content); Assert.AreEqual(HttpStatusCode.Unauthorized, result.StatusCode); }
public void Add_Multi_Pages_For_Exisitng_Shoul_Return_Results() { var rnd = new Random().Next(1000, 10000); var addPagesDto = new BulkPage { BulkPages = "Page_" + rnd, ParentId = -1, Keywords = "", Tags = "", IncludeInMenu = true, StartDate = null, EndDate = null }; Console.WriteLine(@"Add bulk pages request = {0}", JsonConvert.SerializeObject(addPagesDto)); var connector = WebApiTestHelper.LoginHost(); var response = connector.PostJson(AddBulkPagesApi, addPagesDto).Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject <BulkPageResponseWrapper>(response); Console.WriteLine(@"Add bulk pages ersponse = {0}", response); Assert.AreEqual(0, result.Status); Assert.IsNull(result.Response.Pages.First().ErrorMessage); var response2 = connector.PostJson(VerigyBulkPagesApi, addPagesDto).Content.ReadAsStringAsync().Result; var result2 = JsonConvert.DeserializeObject <BulkPageResponseWrapper>(response2); Console.WriteLine(@"Verify bulk pages ersponse = {0}", response2); Assert.AreEqual(0, int.Parse(result2.Status.ToString())); Assert.IsNotNullOrEmpty(result2.Response.Pages.First().ErrorMessage); }
// trigger the scheduler to run through [Run Now] button of the UI private static HttpWebResponse TriggerScheduler(IDictionary <string, object> scheduleInfo, int moduleId) { var scheduleId = (int)scheduleInfo["ScheduleId"]; var scheduleTypeName = (string)scheduleInfo["TypeFullName"]; var scheduleFriendlyName = (string)scheduleInfo["FriendlyName"]; var objectDependencies = (string)scheduleInfo["ObjectDependencies"]; var fieldsPrefix = string.Format("dnn$ctr{0}$EditSchedule", moduleId); var postData = new Dictionary <string, object> { { fieldsPrefix + "$chkEnabled", "on" }, { fieldsPrefix + "$txtServers", "" }, { fieldsPrefix + "$ddlAttachToEvent", "None" }, { fieldsPrefix + "$ddlRetainHistoryNum", "100" }, { fieldsPrefix + "$ddlRetryTimeLapseMeasurement", "Minutes" }, { fieldsPrefix + "$ddlTimeLapseMeasurement", "Hours" }, { fieldsPrefix + "$startScheduleDatePicker$dateInput", "" }, { fieldsPrefix + "$startScheduleDatePicker", "" }, { fieldsPrefix + "$txtFriendlyName", scheduleFriendlyName }, { fieldsPrefix + "$txtObjectDependencies", objectDependencies }, { fieldsPrefix + "$txtRetryTimeLapse", "30" }, { fieldsPrefix + "$txtTimeLapse", "1" }, { fieldsPrefix + "$txtType", scheduleTypeName }, { "__EVENTTARGET", fieldsPrefix + "$cmdRun" }, // button action; if missing, no click action is performed { "__EVENTARGUMENT", "" }, { "__ASYNCPOST", "" }, // all other inputs/fields are left as is }; var relativeUrl = string.Format( "/Host/Schedule/ctl/Edit/mid/{0}/ScheduleId/{1}/portalid/{2}", moduleId, scheduleId, DnnDataHelper.PortalId); return(WebApiTestHelper.LoginHost().PostUserForm(relativeUrl, postData, null)); }
private void UpdateSslSettings(bool sslEnabled) { var connector = WebApiTestHelper.LoginHost(); var postData = new { SSLEnabled = sslEnabled, SSLEnforced = false, SSLURL = string.Empty, STDURL = string.Empty, SSLOffloadHeader = string.Empty }; connector.PostJson("API/PersonaBar/Security/UpdateSslSettings", postData); }
public static void DisableAppStartDelay(bool clearCache = true) { DatabaseHelper.ExecuteStoredProcedure("UpdateHostSetting", "SchedulerdelayAtAppStart", "0", false, 1); if (clearCache) { WebApiTestHelper.ClearHostCache(); } }
public void Using_Image_Handler_For_Foreign_Site_ShouldFail() { var session = WebApiTestHelper.GetAnnonymousConnector(); var relativeUrl = string.Format(HandlerPath, "https://google.com"); var response = session.GetContent(relativeUrl).Content.ReadAsStringAsync().Result; Assert.IsTrue(response.StartsWith("�PNG\r\n"), $"Content = {response}"); }
public void Using_Image_Handler_For_Main_Alias_ShouldPass() { var session = WebApiTestHelper.GetAnnonymousConnector(); var relativeUrl = string.Format(HandlerPath, AppConfigHelper.SiteUrl); var response = session.GetContent(relativeUrl).Content.ReadAsStringAsync().Result; Assert.IsTrue(response.StartsWith("GIF89a"), $"Content = {response}"); }
public static void EnableScheduler(string schedulerName, bool clearCache = false) { var query = string.Format( "UPDATE {{objectQualifier}}Schedule SET Enabled=1 WHERE FriendlyName = '{0}';", schedulerName); DatabaseHelper.ExecuteNonQuery(query); if (clearCache) { WebApiTestHelper.ClearHostCache(); } }
public static void SetSchedulingMode(SchedulingMode mode, bool clearCache = true) { var current = GetSchedulingMode(); if (current != mode) { DatabaseHelper.ExecuteStoredProcedure("UpdateHostSetting", "SchedulerMode", mode.ToString("D"), false, 1); if (clearCache) { WebApiTestHelper.ClearHostCache(); // must clear the site Cache afterwards } } }
private void AddUserToGroup(int groupId, int userId) { var connector = WebApiTestHelper.LoginHost(); var url = "/API/PersonaBar/Roles/AddUserToRole?notifyUser=true&isOwner=false"; connector.PostJson(url, new { userId = userId, roleId = groupId, isAdd = true, }); }
/// <summary> /// Sets a portal setting value, adding or updating the setting as required /// </summary> /// <param name="settingName">The name of the setting</param> /// <param name="settingValue">The value of the setting</param> /// <param name="portalId">The optional PortalId, default to 0</param> /// <param name="isSecure">This flag specifies whether the value is encrypted or not, defaults to false.</param> public static void SetPortalSetting(string settingName, string settingValue, int portalId = 0, bool isSecure = false) { var query = string.Format(@"MERGE INTO {{objectQualifier}}PortalSettings s USING (SELECT {2} PortalId, '{0}' SettingName, '{1}' SettingValue, {3} Sec) AS v ON s.SettingName = v.SettingName WHEN MATCHED THEN UPDATE SET s.SettingValue = v.SettingValue, SettingIsSecure = v.Sec WHEN NOT MATCHED THEN INSERT (PortalId, SettingName, SettingValue, SettingIsSecure) VALUES (v.PortalId, v.SettingName, v.SettingValue, v.Sec);" , settingName, settingValue, portalId, isSecure ? "1" : "0"); DatabaseHelper.ExecuteNonQuery(query); WebApiTestHelper.ClearHostCache(); }
public void GetUsersAsAdminWithVariousFiltersShoudlReturnExpectedResult(string actionName, int expectedTotal, string apiMethod) { // Arrange: all is done in TestFixtureSetUp() // Act var adminConnector = WebApiTestHelper.LoginUser(this._userNames[0]); var response = adminConnector.GetContent(apiMethod, null).Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject <dynamic>(response); // Assert var totalResults = int.Parse(result.TotalResults.ToString()); Assert.AreEqual(expectedTotal, totalResults, $"Total results {totalResults} is incorrect for action [{actionName}]"); }
private static int CreateRole(string roleName, string roleDescription, int portalId = 0) { var fileContent = SqlScripts.SingleRoleCreation; var masterScript = new StringBuilder(fileContent) .Replace(PortalIdMarker, portalId.ToString(CultureInfo.InvariantCulture)) .Replace("{objectQualifier}", AppConfigHelper.ObjectQualifier) .ToString(); var script = new StringBuilder(masterScript) .Replace(RoleNameMarker, roleName.Replace("'", "''")) .Replace(RoleDescriptionMarker, roleDescription.Replace("'", "''")); DatabaseHelper.ExecuteQuery(script.ToString()); WebApiTestHelper.ClearHostCache(); return(GetRoleId(roleName)); }
public void TryingToRenewUsingAnExpiredRenewalTokenShouldFail() { var token1 = GetAuthorizationTokenFor(_hostName, _hostPass); var parts = token1.AccessToken.Split('.'); var decoded = DecodeBase64(parts[1]); dynamic claims = JsonConvert.DeserializeObject(decoded); string sessionId = claims.sid; var query = "UPDATE {objectQualifier}JsonWebTokens SET RenewalExpiry=" + $"'{DateTime.UtcNow.AddMinutes(-1).ToString("yyyy-MM-dd HH:mm:ss")}' WHERE TokenId='{sessionId}';"; DatabaseHelper.ExecuteNonQuery(query); WebApiTestHelper.ClearHostCache(); SetAuthHeaderToken(token1.AccessToken); var result = _httpClient.PostAsJsonAsync(ExtendTokenQuery, new { rtoken = token1.RenewalToken }).Result; Assert.AreEqual(HttpStatusCode.Unauthorized, result.StatusCode); }
public override void TestFixtureSetUp() { // clear all existing users except the HOST superuser DatabaseHelper.ExecuteNonQuery("DELETE FROM {objectQualifier}UserRelationships"); DatabaseHelper.ExecuteNonQuery("DELETE FROM {objectQualifier}UserPortals"); DatabaseHelper.ExecuteNonQuery("DELETE FROM {objectQualifier}Users WHERE UserID > 1"); // create MaxUsers new users for (var i = 0; i < MaxUsers; i++) { int userId, fileId; string userName; WebApiTestHelper.PrepareNewUser(out userId, out userName, out fileId); this._userIds[i] = userId; this._userNames[i] = userName; Console.WriteLine(@"Created test users => id: {0}, username: {1}", userId, userName); } var hostConnector = WebApiTestHelper.LoginHost(); var userIdx = 0; // make first user as admin var makeAdminItem = new { RoleId = 0, UserId = this._userIds[userIdx] }; var response = hostConnector.PostJson(MakeAdminApi, makeAdminItem).Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject <dynamic>(response); Assert.AreEqual(this._userNames[userIdx], result.displayName.ToString()); // Unauthorize the next 2 new users for (userIdx = 1; userIdx <= 2; userIdx++) { var unauthorizeLink = string.Format(UnauthorizeApi, this._userIds[userIdx]); response = hostConnector.PostJson(unauthorizeLink, string.Empty).Content.ReadAsStringAsync().Result; result = JsonConvert.DeserializeObject <dynamic>(response); Assert.IsTrue(bool.Parse(result.Success.ToString())); } // soft delete the next new user var deleteLink = string.Format(DeleteApi, this._userIds[userIdx]); response = hostConnector.PostJson(deleteLink, string.Empty).Content.ReadAsStringAsync().Result; result = JsonConvert.DeserializeObject <dynamic>(response); Assert.IsTrue(bool.Parse(result.Success.ToString())); }
private IWebApiConnector CreateNewSecurePage(out int tabId) { var pagesExecuter = new PagesExecuter { Connector = WebApiTestHelper.LoginHost() }; var pageSettingsBuilder = new PageSettingsBuilder(); pageSettingsBuilder.WithPermission(new TabPermissionsBuilder().Build()); pageSettingsBuilder.WithSecure(true); var pageDetail = pagesExecuter.SavePageDetails(pageSettingsBuilder.Build()); Assert.NotNull(pageDetail.Page, "The system must create the page and return its details in the response"); tabId = (int)pageDetail.Page.id; return(pagesExecuter.Connector); }
public void UsingExpiredRenewalTokenShouldFail() { var token1 = this.GetAuthorizationTokenFor(this._hostName, this._hostPass); var parts = token1.AccessToken.Split('.'); var decoded = DecodeBase64(parts[1]); dynamic claims = JsonConvert.DeserializeObject(decoded); string sessionId = claims.sid; var query = "UPDATE {objectQualifier}JsonWebTokens SET RenewalExpiry=" + $"'{DateTime.UtcNow.AddMinutes(-1).ToString("yyyy-MM-dd HH:mm:ss")}' WHERE TokenId='{sessionId}';"; DatabaseHelper.ExecuteNonQuery(query); WebApiTestHelper.ClearHostCache(); this.SetAuthHeaderToken(token1.AccessToken); var result = this._httpClient.GetAsync(TestGetQuery).Result; var content = result.Content.ReadAsStringAsync().Result; LogText(@"content => " + content); Assert.AreEqual(HttpStatusCode.Unauthorized, result.StatusCode); }
public void File_Url_Should_Update_After_Rename_Folder() { var connector = WebApiTestHelper.LoginAdministrator(); var folder = CreateNewFolder(connector); var folderId = Convert.ToInt32(folder.FolderID); var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Files\\Test.png"); connector.UploadCmsFile(filePath, folder.FolderPath.ToString()); var fileId = GetFileId(folderId, "Test.png"); var newFolderName = Guid.NewGuid().ToString(); RenameFolder(connector, folderId, newFolderName); var getUrlApi = "API/DigitalAssets/ContentService/GetUrl"; var fileUrl = connector.PostJson(getUrlApi, new { fileId = fileId }, GetRequestHeaders()).Content.ReadAsStringAsync().Result; Assert.IsTrue(fileUrl.Contains(newFolderName)); }
private int CreateNewGroup(string roleName) { var connector = WebApiTestHelper.LoginHost(); var url = "/API/PersonaBar/Roles/SaveRole?assignExistUsers=false"; connector.PostJson(url, new { id = -1, name = roleName, groupId = -1, description = roleName, securityMode = 1, status = 1, isPublic = true, autoAssign = false, isSystem = false, }); return(DatabaseHelper.ExecuteScalar <int>($"SELECT RoleId FROM {{objectQualifier}}Roles WHERE RoleName = '{roleName}' AND PortalId = {this.PortalId}")); }
public void Using_Image_Handler_From_All_Alias_ShouldPass() { PortalAliasInfo pai; var aliases = PortalAliasHelper.GetPortalAliaes().ToList(); if (aliases.Count == 1) { var primary = aliases.First(); pai = new PortalAliasInfo { PortalID = primary.PortalID, HTTPAlias = "my-" + primary.HTTPAlias, CultureCode = primary.CultureCode, Skin = primary.Skin, BrowserType = primary.BrowserType, IsPrimary = false, }; } else { pai = aliases.First(a => a.PortalAliasID > 1); } var session = WebApiTestHelper.GetAnnonymousConnector(); aliases = PortalAliasHelper.GetPortalAliaes().ToList(); foreach (var alias in aliases) { var relativeUrl = string.Format(HandlerPath, AppConfigHelper.SiteUrl); var absoluteUrl = $"http://{alias.HTTPAlias}{relativeUrl}"; LogText("Getting image from " + absoluteUrl); var response = session.GetContent(absoluteUrl).Content.ReadAsStringAsync().Result; Assert.IsTrue(response.StartsWith("GIF89a"), $"Url: {absoluteUrl} / Content = {response}"); } }
private static IWebApiConnector PrepareTest(out bool isEnglishEnabled, out dynamic languageSettings) { var connector = WebApiTestHelper.LoginHost(); var response = connector.GetContent(GetLanguagesApi).Content.ReadAsStringAsync().Result; var result = JsonConvert.DeserializeObject <dynamic>(response); isEnglishEnabled = result.Languages[0].Enabled; response = connector.GetContent(GetLanguageSettingsApi).Content.ReadAsStringAsync().Result; result = JsonConvert.DeserializeObject <dynamic>(response); languageSettings = result.Settings; if (string.Compare(languageSettings.SiteDefaultLanguage.Value, EnglishLanguageCode, StringComparison.InvariantCultureIgnoreCase) == 0) { connector.PostJson(AddLanguageApi, new { Code = SpainishLanguageCode }); UpdateLanguageSettings(connector, languageSettings, SpainishLanguageCode); } if (isEnglishEnabled) { EnableEnglish(connector, false); } return(connector); }
private IDictionary <string, string> GetRequestHeaders() { return(WebApiTestHelper.GetRequestHeaders("//ActivityFeed", "Member Directory", PortalId)); }
/// <summary> /// Deletes a module from the specified tab and clears host cache. /// </summary> /// <param name="tabId">tabId on which module is deleted.</param> /// <param name="moduleId">moduleId that is deleted.</param> /// <param name="softDelete">if True, then softdeleted, otherwise harddeleted.</param> public static void DeleteTabModule(int tabId, int moduleId, bool softDelete) { DatabaseHelper.ExecuteStoredProcedure("DeleteTabModule", tabId, moduleId, softDelete); WebApiTestHelper.ClearHostCache(); }