diff --git a/Moggles.Domain/FeatureToggle.cs b/Moggles.Domain/FeatureToggle.cs index 6ec2df1..0257ae1 100644 --- a/Moggles.Domain/FeatureToggle.cs +++ b/Moggles.Domain/FeatureToggle.cs @@ -95,7 +95,7 @@ public void MarkAsNotDeployed(string envName) public FeatureToggleStatus GetFeatureToggleStatusForEnv(string envName) { return FeatureToggleStatuses.FirstOrDefault(fts => - string.Compare(fts.EnvironmentName, envName, StringComparison.OrdinalIgnoreCase) == 0); + string.Compare(fts.EnvironmentName, envName.Trim(), StringComparison.OrdinalIgnoreCase) == 0); } public void ChangeEnvironmentnameForFeatureToggleStatus(string oldEnvName, string NewEnvName) { diff --git a/Moggles.EndToEndTests/Moggles.EndToEndTests.csproj b/Moggles.EndToEndTests/Moggles.EndToEndTests.csproj index ebedc4a..5f5c920 100644 --- a/Moggles.EndToEndTests/Moggles.EndToEndTests.csproj +++ b/Moggles.EndToEndTests/Moggles.EndToEndTests.csproj @@ -7,6 +7,7 @@ + @@ -23,9 +24,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + + diff --git a/Moggles.EndToEndTests/MogglesPages/FeatureTogglesPage.cs b/Moggles.EndToEndTests/MogglesPages/FeatureTogglesPage.cs index 6bc400a..85811ae 100644 --- a/Moggles.EndToEndTests/MogglesPages/FeatureTogglesPage.cs +++ b/Moggles.EndToEndTests/MogglesPages/FeatureTogglesPage.cs @@ -1,62 +1,63 @@ using MogglesEndToEndTests.TestFramework; +using NsTestFrameworkUI.Helpers; +using NsTestFrameworkUI.KendoHelpers; +using NsTestFrameworkUI.Pages; using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; using System; +using System.Linq; using System.Threading; -using NSTestFrameworkDotNetCoreUI.Helpers; -using NSTestFrameworkDotNetCoreUI.Pages; + namespace MogglesEndToEndTests.MogglesPages { public class FeatureTogglesPage { - public IWebElement ToolsMenuDropdown => - Browser.WebDriver.FindElement(By.CssSelector("#bs-example-navbar-collapse-1 > ul > li > ul")); - public IWebElement ToolsButton => Browser.WebDriver.FindElement(By.Id("toolsBtn")); - public IWebElement FeatureToggleNameInput => Browser.WebDriver.FindElement(By.Id("featureToggleName")); - public IWebElement NotesInput => Browser.WebDriver.FindElement(By.Id("notesInput")); - public IWebElement AddFeatureToggleButton => Browser.WebDriver.FindElement(By.Id("addFeatureToggleBtn")); - public IWebElement AddApplicationButton => Browser.WebDriver.FindElement(By.Id("addApplicationBtn")); - public IWebElement AddEnvironmentButton => Browser.WebDriver.FindElement(By.Id("addEnvironmentBtn")); - public IWebElement CloseAddEnvironmentModalBtn => Browser.WebDriver.FindElement(By.Id("closeAddEnvironmentModalBtn")); - public IWebElement CloseAddToggleModalBtn => Browser.WebDriver.FindElement(By.Id("closeAddToggleModalBtn")); - public IWebElement CloseAddApplicationModalBtn => Browser.WebDriver.FindElement(By.Id("closeAddApplicationModalBtn")); - public IWebElement FeatureTogglesGrid => Browser.WebDriver.FindElement(By.Id("toggleGrid")); - public IWebElement DeleteFeatureToggleButton => Browser.WebDriver.FindElement(By.Id("deleteToggleBtn")); - public IWebElement IsPermanentCheckbox => Browser.WebDriver.FindElement(By.Id("editIsPermanentCheckbox")); - public IWebElement DevEnvironmentCheckbox => Browser.WebDriver.FindElement( - By.CssSelector("div:nth-child(2) > div.col-sm-1 > div > div > input[type=checkbox]")); - public IWebElement RefreshEnvironmentButton =>Browser.WebDriver.FindElement(By.Id("refreshEnvironmentsBtn")); - public IWebElement FilterByACriteria => - Browser.WebDriver.FindElement(By.CssSelector("tr:nth-child(2) > th:nth-child(2) > div > input")); - public IWebElement IsAcceptedByUserCheckbox => Browser.WebDriver.FindElement(By.Id("editAcceptedByUserCheckbox")); - public IWebElement SaveButton => Browser.WebDriver.FindElement(By.Id("saveEditToggleBtn")); - public IWebElement SelectApplication => Browser.WebDriver.FindElement(By.Id("selectedApp")); - public IWebElement ApplicationNameInput => Browser.WebDriver.FindElement(By.Id("addApplicationNameInput")); - public IWebElement ApplicationsDropdown => Browser.WebDriver.FindElement(By.CssSelector("#selectedApp>ul")); - public IWebElement FirstEnvNameInput => Browser.WebDriver.FindElement(By.Id("addFirstEnvironmentInput")); - public IWebElement SecondEnvNameInput => Browser.WebDriver.FindElement(By.Id("addEnvironmentNameInput")); - public IWebElement EditApplicationIcon => Browser.WebDriver.FindElement(By.Id("showEditApplicationModalBtn")); - public IWebElement EditApplicationNameInput => Browser.WebDriver.FindElement(By.Id("editApplicationNameInput")); - public IWebElement SaveApplicationChangesButton => Browser.WebDriver.FindElement(By.Id("saveEditApplicationBtn")); - public IWebElement DeleteApplicationButton => Browser.WebDriver.FindElement(By.Id("deleteApplicationBtn")); - public IWebElement AcceptDeleteApplicationButton => Browser.WebDriver.FindElement(By.Id("confirmDeleteApplicationBtn")); - public IWebElement AcceptDeleteEnvironmentButton => Browser.WebDriver.FindElement(By.Id("confirmDeleteEnvironmentBtn")); - public IWebElement SelectedApplication => Browser.WebDriver.FindElement(By.Id("selectedApp")); - public IWebElement EditEnvironmentNameInput => Browser.WebDriver.FindElement(By.Id("editEnvironmentNameInput")); - public IWebElement SaveEnvironmentChangesButton => Browser.WebDriver.FindElement(By.Id("saveEditEnvironmentBtn")); - public IWebElement DeleteEnvironmentButton => Browser.WebDriver.FindElement(By.Id("deleteEnvironmentBtn")); - public IWebElement CancelEditFeatureFlagsModalButton => Browser.WebDriver.FindElement(By.Id("cancelEditToggleBtn")); + #region selectors + private readonly By _applicationsDropdown = By.CssSelector("#selectedApp > ul li"); + private readonly By _toolsMenuDropdown = By.CssSelector(".dropdown-menu li"); + private readonly By _statusesDropdown = By.CssSelector("tr:nth-child(2) > th:nth-child(8) > div > select"); + + private readonly By _addFeatureToggleButton = By.Id("addFeatureToggleBtn"); + private readonly By _closeAddToggleModalBtn = By.Id("closeAddToggleModalBtn"); + private readonly By _addApplicationButton = By.Id("addApplicationBtn"); + private readonly By _closeAddApplicationModalBtn = By.Id("closeAddApplicationModalBtn"); + private readonly By _addEnvironmentButton = By.Id("addEnvironmentBtn"); + private readonly By _closeAddEnvironmentModalBtn = By.Id("closeAddEnvironmentModalBtn"); + + private readonly By _featureToggleNameInput = By.Id("featureToggleName"); + private readonly By _notesInput = By.Id("notesInput"); + private readonly By _applicationNameInput = By.Id("addApplicationNameInput"); + private readonly By _firstEnvNameInput = By.Id("addFirstEnvironmentInput"); + private readonly By _environmentNameInput = By.Id("addEnvironmentNameInput"); + + private readonly By _isPermanentCheckbox = By.Id("editIsPermanentCheckbox"); + private readonly By _isAcceptedByUserCheckbox = By.Id("editAcceptedByUserCheckbox"); + private readonly By _saveButton = By.Id("saveEditToggleBtn"); + + private readonly By _editFeatureToggleIcon = By.CssSelector("#toggleGrid span > a:nth-child(1) > i"); + private readonly By _cancelEditToggleButton = By.Id("cancelEditToggleBtn"); + private readonly By _deleteFeatureToggleButton = By.Id("deleteToggleBtn"); + + private readonly By _editApplicationIcon = By.Id("showEditApplicationModalBtn"); + private readonly By _editApplicationNameInput = By.Id("editApplicationNameInput"); + private readonly By _saveApplicationChangesButton = By.Id("saveEditApplicationBtn"); + private readonly By _confirmDeleteApplicationButton = By.Id("confirmDeleteApplicationBtn"); + private readonly By _deleteApplicationButton = By.Id("deleteApplicationBtn"); + + private readonly By _editEnvironmentIcon = By.CssSelector("#toggleGrid tr:nth-child(1) > th:nth-child(4) > a > i"); + private readonly By _editEnvironmentNameInput = By.Id("editEnvironmentNameInput"); + private readonly By _confirmDeleteEnvironmentButton = By.Id("confirmDeleteEnvironmentBtn"); + private readonly By _saveEnvironmentChangesButton = By.Id("saveEditEnvironmentBtn"); + private readonly By _deleteEnvironmentButton = By.Id("deleteEnvironmentBtn"); + + private readonly By _filterByACriteria = By.CssSelector("tr:nth-child(2) > th:nth-child(2) > div > input"); + private readonly By _refreshEnvironmentButton = By.Id("refreshEnvironmentsBtn"); + private IWebElement _devEnvironmentCheckbox => Browser.WebDriver.FindElement(By.CssSelector("div:nth-child(2) > div.col-sm-1 > div > div > input[type=checkbox]")); private readonly By _rowSelector = By.CssSelector(".vgt-responsive> table > tbody> tr"); - private readonly By _statusesDropdown = - By.CssSelector( - "body > div > div> div > div > div > div> div > div> table > thead > tr:nth-child(2) > th:nth-child(8) > div > select"); - private readonly By _noFeatureToggleDisplayedText = - By.CssSelector("#toggleGrid tr td div div"); + private readonly By _noFeatureToggleDisplayedText = By.CssSelector("#toggleGrid tr td div div"); private readonly By _deleteFeatureToggleIcon = By.CssSelector("#toggleGrid span > a:nth-child(2) > i"); - private readonly By _editFeatureToggleIcon = By.CssSelector("#toggleGrid span > a:nth-child(1) > i"); private readonly By _isPermanentFlag = By.CssSelector(".label-danger"); - private readonly By _editEnvironmentIcon = By.CssSelector("#toggleGrid tr:nth-child(1) > th:nth-child(4) > a > i"); private readonly By _devCheckbok = By.CssSelector("div:nth-child(2) > div.col-sm-1.margin-top-14 > div > div > input[type=checkbox]"); private readonly By _qaCheckbok = @@ -67,91 +68,100 @@ public class FeatureTogglesPage By.CssSelector("div:nth-child(3) > .margin-top-8 > div:nth-child(1)"); private readonly By _refreshedEnvMessage = By.CssSelector("body > div.fade.alert.alert-success.alert-dismissible.in"); - public IWebElement SelectedApplicationName => - Browser.WebDriver.FindElement(By.CssSelector("#app-sel div div div:nth-child(1)")); + private readonly By _selectedApplication = By.Id("selectedApp"); + private readonly By _toolsButton = By.CssSelector("li.dropdown"); + private readonly By _selectedAppName = By.CssSelector("#app-sel div div div:nth-child(1)"); + private readonly By _pageSpinner = By.CssSelector(".fa-spinner"); + public IWebElement FeatureTogglesGrid => Browser.WebDriver.FindElement(By.Id("toggleGrid")); + #endregion - public void SelectASpecificApplication(string applicationName) + public bool IsGridEmpty() => _noFeatureToggleDisplayedText.IsElementPresent(); + public bool IsDevEnvironmentCheckboxChecked() { - Thread.Sleep(1000); - SelectApplication.Click(); - var applications = PageHelpers.GetDropdownList(ApplicationsDropdown, "li"); - var applicationsCount = applications.Count; - for (var i = 0; i < applicationsCount; i++) - { - if (applications[i].Text != applicationName) continue; - applications[i].Click(); - break; - } + WaitHelpers.ExplicitWait(); + return _devCheckbok.IsElementSelected(); + } + public bool IsQaEnvironmentCheckboxChecked() + { + WaitHelpers.ExplicitWait(); + return _qaCheckbok.IsElementSelected(); + } + public bool IsRefreshedEnvironmentMessageIsDisplayed() + { + WaitHelpers.ExplicitWait(); + return _refreshedEnvMessage.IsElementEnabled(); } - public void FilterByAcceptedByUser(string status) + public string GetSelectedApplicationName() { - var dropdown = Browser.WebDriver.FindElement(_statusesDropdown); - var statuses = new SelectElement(dropdown); - statuses.Options[1].Click(); + WaitHelpers.ExplicitWait(); + return _selectedAppName.GetText(); } - public void AddFeatureToggle(string newFeatureToggleName) + public void SelectApplicationByName(string applicationName) { - ToolsButton.Click(); - var options = PageHelpers.GetDropdownList(ToolsMenuDropdown, "li"); - Thread.Sleep(1000); - options[1].Click(); - FeatureToggleNameInput.SendKeys(newFeatureToggleName); - NotesInput.SendKeys("test"); - AddFeatureToggleButton.Click(); - Thread.Sleep(1000); - CloseAddToggleModalBtn.Click(); + _pageSpinner.WaitForSpinner(); + WaitHelpers.ExplicitWait(); + _selectedApplication.WaitForElementToBeClickable(); + _selectedApplication.SelectFromDropdown(_applicationsDropdown, applicationName); } - public void AddNewApplication(string newApplicationName, string firstEnvName) + public void FilterAcceptedByUserColumn(string status) { - ToolsButton.Click(); - var options = PageHelpers.GetDropdownList(ToolsMenuDropdown, "li"); - Thread.Sleep(1000); - options[2].Click(); - ApplicationNameInput.SendKeys(newApplicationName); - FirstEnvNameInput.SendKeys(firstEnvName); - AddApplicationButton.Click(); - Thread.Sleep(1000); - CloseAddApplicationModalBtn.Click(); + _statusesDropdown.WaitForElementToBeClickable(); + PageHelpers.SelectOptionFromDropdown(_statusesDropdown, status); } - public void AddNewEnvironment(string newEnvironmentName) + public void AddFeatureToggle(string newFeatureToggleName) { - ToolsButton.Click(); - var options = PageHelpers.GetDropdownList(ToolsMenuDropdown, "li"); - Thread.Sleep(1000); - options[3].Click(); - SecondEnvNameInput.SendKeys(newEnvironmentName); - AddEnvironmentButton.Click(); - Thread.Sleep(1000); - CloseAddEnvironmentModalBtn.Click(); + WaitHelpers.ExplicitWait(); + _toolsButton.SelectFromDropdown(_toolsMenuDropdown, "Add Feature Toggle"); + _featureToggleNameInput.ActionSendKeys(newFeatureToggleName); + //_workItemIdInput.ActionSendKeys("TESTING PBI 00000"); + _notesInput.ActionSendKeys("test notes"); + _addFeatureToggleButton.ActionClick(); + WaitHelpers.ExplicitWait(); + _closeAddToggleModalBtn.ActionClick(); } - public bool IsGridEmpty() + public void AddNewApplication(string newApplicationName, string firstEnvName) { - Thread.Sleep(1000); - return PageHelpers.IsElementPresent(_noFeatureToggleDisplayedText); + _pageSpinner.WaitForSpinner(); + WaitHelpers.ExplicitWait(); + _toolsButton.SelectFromDropdown(_toolsMenuDropdown, "Add New Application"); + _applicationNameInput.ActionSendKeys(newApplicationName); + _firstEnvNameInput.ActionSendKeys(firstEnvName); + _addApplicationButton.ActionClick(); + WaitHelpers.ExplicitWait(); + _closeAddApplicationModalBtn.ActionClick(); } - public bool NewAddedFeatureToggleIsVisible(string newFeatureToggleName) + public void AddNewEnvironment(string newEnvironmentName) { - Thread.Sleep(1000); - var rows = Utils.GetAllRowsFromGrid(FeatureTogglesGrid, _rowSelector); + WaitHelpers.ExplicitWait(); + _toolsButton.SelectFromDropdown(_toolsMenuDropdown, "Add New Environment"); + _environmentNameInput.ActionSendKeys(newEnvironmentName); + _addEnvironmentButton.ActionClick(); + WaitHelpers.ExplicitWait(); + _closeAddEnvironmentModalBtn.ActionClick(); + } + + public bool IsFeatureToggleDisplayed(string newFeatureToggleName) + { + WaitHelpers.ExplicitWait(); + var rows = FeatureTogglesGrid.GetAllRowsFromGrid(_rowSelector); foreach (var row in rows) { var cells = row.FindElements(By.TagName("td")); if (cells[0].Text.Equals(newFeatureToggleName) || cells[1].Text.Equals(newFeatureToggleName)) return true; } - return false; } - public bool CreationDateIsCorrectlyDisplayed(string newFeatureToggleName) + public bool IsCreationDateCorrectlyDisplayed(string newFeatureToggleName) { - var rows = Utils.GetAllRowsFromGrid(FeatureTogglesGrid, _rowSelector); + var rows = FeatureTogglesGrid.GetAllRowsFromGrid(_rowSelector); foreach (var row in rows) { var cells = row.FindElements(By.TagName("td")); @@ -163,151 +173,115 @@ public bool CreationDateIsCorrectlyDisplayed(string newFeatureToggleName) if (formattedCreationDate == DateTime.Now.Date) return true; } - return false; } public void DeleteFeatureToggle(string newFeatureToggleName) { - Thread.Sleep(1000); - var rows = Utils.GetAllRowsFromGrid(FeatureTogglesGrid, _rowSelector); - for (var i = 0; i <= rows.Count-1; i++) + WaitHelpers.ExplicitWait(); + var rows = FeatureTogglesGrid.GetAllRowsFromGrid(_rowSelector); + for (var i = 0; i <= rows.Count - 1; i++) { var cells = rows[i].FindElements(By.TagName("td")); if (!cells[1].Text.Contains(newFeatureToggleName)) continue; - Utils.GetColumnSpecifiedByIndex(FeatureTogglesGrid, _rowSelector, i, 0).FindElement(_deleteFeatureToggleIcon) + FeatureTogglesGrid.GetColumnSpecifiedByIndex(_rowSelector, i, 0).FindElement(_deleteFeatureToggleIcon) .Click(); - DeleteFeatureToggleButton.Click(); + _deleteFeatureToggleButton.ActionClick(); } } public void EditFeatureToggle(string newFeatureToggleName) { - Thread.Sleep(1000); - var rows = Utils.GetAllRowsFromGrid(FeatureTogglesGrid, _rowSelector); + WaitHelpers.ExplicitWait(); + var rows = FeatureTogglesGrid.GetAllRowsFromGrid(_rowSelector); for (var i = 0; i <= rows.Count - 1; i++) { var cells = rows[i].FindElements(By.TagName("td")); if (cells[1].Text.Contains(newFeatureToggleName)) { - Utils.GetColumnSpecifiedByIndex(FeatureTogglesGrid, _rowSelector, i, 0).FindElement(_editFeatureToggleIcon) + FeatureTogglesGrid.GetColumnSpecifiedByIndex(_rowSelector, i, 0).FindElement(_editFeatureToggleIcon) .Click(); } + WaitHelpers.ExplicitWait(); } } public void SetFeatureToggleAsPermanent() { - Thread.Sleep(1000); - IsPermanentCheckbox.Click(); - SaveButton.Click(); + WaitHelpers.ExplicitWait(); + _isPermanentCheckbox.ActionClick(); + _saveButton.ActionClick(); } public void SetFeatureToggleAsAcceptedByUser() { - Thread.Sleep(1000); - IsAcceptedByUserCheckbox.Click(); - SaveButton.Click(); + _isAcceptedByUserCheckbox.ActionClick(); + _saveButton.ActionClick(); } - public bool FeatureToggleIsPermanent() + public bool IsFeatureTogglePermanent() { - Thread.Sleep(1000); - FilterByACriteria.SendKeys(Constants.FeatureToggleName); + WaitHelpers.ExplicitWait(); + _filterByACriteria.ActionSendKeys(Constants.FeatureToggleName); return PageHelpers.IsElementPresent(_isPermanentFlag); } - public void ChangeApplicationName(string currentApplicationName,string editedApplicationName) - { - var applicationName = GetSelectedApplicationName(); - if (currentApplicationName != applicationName) return; - EditApplicationIcon.Click(); - - EditApplicationNameInput.Clear(); - - EditApplicationNameInput.SendKeys(editedApplicationName); - - SaveApplicationChangesButton.Click(); - - } - - public bool ApplicationIsSelected(string applicationName) + public void ChangeApplicationName(string currentApplicationName, string editedApplicationName) { - return SelectedApplication.Text == applicationName; - } - - public string GetSelectedApplicationName() - { - return SelectedApplicationName.Text; + WaitHelpers.ExplicitWait(); + if (currentApplicationName != GetSelectedApplicationName()) return; + _editApplicationIcon.ActionClick(); + _editApplicationNameInput.ClearField(); + _editApplicationNameInput.ActionSendKeys(editedApplicationName); + _saveApplicationChangesButton.ActionClick(); + WaitHelpers.ExplicitWait(); } public void DeleteApplication(string expectedApplicationName) { - Thread.Sleep(1000); - var applicationName = GetSelectedApplicationName(); - if (expectedApplicationName != applicationName) return; - EditApplicationIcon.Click(); - DeleteApplicationButton.Click(); - AcceptDeleteApplicationButton.Click(); + WaitHelpers.ExplicitWait(); + if (expectedApplicationName != GetSelectedApplicationName()) return; + _editApplicationIcon.ActionClick(); + _deleteApplicationButton.ActionClick(); + _confirmDeleteApplicationButton.ActionClick(); + WaitHelpers.ExplicitWait(); } - public bool ApplicationNameExists(string applicationName) + public bool IsApplicationListed(string applicationName) { - Thread.Sleep(1000); - SelectApplication.Click(); - var applications = PageHelpers.GetDropdownList(ApplicationsDropdown, "li"); - var applicationsCount = applications.Count; - for (var i = 0; i < applicationsCount; i++) - { - if (applications[i].Text.Equals(applicationName)) - return true; - } - - return false; + var dropdownElements = Browser.WebDriver.FindElements(By.CssSelector("#selectedApp ul li")); + return dropdownElements.Any(x => x.Text.Equals(applicationName)); } public void EditEnvironment(string environmentName) { - var element = Utils.GetHeaderSpecifiedByIndex(FeatureTogglesGrid,3); - Thread.Sleep(1000); + WaitHelpers.ExplicitWait(); + var element = Utils.GetHeaderSpecifiedByIndex(FeatureTogglesGrid, 3); + WaitHelpers.ExplicitWait(); if (element.Text.Equals(environmentName)) - { - element.FindElement(_editEnvironmentIcon).Click(); - } + { + element.FindElement(_editEnvironmentIcon).Click(); + } } public void ChangeEnvironmentName(string editedEnvName) { - EditEnvironmentNameInput.Clear(); - EditEnvironmentNameInput.SendKeys(editedEnvName); - SaveEnvironmentChangesButton.Click(); + _editEnvironmentNameInput.ClearField(); + _editEnvironmentNameInput.ActionSendKeys(editedEnvName); + _saveEnvironmentChangesButton.ActionClick(); } - public bool EnvironmentNameExist(string envName) + public bool IsEnvironmentNameDisplayed(string envName) { - Thread.Sleep(1000); - return Utils.GetHeaderSpecifiedByIndex(FeatureTogglesGrid,3).Text.Equals(envName); + WaitHelpers.ExplicitWait(); + return Utils.GetHeaderSpecifiedByIndex(FeatureTogglesGrid, 3).Text.Equals(envName); } public void DeleteEnvironment(string editedEnvName) { - Thread.Sleep(1000); EditEnvironment(editedEnvName); - DeleteEnvironmentButton.Click(); - Thread.Sleep(1000); - AcceptDeleteEnvironmentButton.Click(); - } - - public bool IsDevEnvironmentCheckboxChecked() - { - WaitHelpers.WaitForElement(_devCheckbok); - return PageHelpers.IsElementSelected(_devCheckbok); - } - - public bool IsQaEnvironmentCheckboxChecked() - { - WaitHelpers.WaitForElement(_qaCheckbok); - return PageHelpers.IsElementSelected(_qaCheckbok); + _deleteEnvironmentButton.ActionClick(); + _confirmDeleteEnvironmentButton.ActionClick(); } public bool IsLastUpdatedDateOnDevCorrectlyDisplayed() @@ -322,28 +296,20 @@ public bool IsLastUpdatedDateOnQaCorrectlyDisplayed() public void CloseEditFeatureFlagsModal() { - Thread.Sleep(1000); - CancelEditFeatureFlagsModalButton.Click(); + WaitHelpers.ExplicitWait(); + _cancelEditToggleButton.ActionClick(); } public void UpdateDevEnvironment() { - Thread.Sleep(1000); - DevEnvironmentCheckbox.Click(); - SaveButton.Click(); + _devEnvironmentCheckbox.Click(); + _saveButton.ActionClick(); } public void RefreshEnvironment() { - Thread.Sleep(1000); - RefreshEnvironmentButton.Click(); - } - - public bool IsRefreshedEnvironmentMessageIsDisplayed() - { - WaitHelpers.WaitUntilElementIsVisible(_refreshedEnvMessage); - return PageHelpers.IsElementEnabled(_refreshedEnvMessage); + WaitHelpers.ExplicitWait(); + _refreshEnvironmentButton.ActionClick(); } - } } diff --git a/Moggles.EndToEndTests/SmokeTests/AddANewFeatureToggle.cs b/Moggles.EndToEndTests/SmokeTests/AddANewFeatureToggle.cs index b2f8967..0e2f72b 100644 --- a/Moggles.EndToEndTests/SmokeTests/AddANewFeatureToggle.cs +++ b/Moggles.EndToEndTests/SmokeTests/AddANewFeatureToggle.cs @@ -2,34 +2,34 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace MogglesEndToEndTests.SmokeTests { [TestClass] - public class AddANewFeatureToggle : BaseTest + public class AddAndDeleteNewFeatureToggle : BaseTest { [TestMethod] [TestCategory("AddFeatureToggle")] [TestCategory("SmokeTests")] - public void AddANewFeatureToggle_TheFeatureToggleIsAdded() + public void AddAndDeleteANewFeatureToggle_TheFeatureToggleIsAddedAndDeleted() { //act Browser.Goto(Constants.BaseUrl); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.SmokeTestsApplication); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.SmokeTestsApplication); Pages.FeatureTogglesPage.AddFeatureToggle(Constants.FeatureToggleName); //assert - Pages.FeatureTogglesPage.NewAddedFeatureToggleIsVisible(Constants.FeatureToggleName).Should().BeTrue(); - Pages.FeatureTogglesPage.CreationDateIsCorrectlyDisplayed(Constants.FeatureToggleName).Should().BeTrue(); - } + Pages.FeatureTogglesPage.IsFeatureToggleDisplayed(Constants.FeatureToggleName).Should().BeTrue(); + Pages.FeatureTogglesPage.IsCreationDateCorrectlyDisplayed(Constants.FeatureToggleName).Should().BeTrue(); - [TestCleanup] - public override void After() - { + //act Pages.FeatureTogglesPage.DeleteFeatureToggle(Constants.FeatureToggleName); - base.After(); + + //assert + Pages.FeatureTogglesPage.IsGridEmpty().Should().BeTrue(); } + } } diff --git a/Moggles.EndToEndTests/SmokeTests/DeleteAFeatureToggle.cs b/Moggles.EndToEndTests/SmokeTests/DeleteAFeatureToggle.cs deleted file mode 100644 index 7e764fd..0000000 --- a/Moggles.EndToEndTests/SmokeTests/DeleteAFeatureToggle.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moggles.EndToEndTests.TestFramework; -using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; - -namespace MogglesEndToEndTests.SmokeTests -{ - [TestClass] - public class DeleteAFeatureToggle : BaseTest - { - [TestMethod] - [TestCategory("DeleteFeatureToggle")] - [TestCategory("SmokeTests")] - - public void DeleteAFeatureToggle_TheFeatureToggleIsNoLongerVisible() - { - //act - Browser.Goto(Constants.BaseUrl); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.SmokeTestsApplication); - Pages.FeatureTogglesPage.AddFeatureToggle(Constants.FeatureToggleName); - Pages.FeatureTogglesPage.DeleteFeatureToggle(Constants.FeatureToggleName); - - //assert - Pages.FeatureTogglesPage.IsGridEmpty().Should().BeTrue(); - } - } -} diff --git a/Moggles.EndToEndTests/SmokeTests/EditAndDeleteApplication.cs b/Moggles.EndToEndTests/SmokeTests/EditAndDeleteApplication.cs index b2f58d7..793f09c 100644 --- a/Moggles.EndToEndTests/SmokeTests/EditAndDeleteApplication.cs +++ b/Moggles.EndToEndTests/SmokeTests/EditAndDeleteApplication.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace MogglesEndToEndTests.SmokeTests { @@ -18,18 +18,18 @@ public void EditAndDeleteApplication_TheApplicationIsUpdatedAndAfterThatDeleted( //act Browser.Goto(Constants.BaseUrl); Pages.FeatureTogglesPage.AddNewApplication(Constants.NewApplicationName, Constants.FirstEnvName); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.NewApplicationName); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.NewApplicationName); Pages.FeatureTogglesPage.ChangeApplicationName(Constants.NewApplicationName,Constants.EditedApplicationName); //assert - Pages.FeatureTogglesPage.ApplicationIsSelected(Constants.EditedApplicationName); + Pages.FeatureTogglesPage.GetSelectedApplicationName().Equals(Constants.EditedApplicationName).Should().BeTrue(); Pages.FeatureTogglesPage.IsGridEmpty().Should().BeTrue(); //act Pages.FeatureTogglesPage.DeleteApplication(Constants.EditedApplicationName); //assert - Pages.FeatureTogglesPage.ApplicationNameExists(Constants.EditedApplicationName).Should().BeFalse(); + Pages.FeatureTogglesPage.IsApplicationListed(Constants.EditedApplicationName).Should().BeFalse(); } } } diff --git a/Moggles.EndToEndTests/SmokeTests/EditAndDeleteEnvironment.cs b/Moggles.EndToEndTests/SmokeTests/EditAndDeleteEnvironment.cs index 5c0169c..4d9da48 100644 --- a/Moggles.EndToEndTests/SmokeTests/EditAndDeleteEnvironment.cs +++ b/Moggles.EndToEndTests/SmokeTests/EditAndDeleteEnvironment.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace MogglesEndToEndTests.SmokeTests { @@ -18,19 +18,19 @@ public void EditAndDeleteEnvironment_TheEnvironmentIsUpdatedAndAfterThatDeleted( //act Browser.Goto(Constants.BaseUrl); Pages.FeatureTogglesPage.AddNewApplication(Constants.NewApplicationName, Constants.FirstEnvName); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.NewApplicationName); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.NewApplicationName); Pages.FeatureTogglesPage.AddNewEnvironment(Constants.SecondEnvName); Pages.FeatureTogglesPage.EditEnvironment(Constants.SecondEnvName); Pages.FeatureTogglesPage.ChangeEnvironmentName(Constants.EditedSecondEnvName); //assert - Pages.FeatureTogglesPage.EnvironmentNameExist(Constants.EditedSecondEnvName).Should().BeTrue(); + Pages.FeatureTogglesPage.IsEnvironmentNameDisplayed(Constants.EditedSecondEnvName).Should().BeTrue(); //act Pages.FeatureTogglesPage.DeleteEnvironment(Constants.EditedSecondEnvName); //assert - Pages.FeatureTogglesPage.EnvironmentNameExist(Constants.EditedSecondEnvName).Should().BeFalse(); + Pages.FeatureTogglesPage.IsEnvironmentNameDisplayed(Constants.EditedSecondEnvName).Should().BeFalse(); } [TestCleanup] diff --git a/Moggles.EndToEndTests/SmokeTests/EnvironmentsLastUpdated.cs b/Moggles.EndToEndTests/SmokeTests/EnvironmentsLastUpdated.cs index e980ab1..43ca758 100644 --- a/Moggles.EndToEndTests/SmokeTests/EnvironmentsLastUpdated.cs +++ b/Moggles.EndToEndTests/SmokeTests/EnvironmentsLastUpdated.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace MogglesEndToEndTests.SmokeTests { @@ -17,7 +17,7 @@ public void AddFeatureToggle_DevAndQaEnvironmentsAreUpdated() { //act Browser.Goto(Constants.BaseUrl); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.SmokeTestsApplication); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.SmokeTestsApplication); Pages.FeatureTogglesPage.AddFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.EditFeatureToggle(Constants.FeatureToggleName); diff --git a/Moggles.EndToEndTests/SmokeTests/IsAcceptedByUserFeatureToggle.cs b/Moggles.EndToEndTests/SmokeTests/IsAcceptedByUserFeatureToggle.cs index 91e1f3f..ca2bd8c 100644 --- a/Moggles.EndToEndTests/SmokeTests/IsAcceptedByUserFeatureToggle.cs +++ b/Moggles.EndToEndTests/SmokeTests/IsAcceptedByUserFeatureToggle.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace MogglesEndToEndTests.SmokeTests { @@ -10,7 +10,6 @@ namespace MogglesEndToEndTests.SmokeTests public class IsAcceptedByUserFeatureToggle : BaseTest { [TestMethod] - [Ignore] [TestCategory("IsAcceptedByUser")] [TestCategory("SmokeTests")] @@ -18,7 +17,7 @@ public void EditAFeatureToggleToBeAcceptedByUser() { //act Browser.Goto(Constants.BaseUrl); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.SmokeTestsApplication); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.SmokeTestsApplication); Pages.FeatureTogglesPage.AddFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.EditFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.SetFeatureToggleAsAcceptedByUser(); @@ -27,10 +26,10 @@ public void EditAFeatureToggleToBeAcceptedByUser() Pages.FeatureTogglesPage.IsGridEmpty().Should().BeTrue(); //act - Pages.FeatureTogglesPage.FilterByAcceptedByUser(Constants.AcceptedByUserStatus); + Pages.FeatureTogglesPage.FilterAcceptedByUserColumn(Constants.AcceptedByUserStatus); //assert - Pages.FeatureTogglesPage.NewAddedFeatureToggleIsVisible(Constants.FeatureToggleName).Should().BeTrue(); + Pages.FeatureTogglesPage.IsFeatureToggleDisplayed(Constants.FeatureToggleName).Should().BeTrue(); } [TestCleanup] diff --git a/Moggles.EndToEndTests/SmokeTests/IsPermanentFeatureToggle.cs b/Moggles.EndToEndTests/SmokeTests/IsPermanentFeatureToggle.cs index da87619..a7a1fe6 100644 --- a/Moggles.EndToEndTests/SmokeTests/IsPermanentFeatureToggle.cs +++ b/Moggles.EndToEndTests/SmokeTests/IsPermanentFeatureToggle.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace MogglesEndToEndTests.SmokeTests { @@ -17,14 +17,14 @@ public void EditAFeatureToggleToBePermanent() { //act Browser.Goto(Constants.BaseUrl); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.SmokeTestsApplication); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.SmokeTestsApplication); Pages.FeatureTogglesPage.AddFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.EditFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.SetFeatureToggleAsPermanent(); //assert - Pages.FeatureTogglesPage.FeatureToggleIsPermanent().Should().BeTrue(); + Pages.FeatureTogglesPage.IsFeatureTogglePermanent().Should().BeTrue(); } [TestCleanup] diff --git a/Moggles.EndToEndTests/SmokeTests/RefreshEnvironment.cs b/Moggles.EndToEndTests/SmokeTests/RefreshEnvironment.cs index 63f8b0c..3639468 100644 --- a/Moggles.EndToEndTests/SmokeTests/RefreshEnvironment.cs +++ b/Moggles.EndToEndTests/SmokeTests/RefreshEnvironment.cs @@ -2,7 +2,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moggles.EndToEndTests.TestFramework; using MogglesEndToEndTests.TestFramework; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; namespace Moggles.EndToEndTests.SmokeTests { @@ -17,7 +17,7 @@ public void UpdateEnvironment_RefreshIsTriggered() { //act Browser.Goto(Constants.BaseUrl); - Pages.FeatureTogglesPage.SelectASpecificApplication(Constants.SmokeTestsApplication); + Pages.FeatureTogglesPage.SelectApplicationByName(Constants.SmokeTestsApplication); Pages.FeatureTogglesPage.AddFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.EditFeatureToggle(Constants.FeatureToggleName); Pages.FeatureTogglesPage.UpdateDevEnvironment(); diff --git a/Moggles.EndToEndTests/TestFramework/BaseTest.cs b/Moggles.EndToEndTests/TestFramework/BaseTest.cs index dbbef8d..c2bb122 100644 --- a/Moggles.EndToEndTests/TestFramework/BaseTest.cs +++ b/Moggles.EndToEndTests/TestFramework/BaseTest.cs @@ -1,11 +1,11 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; using System.IO; using System.Reflection; namespace Moggles.EndToEndTests.TestFramework { - public class BaseTest : NSTestFrameworkDotNetCoreUI.BaseTest + public class BaseTest : NsTestFrameworkUI.BaseTest { [TestInitialize] public virtual void Before() diff --git a/Moggles.EndToEndTests/TestFramework/Utils.cs b/Moggles.EndToEndTests/TestFramework/Utils.cs index d3fd5fd..fb28cdb 100644 --- a/Moggles.EndToEndTests/TestFramework/Utils.cs +++ b/Moggles.EndToEndTests/TestFramework/Utils.cs @@ -1,4 +1,4 @@ -using NSTestFrameworkDotNetCoreUI.Helpers; +using NsTestFrameworkUI.Helpers; using OpenQA.Selenium; using System; using System.Collections.ObjectModel; @@ -14,18 +14,6 @@ public static bool IsLastUpdatedDateCorrectlyDisplayed(By cssSelector) var formattedDateValue = DateTime.Parse(dateValue).Date; return formattedDateValue == DateTime.Now.Date; } - - public static ReadOnlyCollection GetAllRowsFromGrid(this IWebElement grid, By rowSelector) - { - return grid.FindElements(By.CssSelector(".vgt-responsive> table > tbody")); - } - - public static IWebElement GetColumnSpecifiedByIndex(this IWebElement grid, By rowSelector, int rowIndex, int columnIndex) - { - var rows = grid.GetAllRowsFromGrid(rowSelector); - var cells = rows[rowIndex].FindElements(By.TagName("td")); - return cells[columnIndex]; - } public static IWebElement GetHeaderSpecifiedByIndex(this IWebElement grid, int columnIndex) { diff --git a/Moggles.EndToEndTests/chromedriver.exe b/Moggles.EndToEndTests/chromedriver.exe index 4f88879..4850c8d 100644 Binary files a/Moggles.EndToEndTests/chromedriver.exe and b/Moggles.EndToEndTests/chromedriver.exe differ diff --git a/Moggles/ClientApp/tests/add-application.spec.js b/Moggles/ClientApp/__tests__/add-application.spec.js similarity index 80% rename from Moggles/ClientApp/tests/add-application.spec.js rename to Moggles/ClientApp/__tests__/add-application.spec.js index c493df3..fb4e66e 100644 --- a/Moggles/ClientApp/tests/add-application.spec.js +++ b/Moggles/ClientApp/__tests__/add-application.spec.js @@ -15,13 +15,13 @@ describe('AddApplication.vue', () => { mockAdapter.reset(); }); - it('Shows empty input on show', function () { + test('Shows empty input on show', function () { const wrapper = shallowMount(AddApplication); let txt = wrapper.find('input').text(); expect(txt).toBe(""); }) - it('Application name is cleared on successful add', async () => { + test('Application name is cleared on successful add', async () => { const wrapper = shallowMount(AddApplication); wrapper.find('button').trigger('click'); @@ -31,9 +31,9 @@ describe('AddApplication.vue', () => { expect(wrapper.vm.applicationName).toBe(''); }) - it('A success alert is shown on successful add and goes away after a while', async () => { + test('A success alert is shown on successful add and goes away after a while', async () => { - let clock = sinon.useFakeTimers(); + jest.useFakeTimers(); const wrapper = shallowMount(AddApplication); @@ -48,13 +48,16 @@ describe('AddApplication.vue', () => { mockAdapter.onPost().reply(200); await flushPromises(); - expect(wrapper.find('.alert').exists()).toBe(true); - clock.tick(1510); - expect(wrapper.find('.alert').exists()).toBe(false); - clock.restore(); + expect(wrapper.find('.alert').exists()).toBeTruthy(); + + jest.advanceTimersByTime(1510); + await wrapper.vm.$nextTick(); + + expect(wrapper.find('.alert').exists()).toBeFalsy(); + }) - it('Emits app added event on succesfull Add', async () => { + test('Emits app added event on succesfull Add', async () => { let spy = sinon.spy(Bus, '$emit'); @@ -75,7 +78,7 @@ describe('AddApplication.vue', () => { spy.restore(); }) - it('Calls the right URL passing the appName and environment name', async () => { + test('Calls the right URL passing the appName and environment name', async () => { let mock = sinon.mock(axios); mock.expects('post').withArgs('api/Applications/add', { applicationName: 'testApp', environmentName: "test", defaultToggleValue: true }).returns(Promise.resolve({})); @@ -87,9 +90,10 @@ describe('AddApplication.vue', () => { await flushPromises(); mock.verify(); + mock.restore(); }) - it('Shows a spinner while request is in process', async () => { + test('Shows a spinner while request is in process', async () => { const wrapper = shallowMount(AddApplication); let spy = sinon.spy(Bus, '$emit'); diff --git a/Moggles/ClientApp/tests/add-environment.spec.js b/Moggles/ClientApp/__tests__/add-environment.spec.js similarity index 69% rename from Moggles/ClientApp/tests/add-environment.spec.js rename to Moggles/ClientApp/__tests__/add-environment.spec.js index 9eb0146..b473b76 100644 --- a/Moggles/ClientApp/tests/add-environment.spec.js +++ b/Moggles/ClientApp/__tests__/add-environment.spec.js @@ -3,14 +3,14 @@ import AddEnvironment from '../src/environment/AddEnvironment.vue' describe('AddEnvironment.vue', () => { - it('is a Vue instance', ()=> { + test('is a Vue instance', () => { const wrapper = mount(AddEnvironment, { propsData: { application: { - id:1 + id: 1 } } }) - expect(wrapper.isVueInstance()).toBe(true) + expect(wrapper.findComponent(AddEnvironment).vm).toBeTruthy() }) }) \ No newline at end of file diff --git a/Moggles/ClientApp/tests/force-cache-refresh.spec.js b/Moggles/ClientApp/__tests__/force-cache-refresh.spec.js similarity index 59% rename from Moggles/ClientApp/tests/force-cache-refresh.spec.js rename to Moggles/ClientApp/__tests__/force-cache-refresh.spec.js index 95aa454..a6bb235 100644 --- a/Moggles/ClientApp/tests/force-cache-refresh.spec.js +++ b/Moggles/ClientApp/__tests__/force-cache-refresh.spec.js @@ -4,15 +4,22 @@ import flushPromises from 'flush-promises' import axios from 'axios'; import sinon from 'sinon'; + describe('ForceCacheRefresh.vue', () => { - it('Calls the right URL passing the app id and env name', + test('Calls the right URL passing the app id and env name', async () => { let mock = sinon.mock(axios); mock.expects('post').withArgs('api/CacheRefresh', { applicationId: 13, envName: 'BAR' }) .returns(Promise.resolve({})); - const wrapper = shallowMount(ForceCacheRefresh); + + + const wrapper = shallowMount(ForceCacheRefresh, { + stubs: { + 'alert': '
' + } + }); wrapper.setData({ applicationId: 13, existingEnvs: [ { @@ -22,14 +29,23 @@ describe('ForceCacheRefresh.vue', () => { sortOrder: 1 }, { - id: '1', + id: '2', envName: 'BAR', defaultToggleValue: true, - sortOrder: 1 + sortOrder: 2 }] }); - wrapper.find('#environmentSelect').setValue('BAR'); + await wrapper.vm.$nextTick(); + + wrapper.findAll('#environmentSelect > option').at(1).element.selected = true; + wrapper.find('#environmentSelect').trigger('change'); + await wrapper.vm.$nextTick(); + + wrapper.find('#refreshBtn').trigger('click'); + + await wrapper.vm.$nextTick(); + await flushPromises(); mock.verify(); @@ -37,9 +53,13 @@ describe('ForceCacheRefresh.vue', () => { }); - it('Shows empty select on show', + test('Shows empty select on show', function() { - const wrapper = shallowMount(ForceCacheRefresh); + const wrapper = shallowMount(ForceCacheRefresh, { + stubs: { + 'alert': '
' + } + }); let txt = wrapper.find('select').text(); expect(txt).toBe(""); }); diff --git a/Moggles/ClientApp/src/App.vue b/Moggles/ClientApp/src/App.vue index 765c94a..8e38d53 100644 --- a/Moggles/ClientApp/src/App.vue +++ b/Moggles/ClientApp/src/App.vue @@ -24,13 +24,13 @@
- +