Example #1
0
    /// <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();
    }
Example #2
0
        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();
        }
Example #3
0
        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();
        }
Example #4
0
        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
        }
Example #5
0
        public void TestConfigSettings()
        {
            var config = new PortalConfiguration("arthur");

            Assert.AreEqual("arthur", config.UserCredentials.UserName);
            Assert.AreEqual("https://awesome-portal.powerappsportals.com/", config.BaseUrl);
        }
Example #6
0
    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;
                }
            }
        }
    }
Example #9
0
    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);
    }
Example #10
0
        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;
        }
    }
Example #12
0
        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();
        }
Example #13
0
        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)
             */
        }
Example #14
0
 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();
    }