From 9b03bf464cc0604ad62a548727cb7b0c520b5ed5 Mon Sep 17 00:00:00 2001 From: Sue Tairaku <42981334+stairaku@users.noreply.github.com> Date: Wed, 29 Mar 2023 13:12:31 -0700 Subject: [PATCH 1/7] Automation Projects --- .../PIMS.Tests.Automation/Classes/Project.cs | 23 +++ .../PageObjects/Projects.cs | 143 ++++++++++++++++++ .../PageObjects/SearchProjects.cs | 121 +++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 testing/PIMS.Tests.Automation/Classes/Project.cs create mode 100644 testing/PIMS.Tests.Automation/PageObjects/Projects.cs create mode 100644 testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs diff --git a/testing/PIMS.Tests.Automation/Classes/Project.cs b/testing/PIMS.Tests.Automation/Classes/Project.cs new file mode 100644 index 0000000000..45fdc3dbb0 --- /dev/null +++ b/testing/PIMS.Tests.Automation/Classes/Project.cs @@ -0,0 +1,23 @@ + +namespace PIMS.Tests.Automation.Classes +{ + public class Project + { + public string ProjectName { get; set; } = null!; + public string? ProjectNumber { get; set; } = null; + public string Status { get; set; } = null!; + public string MOTIRegion { get; set; } = null!; + public string? Summary { get; set; } = null; + public List? Products { get; set; } = new List(); + } + + public class Product + { + public string ProductCode { get; set; } = null!; + public string ProductName { get; set; } = null!; + public string CostEstimate { get; set; } = null!; + public string EstimateDate { get; set; } = null!; + public string Objectives { get; set; } = null!; + public string Scope { get; set; } = null!; + } +} diff --git a/testing/PIMS.Tests.Automation/PageObjects/Projects.cs b/testing/PIMS.Tests.Automation/PageObjects/Projects.cs new file mode 100644 index 0000000000..9447f099d5 --- /dev/null +++ b/testing/PIMS.Tests.Automation/PageObjects/Projects.cs @@ -0,0 +1,143 @@ +using OpenQA.Selenium; + +namespace PIMS.Tests.Automation.PageObjects +{ + public class Projects : PageObjectBase + { + //Menu Elements + private By projectMenuBttn = By.XPath("//a/label[contains(text(),'Project')]/parent::a"); + private By createProjectButton = By.XPath("//a[contains(text(),'Create Project')]"); + + //Create Project Form Elements + private By projectCreateTitle = By.XPath("//h1[contains(text(),'Create Project')]"); + private By projectInstructionParagraph = By.XPath("//p[contains(text(),'Before creating a project')]"); + + private By projectNameLabel = By.XPath("//label[contains(text(),'Project name')]"); + private By projectNameInput = By.Id("input-projectName"); + private By projectNumberLabel = By.XPath("//label[contains(text(),'Project number')]"); + private By projectNumberInput = By.Id("input-projectNumber"); + private By projectStatusLabel = By.XPath("//label[contains(text(),'Status')]"); + private By projectStatusSelect = By.Id("input-projectStatusType"); + private By projectMOTIRegionLabel = By.XPath("//label[contains(text(),'MoTI region')]"); + private By projectMOTIRegionInput = By.Id("input-region"); + private By projectSummaryLabel = By.XPath("//label[contains(text(),'Project summary')]"); + private By projectSummaryTextarea = By.Id("input-summary"); + + private By projectAssociatedProdsSubtitle = By.XPath("//div[contains(text(),'Associated products')]"); + private By projectAddProductButton = By.XPath("//div[contains(text(),'+ Add another product')]/parent::button"); + + //Create Product Form Elements + private By productCodeLabel = By.XPath("//label[contains(text(),'Product code')]"); + private By productCodeInput = By.Id("input-products.0.code"); + private By productNameLabel = By.XPath("//label[contains(text(),'Name')]"); + private By productNameInput = By.Id("input-products.0.description"); + private By productStartDateLabel = By.XPath("//label[contains(text(),'Start date')]"); + private By productStartDateInput = By.Id("datepicker-products.0.startDate"); + private By productCostEstimateLabel = By.XPath("//label[contains(text(),'Cost estimate')]"); + private By productCostEstimateInput = By.Id("input-products.0.costEstimate"); + private By productObjectiveLabel = By.XPath("//label[contains(text(),'Objectives')]"); + private By productObjectiveInput = By.Id("input-products.0.objective"); + private By productScopeLabel = By.XPath("//label[contains(text(),'Scope')]"); + private By productScopeInput = By.Id("input-products.0.scope"); + private By productDeleteButton = By.CssSelector("button[title='Delete Note']"); + + //View Project Form Elements + private By projectViewTitle = By.XPath("//h1[contains(text(),'Project')]"); + private By projectHeaderProjectNameLabel = By.XPath("//h1/parent::div/parent::div/parent::div/following-sibling::div/div/div/div/div/div/div/label[contains(text(),'Project')]"); + private By projectHeaderProjectNameContent = By.XPath("//label[contains(text(),'Project')]/parent::div/following-sibling::div/strong"); + private By projectHeaderMoTIRegionLabel = By.XPath("//label[contains(text(),'MoTI Region')]"); + private By projectHeaderMoTIRegionContent = By.XPath("//label[contains(text(),'MoTI Region')]/parent::div/following-sibling::div/strong"); + private By projectHeaderCreatedLabel = By.XPath("//span[contains(text(),'Created')]"); + private By projectHeaderCreatedContent = By.XPath("//span[contains(text(),'Created')]/strong"); + private By projectHeaderCreatedBy = By.XPath("//span[contains(text(),'Created')]/span[@data-testid='tooltip-icon-userNameTooltip']"); + private By projectHeaderLastUpdatedLabel = By.XPath("//span[contains(text(),'Last updated')]"); + private By projectHeaderLastUpdatedContent = By.XPath("//span[contains(text(),'Last updated')]/strong"); + private By projectHeaderLastUpdatedBy = By.XPath("//span[contains(text(),'Last updated')]/span[@data-testid='tooltip-icon-userNameTooltip']"); + private By projectHeaderStatusLabel = By.XPath("//label[contains(text(),'Status')]"); + private By projectHeaderStatusContent = By.XPath("//label[contains(text(),'Status')]/parent::div/following-sibling::div/strong"); + + private By projectEditButton = By.CssSelector("button[title='Edit project']"); + private By projectDetailsSubtitle = By.XPath("//div[contains(text(),'Project Details')]"); + private By projectDetailsSummaryContent = By.XPath("//label[contains(text(),'Project summary')]/parent::div/following-sibling::div"); + + //Buttons Elements + private By projectCancelButton = By.XPath("//div[contains(text(),'Cancel')]/parent::button"); + private By projectSaveButton = By.XPath("//div[contains(text(),'Save')]/parent::button"); + + public Projects(IWebDriver webDriver) : base(webDriver) + {} + + public void VerifyCreateProjectForm() + { + Wait(); + Assert.True(webDriver.FindElement(projectCreateTitle).Displayed); + Assert.True(webDriver.FindElement(projectInstructionParagraph).Displayed); + + Assert.True(webDriver.FindElement(projectNameLabel).Displayed); + Assert.True(webDriver.FindElement(projectNameInput).Displayed); + Assert.True(webDriver.FindElement(projectNumberLabel).Displayed); + Assert.True(webDriver.FindElement(projectNumberInput).Displayed); + Assert.True(webDriver.FindElement(projectStatusLabel).Displayed); + Assert.True(webDriver.FindElement(projectStatusSelect).Displayed); + Assert.True(webDriver.FindElement(projectMOTIRegionLabel).Displayed); + Assert.True(webDriver.FindElement(projectMOTIRegionInput).Displayed); + Assert.True(webDriver.FindElement(projectSummaryLabel).Displayed); + Assert.True(webDriver.FindElement(projectSummaryTextarea).Displayed); + + Assert.True(webDriver.FindElement(projectAssociatedProdsSubtitle).Displayed); + Assert.True(webDriver.FindElement(projectAddProductButton).Displayed); + + Assert.True(webDriver.FindElement(projectCancelButton).Displayed); + Assert.True(webDriver.FindElement(projectSaveButton).Displayed); + } + + public void VerifyCreateProductForm() + { + Wait(); + Assert.True(webDriver.FindElement(productCodeLabel).Displayed); + Assert.True(webDriver.FindElement(productCodeInput).Displayed); + Assert.True(webDriver.FindElement(productNameLabel).Displayed); + Assert.True(webDriver.FindElement(productNameInput).Displayed); + Assert.True(webDriver.FindElement(productStartDateLabel).Displayed); + Assert.True(webDriver.FindElement(productStartDateInput).Displayed); + Assert.True(webDriver.FindElement(productCostEstimateLabel).Displayed); + Assert.True(webDriver.FindElement(productCostEstimateInput).Displayed); + Assert.True(webDriver.FindElement(productObjectiveLabel).Displayed); + Assert.True(webDriver.FindElement(productObjectiveInput).Displayed); + Assert.True(webDriver.FindElement(productScopeLabel).Displayed); + Assert.True(webDriver.FindElement(productScopeInput).Displayed); + Assert.True(webDriver.FindElement(productDeleteButton).Displayed); + } + + public void VerifyViewForm(string projectName, string projectRegion, string createdDate, string createdBy, string updatedDate, string updatedBy, string status, + string projectSummary) + { + //Header + Assert.True(webDriver.FindElement(projectViewTitle).Displayed); + Assert.True(webDriver.FindElement(projectHeaderProjectNameLabel).Displayed); + Assert.True(webDriver.FindElement(projectHeaderProjectNameContent).Text.Equals(projectName)); + Assert.True(webDriver.FindElement(projectHeaderMoTIRegionLabel).Displayed); + Assert.True(webDriver.FindElement(projectHeaderMoTIRegionContent).Text.Equals(projectRegion)); + Assert.True(webDriver.FindElement(projectHeaderCreatedLabel).Displayed); + Assert.True(webDriver.FindElement(projectHeaderCreatedContent).Text.Equals(TransformDateFormat(createdDate))); + Assert.True(webDriver.FindElement(projectHeaderCreatedBy).Text.Equals(createdBy)); + Assert.True(webDriver.FindElement(projectHeaderLastUpdatedLabel).Displayed); + Assert.True(webDriver.FindElement(projectHeaderLastUpdatedContent).Text.Equals(TransformDateFormat(updatedDate))); + Assert.True(webDriver.FindElement(projectHeaderLastUpdatedBy).Text.Equals(updatedBy)); + Assert.True(webDriver.FindElement(projectHeaderStatusLabel).Displayed); + Assert.True(webDriver.FindElement(projectHeaderStatusContent).Text.Equals(status)); + + //Edit Button + Assert.True(webDriver.FindElement(projectEditButton).Displayed); + + //Project Details + Assert.True(webDriver.FindElement(projectDetailsSubtitle).Displayed); + Assert.True(webDriver.FindElement(projectSummaryLabel).Displayed); + Assert.True(webDriver.FindElement(projectDetailsSummaryContent).Text.Equals(projectSummary)); + + //Project's Products + + + } + } +} diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs new file mode 100644 index 0000000000..7d249e8533 --- /dev/null +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs @@ -0,0 +1,121 @@ +using OpenQA.Selenium; + +namespace PIMS.Tests.Automation.PageObjects +{ + public class SearchProjects : PageObjectBase + { + //Menu Elements + private By projectMenuBttn = By.XPath("//a/label[contains(text(),'Project')]/parent::a"); + private By manageProjectButton = By.XPath("//a[contains(text(),'Manage Project')]"); + + //Search Projects Filters Elements + private By searchProjectSubtitle = By.XPath("//h3[contains(text(),'Projects')]"); + private By searchProjectNumberInput = By.Id("input-projectNumber"); + private By searchProjectNameInput = By.Id("input-projectName"); + private By searchProjectRegionSelect = By.Id("input-projectRegionCode"); + private By searchProjectStatusSelect = By.Id("input-projectStatusCode"); + private By searchProjectButton = By.Id("search-button"); + private By searchProjectResetButton = By.Id("reset-button"); + private By searchProjectAddProjectBttn = By.XPath("//h3[contains(text(),'Projects')]/parent::div/button"); + + //Search Projects Table Column header Elements + private By searchProjectNbrHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Project #')]"); + private By searchProjectNameHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Project name')]"); + private By searchProjectRegionHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Region')]"); + private By searchProjectStatusHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Status')]"); + private By searchProjectLastUpdatedByHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Last updated by')]"); + private By searchProjectUpdatedDateHeaderColumn = By.XPath("//div[@data-testid='projectsTable']/div[@class='thead thead-light']/div/div/div[contains(text(),'Updated date')]"); + + //Search Projects Table 1st result Element + private By searchProject1stResultNbrLink = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[1]/a"); + private By searchProject1stResultNameLink = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[2]/a"); + private By searchProject1stResultRegionContent = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[3]"); + private By searchProject1stResultStatusContent = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[4]"); + private By searchProject1stResultLastUpdatedByContent = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[5]"); + private By searchProject1stResultLastUpdatedDateContent = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper'][1]/div/div[6]"); + private By searchProjectUpdatedDateSortBttn = By.CssSelector("div[data-testid='sort-column-lastUpdatedDate']"); + + private By searchProjectTotalCount = By.XPath("//div[@data-testid='projectsTable']/div[@class='tbody']/div[@class='tr-wrapper']"); + + private By searchProjectShowEntries = By.CssSelector("div[class='Menu-root']"); + private By searchProjectPagination = By.CssSelector("ul[class='pagination']"); + public SearchProjects(IWebDriver webDriver) : base(webDriver) + {} + //Navigates to Search a Project + public void NavigateToSearchProject() + { + Wait(); + webDriver.FindElement(projectMenuBttn).Click(); + + Wait(); + webDriver.FindElement(manageProjectButton).Click(); + } + + public void SearchProjectByName(string projectName) + { + Wait(); + webDriver.FindElement(searchProjectNameInput).SendKeys(projectName); + ChooseSpecificSelectOption(searchProjectStatusSelect, "All Statuses"); + + Wait(5000); + webDriver.FindElement(searchProjectButton).Click(); + } + + public void SearchLastResearchFile() + { + Wait(); + webDriver.FindElement(searchProjectResetButton).Click(); + + Wait(); + ChooseSpecificSelectOption(searchProjectStatusSelect, "All Statuses"); + FocusAndClick(searchProjectButton); + + Wait(); + webDriver.FindElement(searchProjectUpdatedDateSortBttn).Click(); + webDriver.FindElement(searchProjectUpdatedDateSortBttn).Click(); + } + + public void SelectFirstResult() + { + Wait(); + webDriver.FindElement(searchProject1stResultNbrLink).Click(); + } + + public void VerifySearchView() + { + Wait(); + + //Search Projects Filters Section + Assert.True(webDriver.FindElement(searchProjectSubtitle).Displayed); + Assert.True(webDriver.FindElement(searchProjectNumberInput).Displayed); + Assert.True(webDriver.FindElement(searchProjectNameInput).Displayed); + Assert.True(webDriver.FindElement(searchProjectRegionSelect).Displayed); + Assert.True(webDriver.FindElement(searchProjectStatusSelect).Displayed); + Assert.True(webDriver.FindElement(searchProjectButton).Displayed); + Assert.True(webDriver.FindElement(searchProjectResetButton).Displayed); + Assert.True(webDriver.FindElement(searchProjectAddProjectBttn).Displayed); + + //Search Projects Table Column header Elements + Assert.True(webDriver.FindElement(searchProjectNbrHeaderColumn).Displayed); + Assert.True(webDriver.FindElement(searchProjectNameHeaderColumn).Displayed); + Assert.True(webDriver.FindElement(searchProjectRegionHeaderColumn).Displayed); + Assert.True(webDriver.FindElement(searchProjectStatusHeaderColumn).Displayed); + Assert.True(webDriver.FindElement(searchProjectLastUpdatedByHeaderColumn).Displayed); + Assert.True(webDriver.FindElement(searchProjectUpdatedDateHeaderColumn).Displayed); + + Assert.True(webDriver.FindElement(searchProjectShowEntries).Displayed); + Assert.True(webDriver.FindElement(searchProjectPagination).Displayed); + } + + public void VerifyViewSearchResult(string number, string name, string region, string status, string lastUpdatedBy, string lastUpdatedDate) + { + Wait(); + Assert.True(webDriver.FindElement(searchProject1stResultNbrLink).Text.Equals(number)); + Assert.True(webDriver.FindElement(searchProject1stResultNameLink).Text.Equals(name)); + Assert.True(webDriver.FindElement(searchProject1stResultRegionContent).Text.Equals(region)); + Assert.True(webDriver.FindElement(searchProject1stResultStatusContent).Text.Equals(status)); + Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedByContent).Text.Equals(lastUpdatedBy)); + Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedDateContent).Text.Equals(TransformDateFormat(lastUpdatedDate))); + } + } +} From 15afced286b79e60d39ad2476652e0096d9dbd2f Mon Sep 17 00:00:00 2001 From: Sue Tairaku <42981334+stairaku@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:17:25 -0700 Subject: [PATCH 2/7] Automation - Projects and Products automation --- .../PIMS.Tests.Automation/Classes/Project.cs | 27 +- .../Data/ExcelDataContext.cs | 1 + .../Data/PIMS_Testing_Data.xlsx | Bin 15741 -> 21533 bytes .../Features/Projects.feature | 21 ++ .../Features/Projects.feature.cs | 200 ++++++++++++ .../PageObjects/Contacts.cs | 60 ---- .../PageObjects/Projects.cs | 292 +++++++++++++++++- .../PageObjects/SearchProjects.cs | 20 +- .../StepDefinitions/ContactsSteps.cs | 37 +-- .../StepDefinitions/ProjectSteps.cs | 193 ++++++++++++ 10 files changed, 734 insertions(+), 117 deletions(-) create mode 100644 testing/PIMS.Tests.Automation/Features/Projects.feature create mode 100644 testing/PIMS.Tests.Automation/Features/Projects.feature.cs create mode 100644 testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs diff --git a/testing/PIMS.Tests.Automation/Classes/Project.cs b/testing/PIMS.Tests.Automation/Classes/Project.cs index 45fdc3dbb0..ff40a6df26 100644 --- a/testing/PIMS.Tests.Automation/Classes/Project.cs +++ b/testing/PIMS.Tests.Automation/Classes/Project.cs @@ -3,11 +3,22 @@ namespace PIMS.Tests.Automation.Classes { public class Project { - public string ProjectName { get; set; } = null!; - public string? ProjectNumber { get; set; } = null; + public string Name { get; set; } = null!; + public string? Number { get; set; } = null; + public string CodeName { get; set; } = null!; public string Status { get; set; } = null!; public string MOTIRegion { get; set; } = null!; public string? Summary { get; set; } = null; + public string CreatedBy { get; set; } = null!; + public string UpdatedBy { get; set; } = null!; + public int ProductsCount { get; set; } = 0; + public int ProductsRowStart { get; set; } = 0; + public string? UpdateName { get; set; } = null; + public string? UpdateNumber { get; set; } = null; + public string? UpdateCodeName { get; set; } = null; + public string? UpdateStatus { get; set; } = null; + public string? UpdateMOTIRegion { get; set; } = null; + public string? UpdateSummary { get; set; } = null; public List? Products { get; set; } = new List(); } @@ -15,9 +26,19 @@ public class Product { public string ProductCode { get; set; } = null!; public string ProductName { get; set; } = null!; + public string ProductCodeName { get; set; } = null!; public string CostEstimate { get; set; } = null!; - public string EstimateDate { get; set; } = null!; + public string? EstimateDate { get; set; } = null; + public string StartDate { get; set; } = null!; public string Objectives { get; set; } = null!; public string Scope { get; set; } = null!; + public string UpdateProductCode { get; set; } = null!; + public string UpdateProductName { get; set; } = null!; + public string UpdateProductCodeName { get; set; } = null!; + public string UpdateCostEstimate { get; set; } = null!; + public string? UpdateEstimateDate { get; set; } = null; + public string UpdateStartDate { get; set; } = null!; + public string UpdateObjectives { get; set; } = null!; + public string UpdateScope { get; set; } = null!; } } diff --git a/testing/PIMS.Tests.Automation/Data/ExcelDataContext.cs b/testing/PIMS.Tests.Automation/Data/ExcelDataContext.cs index 1a51610200..5a32a9f96d 100644 --- a/testing/PIMS.Tests.Automation/Data/ExcelDataContext.cs +++ b/testing/PIMS.Tests.Automation/Data/ExcelDataContext.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using ExcelDataReader; using System.Data; +using PIMS.Tests.Automation.Classes; namespace PIMS.Tests.Automation.Data { diff --git a/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx b/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx index 9d238c90991baadbceff1b4fc92fe49a7bb27283..4c5442b7083f6d8d973da5b80319686a011d21b3 100644 GIT binary patch delta 10791 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 delta 6363 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 diff --git a/testing/PIMS.Tests.Automation/Features/Projects.feature b/testing/PIMS.Tests.Automation/Features/Projects.feature new file mode 100644 index 0000000000..d9fc692245 --- /dev/null +++ b/testing/PIMS.Tests.Automation/Features/Projects.feature @@ -0,0 +1,21 @@ +Feature: Projects + +@Regression-Projects +Scenario Outline: Create new Projects + Given I create a new Project from row number + When I search for an existing project + Then Expected Content is displayed on Projects Table + Examples: + | RowNumber | + | 1 | + | 2 | + | 3 | + | 4 | + +Scenario: Update Project + Given I update an existing project from row number 1 + Then The Project is updated successfully + +Scenario: Duplicate Project + Given I create a new Project from row number 1 + Then Duplicate Project Alert is displayed diff --git a/testing/PIMS.Tests.Automation/Features/Projects.feature.cs b/testing/PIMS.Tests.Automation/Features/Projects.feature.cs new file mode 100644 index 0000000000..2c0fa84f1a --- /dev/null +++ b/testing/PIMS.Tests.Automation/Features/Projects.feature.cs @@ -0,0 +1,200 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by SpecFlow (https://www.specflow.org/). +// SpecFlow Version:3.9.0.0 +// SpecFlow Generator Version:3.9.0.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ +#region Designer generated code +#pragma warning disable +namespace PIMS.Tests.Automation.Features +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public partial class ProjectsFeature : object, Xunit.IClassFixture, System.IDisposable + { + + private static TechTalk.SpecFlow.ITestRunner testRunner; + + private static string[] featureTags = ((string[])(null)); + + private Xunit.Abstractions.ITestOutputHelper _testOutputHelper; + +#line 1 "Projects.feature" +#line hidden + + public ProjectsFeature(ProjectsFeature.FixtureData fixtureData, PIMS_Tests_Automation_XUnitAssemblyFixture assemblyFixture, Xunit.Abstractions.ITestOutputHelper testOutputHelper) + { + this._testOutputHelper = testOutputHelper; + this.TestInitialize(); + } + + public static void FeatureSetup() + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Features", "Projects", null, ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + public static void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + public void TestInitialize() + { + } + + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(_testOutputHelper); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + + void System.IDisposable.Dispose() + { + this.TestTearDown(); + } + + [Xunit.SkippableTheoryAttribute(DisplayName="Create new Projects")] + [Xunit.TraitAttribute("FeatureTitle", "Projects")] + [Xunit.TraitAttribute("Description", "Create new Projects")] + [Xunit.TraitAttribute("Category", "Regression-Projects")] + [Xunit.InlineDataAttribute("1", new string[0])] + [Xunit.InlineDataAttribute("2", new string[0])] + [Xunit.InlineDataAttribute("3", new string[0])] + [Xunit.InlineDataAttribute("4", new string[0])] + public void CreateNewProjects(string rowNumber, string[] exampleTags) + { + string[] @__tags = new string[] { + "Regression-Projects"}; + if ((exampleTags != null)) + { + @__tags = System.Linq.Enumerable.ToArray(System.Linq.Enumerable.Concat(@__tags, exampleTags)); + } + string[] tagsOfScenario = @__tags; + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + argumentsOfScenario.Add("RowNumber", rowNumber); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Create new Projects", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 4 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 5 + testRunner.Given(string.Format("I create a new Project from row number {0}", rowNumber), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 6 + testRunner.When("I search for an existing project", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 7 + testRunner.Then("Expected Content is displayed on Projects Table", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + + [Xunit.SkippableFactAttribute(DisplayName="Update Project")] + [Xunit.TraitAttribute("FeatureTitle", "Projects")] + [Xunit.TraitAttribute("Description", "Update Project")] + public void UpdateProject() + { + string[] tagsOfScenario = ((string[])(null)); + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Update Project", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 15 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 16 + testRunner.Given("I update an existing project from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 17 + testRunner.Then("The Project is updated successfully", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + + [Xunit.SkippableFactAttribute(DisplayName="Duplicate Project")] + [Xunit.TraitAttribute("FeatureTitle", "Projects")] + [Xunit.TraitAttribute("Description", "Duplicate Project")] + public void DuplicateProject() + { + string[] tagsOfScenario = ((string[])(null)); + System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Duplicate Project", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 19 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 20 + testRunner.Given("I create a new Project from row number 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 21 + testRunner.Then("Duplicate Project Alert is displayed", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + } + this.ScenarioCleanup(); + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class FixtureData : System.IDisposable + { + + public FixtureData() + { + ProjectsFeature.FeatureSetup(); + } + + void System.IDisposable.Dispose() + { + ProjectsFeature.FeatureTearDown(); + } + } + } +} +#pragma warning restore +#endregion diff --git a/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs b/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs index 34445a2d6f..62ce5fd8c0 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/Contacts.cs @@ -180,40 +180,6 @@ public void NavigateToCreateNewContact() webDriver.FindElement(createContactButton).Click(); } - //Creates Individual Contact with minimum fields - //public void CreateIndividualContactMinFields(string firstName, string lastName, string orgName, string email, string country, string addressLine1, string province, string city, string postalCode) - //{ - // Wait(); - - // //Choosing individual contact option - // FocusAndClick(contactIndividualRadioBttn); - - // //Inserting individual personal details - // webDriver.FindElement(contactIndFirstNameInput).SendKeys(firstName); - // webDriver.FindElement(contactIndLastNameInput).SendKeys(lastName); - // webDriver.FindElement(contactIndOrgInput).SendKeys(orgName); - - // Wait(); - // webDriver.FindElement(contactOrgNameSelect).Click(); - - // //Inserting individual contact info - // webDriver.FindElement(contactEmailInput1).SendKeys(email); - // ChooseRandomSelectOption(contactEmailSelect1, 2); - - // //Inserting contact mail address - // webDriver.FindElement(contactMailAddressLine1Input).SendKeys(addressLine1); - - // var countryElement = webDriver.FindElement(contactMailCountrySelect); - // ChooseSpecificSelectOption(contactMailCountrySelect, country); - - // webDriver.FindElement(contactMailCityInput).SendKeys(city); - - // var provinceElement = webDriver.FindElement(contactMailProvinceSelect); - // ChooseSpecificSelectOption(contactMailProvinceSelect, province); - - // webDriver.FindElement(contactMailPostalCodeInput).SendKeys(postalCode); - //} - //Creates Individual Contact with all fields public void CreateIndividualContact(string firstName, string middleName, string lastName, string prefName, string orgName, string email1, string emailType1, string phone1, string phoneType1, string mailAddressLine1, string mailAddressLine2, string mailAddressLine3, string mailCity, string mailProvince, string mailPostalCode, string mailCountry, string mailOtherCountry, @@ -338,32 +304,6 @@ public void CreateIndividualContact(string firstName, string middleName, string webDriver.FindElement(contactCommentTextarea).SendKeys(comments); } - //public void CreateOrganizationContactMinFields(string orgName, string phone, string addressLine1, string country, string province, string city, string postalCode) - //{ - // Wait(); - - // //Choosing organization contact option - // FocusAndClick(contactOrganizationRadioBttn); - - // //Inserting organization contact details - // webDriver.FindElement(contactOrgNameInput).SendKeys(orgName); - - // //Inserting organization contact info - // webDriver.FindElement(contactPhoneInput1).SendKeys(phone); - // ChooseRandomSelectOption(contactPhoneSelect1, 2); - - // //Inserting contact property address - // webDriver.FindElement(contactPropertyAddressLine1Input).SendKeys(addressLine1); - - // ChooseSpecificSelectOption(contactPropertyCountrySelect, country); - - // webDriver.FindElement(contactPropertyCityInput).SendKeys(city); - - // ChooseSpecificSelectOption(contactPropertyProvinceSelect, province); - - // webDriver.FindElement(contactPropertyPostalCodeInput).SendKeys(postalCode); - //} - //Creates Organization Contact with all fields public void CreateOrganizationContact(string orgName, string alias, string incNumber, string email1, string emailType1, string email2, string emailType2, string phone1, string phoneType1, string phone2, string phoneType2, diff --git a/testing/PIMS.Tests.Automation/PageObjects/Projects.cs b/testing/PIMS.Tests.Automation/PageObjects/Projects.cs index 9447f099d5..c3cc8aefe3 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/Projects.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/Projects.cs @@ -1,4 +1,5 @@ using OpenQA.Selenium; +using PIMS.Tests.Automation.Classes; namespace PIMS.Tests.Automation.PageObjects { @@ -64,8 +65,176 @@ public class Projects : PageObjectBase private By projectCancelButton = By.XPath("//div[contains(text(),'Cancel')]/parent::button"); private By projectSaveButton = By.XPath("//div[contains(text(),'Save')]/parent::button"); + //Modals Elements + private By deleteProductModal = By.CssSelector("div[class='modal-dialog']"); + private By duplicateProjectToast = By.CssSelector("div[class='Toastify__toast-body']"); + + private SharedModals sharedModals; + public Projects(IWebDriver webDriver) : base(webDriver) - {} + { + sharedModals = new SharedModals(webDriver); + } + + //Navigates to Create a new Project + public void NavigateToCreateNewProject() + { + Wait(); + webDriver.FindElement(projectMenuBttn).Click(); + + Wait(); + webDriver.FindElement(createProjectButton).Click(); + } + public void CreateProject(Project project) + { + Wait(); + + webDriver.FindElement(projectNameInput).SendKeys(project.Name); + if (project.Number != "") + { + webDriver.FindElement(projectNumberInput).SendKeys(project.Number); + } + ChooseSpecificSelectOption(projectStatusSelect, project.Status); + ChooseSpecificSelectOption(projectMOTIRegionInput, project.MOTIRegion); + if (project.Summary != "") + { + webDriver.FindElement(projectSummaryTextarea).SendKeys(project.Summary); + } + } + + public void CreateProduct(Product product, int index) + { + By productCodeDynamicInput = By.Id("input-products."+ index +".code"); + By productNameDynamicInput = By.Id("input-products."+ index +".description"); + By productStartDateDynamicInput = By.Id("datepicker-products."+ index +".startDate"); + By productCostEstimateDynamicInput = By.Id("input-products."+ index +".costEstimate"); + By productEstimateDateDynamicInput = By.Id("datepicker-products."+ index +".costEstimateDate"); + By productObjectiveDynamicInput = By.Id("input-products."+ index +".objective"); + By productScopeDynamicInput = By.Id("input-products."+ index +".scope"); + + Wait(); + webDriver.FindElement(projectAddProductButton).Click(); + + Wait(); + webDriver.FindElement(productCodeDynamicInput).SendKeys(product.ProductCode); + webDriver.FindElement(productNameDynamicInput).SendKeys(product.ProductName); + if (product.StartDate != "") + { + webDriver.FindElement(productStartDateDynamicInput).SendKeys(product.StartDate); + } + if (product.CostEstimate != "") + { + webDriver.FindElement(productCostEstimateDynamicInput).SendKeys(product.CostEstimate); + } + if (product.EstimateDate != "") + { + webDriver.FindElement(productEstimateDateDynamicInput).SendKeys(product.EstimateDate); + } + if (product.Objectives != "") + { + webDriver.FindElement(productObjectiveDynamicInput).SendKeys(product.Objectives); + } + if (product.Scope != "") + { + webDriver.FindElement(productScopeDynamicInput).SendKeys(product.Scope); + } + } + public void UpdateProject(Project project) + { + Wait(); + if (project.UpdateName != "") + { + ClearInput(projectNameInput); + webDriver.FindElement(projectNameInput).SendKeys(project.UpdateName); + } + if (project.UpdateNumber != "") + { + ClearInput(projectNumberInput); + webDriver.FindElement(projectNumberInput).SendKeys(project.UpdateNumber); + } + if (project.UpdateStatus != "") { ChooseSpecificSelectOption(projectStatusSelect, project.UpdateStatus); } + if (project.UpdateMOTIRegion != "") { ChooseSpecificSelectOption(projectMOTIRegionInput, project.UpdateMOTIRegion); } + if (project.UpdateSummary != "") + { + ClearInput(projectSummaryTextarea); + webDriver.FindElement(projectSummaryTextarea).SendKeys(project.UpdateSummary); + } + } + + public void UpdateProduct(Product product, int index) + { + By productCodeDynamicInput = By.Id("input-products."+ index +".code"); + By productNameDynamicInput = By.Id("input-products."+ index +".description"); + By productStartDateDynamicInput = By.Id("datepicker-products."+ index +".startDate"); + By productCostEstimateDynamicInput = By.Id("input-products."+ index +".costEstimate"); + By productEstimateDateDynamicInput = By.Id("datepicker-products."+ index +".costEstimateDate"); + By productObjectiveDynamicInput = By.Id("input-products."+ index +".objective"); + By productScopeDynamicInput = By.Id("input-products."+ index +".scope"); + + Wait(); + + if (product.UpdateProductCode != "") + { + ClearInput(productCodeDynamicInput); + webDriver.FindElement(productCodeDynamicInput).SendKeys(product.UpdateProductCode); + } + if (product.UpdateProductName != "") + { + ClearInput(productNameDynamicInput); + webDriver.FindElement(productNameDynamicInput).SendKeys(product.UpdateProductName); + } + if (product.UpdateStartDate != "") + { + ClearInput(productStartDateDynamicInput); + webDriver.FindElement(productStartDateDynamicInput).SendKeys(product.UpdateStartDate); + } + if (product.UpdateCostEstimate != "") + { + ClearInput(productCostEstimateDynamicInput); + webDriver.FindElement(productCostEstimateDynamicInput).SendKeys(product.UpdateCostEstimate); + } + if (product.UpdateEstimateDate != "") + { + ClearInput(productEstimateDateDynamicInput); + webDriver.FindElement(productEstimateDateDynamicInput).SendKeys(product.UpdateEstimateDate); + } + if (product.UpdateObjectives != "") + { + ClearInput(productObjectiveDynamicInput); + webDriver.FindElement(productObjectiveDynamicInput).SendKeys(product.UpdateObjectives); + } + if (product.UpdateScope != "") + { + ClearInput(productScopeDynamicInput); + webDriver.FindElement(productScopeDynamicInput).SendKeys(product.UpdateScope); + } + } + + public void DeleteProduct(int productIndex) + { + Wait(); + By deleteButtonElement = By.XPath("//div[@class='collapse show']/div["+ productIndex +"]/div/div/button[@title='Delete Note']"); + webDriver.FindElement(deleteButtonElement).Click(); + + if (webDriver.FindElements(deleteProductModal).Count > 0) + { + Assert.True(sharedModals.ModalHeader().Equals("Remove Product")); + Assert.True(sharedModals.ModalContent().Equals("Deleting this product will remove it from all \"Product\" dropdowns. Are you certain you wish to proceed?")); + ButtonElement("Remove"); + } + } + + public void SaveProject() + { + Wait(); + FocusAndClick(projectSaveButton); + } + + public void CancelProject() + { + Wait(); + FocusAndClick(projectCancelButton); + } public void VerifyCreateProjectForm() { @@ -93,6 +262,9 @@ public void VerifyCreateProjectForm() public void VerifyCreateProductForm() { + Wait(); + webDriver.FindElement(projectAddProductButton).Click(); + Wait(); Assert.True(webDriver.FindElement(productCodeLabel).Displayed); Assert.True(webDriver.FindElement(productCodeInput).Displayed); @@ -107,25 +279,29 @@ public void VerifyCreateProductForm() Assert.True(webDriver.FindElement(productScopeLabel).Displayed); Assert.True(webDriver.FindElement(productScopeInput).Displayed); Assert.True(webDriver.FindElement(productDeleteButton).Displayed); + + DeleteProduct(1); } - public void VerifyViewForm(string projectName, string projectRegion, string createdDate, string createdBy, string updatedDate, string updatedBy, string status, - string projectSummary) + public void VerifyProjectViewForm(Project project) { + DateTime thisDay = DateTime.Today; + string today = thisDay.ToString("MMM dd, yyyy"); + //Header Assert.True(webDriver.FindElement(projectViewTitle).Displayed); Assert.True(webDriver.FindElement(projectHeaderProjectNameLabel).Displayed); - Assert.True(webDriver.FindElement(projectHeaderProjectNameContent).Text.Equals(projectName)); + Assert.True(webDriver.FindElement(projectHeaderProjectNameContent).Text.Equals(project.CodeName)); Assert.True(webDriver.FindElement(projectHeaderMoTIRegionLabel).Displayed); - Assert.True(webDriver.FindElement(projectHeaderMoTIRegionContent).Text.Equals(projectRegion)); + Assert.True(webDriver.FindElement(projectHeaderMoTIRegionContent).Text.Equals(project.MOTIRegion)); Assert.True(webDriver.FindElement(projectHeaderCreatedLabel).Displayed); - Assert.True(webDriver.FindElement(projectHeaderCreatedContent).Text.Equals(TransformDateFormat(createdDate))); - Assert.True(webDriver.FindElement(projectHeaderCreatedBy).Text.Equals(createdBy)); + Assert.True(webDriver.FindElement(projectHeaderCreatedContent).Text.Equals(today)); + Assert.True(webDriver.FindElement(projectHeaderCreatedBy).Text.Equals(project.CreatedBy)); Assert.True(webDriver.FindElement(projectHeaderLastUpdatedLabel).Displayed); - Assert.True(webDriver.FindElement(projectHeaderLastUpdatedContent).Text.Equals(TransformDateFormat(updatedDate))); - Assert.True(webDriver.FindElement(projectHeaderLastUpdatedBy).Text.Equals(updatedBy)); + Assert.True(webDriver.FindElement(projectHeaderLastUpdatedContent).Text.Equals(today)); + Assert.True(webDriver.FindElement(projectHeaderLastUpdatedBy).Text.Equals(project.UpdatedBy)); Assert.True(webDriver.FindElement(projectHeaderStatusLabel).Displayed); - Assert.True(webDriver.FindElement(projectHeaderStatusContent).Text.Equals(status)); + Assert.True(webDriver.FindElement(projectHeaderStatusContent).Text.Equals(project.Status)); //Edit Button Assert.True(webDriver.FindElement(projectEditButton).Displayed); @@ -133,11 +309,103 @@ public void VerifyViewForm(string projectName, string projectRegion, string crea //Project Details Assert.True(webDriver.FindElement(projectDetailsSubtitle).Displayed); Assert.True(webDriver.FindElement(projectSummaryLabel).Displayed); - Assert.True(webDriver.FindElement(projectDetailsSummaryContent).Text.Equals(projectSummary)); + Assert.True(webDriver.FindElement(projectDetailsSummaryContent).Text.Equals(project.Summary)); + } + + public void VerifyProductViewForm(Product product, int index, string validationType) + { + DateTime thisDay = DateTime.Today; + string today = thisDay.ToString("MMM dd, yyyy"); - //Project's Products + By productHeader = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div[1]"); + By productStartDateLabel = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Start Date')]"); + By productStartDateContent = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Start Date')]/parent::div/following-sibling::div"); + By productCostEstimateLabel = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Cost estimate')]"); + By productCostEstimateContent = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Cost estimate')]/parent::div/following-sibling::div"); + By productObjectivesLabel = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Objectives')]"); + By productObjectivesContent = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Objectives')]/parent::div/following-sibling::div"); + By productScopeLabel = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Scope')]"); + By productScopeContent = By.XPath("//div[contains(text(),'Associated Products')]/parent::div/parent::h2/following-sibling::div/div[" +index+ "]/div/div/label[contains(text(),'Scope')]/parent::div/following-sibling::div"); + if (validationType == "Create") + { + Assert.True(webDriver.FindElement(productHeader).Displayed); + Assert.True(webDriver.FindElement(productStartDateLabel).Displayed); + Assert.True(webDriver.FindElement(productStartDateContent).Text.Equals(TransformDateFormat(product.StartDate))); + Assert.True(webDriver.FindElement(productCostEstimateLabel).Displayed); + if (product.EstimateDate != "") + { + Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.CostEstimate) + " as of " + TransformDateFormat(product.EstimateDate))); + } + else + { + Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.CostEstimate) + " no estimate date entered")); + } + Assert.True(webDriver.FindElement(productObjectivesLabel).Displayed); + if (product.Objectives != "") + { + Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals(product.Objectives)); + } + else + { + Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals("no objective entered")); + } + Assert.True(webDriver.FindElement(productScopeLabel).Displayed); + if (product.Scope != "") + { + Assert.True(webDriver.FindElement(productScopeContent).Text.Equals(product.Scope)); + } + else + { + Assert.True(webDriver.FindElement(productScopeContent).Text.Equals("no scope entered")); + } + } + else + { + Assert.True(webDriver.FindElement(productHeader).Displayed); + Assert.True(webDriver.FindElement(productStartDateLabel).Displayed); + Assert.True(webDriver.FindElement(productStartDateContent).Text.Equals(TransformDateFormat(product.UpdateStartDate))); + Assert.True(webDriver.FindElement(productCostEstimateLabel).Displayed); + if (product.EstimateDate != "") + { + Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.UpdateCostEstimate) + " as of " + TransformDateFormat(product.UpdateEstimateDate))); + } + else + { + Assert.True(webDriver.FindElement(productCostEstimateContent).Text.Equals(TransformCurrencyFormat(product.UpdateCostEstimate) + " no estimate date entered")); + } + Assert.True(webDriver.FindElement(productObjectivesLabel).Displayed); + if (product.UpdateObjectives != "") + { + Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals(product.UpdateObjectives)); + } + else if (product.Objectives != "") + { + Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals(product.Objectives)); + } + else + { + Assert.True(webDriver.FindElement(productObjectivesContent).Text.Equals("no objective entered")); + } + Assert.True(webDriver.FindElement(productScopeLabel).Displayed); + if (product.UpdateScope != "") + { + Assert.True(webDriver.FindElement(productScopeContent).Text.Equals(product.UpdateScope)); + } + else if (product.Scope != "") + { + Assert.True(webDriver.FindElement(productScopeContent).Text.Equals(product.Scope)); + } + else + { + Assert.True(webDriver.FindElement(productScopeContent).Text.Equals("no scope entered")); + } + } + } + public Boolean duplicateProject() + { + return webDriver.FindElements(duplicateProjectToast).Count > 0; } } } diff --git a/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs b/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs index 7d249e8533..10c7aed214 100644 --- a/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs +++ b/testing/PIMS.Tests.Automation/PageObjects/SearchProjects.cs @@ -1,4 +1,5 @@ using OpenQA.Selenium; +using PIMS.Tests.Automation.Classes; namespace PIMS.Tests.Automation.PageObjects { @@ -61,7 +62,7 @@ public void SearchProjectByName(string projectName) webDriver.FindElement(searchProjectButton).Click(); } - public void SearchLastResearchFile() + public void SearchLastProject() { Wait(); webDriver.FindElement(searchProjectResetButton).Click(); @@ -107,15 +108,18 @@ public void VerifySearchView() Assert.True(webDriver.FindElement(searchProjectPagination).Displayed); } - public void VerifyViewSearchResult(string number, string name, string region, string status, string lastUpdatedBy, string lastUpdatedDate) + public void VerifyViewSearchResult(Project project) { + DateTime thisDay = DateTime.Today; + string today = thisDay.ToString("MMM dd, yyyy"); + Wait(); - Assert.True(webDriver.FindElement(searchProject1stResultNbrLink).Text.Equals(number)); - Assert.True(webDriver.FindElement(searchProject1stResultNameLink).Text.Equals(name)); - Assert.True(webDriver.FindElement(searchProject1stResultRegionContent).Text.Equals(region)); - Assert.True(webDriver.FindElement(searchProject1stResultStatusContent).Text.Equals(status)); - Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedByContent).Text.Equals(lastUpdatedBy)); - Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedDateContent).Text.Equals(TransformDateFormat(lastUpdatedDate))); + Assert.True(webDriver.FindElement(searchProject1stResultNbrLink).Text.Equals(project.Number)); + Assert.True(webDriver.FindElement(searchProject1stResultNameLink).Text.Equals(project.Name)); + Assert.True(webDriver.FindElement(searchProject1stResultRegionContent).Text.Equals(project.MOTIRegion)); + Assert.True(webDriver.FindElement(searchProject1stResultStatusContent).Text.Equals(project.Status)); + Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedByContent).Text.Equals(project.UpdatedBy)); + Assert.True(webDriver.FindElement(searchProject1stResultLastUpdatedDateContent).Text.Equals(today)); } } } diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/ContactsSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/ContactsSteps.cs index aaae589ed6..ace648ae95 100644 --- a/testing/PIMS.Tests.Automation/StepDefinitions/ContactsSteps.cs +++ b/testing/PIMS.Tests.Automation/StepDefinitions/ContactsSteps.cs @@ -6,20 +6,13 @@ namespace PIMS.Tests.Automation.StepDefinitions { [Binding] - public sealed class ContactsSteps + public class ContactsSteps { private readonly LoginSteps loginSteps; private readonly Contacts contacts; private readonly SearchContacts searchContacts; - //private readonly IEnumerable individualContacts; - //private readonly IEnumerable organizationContacts; private readonly string userName = "TRANPSP1"; - //private readonly string userName = "sutairak"; - - //private readonly string nonExistingContact = "A non existing contact"; - //private readonly string legacyOrganizationName = "BC Hydro and Telus"; - //private readonly string comments = "Automated Test for Contacts"; private IndividualContact individualContact; private OrganizationContact organizationContact; @@ -31,32 +24,8 @@ public ContactsSteps(BrowserDriver driver) searchContacts = new SearchContacts(driver.Current); individualContact = new IndividualContact(); organizationContact = new OrganizationContact(); - //individualContacts = driver.Configuration.GetSection("IndividualContacts").Get>(); - //organizationContacts = driver.Configuration.GetSection("OrganizationContacts").Get>(); } - //[StepDefinition(@"I create a new Individual Contact with minimum fields (.*)")] - //public void MinimumIndividualContact(string lastName) - //{ - // /* TEST COVERAGE: PSP-2705, PSP-2797, PSP-4559 */ - - // //Login to PIMS - // loginSteps.Idir(userName); - - // var contact = individualContacts.SingleOrDefault(u => u.LastName.Equals(lastName, StringComparison.OrdinalIgnoreCase)); - // if (contact == null) throw new InvalidOperationException($"Contact {lastName} not found in the test configuration"); - - // //Navigate to Create new contact form - // contacts.NavigateToCreateNewContact(); - - // //Create new Individual Contact with minimum fields - // contacts.CreateIndividualContactMinFields(contact.FirstName, contact.LastName, contact.Organization, contact.Email, contact.MailCountry, contact.MailAddressLine1, contact.MailProvince, contact.MailProvince, contact.MailPostalCode); - - // //Save Contact - // contacts.SaveContact(); - - //} - [StepDefinition(@"I create a new Individual Contact from row number (.*)")] public void IndividualContact(int rowNumber) { @@ -314,11 +283,11 @@ public void VerifyContactsTableContent(string contactType) if (contactType == "Individual") { - searchContacts.VerifyContactTableContent(individualContact.FullName, individualContact.FirstName, individualContact.LastName, individualContact.Organization, individualContact.Email1, individualContact.MailAddressLine1, individualContact.MailCity, individualContact.MailProvDisplay); + searchContacts.VerifyContactTableContent(individualContact.FullName, individualContact.FirstName, individualContact.LastName, individualContact.Organization, individualContact.Email1, individualContact.MailAddressLine1, individualContact.MailCity, individualContact.MailProvDisplay, individualContact.MailCountry); } else { - searchContacts.VerifyContactTableContent(organizationContact.OrganizationName, "", "", organizationContact.OrganizationName, organizationContact.Email1, organizationContact.MailAddressLine1, organizationContact.MailCity, organizationContact.MailProvDisplay); + searchContacts.VerifyContactTableContent(organizationContact.OrganizationName, "", "", organizationContact.OrganizationName, organizationContact.Email1, organizationContact.MailAddressLine1, organizationContact.MailCity, organizationContact.MailProvDisplay, organizationContact.MailCountry); } } diff --git a/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs b/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs new file mode 100644 index 0000000000..41b0c87f6a --- /dev/null +++ b/testing/PIMS.Tests.Automation/StepDefinitions/ProjectSteps.cs @@ -0,0 +1,193 @@ +using System.Data; +using PIMS.Tests.Automation.Data; +using PIMS.Tests.Automation.Classes; + +namespace PIMS.Tests.Automation.StepDefinitions +{ + [Binding] + public class ProjectSteps + { + private readonly LoginSteps loginSteps; + private readonly Projects projects; + private readonly SearchProjects searchProjects; + + private readonly string userName = "TRANPSP1"; + + private Project project; + + public ProjectSteps(BrowserDriver driver) + { + loginSteps = new LoginSteps(driver); + projects = new Projects(driver.Current); + searchProjects = new SearchProjects(driver.Current); + + project = new Project(); + } + + [StepDefinition(@"I create a new Project from row number (.*)")] + public void CreateProject(int rowNumber) + { + /* TEST COVERAGE: PSP-5428, PSP-5429, PSP-5447, PSP-5534, PSP-5535 */ + + //Login to PIMS + loginSteps.Idir(userName); + + //Navigate to Create new contact form + projects.NavigateToCreateNewProject(); + + //Verify Create Project Form + projects.VerifyCreateProjectForm(); + + //Create a new Project + PopulateProjectData(rowNumber); + projects.CreateProject(project); + + //Verify Create Product Form + projects.VerifyCreateProductForm(); + + //Add Products + for (int i = 0; i < project.ProductsCount; i++) + { + projects.CreateProduct(project.Products[i], i); + } + + //Save Project + projects.SaveProject(); + + //Verify Project View + projects.VerifyProjectViewForm(project); + + //Verify Products within a Project + for (int i = 0; i < project.ProductsCount; i++) + { + projects.VerifyProductViewForm(project.Products[i], i, "Create"); + } + } + + [StepDefinition(@"I search for an existing project")] + public void SearchExistingProject() + { + /* TEST COVERAGE: */ + + //Navigate to Search a Contact + searchProjects.NavigateToSearchProject(); + + //Look for existing Project by name + searchProjects.SearchProjectByName(project.Name); + } + + [StepDefinition(@"I update an existing project from row number (.*)")] + public void UpdateProject(int rowNumber) + { + /* TEST COVERAGE: PSP-5536, PSP-5537 */ + + //Login to PIMS + loginSteps.Idir(userName); + + //Navigate to Manage Projects + searchProjects.NavigateToSearchProject(); + + //Look for existing Project by name + PopulateProjectData(rowNumber); + searchProjects.SearchProjectByName(project.Name); + + //Select the 1st found Project + searchProjects.SelectFirstResult(); + + //Edit selected project + projects.UpdateProject(project); + + //Edit Products + for (int i = 0; i < project.ProductsCount; i++) + { + projects.UpdateProduct(project.Products[i], i); + } + + //Save Project + projects.SaveProject(); + } + + [StepDefinition(@"Expected Content is displayed on Projects Table")] + public void VerifyProjectsTableContent() + { + /* TEST COVERAGE: PSP-5319 */ + searchProjects.VerifyViewSearchResult(project); + } + + [StepDefinition(@"The Project is updated successfully")] + public void UpdateProjectSuccessfully() + { + //Verify Project View + projects.VerifyProjectViewForm(project); + + //Verify Products within a Project + for (int i = 0; i < project.ProductsCount; i++) + { + projects.VerifyProductViewForm(project.Products[i], i, "Update"); + } + } + + [StepDefinition(@"Duplicate Project Alert is displayed")] + public void DuplicateProject() + { + Assert.True(projects.duplicateProject()); + } + private void PopulateProjectData(int rowNumber) + { + DataTable projectsSheet = ExcelDataContext.GetInstance().Sheets["Projects"]; + ExcelDataContext.PopulateInCollection(projectsSheet); + + project.Number = ExcelDataContext.ReadData(rowNumber, "Number"); + project.Name = ExcelDataContext.ReadData(rowNumber, "Name"); + project.CodeName = ExcelDataContext.ReadData(rowNumber, "CodeName"); + project.Status = ExcelDataContext.ReadData(rowNumber, "Status"); + project.MOTIRegion = ExcelDataContext.ReadData(rowNumber, "MOTIRegion"); + project.Summary = ExcelDataContext.ReadData(rowNumber, "Summary"); + project.CreatedBy = ExcelDataContext.ReadData(rowNumber, "CreatedBy"); + project.UpdatedBy = ExcelDataContext.ReadData(rowNumber, "UpdatedBy"); + project.ProductsCount = Int32.Parse(ExcelDataContext.ReadData(rowNumber, "ProductsCount")); + project.ProductsRowStart = Int32.Parse(ExcelDataContext.ReadData(rowNumber, "ProductsRowStart")); + project.UpdateNumber = ExcelDataContext.ReadData(rowNumber, "UpdateNumber"); + project.UpdateName = ExcelDataContext.ReadData(rowNumber, "UpdateName"); + project.UpdateCodeName = ExcelDataContext.ReadData(rowNumber, "UpdateCodeName"); + project.UpdateStatus = ExcelDataContext.ReadData(rowNumber, "UpdateStatus"); + project.UpdateMOTIRegion = ExcelDataContext.ReadData(rowNumber, "UpdateMOTIRegion"); + project.UpdateSummary = ExcelDataContext.ReadData(rowNumber, "UpdateSummary"); + + if (project.ProductsCount != 0 && project.ProductsRowStart != 0) + { + PopulateProductCollection(project.ProductsRowStart, project.ProductsCount); + } + } + + private void PopulateProductCollection(int startRow, int rowsCount) + { + DataTable projectProductsSheet = ExcelDataContext.GetInstance().Sheets["ProjectsProducts"]; + ExcelDataContext.PopulateInCollection(projectProductsSheet); + + for (int i = startRow; i <= rowsCount; i++) + { + Product product = new Product(); + product.ProductCode = ExcelDataContext.ReadData(i, "ProductCode"); + product.ProductName = ExcelDataContext.ReadData(i, "ProductName"); + product.ProductCodeName = ExcelDataContext.ReadData(i, "ProductCodeName"); + product.CostEstimate = ExcelDataContext.ReadData(i, "CostEstimate"); + product.EstimateDate = ExcelDataContext.ReadData(i, "EstimateDate"); + product.StartDate = ExcelDataContext.ReadData(i, "StartDate"); + product.Objectives = ExcelDataContext.ReadData(i, "Objectives"); + product.Scope = ExcelDataContext.ReadData(i, "Scope"); + product.UpdateProductCode = ExcelDataContext.ReadData(i, "UpdateProductCode"); + product.UpdateProductName = ExcelDataContext.ReadData(i, "UpdateProductName"); + product.UpdateProductCodeName = ExcelDataContext.ReadData(i, "UpdateProductCodeName"); + product.UpdateCostEstimate = ExcelDataContext.ReadData(i, "UpdateCostEstimate"); + product.UpdateEstimateDate = ExcelDataContext.ReadData(i, "UpdateEstimateDate"); + product.UpdateStartDate = ExcelDataContext.ReadData(i, "UpdateStartDate"); + product.UpdateObjectives = ExcelDataContext.ReadData(i, "UpdateObjectives"); + product.UpdateScope = ExcelDataContext.ReadData(i, "UpdateScope"); + + project.Products.Add(product); + } + } + } + +} From 793ef7f6ea1a8ac283e001b6a8df57c1171f651f Mon Sep 17 00:00:00 2001 From: Sue Tairaku Date: Fri, 12 May 2023 08:49:26 -0700 Subject: [PATCH 3/7] Leases refactoring --- .../Data/PIMS_Testing_Data.xlsx | Bin 34877 -> 43248 bytes .../StepDefinitions/LeaseLicenseSteps.cs | 70 +----------------- 2 files changed, 3 insertions(+), 67 deletions(-) diff --git a/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx b/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx index 0c4947ebad4b3b7a0b6564fe743fce01d7d63733..b0fefef6716209f0ab6e7d4725e8d3603dff6b25 100644 GIT binary patch delta 17674 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 delta 10754 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 Date: Wed, 17 May 2023 12:59:16 -0700 Subject: [PATCH 4/7] Leases refactoring --- .../PIMS.Tests.Automation/Classes/Lease.cs | 136 ++++ .../Data/PIMS_Testing_Data.xlsx | Bin 43248 -> 46374 bytes .../Features/Leases.feature | 12 +- .../Features/Leases.feature.cs | 12 +- .../PageObjects/LeaseDeposits.cs | 92 +-- .../PageObjects/LeaseDetails.cs | 491 +++++++++---- .../PageObjects/LeaseImprovements.cs | 101 ++- .../PageObjects/LeaseInsurance.cs | 181 +++-- .../PageObjects/LeasePayments.cs | 75 +- .../PageObjects/PageObjectBase.cs | 8 + .../StepDefinitions/LeaseLicenseSteps.cs | 646 ++++++++++-------- 11 files changed, 1187 insertions(+), 567 deletions(-) create mode 100644 testing/PIMS.Tests.Automation/Classes/Lease.cs diff --git a/testing/PIMS.Tests.Automation/Classes/Lease.cs b/testing/PIMS.Tests.Automation/Classes/Lease.cs new file mode 100644 index 0000000000..0b97cb38cf --- /dev/null +++ b/testing/PIMS.Tests.Automation/Classes/Lease.cs @@ -0,0 +1,136 @@ +namespace PIMS.Tests.Automation.Classes +{ + public class Lease + { + public string? MinistryProject { get; set; } = String.Empty; + public string LeaseStatus { get; set; } = null!; + public string AccountType { get; set; } = null!; + public string LeaseStartDate { get; set; } = null!; + public string? LeaseExpiryDate { get; set; } = String.Empty; + public string? MOTIContact { get; set; } = String.Empty; + public string MOTIRegion { get; set; } = null!; + public string Program { get; set; } = null!; + public string? ProgramOther { get; set; } = String.Empty; + public string AdminType { get; set; } = null!; + public string? TypeOther { get; set; } = String.Empty; + public string? Category { get; set; } = String.Empty; + public string? CategoryOther { get; set; } = String.Empty; + public string Purpose { get; set; } = null!; + public string? PurposeOther { get; set; } = String.Empty; + public string? Initiator { get; set; } = String.Empty; + public string? Responsibility { get; set; } = String.Empty; + public string? EffectiveDate { get; set; } = String.Empty; + public string? IntendedUse { get; set; } = String.Empty; + public string? FirstNation { get; set; } = String.Empty; + public string? StrategicRealEstate { get; set; } = String.Empty; + public string? RegionalPlanning { get; set; } = String.Empty; + public string? RegionalPropertyService { get; set; } = String.Empty; + public string? District { get; set; } = String.Empty; + public string? Headquarter { get; set; } = String.Empty; + public string? ConsultationOther { get; set; } = String.Empty; + public string? ConsultationOtherDetails { get; set; } = String.Empty; + public string? PhysicalLeaseExist { get; set; } = String.Empty; + public string? DigitalLeaseExist { get; set; } = String.Empty; + public string? DocumentLocation { get; set; } = String.Empty; + public string? LISNumber { get; set; } = String.Empty; + public string? PSNumber { get; set; } = String.Empty; + public string? LeaseNotes { get; set; } = String.Empty; + public int SearchPropertiesIndex { get; set; } = 0; + public SearchProperty? SearchProperties { get; set; } = new SearchProperty(); + public int TenantsStartRow { get; set; } = 0; + public int TenantsQuantity { get; set; } = 0; + public int TenantsNumber { get; set; } = 0; + public int RepresentativeNumber { get; set; } = 0; + public int PropertyManagerNumber { get; set; } = 0; + public int UnknownNumber { get; set; } = 0; + public List? LeaseTenants { get; set; } = new List(); + public string? CommercialImprovementUnit { get; set; } = String.Empty; + public string? CommercialImprovementBuildingSize { get; set; } = String.Empty; + public string? CommercialImprovementDescription { get; set; } = String.Empty; + public string? ResidentialImprovementUnit { get; set; } = String.Empty; + public string? ResidentialImprovementBuildingSize { get; set; } = String.Empty; + public string? ResidentialImprovementDescription { get; set; } = String.Empty; + public string? OtherImprovementUnit { get; set; } = String.Empty; + public string? OtherImprovementBuildingSize { get; set; } = String.Empty; + public string? OtherImprovementDescription { get; set; } = String.Empty; + public string? AircraftInsuranceInPlace { get; set; } = String.Empty; + public string? AircraftLimit { get; set; } = String.Empty; + public string? AircraftPolicyExpiryDate { get; set; } = String.Empty; + public string? AircraftDescriptionCoverage { get; set; } = String.Empty; + public string? CGLInsuranceInPlace { get; set; } = String.Empty; + public string? CGLLimit { get; set; } = String.Empty; + public string? CGLPolicyExpiryDate { get; set; } = String.Empty; + public string? CGLDescriptionCoverage { get; set; } = String.Empty; + public string? MarineInsuranceInPlace { get; set; } = String.Empty; + public string? MarineLimit { get; set; } = String.Empty; + public string? MarinePolicyExpiryDate { get; set; } = String.Empty; + public string? MarineDescriptionCoverage { get; set; } = String.Empty; + public string? VehicleInsuranceInPlace { get; set; } = String.Empty; + public string? VehicleLimit { get; set; } = String.Empty; + public string? VehiclePolicyExpiryDate { get; set; } = String.Empty; + public string? VehicleDescriptionCoverage { get; set; } = String.Empty; + public string? OtherInsuranceType { get; set; } = String.Empty; + public string? OtherInsuranceInPlace { get; set; } = String.Empty; + public string? OtherLimit { get; set; } = String.Empty; + public string? OtherPolicyExpiryDate { get; set; } = String.Empty; + public string? OtherDescriptionCoverage { get; set; } = String.Empty; + public string? DepositNotes { get; set; } = String.Empty; + public int DepositsStartRow { get; set; } = 0; + public int DepositsCount { get; set; } = 0; + public List LeaseDeposits { get; set; } = new List(); + public int TermsStartRow { get; set; } = 0; + public int TermsCount { get; set; } = 0; + public List LeaseTerms { get; set; } = new List(); + public int PaymentsStartRow { get; set; } = 0; + public int PaymentsCount { get; set; } = 0; + public List TermPayments { get; set; } = new List(); + + } + + public class Tenant + { + public string ContactType { get; set; } = null!; + public string Summary { get; set;} = null!; + public string PrimaryContact { get; set; } = null!; + public string TenantType { get; set; } = null!; + } + + public class Deposit + { + public string? DepositType { get; set; } = String.Empty; + public string? DepositTypeOther { get; set; } = String.Empty; + public string? DepositDescription { get; set; } = String.Empty; + public string? DepositAmount { get; set; } = String.Empty; + public string? DepositPaidDate { get; set; } = String.Empty; + public string? DepositHolder{ get; set; } = String.Empty; + public string? ReturnTerminationDate { get; set; } = String.Empty; + public string? TerminationClaimDeposit { get; set; } = String.Empty; + public string? ReturnedAmount { get; set; } = String.Empty; + public string? ReturnInterestPaid { get; set; } = String.Empty; + public string? ReturnedDate { get; set; } = String.Empty; + public string? ReturnPayeeName { get; set; } = String.Empty; + } + + public class Term + { + public string TermStartDate { get; set; } = null!; + public string? TermEndDate { get; set; } = String.Empty; + public string? TermPaymentFrequency { get; set;} = String.Empty; + public string? TermAgreedPayment { get; set; } = String.Empty; + public string? TermPaymentsDue { get; set; } = String.Empty; + public bool PaymentGST { get; set; } = false; + public string? TermStatus { get; set; } = String.Empty; + } + + public class Payment + { + public string PaymentSentDate { get; set; } = null!; + public string? PaymentMethod { get; set; } = String.Empty; + public string? PaymentTotalReceived { get; set; } = String.Empty; + public string? PaymentExpectedPayment { get; set; } = String.Empty; + public string? PaymentGST { get; set; } = String.Empty; + public string? PaymentStatus { get; set; } = String.Empty; + public int ParentTerm { get; set; } = 0; + } + +} diff --git a/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx b/testing/PIMS.Tests.Automation/Data/PIMS_Testing_Data.xlsx index b0fefef6716209f0ab6e7d4725e8d3603dff6b25..d5fbf842af1d7314965923937c1b8bec5d7dc97a 100644 GIT binary patch delta 17719 zcmYhhV{m5A7cCsywrx&q+qP}2^bL2d-5DK4xmC3?Yn3E8*;z{CRi|Zal2e{x#Y@iX=7VX zHVb)#MaOW}$nt7?^T&TSfXdS2;JIeL-^**}!ez$s$ts&-0(KAFY)w!MGpr(k&J=k% z58^!Ctl&wl6p1t1ae#$IaYwSyzvKHUy;5T&e`pg@7glu>i955*b z!Gk-ZLT5OU|44EICLtypA&I)h1}CAwJiVwLG&-Bu{|grfB|p?mnnekAkE|bLiqSX= zGq#D1S3)=H%_Y-@SjGjZ{x>wbL#m>hl!(K73Uk~FbX&JrOT*Ev+io}<)|5D^ZEm@= z)tFZQuYC~Fi{^RCZ&DG7a@3$JD*)U~vguh)mty8%x7y}gf!d6InhR1`OnzEefHt}Y zFVr?<>6*`m?9;oo2&%JziblVef4EBKA5k?F-3TdB@JNVra@jRnF1i4Xt|KKG;0SLz>%q3Z%JHeE@tcr_((* z=0Os5={&f_`qp>lfbdE&skF)+nJI8+6SI-Ed@{6Q>z0gauvdtsjx0F`OiY;!G|WL| zCMuqS!HH3jT5Z+gGPgUzu_zI2TKs*L55*sWIP|uG?yv;be)Ly?CkG;G*iR5@5E9W& zm^@(w#T#bW_HcsU*s8pZ3qU-`v~zfk`IDTEiy!G+P$XANLNwkAdrvUy=ACeu4Dw9_ zqZpzptg>H&TXgF*0!vqtI3#Nic4s_AzJy5Qiyk-K$0i?n?QkHabA>ITB}V;9UX-5p@KWsrfrKQNthTSHbB3~E0ltM(`q~@*B?~*hgAi7nmkB-2gPI@>z?c5$~;J?A=vDeVLONHTm9qDos^5v zv>0l0#9AzIO{l2lF`&16`Z>bf9rEQ)qXlj)k&vaHbBfHu4uEs=At}y-C|^~zJ(9sH z64{ph-$*MOw;^eAg$#*iaE$OPe`BO(!zhlkw0F)k*H`bSBmKDUC`omGF~6-Jei1Sv zE=}*T-e3(T%dDtVI9A6O+{k9i;qS zYyWOUhHL?8^ux44h6eVu-*Ey50{TwAWh4g3#ji6Vh25mS6O!ym8B;QYCF-duu1oV( zsef_ejsn{xb2d*8RGb5D4hQT0>fcKD!42`U)}AzLyqx?-$P4|Y+zdWo6azBvtTy3p zP>?Us(g+R{V`evQy%Yt~4HbNS!|$(|o8r#`No)%gvW#|WXxAD;GKg4YM4_5%xhDlE zbsePhUHTYv)vj}XRZ)>3i?do}S}RJdTWn=gRg+@)6-9_Uzm8laHcj{FfY87iw|uMP z2*02(YCod30BlTYV`TtA1%uP`+2W9D-ihOy?=<1*xO_`;E3ccm_rj5iGv3Tn(LkI~ zTz}Gf|3DRw)tj(=-U}VPAQ^43hIk8zBDt}Fw!p+_A4u{TI0avJNY^JY(<oP3 zsJ7*ywANgH0pizBb^6t=a{kBQ4gP#2fUO9l%R{=4h&S5l3AE}LAdDnIIP?^tyzh2B zVFxK8a9V(d&a?cil-mQ-E}+TDZQIdo<2_0u{2_r8IFx8F_(cHJX{Gz1;w)CQD1 zvS=dwCK`AOw#W1$Y}l42Q7gEwU1)S}f$r<13*Z-LonPIcTh*#j$RXJmu!L(Jpn^eJ zk>BrRo#}Wz*OUE>M|MBHLOsdg%t6h1o5JCFd5*+Yy{;V3#5CBFQAYaF&+)rk>J8bv z+_7w{`37x_V$pTP$k$)%pN|B0*+}?~WR+H~d zcVb9yd3@+kHN1TGp8`K^2BkeK?r&Dj{JcxMmS0e(h zTV4SCFgvF@wQY!}wY*({kB&e02>QR`jeP8FdoFra@kOx3D5~!74-N2^r}5&wdl_Ln ztD{dQ@;aiWOya#D?^?s}Hw@cAtP$>7wjM_s));3eQqfa&?ZiYR#>!Qghl??zQdF zpSKl_P84-4i6eIR-aCh(_vf1-#M)Z#fNz>B8=iUnbb(L%_?A;TR}x>uH{bFL%1^+q zh9@n^WXlhb_OX~o&nk}(ul?u74G8g1+0AbNaBheRqlz5g_KWJzx+hQPY<~Qf!_x(0 zi!ZP1Tr+|(7X5z1cDI9_4p7;gUx6`PPkFo{2%x)S2p%%$$RRyoQqN=cl?C3lDg-PU za>MFOSvnNyF~uoU2pXlVc$PsSwu8xK{pa2ssBUsO~G16v%=yDlJY zUonsk+kuVgnjguM8VQ~3?@*57lpzRx=2ZTy=_^aqL3%LNv~qRQ8$*Dq0D`5}FH@qV zsS>zkTc$vFrg4yAJ#ApFFA!`fj>Vh=4?lQ*|iFldL|-7%M%Dct%bvB;pf} z#Cgh+p)@ii7lXQVTuOfORfU$iwh#+-vCd3vyEi70I6+z%wq83IB)gk|WMDn#xVqqu5F;?JuF4@i3VCxSzmPNc= z`a47b(~8~(2_Xkpgk_szo)5u(B#&m=Xc&BPCwrKe5}#TnSCmAK2Mu2962ZN1i&+l6@^I z&?9P7!9(q)(xtk*NBcKh_G98z?BB_=wl9`^l8BnvDpa_w*a#>Z1qd2N1(g*-^bQ7wtqIi(aQ5 zk-E*DN~;K z@A)mpL+q`ji01A7g!nO<@B<12^z#Gs-y=n9L!Oii=?gstQL|&i&VvO;@>d|ShvC>0 z{RGMMBpm6$%=Pz|x`##N#VZwxgQDBIyIQVEdhYk$$K>RP;Y&~Fb#M2#-<|u?I1gsH zL1#Vy^6f%qDHTw|{oAGf=i>JJ{owlPYV^9h|1&wg^DAB82fqvNnNeUk?aRpaq@%ZX z^!ABp+GC$H;_1arALDCsXXR`13mH{8X1W8%Wsr$478^-6&uWT(@DRskl&S8x7S806 z^M(5N7!a%JL5g>dQq-S&X_FCKyh`R|v;%Jd(nrda8j$%2Q$oI16f=S`z|h9sdpaHt zv|fN2?)F3{irOc@%lrUn6a!2JXfzEDluMTx?$B|XDPa(P5D3r$2fBGHTHX?1?D=~U zq+%~q6;`s@LYtmwB`;#h&58TBIw<;`Yz>6;ex!bNV3sF|rb!`H9u0;{ADIo3D4Puc zUS2}f20oz=bxAvzj;Ns-LaWc!rp{fqjXW)ss&&GNj6_ez_$tHwF6U0Ri<~0)PwS8= z%UfE8?C%|vR-ra6z%fg=KA^QU{#phWdo_(qUj7_uJe{%sp(%NcJu^y{CfH^9wlt- zd@`a}FIXaO#C-xCK#zvKx0Wlr&Qs)M4AK}N%{Qrg+0ic>4W2duf(IX~I=jTYi#r2j zCP&po746RhUGeL%qykoqqMz`rAS|BCm0`7*-nOsq*gkTY=WTy?f*O|BVd2(tay@+9 z^>1eVFN57p9EwjZ;0U~<02EeC)*${!J8G-!i=RC0ti0KQ{+=|n-|cYe6kxXY4XdFs zaqfQMcLQTMadJa|5_XetuA|_oHmz6P_}JW~U>HIND*XpMMo)dz?mqNoS%IULJ_PB1 zxQ=}RwkoEmL#Bo(>teiHIGL|K+p>jnx_ho$-rR_FlSV}DX~CaThguY$ZLMAc(Ytmy zGdQ6;lZ#a4qIx;=kZwVDbVk6k#$=W-ZUlWmO0%m*eA>+!`CcBt ztMEWi6Jg#W78)CON}Pv{$lpDCaE;u=pOh29pOrJ#fkLsk&v`VY?r8_FP2hP3txX_> z%Xn}3JB))RQA`AhDH;z;+q7>^7!dZI|4e97=`OncxyZWv<}Ny?#1q6wSHH4{yCdvH zTYh?9wE{pi_VCWwyvV$3!pbU!Fgzh>cHb->k>D(#tmayqQ^4nvHtLZcc~0oHu0;f%5;GRZpDd{1{VwvIz$}JaVEm z8W=m9>|Q*f>aORl-Xg7bgz7zRh{li7q<~2S|Yp-A2PCs&Vmj3bslw3zr0HcOurkn9EH($a0&rQk;Ljtt^ zD|>);U!=bf({>_VkR?Smoy0mFmMTUYo$!p2NB`KxsV)6%JGH47Rh&xqVFmSOMp7o1 z72D3`*^sJcAM`yi@6)T4T5@oGKR08=Ften!klU$Fx_pkn`)B!ovvE;%v$LOI1kPpQ ztt`7^6NfG7Dj)obYjrGD)>ei!06c|d$h&AiXPb%$?t}yANKdkw(-JYBoBVkS+5y5ZKL|_ctqR*U6E;;b#rhv$=x`ndUI`hId zEI}oomE`B&1QAYkvO6ENsasz#bP3`Rf(_!%Y#I{57|mjKSvh~=3E3Q5#CNbK99s7n z7^K?eJ~S}SZk1` zV1Jh^X^^UM2VykI6D9Ego1MoFu-YyULfUI1rw1J5Y#U3yp8z%ASqDz|jUjJ13EY(4 z4qUZ7SM{tB4#ZY^X4u6Clm1hasK4m%&V|w1bGenBQ?1XWVZBWCP(s6ZHAIPg#x+xI^~V@K09jSTSb0B&rb3{r4g~Sxur^G z$rQW|tT}j-X_HuoiSVd7VaZO&00C;Y^E7N)gF$UT+9hVQq=#q&DGAzh#Ofk)zw&Z4 zjAdp$f(T9C%QCP0vgMn?zXizI+$5S4kPw#R>kVQ89q{yUQcj{F1KE-zJ-_S!@Q?}S z&WGpb5({-K=-fv@hiafwx8SGC)B>N!@GRTIH!RX*W5hu#Z|lyxhyMU4UrO4*wC2Nn zDgNtV-oPgtN#OvP7(DH4b5isi)|t@4ZYZw=GLgezp%11WWZ}R7r9`o$?+C@>jGr^G##(+J6bNb5ZCAAUkBxh&4{%%@SUW!;zX; zsr=Pu=N)C--2M1hTVP0(zL<};iwRoF#(6Baxa@G)j*KB)3;tMIW-X=N#ON*g@qQbR3h;zY24i$aMs5 zMd>ePAcrLz-WFPvvh1x-KSYfu=A;HGLuhd(Tz`5i$-oyT$|t-9pJ%gnTJzsB71lx@ zdw#N+$esc001W#84b@j>DYEvu0b06uBD(IrP4}}mp%kuf-0+KV+gv)zvm~_SHmD-0 zw3@VJHBB<76f#7ytj|G@Xyv{TJq^hRno${+pDe>4`}wz%^j(Pu3JLXQ15Y!Jt{N9z zq?jB54(Y3{3CeO@pue|StSA4REAPX@xrF7?=NTYM5C;8ICbIQS(SD2TJzJc-_O!5N zXX!36`f6t2F0vbp+f6+)oe`V^ju)o1yIf^P6&~qTT)Ax!f}psJfk4d4g9`zb5%w<< z7OwrJHYb_*rD0W4@2pG&s;5xEJpypOL_mmD289U`Qw{=%Q$R^Eu@hq8s>uFSbaF(@ zDFopCIz+I`oi!=(87=~p^lpF+x6E{1g-E}ZEW@mkGi#e4-_yruU@b#$ z+#6;n5G1){o(OFF#3EV9c`E^1>Oe`H6tl6TcuB{J+uvk-S2GdeN#<9SjI0c-_3=uY-OX}lKVJ2 zx=1(If4_pEGMd}OMMGOjv4wqmokTAWX7T)yz-bTcnGfdjzP~CT`-~ny-N?+;Qy^<= zjAe#`I!K+Ig*Dg3&dgBV$jY3=;)8miM8V3;Z|02JSTNN;B$yu$Vb1(Kr@oB!xfdYt zJGS7oAH*5@e#Ltcl_?=Zyl^^lVQnIj>AYzPQ@bb{X3we3MW({p@*SZ89HFLnDf~cI zK}75=UpWI-H`HqMCnO1A)dXANaPi27#>WiLcfQwQZ;6(kAU^txRKHJNA4M?a4T9H6 zp>(PDH{PJ(&3TGc`A|j~t@;VR^mN_=^Fk?qFgU46;h4{v+{A_O{CD+8|9Fy=<|Tb~ z%q)`W$L{0Tf%%AGAPe8TAIym#0U7@7uQ~4$ZHbphk^0fzLIa@xr37eF?&Y_CO1laB zFC`EGQe^(gEL!Nxf8E6!DdUq^C{k5H*3OEomj9Cq7Jo6Secg03gNYl9h?C$^2Hxad z_#}-_O8wdn{3o+IB$wf12lOhbmMi4%Z#{TNW2|W{=>KF^#`PGYTejCf6EAf;3;tvo zRM-YrzC$!(w;+L`t$(PtUCElGou^CA`f>olVmuo_alxwecTQqVS@Q;22%x2qC zgW-M1PiC7>;nK=X)iD*-h=;rTZ}nd!R3H=fC8OW@1G}7apF|zN+e(KnX#huOlSCf6 zcQU%}{*J4^2i@h;kF9-PEfMB#4;^sbyYz zMc4$r6jT}Vy8iyq{%nNH`k14s${W`sxGB(qhMt33m~inyc&{AWY~>DL(cKb?j0^-*@6 z#So3k%OMam;~*!AGzg&v9*M&3M8ik%vUT`JentT&2nVQ)NRa@2WX}6yHWDrZ!9XKU z7)u3Wf0SgB>Bf`pAq^PI9fZ5VuCW74An-G&ds|64_;?AZqs zp@kX@-vXhci{i3p8gHyP&XfSOG2OPFpF1s!H+77a0m#?wkZ+s`vFSD0uB_~0za9m) z6B+}&4geZ1xJIs$hB=K9URN)iPb($@y4hA~pAbb>i1~mH+>L7pmrwensxfVoJA2+^ zeySKIA4U*l^Y8Al&*wtwe0CP-y5G)L5%KO;B$q0kY#=sq46#F5$ug)W(`%(ll_QW7 zwC700+ZHhUslR18Ml(IFs+=jzmxYIb*Yw2BqX0;MTYTuo^3ENf;mJ?HaI9rif^7cy z(*YA@T*{lhkq9R6@RkZ+4keG&yk@6IGmL>myY1}Kpm+$S-Br!=XRHEzXOxLz zk&9-P>2jVaw%ea0c~@16-sS*!O<={>LEyzDe~$KS`$r^$=^1_Fp(hZ)f%dH{W#nwO zhxJ565Yczw^Z3TVYtRdLYlDa1eyLc)Y_)T%*jU!{#uE3!#0ABs&ck4tCQ@ z)OUz3)OpG!2w-n~e(qlu2*mvB*V0mRe8qBPPyhv)(--?O;ej+*ur9a!M_#9|QQ;3} zqA%Kq1J7MXyO3T0ZJ9CqTJy0Ufj+hY2SiW$s!X4Deryr5R>2+drx;K!L@i zo~}Am}q}bC%vd1&gK46{^S=xe`eRGp2Ly>?p7RFj83K+ zif1h#Oata-LP0Ehb4hs>2FCvc)5rMjl)$e9t7>Nh++8gVNI25MH7bUjz9G_e!#x&oLMeuG) z;kzHWlCx%l-Sj$Lkf^9O`uebhjE}dKc-mgXFUf}cos>H0!S9Y)>;|kx!@omI*c|oG zpYAUDx0+Moj|{`_7Pzw20J*XqjolwwI}*;(h0gRsf_K1ExZvdto94%Rhw&mtXz~U&Wrp6mnzfY{+EWgfS`w$N-SpXXe%Se%7PyP`;xjU?&p2be3Qnuqn3D)vO&hYG< z1pxoA-rY2&l3o1A=X;d@@tO5MK9{8aUt=!%&zR>TqKImzvNUbWE%4XGn)F$tux_AL zSpE2oO2J8{Qfx}4xUBcN_|AO1yZQsHvv)&j=}k3=@kXe2@spcRThQOX?bxXm3*fJ; z*T>>CPE&1M0WWuhpHxeY+fMc%|41#&WAfZc_1AV3pi?2zeuB@tCb^^x+FM~)@)EVs z@uR#UN*4D}URopqYV_OQXlz=XsVC)f?tTUiX&Bdf_tTs5d3|2n9k!u=g(?-@6n2QKR22 zn47Vn<+h`FF0vvN<7XmAEP3hfnE@$#^VsPWplb#nu;lX^4P)I?7(U{gIy$Rs>jA+a zi(@{Q%|2S?ujf47m#WAs%Q9)!01VXySzWgRt1G79#~ZbNNh2D?q+o~yMrBhoEv-of zvnqtU_Kn9MBC!YrY~&3!gdDWDj$xKav9Lj1AgK_@sT@_;=Y@0fO!Y&B*m%(kHJ=&| zz%D77f{njdEG`ptO(BzQ9I`-q8w>EvJWe^(+8Kyl$caPJbh#$_PD&vKD+&$(^$i`a z^MUjc+~@StL`d3PMdbH^LxIeEkHg?eUK>(k0i+vQux9IC?o&5)*A5yo{3c!XV487$ zop7mV9P&c=HLoT>#`skgoqJ__FYo{k*g%-vmA2dYJ?2%c8!7iWOd)TZt;>-7!bc=; zpBU2T4F6kj)m~BiXp&`H zK$2?U@2jf|G4#$~3D!SItV|d6e2VZlegeO)R+pE)o|`)fQ6$|50TMp=x7H4~?+Ih3 zD}D$ESI#|Kj8~jWJwnY}-&bX4;WfSc-IrqLB{keHQ5r9CXIx+qT_5E_ku-jbYU^K4 zmr11eLC$eDIZ4i0=<Xq5)C+vo)@ zx%F8%?JQ2W0m8roO(L(xAHfEFl|>DyN7WdDBv6gDP0gtHNMdhp zam4XJ0+)@ja+Gg2(OG(xI?dTH(S{Y)s+Y7P-z4Y`w=CXcHc5mE3-7doftNg0gP~L6 zwF~N&yR-sh6NyPIJ~GHBr&eeh-=`A(F=H_NjT@Q%lk`4k05U98r!0M=Y-N|}mF3uA z!PoV|LqpCFTP?KIY^1Ohttz0Ph;{|35n42t~GAuMA#4%DP7y@8qCLAwxG~&cl z!X~dCk^R1E;L1N9kFft4jbz9oq+|;zv_@<-3se{xFOYLTY#^X{i{vOvT!5aA%f4iT zzX0-yfaChCZaO@+X|WYCb5h;L*Tu_ZMG}yiG!x%P z9WpE8?*@j6iHXm9c2=@6#FpLn;dk&n&3NVgaJVqK`tiv8=6e0c zzr3JBN5T;&p})J#?=Q*k_bE8-L*~cmMQdH;R9v*&X?iB^eJ-5j1c2gy{c_wpw!qre z`Sku?kztHV*0C5KlZgBLfETC!5Vua}SNvfB;IpIG>a>dQMPp8_ku0>pGU|UIm~6zh zYQEMyx_QhuqI&M+fPti1jC(?38^_>CTqoml#ov1#K;5H}JDBB2S&?0v+OdTHJvL@A zLj%vLVAr<3MgQBQ2v|7eOYRwqCd>`E(}2~@Yio^69=qeC+}Q;S{Mh!`%17mp-=3XZ z|B|CadSnvxpG%zduUNuOHLqM!U;P&R#9MjUN{7GjB=n4wfpe@AM(6*tJrT>>GdC;W zHKZipX6t)hZ*n9OL$GB!?zyh9;t)-xswiW9ydV95c5@!P3_z?1to`H8gRcaa2{T`o z@%3J_b^TdTP*3yPJMjz7Rtbc2wj$DBXWjt`eS^<=z=+q}@E3|oGbK%MufyiK!e zR}JKN?Kmd%dY$zp~}&QRc9Z@o2AuAj6!b}KD-VKiRN`Vcj+#4o%Pk& zUnsd19IuJ;!WlwTBC8!s>mH~Y@WG)k`}Du!;&+0EGAXSQKB%mwwka+M+ItBgH5j#M=ou!MDbnNED5e1$6aD7j3*r9X<^Xh+Hk#th3%|T@eIWEIxUC$57O6sU-J<_xL@EeeN5hv7zFVPJ=?pS1G@hioCCanVA`yT>G*~ z)foFLVP-)_rtD<{Z+_G^+SBJ3#p?c%r=@n#x<`n5K(Xw z`n1U@JgX7gI1>38A7XyTzLySA`<}q8uzmr+M1bgkeArI=^59F^8+*Q<1FGSm?+@=I zMEHi@g@MGHC7z|M_p0C7K%8T0C*PAKz0582KM$pdD*e?1N9Ce}*Ox>*HCq%2E+
    k#at(&g$yQ|wx5}O@YVallC3I_KcJ^lTAW{F$0ZRd$Jb7*b$dO}#^yU|snw7Fb> zr~tpU4HKt~)%QpftD&tcD)fn^FNG0dk4gon*zAt6T;T0$Y}e z6F=TBkB8HGOSaA-EpN}$u>qkoFzq9K$9c`(Vrgx*2@J z-xVX`?V6Ot{>MbNxj+LPGY^gO1CF5(=4delP6c%go1O$-HqcqX3Amgmc6)fkyjUMy zeL8mPI((g=KV3QukgPPsNdRm;l& zhL3$o;|TKBBKeExQb#UKG9B&J>Cz0~Q_v57=26EW{&VzD{a z7q6(;?5c8uoH=H6xC_V6QiVuUIpwcBOC z3=0N-uL|B4Q>YF>0gfhoZPyi=4H6pozGdGEA~^eNr>Uhvt{$Bkb%2A+2I%?iCd0mH z%q(vKqZ>c4r>|IIr6IDgEF0xYd2DloshkK78Pu7-vijZF#=~hnQ`S$P1h7b&OjA$4 zJlF*&^%v;nnq*4p>eZ`wpPghPRwYNyT9t2H3(=vtOpRM%)47svT`<>{Yi@L#V^CPA zs=SZ~c3GiyhNoRd0Wg`79X?2;@4j;X z{ZbdGvO#UVG(b(pD1-o`=>D7P+^E>`%tLKWYKJQq8=3V2MM-Op5jQe$Z<|jn?v>_o z)>r?FHDBsyYIJ#^YWwM3fJsu27#Hjg^IWfYRA-O~!S8hoZ5puBd$j{Y2Jxc&fp3!= zhPzwi4@F*j=u%F-37`^$Vik%5ijeu;2~R3L0S-P*ZQ^!_7VQ@jTnC?)R6}&2t_0uQ zVvKl+7w!_zUoDA(2(SL(fe70U-zI9B`;b%P+X;zUxW(PUgs?%B{4lVNuV?zxI=2Z01yhIW|vd?u0F&zQU=}? zZ<#%uCvH5RV=Vc=;tWeHir9|22X_>7W0)p`B%1EP{d4QvYWo59eAQGRzhT7_7s{#V z-b!8|_}eZ0;7LGyTQN1LzZzcjF2yAEpI zz-M++be@A&`G`zr9}(ad8lW!J04pYCXse@)+vl?9l?%soA-VD^F6g4VPU5j zmn?_$7_bC)04bf{IaK{=EF1k<`DoWlEX|KKAsbwrEK|ydd!3;4v>Jc6o>^Q0cVv{c zN0|=+%c!Jf3(~zdwyvOT=@o_4jqg*%VuY(Jg_zw@k|WuHU|BsSQWRz^qrNKekWtl0 zW;Pm~rqpH|yS8Rr(7l_^GQiOpk zCL+`dncmSFNl|Pd+Z&T8&(({=bViUrLSrqqj26tbb$rrKT}2fxs@>2+IU_W7Q%TdC z*Awm*Q_@ZuIq6F#8;BHC0+II>CZay9Q7}1@L_P_|wf+JLM)#1ez@Lq3`D9MJweq7^ z6F>Zff$c^iq|bNz+=Y+>!nq4LCVj1>1$_6jpXNS*vy(Wa(xPDqYu6|VWD|a-olG<&*9M#IByh=UjIKbCzec>) zV2pSi+%>-&STujbhVYf|GG4z(?9r|?Q#q5P>sN`u7nOk&(I14BBNgr&azkk21FrEw ze=YBGOd*k(8k2*XZYi1vyT@%GQ3SLsuDw?S#LKjoom@MF5N%D2jec7-PcQH^ycdSrV zjH3ayg+6-=d}_jB@fT9ddFY-K0nEOGkrgTz3)Zyt(m=#^`d8X3S=%cV@|qVjA&^i6 zGgG}1Ih39m*ot~|NQF=#mYEID0|i^j+kHZQLARCmLY)X&3$YZ^SS=pIQd8h7VzlR< zS42iDP$-mB(ZB;gwbqqC@+OU?t|D&fip=X)hiV(UlgQrua%G;<60z)21H?8qidSzP zyTN(y3(KrZtXW+Wm(fdGS9r^rnfQ|i=&vd$DoI|l(1r)SGA&c^?zj^ALX+XQ!^@~A zP%mbi5ru})WpV)%%@Hfnh|t2y6Y@!F-M*g+O$2R7AP#^o?)0Ok8LZE53I;uA04cAz zG|X-}#}SOtqg!Gx5pPfPuMY#3gUSN-6o}WJ+p^PiqrTARRPqaec+m00GwMu$ObL2NjtI zVl(ORA_gB)=+1d^zyGefgp@$P2SqM7{{=rk|Le!A_Vi0x=*hbK^3*B^hOfc>q@)9V z0tl(HpNOprla>h@+0`S^AOYD!5{NV%oyuY(2b*D2$*AuZ%yd zC{GNspAiI+8r%Ci3IN;m9>|bSsbr6={MY~oBjF))LI&=dKh3d4SdsC8@|pM!b(rCq ztnU_&)}y5P0t)6qDdtqO04hAhuOYUOSOh^Z3Km0|CQA@a9$7-(k<4aEx_DZ32?Jny zYtq+EA5yajNe)hH-KNs&)`zh>!dXOTn)VwHu%FC9lB5v>#{21%(jjFi9)^}?z2B&)Z_(K4%aNvkz?%X$S zt&*z{hN%I{-hQE1e$hEUeEV!&A>Ih9fA270>ssf;2Wcd?v_PPmm=2z~gSe-<2r8VF zA}J4=l1hRzl4 ztbAG9`usITE_=WAq?B7i>5UayzEwX|1wK3+rmWdA(OM@+Ga~&Nh%O&gcn_@w7)C*U zbZ%QnxScA>gwNjC@P$)-4!b_87O2BGG%-pIgEl9i88 zO+t;WsUDkU(WCU2`>p&+R=?{0QQKy7KRY9BeccyTSO#A3Zk30L_$mqhhj6cy@MJ0< zUt*azuF4Hh>w~jl#>sT+V9a`n^eiqW&9U~ZO*3ZLvSbK2*6nLDn^4^Qiav*Fsww48rq3*!0DOY30o z4&qQy^{4%LRSJEciTdlYKO1h;peg-ShXws`F`)j*+%MxJy_v};tGUirXnA13S_?M1 zs*L_KZKOvs8z&DG#4lhh;sKb1bP6&ehKi7gCCK+*;O<{w=wASekf;GfSFoA1=bYz= zT}12UujmHDX3w+sEuYv{8GMmqfPHRLnMv-`(lLT_Un@yn8sx1Vrjc(_wcV?tPE#d=+h6cl~nUpuFdc5=Z8zG z3&{suEf#XOlZQ)I1)GeUyC6*Gq!fVSf=IKHa!a&-xW({++M=RzFRQ0F3;DHjKeDmC z$~-Xan2{z7N|mYVs(+R<$b zz=PS4q#cZ82oP5zF)5bo6m?Gz1x$DCWmn+WBPH!EeMQ*2_n0Cxfqn<7b0;Yj{^$Xr0ANVtLQuHlG z*)OVZ#PbYoix0Yyf20#*n&seu6_i@mcALl76{#l6gd=}sJ?PYb<4px4!X!_$v%C9- z>(v%nNjr9X2)rbUE^DO~I~DS9DbA88w}&1ZFex&x6Uey%{_PiR1_LMx(7wv8%9Mze$BY1bBV8;>Ji|IPk@#55frLSJhUk!diMs2U$z z2i}_(-S>8#EL^fIB3*XgJ68_Y+<6o^f>`Kn(d!Dg&TiZi31-#HkSkE(6=*5%=jAwYo^IDfoU~er*bQ7ocaZa*2XB(;@0AX0g@-X*-o3P zsDoqak?X`@_#5!0Wgb1%R{>AIx^VSugM^BAad#zcPXQ`I)hUZ?4Zu46< z>({J^urKc(up;YPS~|S;pK<|CfwkLrL)i<(r4`W{&^|cj{df|IFct!+Z0S*Lq?B@QrQpHbI*=2wKf z8!Wv}LIVi&}yq#9JmN3V@cE<3|vkVPtNSr zM{COC8l9$&OF2kso}b2p&@ok=_sq^gxe@;+f&koAwY6UgWLY?ATlI6KqYuRMOoCuX zW5)?m_8PH(zPfFiG+)}TKO8mSI@_eW@M&lFnPD7m^U9o>(e%HU!4VbvRlh@aVRH6z z2daG?RIhDGI43>5lu5UII}OF|&xJ`J4@~>eee?H^?{rNRlODDy<#7^EJE_5_@c0~EvnsRc_B$I#WTjUd$sT4xm@8k!ny{D zeuEiwXnTc*I&$!n7YIgm2Cf}8d+EuYiQD92R~zj#Ng%EQ6oEaNaw=+x?}&)^yG5H2 zlC#v|f%&tjrZy3GT-R)^^TN>U1Om-N1c2Ec$lW>})2ddf{|FP7Q46;oWhHBI(zc41 z$9BHn^C>#FOUoL4VN3!@FS#p3%EDIq=Xc3Wt|RI|^obyRm(Xl#nj%qJrFcXs1YTAW z_OwDPs+8GtF;PsOz9!ew(w{Rclud~T!v`z($;3oKT+zItqp>>=Au525dL>vq^# zHb8Q=Yquw->BPk1ppv@VHVXb(*uA-~cj%$sn(j?)NO;poEJq%PlfDl>^u8L&UZm}5 zh==~Ql@W<0tWf236zRC?TeD}P3b49$v^E`JWX{rVOlF!*NaNXEuxw47jqShWxFoCr zS~T0)TH!w(#hzs$L9+Cima0T`{D%B}m=T~;1=|U(p*rG*m71BoMs>XY5Gbde$x;bU zVF!fluhL9WF?D5TfaZO_F%fo|q>pM&0k};yzAqmyy>q#V?yrt>=8|2FqYXCJrdg>8mIb4x4S@=}u?8>*mV8=*l4cl@hGG$bd+N(d2JF>s3}8*vHoF<+=R{nkN6bw`&AOaC284$q&%-J{>vk44PuPZOF`0pz7 z-$42|JZ%|GjBHIrERC$}|GSpgo#}@eV1f(S>)ho@+0;AvEn>QbFp(!nSm5eJ-*jdf zeY&BeislaU1|nef5#D$iM~tHY(jo>8C-pWzN4D#Y{R`5NSqi80DFh@BtMF#IQeCQ2 zUK_`_T~H}N-ilw;nIKi1(qzw~#JBxz*L1=r!!rkTg4ufLkgj&3VUGc_zy=)_Bn&2F zT!5|5mY}cKe(TckT=3*}knwP^?b+o#(n85t5C9K;B6U%9a`nF1J~Co{-|6?y~y zBQoA>mzCy+wT__bekAz+EyDGqp33`eo78kY)3(>=|JoQ8xX0&Q<@`CHC#955Tl$^z zmdI2uK~AS9jgO{kT(NUq|MOP7()oyGEZW+vn!6etSHJnD_R#d{)HdH<-XUw_;*g%#TzER7mmd8 zOrQVY``ORiR=*Nobyt*qifU8vy2hJc>9>U|EVWIn=Ly;D%rB2HN;c2CyPN6AVO8mz za-Vs#JwN2%P24SJE8X(E=;FSkp_Se8^FNuMS~TIzpMrPoo9F0gMqbePlQI9l;r(ZC z^q&Ykicb=;p5rfOxpVnu)n0MoN1_u-cLGOT-f)AG)@GGyDa@Ov&yHl0fgcLN&A`A9 zOfCo@!9F=;p5o*WbETM8a8Kr$r!#r?JSiqmzR8WQqLUYhvrbN(Cop-oyZ{eEOS%|X z(rCUulZ+IYSutN!2EP4Un1Mk8p%}>8A`e!?vOu3HS{2NkZ^}B^e}RAuVmmIno`afT zg%cKt${==GpetH!GWp;FEg8gmaRvt9ye|@{v;dkS4f28vVg)I>A_iNaBC*LS3q@rR z3)avT890I!tp+MWtb##Tw9*x<=+i=drY&AzrsX1irpf>?vjNCF5PecYWXU)JMg5&`P2K%_leHmilSm>QE#q_QmXqf2aee*>pmjdJIZQbOF z^Ry-hFP35w?U*dMM0#@9ViTsaPB8N}ka?*K$nB=0^nkhYOHG(= z_kx)PK<2$Z5R=K!Xma6FNoWDvzf_dzaX(ne!KKo`!b*zi`2;Zc9MCL>6;e#ECQjbC zLIqe{=`;PD3}znaVx3&JOpA$Q8kl>&hjsF4AXj__m@BNm|3t~bh5#6DJIi7 zV6MzE2-jsEh|6d(xp29N40=I_2%O*rlNT;mk^vVWj0_AJObiTy2w5OYd*S5!%Wavq dES@a4!iMSDGN7r3d|C`z4AQ{F{B;FLEdWb;mc;-7 delta 15358 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