/// <summary> /// Initializes the target object for the page /// </summary> /// <remarks>Many pages have "target" objects that the page operates on. For instance, when viewing /// an event, the target object is an event. When looking up a directory, that's the target /// object. This method is intended to be overriden to initialize the target object for /// each page that needs it.</remarks> protected override void InitializeTargetObject() { base.InitializeTargetObject(); if (MultiStepWizards.SearchDirectory.SearchBuilder == null || MultiStepWizards.SearchDirectory.SearchBuilder.Search == null) { GoTo("~/directory/SearchDirectory_Criteria.aspx"); return; } targetSearch = MultiStepWizards.SearchDirectory.SearchBuilder.Search.Clone(); if (targetSearch == null) { GoTo("~/directory/SearchDirectory_Criteria.aspx"); return; } foreach (var column in targetSearch.OutputColumns) { var labelOverride = PortalConfiguration.GetOverrideFor( Request.Url.LocalPath, ColumnHeaderOverridePrefix + column.Name, "Text"); if (labelOverride != null) { column.DisplayName = labelOverride.Value; } } addRequiredSearchParameters(); }
public void NavigateToProfileFromHeader() { var config = new PortalConfiguration("arthur"); // Arrange var portal = new Portal(config); if (!portal.Login()) { portal.Quit(); Assert.Fail("Failed to authenticate"); } var profileUrl = portal .ClickByLinkText("Close") // close the Admin floating menu .ClickByClassName("username") .ClickByLinkText("Profile") .Wait(2000) .GetCurrentUrl(); var profileEmailAddress = portal .GetValue("emailaddress1"); Assert.AreEqual($"{config.BaseUrl}profile/", profileUrl); Assert.AreEqual("*****@*****.**", profileEmailAddress); portal.Quit(); }
public void FirstTestDuringSetUp() { #region actions to do //TODO - Support for multiple browsers //TODO - Initialisation helper - set up and tear down of local user account //TODO - Provide several different base classes, e.g. LoginAndQuitAfterTest(personaName), BasePortalTest() // Each class should be as test small as possible and include as little set up as possible. // ^^ On average, 10-20 lines max. would be great :) #endregion actions to do var config = new PortalConfiguration("arthur"); // Arrange var portal = new Portal(config); if (!portal.Login()) { //TODO - extract this out into the Login method, not in the test class portal.Quit(); Assert.Fail("Failed to authenticate"); } // Act var result = portal .SetValue("firstname", "Arthur") // TODO - Extract magic strings out into overridable DataModel .SetValue("lastname", "Nicholson-Gumuła") .Click("submit") .Wait(1000) .GetValue("name"); // Assert Assert.AreEqual("Arthur Nicholson-Gumuła", result, "Record name has been set correctly"); portal.Quit(); }
public void UserCanUpdateNickname() { var config = new PortalConfiguration("arthur"); // Arrange var portal = new Portal(config); if (!portal.Login()) { Assert.Fail("Failed to authenticate"); } var oldNickName = portal .ClickByLinkText("Close") // close the Admin floating menu .ClickByClassName("username") .ClickByLinkText("Profile") .Wait(2000) .GetValue("nickname"); // TODO - write test // Set new nick name // Submit // Refresh // Get and assert // Reset to original nickname and assert }
public void TestConfigSettings() { var config = new PortalConfiguration("arthur"); Assert.AreEqual("arthur", config.UserCredentials.UserName); Assert.AreEqual("https://awesome-portal.powerappsportals.com/", config.BaseUrl); }
protected void generateFieldsDataView() { DataTable fieldTable = new DataTable(); fieldTable.Columns.Add(new DataColumn("FieldName", typeof(string))); fieldTable.Columns.Add(new DataColumn("FieldValue", typeof(string))); foreach (DataColumn dcDetailsColumn in targetDetailsRow.Table.Columns) { if (dcDetailsColumn.ColumnName == "ID" || dcDetailsColumn.ColumnName == "ROW_NUMBER") { continue; } DataColumn column = dcDetailsColumn; var field = targetManifest.Fields.Where(x => x.Name == column.ColumnName).FirstOrDefault(); string fieldName = field != null ? field.Label : column.ColumnName; DataRow row = fieldTable.NewRow(); row["FieldName"] = fieldName; var labelOverride = PortalConfiguration.GetOverrideFor( Request.Url.LocalPath, DetailLabelOverridePrefix + (field != null ? field.Name : column.ColumnName), "Text"); if (labelOverride != null) { row["FieldName"] = labelOverride.Value; } row["FieldValue"] = targetDetailsRow[column].ToString(); fieldTable.Rows.Add(row); } dvDetailsFields = new DataView(fieldTable); }
public void CreateNewCase() { // Arrange var config = new PortalConfiguration("arthur"); var portal = new Portal(config); if (!portal.Login()) { Assert.Fail("Failed to authenticate"); } // Act var createdCaseUrl = portal .Navigate(SupportPage.PageUrl) .Wait(1000) .ClickByLinkText(SupportPage.CreateNewCase) .Wait(1000) .SetValue(SupportPage.Title, $"New Test Case - {DateTime.Now}") //.SetValue(SupportPage.CaseType, ) .SetValue(SupportPage.Description, "This is a new case because I'm having problems setting OptionSets in the portal") .Click(SupportPage.Submit) .Wait(2000) .GetCurrentUrl(); portal.Quit(); // Assert Console.WriteLine($"URL of generated Case is {createdCaseUrl}"); Assert.IsTrue(createdCaseUrl.Contains("/?created")); }
/// <summary> /// Initializes the target object for the page /// </summary> /// <remarks>Many pages have "target" objects that the page operates on. For instance, when viewing /// an event, the target object is an event. When looking up a directory, that's the target /// object. This method is intended to be overriden to initialize the target object for /// each page that needs it.</remarks> protected override void InitializeTargetObject() { base.InitializeTargetObject(); if (MultiStepWizards.SearchDirectory.SearchManifest == null) { MultiStepWizards.SearchDirectory.SearchManifest = buildSearchManifest(); } using (IConciergeAPIService proxy = GetConciegeAPIProxy()) { var s = new Search("MembershipWithFlowdown"); PortalConfiguration.Current.MembershipDirectorySearchFields.ForEach(x => s.AddOutputColumn(x)); targetCriteriaFields = proxy.DescribeCompiledSearch(s).ResultValue.Fields; foreach (var f in targetCriteriaFields) { f.PortalPrompt = null; // MS-923 if (f.DataType == FieldDataType.Reference && f.DisplayType == FieldDisplayType.TextBox) { f.DisplayType = FieldDisplayType.AjaxComboBox; // MS-925 } var labelOverride = PortalConfiguration.GetOverrideFor( Request.Url.LocalPath, ColumnHeaderOverridePrefix + f.Name, "Text"); if (labelOverride != null) { f.Label = labelOverride.Value; } } } }
private msPortalControlPropertyOverride _getCurrentOverride() { if (!string.IsNullOrWhiteSpace(MultiStepWizards.CustomizePage.EditModeControlName) && !string.IsNullOrWhiteSpace(MultiStepWizards.CustomizePage.EditModeControlPropertyName)) { return(PortalConfiguration.GetOverrideFor(MultiStepWizards.CustomizePage.PageName, MultiStepWizards.CustomizePage.EditModeControlName, MultiStepWizards.CustomizePage.EditModeControlPropertyName)); } return(null); }
public Portal(PortalConfiguration configuration) { _config = configuration; switch (_config.BrowserSettings.BrowserType) { case BrowserType.Chrome: var chromeOptions = new ChromeOptions(); if (_config.BrowserSettings.Headless) { chromeOptions.AddArguments("headless"); } _driver = new ChromeDriver(chromeOptions); break; case BrowserType.Firefox: var firefoxOptions = new FirefoxOptions(); if (_config.BrowserSettings.Headless) { firefoxOptions.AddArguments("--headless"); } _driver = new FirefoxDriver(firefoxOptions); break; case BrowserType.Edge: var edgeOptions = new EdgeOptions(); edgeOptions.UseChromium = true; if (_config.BrowserSettings.Headless) { edgeOptions.AddArguments("headless"); } _driver = new EdgeDriver(edgeOptions); break; default: throw new ArgumentOutOfRangeException(); } //_driver = new FirefoxDriver(); this.Navigate(_config.BaseUrl); }
protected void gvValues_RowDataBound(object sender, GridViewRowEventArgs e) { var ppo = (msPortalControlPropertyOverride)e.Row.DataItem; if (Page.IsPostBack) { return; // only do this if there's a postback - otherwise, preserve ViewState } switch (e.Row.RowType) { case DataControlRowType.Header: break; case DataControlRowType.Footer: break; case DataControlRowType.DataRow: var lbEdit = (LinkButton)e.Row.FindControl("lbEdit"); var lbReset = (LinkButton)e.Row.FindControl("lbReset"); var lValue = (Literal)e.Row.FindControl("lValue"); lbReset.Visible = false; lValue.Text = ppo.Value; var ppoExisting = PortalConfiguration.GetOverrideFor(ppo.PageName, ppo.ControlName, ppo.PropertyName); if (ppoExisting != null) { lbReset.Visible = true; lValue.Text = ppoExisting.Value; ppo.ID = ppoExisting.ID; } lbEdit.CommandArgument = ppo.ID; // guaranteed to be set above lbReset.CommandArgument = ppo.ID; // guaranteed to be set above RegisterJavascriptConfirmationBox(lbReset, "Are you sure you want to reset the specified text back to its default value?"); // If we have to truncate, also HTML Encode the data to prevent incomplete HTML if (lValue.Text != null && lValue.Text.Length > 100) { lValue.Text = Server.HtmlEncode(lValue.Text.Substring(0, 100) + "..."); } break; } }
public void CanLogIn() { var config = new PortalConfiguration("arthur"); // Arrange var portal = new Portal(config); if (!portal.Login()) { portal.Quit(); Assert.Fail("Failed to authenticate"); } Assert.True(true, "Succeeded in logging in!"); Assert.AreEqual(config.BaseUrl, portal.GetCurrentUrl()); portal.Quit(); }
public void WalksThroughContactDetailsInGdsPortal() { const int standardWaitTime = 2000; var config = new PortalConfiguration("arthur"); var portal = new Portal(config); if (!portal.Login()) { portal.Quit(); Assert.Fail("Failed to authenticate"); } var actionUrl = portal.Navigate("task-list", standardWaitTime) .ClickByLinkText("Contact details") .Click("UpdateButton", standardWaitTime) .Clear("telephone2") .Clear("telephone1") .SetValue("telephone2", "0131 618 618 4") .SetValue("telephone1", "07789 456 123") .ValidatePage( // QUESTION - Probably want to validate every page, add option to include in PortalConfiguration? new List <IPageValidator>() { // new IsEnabled("awe_address"), // new IsEnabled("Continue"), // new ValidateHeaders(), // new ValidateUrlFormat() }, Assert.Fail, Assert.Warn) .Click("UpdateButton", standardWaitTime) .Clear("emailaddress2") .SetValue("emailaddress2", "*****@*****.**") .Click("UpdateButton", standardWaitTime) .Click("UpdateButton", standardWaitTime) .Click("UpdateButton", standardWaitTime) .GetCurrentUrl(); var signedOutUrl = portal .ClickByLinkText("Close") // Shouldn't be required! // This is just if you're logged in as an Admin. // Tests shouldn't normally be run as Admins ;) .ClickByLinkText("Sign Out", standardWaitTime) .GetCurrentUrl(); portal.Quit(); Assert.AreEqual("https://awesome-portal.powerappsportals.com/task-list/", actionUrl); Assert.AreEqual("https://awesome-portal.powerappsportals.com/", signedOutUrl); /* * TODO - Actions.... * 2. Implement SetValue for other data types than string ;) * 3. Extract the common set up into a base class... * 4. Add helpers to extract magic strings etc... * 5. Add other test functions that allow you to * 6. How to handle if an element doesn't exist * 7. Implement a ClickIfExists? (e.g. for the Admin dialog) */ }
public void CantLoginWithInvalidDetails() { //TODO - Write test to login with user "peter" who isn't a real user set up in the portal var config = new PortalConfiguration("peter"); }
/// <summary> /// Initializes the target object for the page /// </summary> /// <remarks>Many pages have "target" objects that the page operates on. For instance, when viewing /// an event, the target object is an event. When looking up a directory, that's the target /// object. This method is intended to be overriden to initialize the target object for /// each page that needs it.</remarks> protected override void InitializeTargetObject() { base.InitializeTargetObject(); targetChapter = LoadObjectFromAPI <msChapter>(ContextID); if (targetChapter == null) { GoToMissingRecordPage(); return; } targetMembershipOrganization = LoadObjectFromAPI <msMembershipOrganization>(targetChapter.MembershipOrganization); if (targetMembershipOrganization == null) { GoToMissingRecordPage(); return; } targetSearchManifest = MultiStepWizards.ViewChapterMembers.SearchManifest; if (targetSearchManifest == null || targetSearchManifest.DefaultSelectedFields.Count == 0) { targetSearchManifest = buildSearchManifest(); MultiStepWizards.ViewChapterMembers.SearchManifest = targetSearchManifest; } using (IConciergeAPIService proxy = GetConciegeAPIProxy()) { List <string> availableFields = defaultFieldFullPaths; //If the Membership Organization has defined criteria fields available to leaders use them but prefix with "Membership." because the settings are based on the Membership search //while this is a chapter membership search if (targetMembershipOrganization.LeaderSearchFields != null) { availableFields = (from field in targetMembershipOrganization.LeaderSearchFields select "Membership." + field).ToList(); } targetCriteriaFields = proxy.GetSearchFieldMetadataFromFullPath(msChapterMembership.CLASS_NAME, null, availableFields).ResultValue; } foreach (var f in targetCriteriaFields) { var labelOverride = PortalConfiguration.GetOverrideFor( Request.Url.LocalPath, ColumnHeaderOverridePrefix + f.Name, "Text"); if (labelOverride != null) { f.Label = labelOverride.Value; } } foreach (var f in targetSearchManifest.Fields) { var labelOverride = PortalConfiguration.GetOverrideFor( Request.Url.LocalPath, ColumnHeaderOverridePrefix + f.Name, "Text"); if (labelOverride != null) { f.Label = labelOverride.Value; } } //Has to be in the InitializeTargetObject to have the leader before running the CheckSecurity loadDataFromConcierge(); }