diff --git a/Test/UITest/Configuration/AppSettings.cs b/Test/UITest/Configuration/AppSettings.cs index f3d506e9..fd0904e6 100644 --- a/Test/UITest/Configuration/AppSettings.cs +++ b/Test/UITest/Configuration/AppSettings.cs @@ -10,6 +10,7 @@ public class AppSettings private IConfigurationSection _UsersSection; private IConfigurationSection _ServersSection; private IConfiguration _ConnectionStringSection; + private IConfiguration _ListingFilesSection; public AppSettings() { @@ -18,6 +19,7 @@ public AppSettings() _UsersSection = _Configuration.GetSection("Users"); _ServersSection = _Configuration.GetSection("Servers"); _ConnectionStringSection = _Configuration.GetSection("ConnectionStrings"); + _ListingFilesSection = _Configuration.GetSection("ListingFiles"); } public string GetUser(string Key) @@ -33,6 +35,11 @@ public string GetConnectionString(string key) { return (_ConnectionStringSection[key]); } + + public string GetListingFile(string key) + { + return (_ListingFilesSection[key]); + } } } diff --git a/Test/UITest/DataBase/Entities/DssDbContext.cs b/Test/UITest/DataBase/Entities/DssDbContext.cs index 6c7feadc..254734a1 100644 --- a/Test/UITest/DataBase/Entities/DssDbContext.cs +++ b/Test/UITest/DataBase/Entities/DssDbContext.cs @@ -51,10 +51,6 @@ public DssDbContext(DbContextOptions options) public virtual DbSet DssUserRoles { get; set; } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) -#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263. - => optionsBuilder.UseNpgsql("Host=localhost;Database=strdssdev;Username=strdssdev;Password=test@123"); - protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasPostgresExtension("postgis"); diff --git a/Test/UITest/DataBase/Entities/DssDbContextPartial.cs b/Test/UITest/DataBase/Entities/DssDbContextPartial.cs new file mode 100644 index 00000000..afd1ec6a --- /dev/null +++ b/Test/UITest/DataBase/Entities/DssDbContextPartial.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataBase.Entities +{ + public partial class DssDbContext : DbContext + { + private string _ConnectionString = string.Empty; + + public DssDbContext(DbContextOptions options, string ConnectionString) : base(options) + { + _ConnectionString = ConnectionString; + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + => optionsBuilder.UseNpgsql(_ConnectionString); + + } +} diff --git a/Test/UITest/DataBase/Repositories/GenericRespository.cs b/Test/UITest/DataBase/Repositories/GenericRespository.cs index ea4e786d..93f0d0f2 100644 --- a/Test/UITest/DataBase/Repositories/GenericRespository.cs +++ b/Test/UITest/DataBase/Repositories/GenericRespository.cs @@ -95,14 +95,8 @@ public virtual TEntity GetByID(object id) return (result); } - ///TODO: Implement GetByName() - //public virtual TEntity GetByName(TEntity entity, string Name) - //{ - //} - public virtual TEntity Insert(TEntity entity) { - var foo = _DbSet.Add(entity); return (_DbSet.Add(entity).Entity); } @@ -114,8 +108,9 @@ public virtual void Delete(object id) public virtual void Delete(TEntity entityToDelete) { - if (_Context.Entry(entityToDelete).State == EntityState.Detached) - _DbSet.Attach(entityToDelete); + //Don't change state, just load entity + //if (_Context.Entry(entityToDelete).State == EntityState.Detached) + // _DbSet.Attach(entityToDelete); _DbSet.Remove(entityToDelete); } diff --git a/Test/UITest/DataBase/UnitOfWork/IUnitOfWork.cs b/Test/UITest/DataBase/UnitOfWork/IUnitOfWork.cs index 60442602..50764ce9 100644 --- a/Test/UITest/DataBase/UnitOfWork/IUnitOfWork.cs +++ b/Test/UITest/DataBase/UnitOfWork/IUnitOfWork.cs @@ -21,6 +21,8 @@ public interface IUnitOfWork GenericRepository DssUserIdentityViewRepository { get; } GenericRepository DssUserPrivilegeRepository { get; } GenericRepository DssUserRoleRepository { get; } + GenericRepository DssUploadDeliveryRepository { get; } + GenericRepository DssUploadLineRepository { get; } void Dispose(); void Save(); diff --git a/Test/UITest/DataBase/UnitOfWork/UnitOfWork.cs b/Test/UITest/DataBase/UnitOfWork/UnitOfWork.cs index 2aadf48e..de11df9d 100644 --- a/Test/UITest/DataBase/UnitOfWork/UnitOfWork.cs +++ b/Test/UITest/DataBase/UnitOfWork/UnitOfWork.cs @@ -14,18 +14,7 @@ public class UnitOfWork : IDisposable, IUnitOfWork DbContext _context; bool _disposed; - //public GenericRepository DssAccessRequestStatus { get; } - //public GenericRepository DssDbContext { get; } - //public GenericRepository DssEmailMessage { get; } - //public GenericRepository DssEmailMessageType { get; } - //public GenericRepository DssMessageReason { get; } - //public GenericRepository DssOrganization { get; } - //public GenericRepository DssOrganizationContactPerson { get; } - //public GenericRepository DssOrganizationType { get; } - //public GenericRepository DssUserIdentity { get; } - //public GenericRepository DssUserIdentityView { get; } - //public GenericRepository DssUserPrivilege { get; } - //GenericRepository DssUserRole { get; } + private readonly GenericRepository _DssAccessRequestStatusRepository; private readonly GenericRepository _DssEmailMessageRepository; @@ -37,7 +26,8 @@ public class UnitOfWork : IDisposable, IUnitOfWork private readonly GenericRepository _DssUserIdentityRepository; private readonly GenericRepository _DssUserIdentityViewRepository; private readonly GenericRepository _DssUserPrivilegeRepository; - //private readonly GenericRepository _DssMessageReasonRepository; + private readonly GenericRepository _DssUploadDeliveryRepository; + private readonly GenericRepository _DssUploadLineRepository; private readonly GenericRepository _DssUserRoleRepository; @@ -88,6 +78,17 @@ public GenericRepository DssUserIdentityViewRepository { get => _DssUserIdentityViewRepository ?? new GenericRepository(_context); } + + public GenericRepository DssUploadDeliveryRepository + { + get => _DssUploadDeliveryRepository ?? new GenericRepository(_context); + } + + public GenericRepository DssUploadLineRepository + { + get => _DssUploadLineRepository ?? new GenericRepository(_context); + } + public GenericRepository DssUserRoleRepository { get => _DssUserRoleRepository ?? new GenericRepository(_context); diff --git a/Test/UITest/DataBase/UnitOfWork/UserIdentityUnitOfWork.cs b/Test/UITest/DataBase/UnitOfWork/UserIdentityUnitOfWork.cs deleted file mode 100644 index a62553de..00000000 --- a/Test/UITest/DataBase/UnitOfWork/UserIdentityUnitOfWork.cs +++ /dev/null @@ -1,119 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using DataBase.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using DataBase.Entities; - -namespace DataBase.UnitOfWork -{ - public class UserIdentityUnitOfWork : IDisposable, IUnitOfWork - { - DbContext _context; - bool _disposed; - - private readonly GenericRepository _DssAccessRequestStatusRepository; - private readonly GenericRepository _DssEmailMessageRepository; - private readonly GenericRepository _DssEmailMessageTypeRepository; - private readonly GenericRepository _DssMessageReasonRepository; - private readonly GenericRepository _DssOrganizationRepository; - private readonly GenericRepository _DssOrganizationContactPersonRepository; - private readonly GenericRepository _DssOrganizationTypeRepository; - private readonly GenericRepository _DssUserIdentityRepository; - private readonly GenericRepository _DssUserIdentityViewRepository; - private readonly GenericRepository _DssUserPrivilegeRepository; - private readonly GenericRepository _DssUserRoleRepository; - - - public GenericRepository DssAccessRequestStatusRepository - { - get => _DssAccessRequestStatusRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssEmailMessageRepository - { - get => _DssEmailMessageRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssEmailMessageTypeRepository - { - get => _DssEmailMessageTypeRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssMessageReasonRepository - { - get => _DssMessageReasonRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssOrganizationRepository - { - get => _DssOrganizationRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssOrganizationContactPersonRepository - { - get => _DssOrganizationContactPersonRepository ?? new GenericRepository(_context); - } - public GenericRepository DssOrganizationTypeRepository - { - get => _DssOrganizationTypeRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssUserIdentityRepository - { - get => _DssUserIdentityRepository ?? new GenericRepository(_context); - } - - public GenericRepository DssUserPrivilegeRepository - { - get => _DssUserPrivilegeRepository ?? new GenericRepository(_context); - } - public GenericRepository DssUserIdentityViewRepository - { - get => _DssUserIdentityViewRepository ?? new GenericRepository(_context); - } - public GenericRepository DssUserRoleRepository - { - get => _DssUserRoleRepository ?? new GenericRepository(_context); - } - - - public UserIdentityUnitOfWork(DbContext context) - { - if (context != null) - { - _context = context; - } - } - - public DssUserIdentity? GetIdentity(string email) - { - if (null == email) - { - throw new ArgumentNullException("email"); - } - var identity = _DssUserIdentityRepository._DbSet.Where(p => p.EmailAddressDsc == email).FirstOrDefault(); - - return (identity); - } - public void Save() - { - _context.SaveChanges(); - } - - protected virtual void Dispose(bool disposing) - { - if (!_disposed && disposing) _context.Dispose(); - - _disposed = true; - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - } -} diff --git a/Test/UITest/MOHShortTermRentalTest.sln b/Test/UITest/MOHShortTermRentalTest.sln index 93463959..a3e600ed 100644 --- a/Test/UITest/MOHShortTermRentalTest.sln +++ b/Test/UITest/MOHShortTermRentalTest.sln @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConfigurationUnitTests", "C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataBase", "DataBase\DataBase.csproj", "{47E59E4B-9824-4E49-B1A6-C956402679A8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsAutomation", "WinFormsLibrary1\WindowsAutomation.csproj", "{213BAB38-0602-4072-BA0A-8F3F3B85CF08}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,6 +41,10 @@ Global {47E59E4B-9824-4E49-B1A6-C956402679A8}.Debug|Any CPU.Build.0 = Debug|Any CPU {47E59E4B-9824-4E49-B1A6-C956402679A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {47E59E4B-9824-4E49-B1A6-C956402679A8}.Release|Any CPU.Build.0 = Release|Any CPU + {213BAB38-0602-4072-BA0A-8F3F3B85CF08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {213BAB38-0602-4072-BA0A-8F3F3B85CF08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {213BAB38-0602-4072-BA0A-8F3F3B85CF08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {213BAB38-0602-4072-BA0A-8F3F3B85CF08}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature b/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature index 4da78008..24ada7a2 100644 --- a/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature +++ b/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature @@ -1,13 +1,14 @@ Feature: DenyAccessToSystem Link to a feature: https://hous-hpb.atlassian.net/browse/DSS-75 -@Access +@Access @Headless Scenario: DenyAccessToSystem #User Authentication Given that I am an authenticated LG, CEU, Provincial Gov or Platform user and the expected result is "" - When I attempt to access the Data Sharing System as "" + #When I attempt to access the Data Sharing System as "" with email "" and Role "" + When I attempt to access the Data Sharing System as "" with email "" and Role "" Then I dont have the required access permissions @@ -15,5 +16,5 @@ Scenario: DenyAccessToSystem # # Examples: - | UserName | Description | ExpectedResult | - | CEUATST | HappyPath | pass | \ No newline at end of file + | UserName | Email | RoleName | Description | ExpectedResult | + | CEUATST | ceuatst@gov.bc.ca | ceu_admin | HappyPath | pass | \ No newline at end of file diff --git a/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature.cs b/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature.cs index 1761bc48..fda968fa 100644 --- a/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature.cs +++ b/Test/UITest/SpecFlowProjectBDD/Features/DenyAccessToSystem.feature.cs @@ -76,11 +76,13 @@ public void ScenarioCleanup() [NUnit.Framework.TestAttribute()] [NUnit.Framework.DescriptionAttribute("DenyAccessToSystem")] [NUnit.Framework.CategoryAttribute("Access")] - [NUnit.Framework.TestCaseAttribute("CEUATST", "HappyPath", "pass", null)] - public void DenyAccessToSystem(string userName, string description, string expectedResult, string[] exampleTags) + [NUnit.Framework.CategoryAttribute("Headless")] + [NUnit.Framework.TestCaseAttribute("CEUATST", "ceuatst@gov.bc.ca", "ceu_admin", "HappyPath", "pass", null)] + public void DenyAccessToSystem(string userName, string email, string roleName, string description, string expectedResult, string[] exampleTags) { string[] @__tags = new string[] { - "Access"}; + "Access", + "Headless"}; if ((exampleTags != null)) { @__tags = System.Linq.Enumerable.ToArray(System.Linq.Enumerable.Concat(@__tags, exampleTags)); @@ -88,6 +90,8 @@ public void DenyAccessToSystem(string userName, string description, string expec string[] tagsOfScenario = @__tags; System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new System.Collections.Specialized.OrderedDictionary(); argumentsOfScenario.Add("UserName", userName); + argumentsOfScenario.Add("Email", email); + argumentsOfScenario.Add("RoleName", roleName); argumentsOfScenario.Add("Description", description); argumentsOfScenario.Add("ExpectedResult", expectedResult); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("DenyAccessToSystem", null, tagsOfScenario, argumentsOfScenario, featureTags); @@ -105,13 +109,14 @@ public void DenyAccessToSystem(string userName, string description, string expec testRunner.Given(string.Format("that I am an authenticated LG, CEU, Provincial Gov or Platform user and the expec" + "ted result is \"{0}\"", expectedResult), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); #line hidden -#line 10 - testRunner.When(string.Format("I attempt to access the Data Sharing System as \"{0}\"", userName), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line 11 + testRunner.When(string.Format("I attempt to access the Data Sharing System as \"{0}\" with email \"{1}\" and Role \"{" + + "2}\"", userName, email, roleName), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 12 +#line 13 testRunner.Then("I dont have the required access permissions", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 14 +#line 15 testRunner.Then("I should see a specific message indicating that access is restricted", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden } diff --git a/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature b/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature index 2a196bde..5b0863d4 100644 --- a/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature +++ b/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature @@ -19,7 +19,7 @@ Scenario: ManagingAccess #Request Details: - When Reviewing a specific access request + When Reviewing a specific access request Then I should be able to view detailed information provided by the user, including their role request and any justifications or additional comments @@ -27,7 +27,8 @@ Scenario: ManagingAccess When Reviewing an access request - Then There should be a Grant Access button allowing me to approve the user's request + Then There should be a Grant Access button allowing me to approve the user's request "" + #Role Assignment: @@ -62,8 +63,8 @@ Scenario: ManagingAccess # # Examples: - | UserName | ListingID | Description | ExpectedResult | ListingURL | AdditionalCCsTextBox | GovPhoneNumber | TakedownReason | - | CEUATST | 0 | ListingID - Boundary | pass | http://listingURL.com | richard.anderson@dxc.com | 9991231234 | Get a business license | + | UserName | ListingID | Description | ExpectedResult | ListingURL | RequestingAccessUser |AdditionalCCsTextBox | GovPhoneNumber | TakedownReason | + | CEUATST | 0 | ListingID - Boundary | pass | http://listingURL.com | STRDSSVrboDev |richard.anderson@dxc.com | 9991231234 | Get a business license | diff --git a/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature.cs b/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature.cs index 013b0ccd..9ca3c05d 100644 --- a/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature.cs +++ b/Test/UITest/SpecFlowProjectBDD/Features/ManagingAccess.feature.cs @@ -76,8 +76,8 @@ public void ScenarioCleanup() [NUnit.Framework.TestAttribute()] [NUnit.Framework.DescriptionAttribute("ManagingAccess")] [NUnit.Framework.CategoryAttribute("Access")] - [NUnit.Framework.TestCaseAttribute("CEUATST", "0", "ListingID - Boundary", "pass", "http://listingURL.com", "richard.anderson@dxc.com", "9991231234", "Get a business license", null)] - public void ManagingAccess(string userName, string listingID, string description, string expectedResult, string listingURL, string additionalCCsTextBox, string govPhoneNumber, string takedownReason, string[] exampleTags) + [NUnit.Framework.TestCaseAttribute("CEUATST", "0", "ListingID - Boundary", "pass", "http://listingURL.com", "STRDSSVrboDev", "richard.anderson@dxc.com", "9991231234", "Get a business license", null)] + public void ManagingAccess(string userName, string listingID, string description, string expectedResult, string listingURL, string requestingAccessUser, string additionalCCsTextBox, string govPhoneNumber, string takedownReason, string[] exampleTags) { string[] @__tags = new string[] { "Access"}; @@ -92,6 +92,7 @@ public void ManagingAccess(string userName, string listingID, string description argumentsOfScenario.Add("Description", description); argumentsOfScenario.Add("ExpectedResult", expectedResult); argumentsOfScenario.Add("ListingURL", listingURL); + argumentsOfScenario.Add("RequestingAccessUser", requestingAccessUser); argumentsOfScenario.Add("AdditionalCCsTextBox", additionalCCsTextBox); argumentsOfScenario.Add("GovPhoneNumber", govPhoneNumber); argumentsOfScenario.Add("TakedownReason", takedownReason); @@ -134,40 +135,41 @@ public void ManagingAccess(string userName, string listingID, string description testRunner.When("Reviewing an access request", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden #line 30 - testRunner.Then("There should be a Grant Access button allowing me to approve the user\'s request", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); + testRunner.Then(string.Format("There should be a Grant Access button allowing me to approve the user\'s request \"" + + "{0}\"", requestingAccessUser), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 34 +#line 35 testRunner.When("Clicking the Grant Access button", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 36 +#line 37 testRunner.Then("I should be prompted to assign the appropriate roles to the user based on their r" + "equest and the system\'s role hierarchy", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 40 +#line 41 testRunner.When("Reviewing an access request for denial", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 42 +#line 43 testRunner.Then("There should be a Deny Access option allowing me to reject the user\'s request if " + "it is deemed inappropriate or unnecessary", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 46 +#line 47 testRunner.When("Reviewing an access request that has been granted", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 48 +#line 49 testRunner.Then("There should be a Remove Access option allowing me to remove the user\'s access if" + " it is deemed inappropriate or unnecessary", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 52 +#line 53 testRunner.When("Granting or denying access", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 54 +#line 55 testRunner.Then("I should receive a confirmation message indicating the success of the action take" + "n, and the user should be notified accordingly", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden -#line 58 +#line 59 testRunner.When("Managing user access requests", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden -#line 60 +#line 61 testRunner.Then("The access request list should dynamically update to reflect the current status a" + "pproved or denied of each request", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden diff --git a/Test/UITest/SpecFlowProjectBDD/Features/UploadListingDataPlatformUser.feature b/Test/UITest/SpecFlowProjectBDD/Features/UploadListingDataPlatformUser.feature new file mode 100644 index 00000000..fe65a080 --- /dev/null +++ b/Test/UITest/SpecFlowProjectBDD/Features/UploadListingDataPlatformUser.feature @@ -0,0 +1,84 @@ +Feature: UploadListingDataPlatformUser +Link to a feature: https://hous-hpb.atlassian.net/browse/DSS-23 + +@UploadListingData +Scenario: UploadListingDataPlatformUser +#Platform Staff Authentication: + Given I am an authenticated platform representative "" with the necessary permissions and the expected result is "" and I am a "" user + +#Access to Data Sharing System: + When I access the Data Sharing System + + Then I should have the option to upload short-term listing data + + + +#Initiate Upload Process: + + When I opt to upload short-term listing data + + Then the upload data interface should load + +#CSV File Selection: + + Given I am on the upload data interface + + When I select a CSV file containing short-term listing data "" + +#Month Designation: + + And I select which month the STR listing data is for "" + +#Validation rules + +#Users cannot upload STR listing data for future month +# +#Users can upload STR listing data for previous months + +#Initiate Upload: + + When I initiate the upload + + Then the Data Sharing System should import the STR listing data + +#Successful Upload: + + When the data import is successful + + Then I should see a success message + + And a new entry on an upload log with a timestamp, username, and the number of records created. + +#Unsuccessful Upload: + + When the data import is not successful + + Then I should see a confirmation message indicating the issue. + + And a new entry on an import log with a timestamp, username, and information about the unsuccessful import, such as error details. + +#Validation -need to be defined + +#Email Confirmation: + + When the data import is complete + + Then i should receive an email confirming the status of my upload: Template: Platform Upload Error Notification + + And a report of any error codes that need to be addressed + +#Testing: + +#Conduct thorough testing to validate the functionality of the upload process and associated features under various scenarios. + + +Examples: + | UserName | UserType | Environment | UploadFile | Month | ExpectedResult | + | STRDSSVrboDev | platform_staff | dev | C:\\Users\\RAnderson\\Source\\Repos\\House-Policy-STRDSS\\Test\\UITest\\TestData\\listing files\\listing-valid-2024-04.csv | April | pass | + #| STRDSSAirbnbDev | platform_staff | dev | |pass | + + + + + + diff --git a/Test/UITest/SpecFlowProjectBDD/Features/UploadListingDataPlatformUser.feature.cs b/Test/UITest/SpecFlowProjectBDD/Features/UploadListingDataPlatformUser.feature.cs new file mode 100644 index 00000000..0fd305d4 --- /dev/null +++ b/Test/UITest/SpecFlowProjectBDD/Features/UploadListingDataPlatformUser.feature.cs @@ -0,0 +1,175 @@ +// ------------------------------------------------------------------------------ +// +// 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 SpecFlowProjectBDD.Features +{ + using TechTalk.SpecFlow; + using System; + using System.Linq; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "3.9.0.0")] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [NUnit.Framework.TestFixtureAttribute()] + [NUnit.Framework.DescriptionAttribute("UploadListingDataPlatformUser")] + public partial class UploadListingDataPlatformUserFeature + { + + private TechTalk.SpecFlow.ITestRunner testRunner; + + private static string[] featureTags = ((string[])(null)); + +#line 1 "UploadListingDataPlatformUser.feature" +#line hidden + + [NUnit.Framework.OneTimeSetUpAttribute()] + public virtual void FeatureSetup() + { + testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); + TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Features", "UploadListingDataPlatformUser", "Link to a feature: https://hous-hpb.atlassian.net/browse/DSS-23", ProgrammingLanguage.CSharp, featureTags); + testRunner.OnFeatureStart(featureInfo); + } + + [NUnit.Framework.OneTimeTearDownAttribute()] + public virtual void FeatureTearDown() + { + testRunner.OnFeatureEnd(); + testRunner = null; + } + + [NUnit.Framework.SetUpAttribute()] + public void TestInitialize() + { + } + + [NUnit.Framework.TearDownAttribute()] + public void TestTearDown() + { + testRunner.OnScenarioEnd(); + } + + public void ScenarioInitialize(TechTalk.SpecFlow.ScenarioInfo scenarioInfo) + { + testRunner.OnScenarioInitialize(scenarioInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(NUnit.Framework.TestContext.CurrentContext); + } + + public void ScenarioStart() + { + testRunner.OnScenarioStart(); + } + + public void ScenarioCleanup() + { + testRunner.CollectScenarioErrors(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("UploadListingDataPlatformUser")] + [NUnit.Framework.CategoryAttribute("UploadListingData")] + [NUnit.Framework.TestCaseAttribute("STRDSSVrboDev", "platform_staff", "dev", "C:\\Users\\RAnderson\\Source\\Repos\\House-Policy-STRDSS\\Test\\UITest\\TestData\\listing " + + "files\\listing-valid-2024-04.csv", "April", "pass", null)] + public void UploadListingDataPlatformUser(string userName, string userType, string environment, string uploadFile, string month, string expectedResult, string[] exampleTags) + { + string[] @__tags = new string[] { + "UploadListingData"}; + 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("UserName", userName); + argumentsOfScenario.Add("UserType", userType); + argumentsOfScenario.Add("Environment", environment); + argumentsOfScenario.Add("UploadFile", uploadFile); + argumentsOfScenario.Add("Month", month); + argumentsOfScenario.Add("ExpectedResult", expectedResult); + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("UploadListingDataPlatformUser", null, tagsOfScenario, argumentsOfScenario, featureTags); +#line 5 +this.ScenarioInitialize(scenarioInfo); +#line hidden + if ((TagHelper.ContainsIgnoreTag(tagsOfScenario) || TagHelper.ContainsIgnoreTag(featureTags))) + { + testRunner.SkipScenario(); + } + else + { + this.ScenarioStart(); +#line 7 + testRunner.Given(string.Format("I am an authenticated platform representative \"{0}\" with the necessary permission" + + "s and the expected result is \"{1}\" and I am a \"{2}\" user", userName, expectedResult, userType), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 10 + testRunner.When("I access the Data Sharing System", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 12 + testRunner.Then("I should have the option to upload short-term listing data", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden +#line 18 + testRunner.When("I opt to upload short-term listing data", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 20 + testRunner.Then("the upload data interface should load", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden +#line 24 + testRunner.Given("I am on the upload data interface", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given "); +#line hidden +#line 26 + testRunner.When(string.Format("I select a CSV file containing short-term listing data \"{0}\"", uploadFile), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 30 + testRunner.And(string.Format("I select which month the STR listing data is for \"{0}\"", month), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 40 + testRunner.When("I initiate the upload", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 42 + testRunner.Then("the Data Sharing System should import the STR listing data", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden +#line 46 + testRunner.When("the data import is successful", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 48 + testRunner.Then("I should see a success message", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden +#line 50 + testRunner.And("a new entry on an upload log with a timestamp, username, and the number of record" + + "s created.", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 54 + testRunner.When("the data import is not successful", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 56 + testRunner.Then("I should see a confirmation message indicating the issue.", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden +#line 58 + testRunner.And("a new entry on an import log with a timestamp, username, and information about th" + + "e unsuccessful import, such as error details.", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden +#line 64 + testRunner.When("the data import is complete", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); +#line hidden +#line 66 + testRunner.Then("i should receive an email confirming the status of my upload: Template: Platform " + + "Upload Error Notification", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden +#line 68 + testRunner.And("a report of any error codes that need to be addressed", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); +#line hidden + } + this.ScenarioCleanup(); + } + } +} +#pragma warning restore +#endregion diff --git a/Test/UITest/SpecFlowProjectBDD/Helpers/AuthHelper.cs b/Test/UITest/SpecFlowProjectBDD/Helpers/AuthHelper.cs index 91726cd5..5d61d30e 100644 --- a/Test/UITest/SpecFlowProjectBDD/Helpers/AuthHelper.cs +++ b/Test/UITest/SpecFlowProjectBDD/Helpers/AuthHelper.cs @@ -20,7 +20,7 @@ public class AuthHelper private string _TestUserName; private string _TestPassword; private AppSettings _AppSettings; - private LogonTypeEnum _LogonType; + private LogonTypeEnum? _LogonType; private BCIDPage _BCIDPage; public AuthHelper(IDriver Driver) @@ -37,12 +37,12 @@ public LogonTypeEnum SetLogonType(UserTypeEnum UserType) switch (UserType) { case UserTypeEnum.BCGOVERNMENTSTAFF: + case UserTypeEnum.CEUSTAFF: + case UserTypeEnum.CEUADMIN: { _LogonType = SFEnums.LogonTypeEnum.IDIR; break; } - case UserTypeEnum.CEUSTAFF: - case UserTypeEnum.CEUADMIN: case UserTypeEnum.LOCALGOVERNMENT: case UserTypeEnum.SHORTTERMRENTALPLATFORM: { @@ -55,10 +55,10 @@ public LogonTypeEnum SetLogonType(UserTypeEnum UserType) return (_LogonType); } - public LogonTypeEnum Authenticate(string UserName, UserTypeEnum UserType) + public LogonTypeEnum? Authenticate(string UserName, string Password, UserTypeEnum UserType) { _TestUserName = UserName; - _TestPassword = _AppSettings.GetUser(_TestUserName) ?? string.Empty; + _TestPassword = Password; _LogonType = SetLogonType(UserType); _Driver.Url = _AppSettings.GetServer("default"); @@ -86,6 +86,11 @@ public LogonTypeEnum Authenticate(string UserName, UserTypeEnum UserType) } } + if (_Driver.Url.ToLower().Contains("logon.cgi")) + { + _LogonType = null; + } + return (_LogonType); } } diff --git a/Test/UITest/SpecFlowProjectBDD/Helpers/DataBaseHelper.cs b/Test/UITest/SpecFlowProjectBDD/Helpers/DataBaseHelper.cs index cbd319f3..1de08ed6 100644 --- a/Test/UITest/SpecFlowProjectBDD/Helpers/DataBaseHelper.cs +++ b/Test/UITest/SpecFlowProjectBDD/Helpers/DataBaseHelper.cs @@ -31,11 +31,30 @@ public List GetIdentities() { if (null == email) { - throw new ArgumentNullException("email"); + throw new ArgumentNullException("Email cannot be null"); } - var identity = _DssDBContext.DssUserIdentities.Where(p => p.EmailAddressDsc == email).FirstOrDefault(); + DssUserIdentity? identity = _DssDBContext.DssUserIdentities.Where(p => p.EmailAddressDsc == email).FirstOrDefault(); return (identity); } + + + public DssUserRole? GetUserRole(string TestUserType) + { + if (null == TestUserType) + { + throw new ArgumentNullException("UserType cannot be null"); + } + + DssUserRole? userRole = _DssDBContext.DssUserRoles.FirstOrDefault(p => p.UserRoleCd == TestUserType); + + return (userRole); + } + + public void SaveChanges() + { + _DssDBContext.SaveChanges(); + } + } } diff --git a/Test/UITest/SpecFlowProjectBDD/SFEnums.cs b/Test/UITest/SpecFlowProjectBDD/SFEnums.cs index 57e54b3d..a00db585 100644 --- a/Test/UITest/SpecFlowProjectBDD/SFEnums.cs +++ b/Test/UITest/SpecFlowProjectBDD/SFEnums.cs @@ -10,5 +10,6 @@ public static class SFEnums { public enum UserTypeEnum { CEUSTAFF, CEUADMIN, LOCALGOVERNMENT, BCGOVERNMENTSTAFF, SHORTTERMRENTALPLATFORM } public enum LogonTypeEnum { IDIR, BCID } + public enum Environment { LOCAL,DEV,TEST,UAT,PROD} } } diff --git a/Test/UITest/SpecFlowProjectBDD/SpecFlowProjectBDD.csproj b/Test/UITest/SpecFlowProjectBDD/SpecFlowProjectBDD.csproj index c7384fa5..fcd0a687 100644 --- a/Test/UITest/SpecFlowProjectBDD/SpecFlowProjectBDD.csproj +++ b/Test/UITest/SpecFlowProjectBDD/SpecFlowProjectBDD.csproj @@ -9,11 +9,12 @@ + - + @@ -29,6 +30,7 @@ + @@ -55,6 +57,10 @@ $(UsingMicrosoftNETSdk) %(RelativeDir)%(Filename).feature$(DefaultLanguageSourceExtension) + + $(UsingMicrosoftNETSdk) + %(RelativeDir)%(Filename).feature$(DefaultLanguageSourceExtension) + $(UsingMicrosoftNETSdk) %(RelativeDir)%(Filename).feature$(DefaultLanguageSourceExtension) diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/DenyAccessToSystem.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/DenyAccessToSystem.cs index d3b6428a..cd7c69ad 100644 --- a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/DenyAccessToSystem.cs +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/DenyAccessToSystem.cs @@ -1,5 +1,12 @@ using Configuration; +using DataBase.Entities; +using DataBase.UnitOfWork; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Newtonsoft.Json; +using NUnit.Framework; using NUnit.Framework.Legacy; +using SpecFlowProjectBDD.Helpers; using TestFrameWork.Models; using UITest.PageObjects; using UITest.TestDriver; @@ -18,8 +25,16 @@ public sealed class DenyAccessToSystem private NoticeOfTakeDownPage _NoticeOfTakeDownPage; private string _TestUserName; private string _TestPassword; + private string _TestEmail; private bool _ExpectedResult = false; + private SFEnums.UserTypeEnum _UserType; + private DssDbContext _DssDBContext; + private DssUserIdentity _UserIdentity; + private bool _OriginalEnabledValue; AppSettings _AppSettings; + private IUnitOfWork _UnitOfWork; + private SFEnums.Environment _Environment = SFEnums.Environment.LOCAL; + public DenyAccessToSystem(SeleniumDriver Driver) { @@ -29,34 +44,67 @@ public DenyAccessToSystem(SeleniumDriver Driver) _IDirPage = new IDirLoginPage(_Driver); _AppSettings = new AppSettings(); + + DbContextOptions dbContextOptions = new DbContextOptions(); + + string dbConnectionString = _AppSettings.GetConnectionString(_Environment.ToString().ToLower()) ?? string.Empty; + + _DssDBContext = new DssDbContext(dbContextOptions, dbConnectionString); + _UnitOfWork = new UnitOfWork(_DssDBContext); } //User Authentication [Given(@"that I am an authenticated LG, CEU, Provincial Gov or Platform user and the expected result is ""(.*)""")] - public void GivenIAmAauthenticatedGovernmentUseer(string ExpectedResult) + public void GivenIAmAauthenticatedGovernmentUser(string ExpectedResult) { _ExpectedResult = ExpectedResult.ToUpper() == "PASS" ? true : false; _Driver.Url = _AppSettings.GetServer("default"); _Driver.Navigate(); - - _PathFinderPage.IDRButton.Click(); } - - [When(@"I attempt to access the Data Sharing System as ""(.*)""")] - public void IAttemptToAccessTheDataSharingSystem(string UserName) + //[When(@"I attempt to access the Data Sharing System as ""(.*)"" with email ""(.*)"" and Role ""(.*)""")] + [When(@"I attempt to access the Data Sharing System as ""(.*)"" with email ""(.*)"" and Role ""(.*)""")] + public void IAttemptToAccessTheDataSharingSystem(string UserName, string Email, string RoleName) { + if (string.IsNullOrWhiteSpace(UserName)) + { + throw new ArgumentException("UserName cannot be empty"); + } + + if ((string.IsNullOrWhiteSpace(Email))) + { + throw new ArgumentException("Email cannot be empty"); + } + + if ((string.IsNullOrWhiteSpace(RoleName))) + { + throw new ArgumentException("Rolename cannot be empty"); + } + _TestUserName = UserName; _TestPassword = _AppSettings.GetUser(_TestUserName) ?? string.Empty; + _TestEmail = Email; + //////////////////// DB Setup //////////////////////////////////////// + // Retrieve the user identity + _UserIdentity = _DssDBContext.DssUserIdentities.FirstOrDefault(p => p.EmailAddressDsc == _TestEmail); + _OriginalEnabledValue = _UserIdentity.IsEnabled; + + // Update properties of the identity + _UserIdentity.IsEnabled = false; - _IDirPage.UserNameTextBox.WaitFor(5); + _DssDBContext.SaveChanges(); + ///////////////////////////////////////////////////////////// + + UserHelper userHelper = new UserHelper(); - _IDirPage.UserNameTextBox.EnterText(_TestUserName); + _UserType = userHelper.SetUserType(RoleName); - _IDirPage.PasswordTextBox.EnterText(_TestPassword); + AuthHelper authHelper = new AuthHelper(_Driver); + + //Authenticate user using IDir or BCID depending on the user + authHelper.Authenticate(_TestUserName, _TestPassword, _UserType); - _IDirPage.ContinueButton.Click(); } [Then("I dont have the required access permissions")] @@ -71,5 +119,15 @@ public void IShouldSeeASpecificMessageIndicatingThatAccessIsRestricted() System.Threading.Thread.Sleep(1000); ClassicAssert.IsTrue(_LayoutPage.Driver.PageSource.Contains("401 Access Denied")); } + + [AfterScenario] + public void TestTearDown() + { + //restore original User value + + _UserIdentity.IsEnabled = _OriginalEnabledValue; + + _DssDBContext.SaveChanges(); + } } } diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/ManagingAccess.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/ManagingAccess.cs index 1239d237..09b7c824 100644 --- a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/ManagingAccess.cs +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/ManagingAccess.cs @@ -1,9 +1,14 @@ using Configuration; +using DataBase.Entities; +using DataBase.UnitOfWork; +using Microsoft.EntityFrameworkCore; +using NUnit.Framework; using NUnit.Framework.Legacy; using OpenQA.Selenium; using OpenQA.Selenium.DevTools.V118.Debugger; using SpecFlowProjectBDD.Helpers; using System.Reflection.Metadata; +using TechTalk.SpecFlow.CommonModels; using TestFrameWork.Models; using UITest.PageObjects; using UITest.TestDriver; @@ -26,6 +31,12 @@ public sealed class ManagingAccess private string _TestPassword; private bool _ExpectedResult = false; AppSettings _AppSettings; + private DssUserIdentity _RequestingUserIdentity; + private bool _OriginalEnabledValue; + private string _OriginalAccessRequestStatusCd = string.Empty; + private DssDbContext _DssDBContext; + private IUnitOfWork _UnitOfWork; + private SFEnums.Environment _Environment = SFEnums.Environment.LOCAL; public ManagingAccess(SeleniumDriver Driver) { @@ -37,8 +48,31 @@ public ManagingAccess(SeleniumDriver Driver) _PathFinderPage = new PathFinderPage(_Driver); _IDirPage = new IDirLoginPage(_Driver); _AppSettings = new AppSettings(); + + DbContextOptions dbContextOptions = new DbContextOptions(); + + string dbConnectionString = _AppSettings.GetConnectionString(_Environment.ToString().ToLower()) ?? string.Empty; + + _DssDBContext = new DssDbContext(dbContextOptions, dbConnectionString); + _UnitOfWork = new UnitOfWork(_DssDBContext); + } + + [SetUp] + public void Setup() + { + } + + [AfterScenario("ManagingAccess")] + public void TearDown() + { + if (null != _RequestingUserIdentity) + { + _RequestingUserIdentity.AccessRequestStatusCd = _OriginalAccessRequestStatusCd; + _DssDBContext.SaveChanges(); + } } + //User Authentication //[Given(@"I am an authenticated LG staff member and the expected result is ""(.*)""")] [Given(@"that I am an authenticated government user ""(.*)"" and the expected result is ""(.*)""")] @@ -46,6 +80,7 @@ public void GivenIAmAauthenticatedGovernmentUser(string UserName, string Expecte { _TestUserName = UserName; _TestPassword = _AppSettings.GetUser(_TestUserName) ?? string.Empty; + _ExpectedResult = ExpectedResult.ToUpper() == "PASS" ? true : false; _Driver.Url = _AppSettings.GetServer("default"); @@ -55,7 +90,7 @@ public void GivenIAmAauthenticatedGovernmentUser(string UserName, string Expecte AuthHelper authHelper = new AuthHelper(_Driver); //Authenticate user using IDir or BCID depending on the user - authHelper.Authenticate(_TestUserName, UserTypeEnum.BCGOVERNMENTSTAFF); + authHelper.Authenticate(_TestUserName, _TestPassword, UserTypeEnum.BCGOVERNMENTSTAFF); IWebElement TOC = null; @@ -73,7 +108,7 @@ public void GivenIAmAauthenticatedGovernmentUser(string UserName, string Expecte if ((null != TOC) && (TOC.Displayed)) { //Nested Angular controls obscure the TermsAndConditionsCheckbox. Need JS - _TermsAndConditionsPage.TermsAndConditionsCheckBox.ExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); + _TermsAndConditionsPage.TermsAndConditionsCheckBox.JSExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); _TermsAndConditionsPage.ContinueButton.Click(); } } @@ -88,10 +123,15 @@ public void IAccessTheAdministrativeInterfaceOfTheSystem() [Then("There should be a dedicated section for managing user access requests")] public void ThereShouldBeADedicatedSectionForManagingUserAccessRequests() { - bool result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-user-management > div.table-card-container"").checkVisibility()"); + string selector = "body > app-root > app-layout > div.content > app-user-management > div.table-card-container"; + + //bool result = (bool)_ManagingAccessPage.UserTable.JSCheckVisability(selector); + bool result = (bool)_ManagingAccessPage.UserTable.IsEnabled(); + ClassicAssert.IsTrue(result); } + //#User Access Request List @@ -103,39 +143,31 @@ public void INavigateToTheUserAccessRequestSection() [Then("I should see a list displaying all user access requests, including relevant details such as the user's name, role request, and date of submission")] public void IShouldSeeAListDisplayingAllUserAccessRequestss() { - bool found = false; bool result = false; - while (found == false) - { - //wait for element to become visable - try - { - result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table"").checkVisibility()"); - found = true; - } - catch (JavaScriptException ex) - { - System.Threading.Thread.Sleep(1000); - } + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#user-table"").checkVisibility()"); + ClassicAssert.IsTrue(result); - } - - result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > tbody"").checkVisibility()"); + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#table-header"").checkVisibility()"); ClassicAssert.IsTrue(result); - result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > thead > tr > th:nth-child(3)"").textContent.toLowerCase().trim() === ""first name"""); + + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#givenNm_th"").textContent.toLowerCase().trim() === ""first name"""); + ClassicAssert.IsTrue(result); - result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > thead > tr > th:nth-child(4)"").textContent.toLowerCase().trim() === ""last name"""); + + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#familyNm_th"").textContent.toLowerCase().trim() === 'last name'"); ClassicAssert.IsTrue(result); - result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > thead > tr > th:nth-child(7)"").textContent.toLowerCase().trim() === ""organization"""); + + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#orgName_th"").textContent.toLowerCase().trim() === ""organization"""); ClassicAssert.IsTrue(result); - result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > thead > tr > th:nth-child(6)"").textContent.toLowerCase().trim() === ""email address"""); + + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#emailAddressDsc_th"").textContent.toLowerCase().trim() === ""email address"""); ClassicAssert.IsTrue(result); } //Request Details - [When("Reviewing a specific access request")] + [When(@"Reviewing a specific access request")] public void ReviewingASpecificAccessRequest() { } @@ -143,7 +175,7 @@ public void ReviewingASpecificAccessRequest() [Then("I should be able to view detailed information provided by the user, including their role request and any justifications or additional comments")] public void ShouldBeAbleToViewDetailedInformationProvidedByTheUser() { - bool result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > tbody > tr:nth-child(1)"").checkVisibility()"); + bool result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#row-0"").checkVisibility()"); ClassicAssert.IsTrue(result); } @@ -153,10 +185,43 @@ public void ReviewingAnAccessRequest() { } - [Then("There should be a Grant Access button allowing me to approve the user's request")] - public void ThereShouldBeAGrantAccessButton() + [Then(@"There should be a Grant Access button allowing me to approve the user's request ""(.*)""")] + public void ThereShouldBeAGrantAccessButton(string RequestingAccessUserEmail) { - bool result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > tbody > tr:nth-child(1) > td:nth-child(9) > span > p-inputswitch > div"").checkVisibility()"); + + //Get email for first user in list + string email = (string)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#row-0 > td:nth-child(6)"").innerText"); + + //////////////////// DB Setup //////////////////////////////////////// + // Retrieve the user identity + _RequestingUserIdentity = _DssDBContext.DssUserIdentities.FirstOrDefault(p => p.EmailAddressDsc == email); + if (null == _RequestingUserIdentity) + { + throw new NotFoundException($"{email} not found in Identities table"); + } + _OriginalAccessRequestStatusCd = _RequestingUserIdentity.AccessRequestStatusCd; + _RequestingUserIdentity.AccessRequestStatusCd = "Requested"; + + _DssDBContext.SaveChanges(); + + ///////////////////////////////////////////////////////////// + + _ManagingAccessPage.Driver.Navigate().Refresh(); + + bool result = false; + + //Wait for control to become visable + for (int i = 0; i <= 3; i++) + { + if ((bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#row-0 > td:nth-child(8)"").checkVisibility()")) + { + result = true; + break; + } + System.Threading.Thread.Sleep(1000); + } + result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#row-0 > td:nth-child(8)"").checkVisibility()"); + ClassicAssert.IsTrue(result); } @@ -164,11 +229,13 @@ public void ThereShouldBeAGrantAccessButton() [When("Clicking the Grant Access button")] public void ClickingTheGrantAccessButton() { + _ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#form-approve-0-btn"").click()"); } [Then("I should be prompted to assign the appropriate roles to the user based on their request and the system's role hierarchy")] public void IShouldBePromptedToAssignTheAppropriateRolesToTheUser() { + _ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#cancel-dialog-btn"").click()"); } @@ -192,7 +259,7 @@ public void ReviewingAnAccessRequestThatHasBeenGranted() [Then("There should be a Remove Access option allowing me to remove the user's access if it is deemed inappropriate or unnecessary")] public void ThereShouldBeARemoveAccessOption() { - bool result = (bool)_ManagingAccessPage.ManageAccessSection.ExecuteJavaScript(@"document.querySelector(""#pn_id_12-table > tbody > tr:nth-child(1) > td:nth-child(9) > span > p-inputswitch > div"").checkVisibility()"); + bool result = (bool)_ManagingAccessPage.UserTable.JSExecuteJavaScript(@"document.querySelector(""#access-status-0-insw"").checkVisibility()"); ClassicAssert.IsTrue(result); } diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/STRDSSLandingPage.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/STRDSSLandingPage.cs index 59472799..a543a8a6 100644 --- a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/STRDSSLandingPage.cs +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/STRDSSLandingPage.cs @@ -25,7 +25,6 @@ public sealed class STRDSSLandingPage private bool _ExpectedResult = false; private AppSettings _AppSettings; private SFEnums.UserTypeEnum _UserType; - private SFEnums.LogonTypeEnum _LogonType; private BCIDPage _BCIDPage; public STRDSSLandingPage(SeleniumDriver Driver) @@ -58,7 +57,7 @@ public void GivenIAmAauthenticatedLGStaffMemberUser(string UserName, string Expe _UserType = userHelper.SetUserType(UserType); //Authenticate user using IDir or BCID depending on the user - _LogonType = authHelper.Authenticate(UserName, _UserType); + authHelper.Authenticate(_TestUserName, _TestPassword, _UserType); IWebElement TOC = null; @@ -75,7 +74,7 @@ public void GivenIAmAauthenticatedLGStaffMemberUser(string UserName, string Expe if ((null != TOC) && (TOC.Displayed)) { //Nested Angular controls obscure the TermsAndConditionsCheckbox. Need JS - _TermsAndConditionsPage.TermsAndConditionsCheckBox.ExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); + _TermsAndConditionsPage.TermsAndConditionsCheckBox.JSExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); _TermsAndConditionsPage.ContinueButton.Click(); } } diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendNoticeOfTakedownWithoutADSSlisting.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendNoticeOfTakedownWithoutADSSlisting.cs index 948d6668..f23df28b 100644 --- a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendNoticeOfTakedownWithoutADSSlisting.cs +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendNoticeOfTakedownWithoutADSSlisting.cs @@ -52,7 +52,7 @@ public void GivenIAmAauthenticatedLGStaffMemberUser(string UserName, string Expe AuthHelper authHelper = new AuthHelper(_Driver); //Authenticate user using IDir or BCID depending on the user - authHelper.Authenticate(_TestUserName, UserTypeEnum.LOCALGOVERNMENT); + authHelper.Authenticate(_TestUserName, _TestPassword, UserTypeEnum.LOCALGOVERNMENT); IWebElement TOC = null; @@ -69,7 +69,7 @@ public void GivenIAmAauthenticatedLGStaffMemberUser(string UserName, string Expe if ((null != TOC) && (TOC.Displayed)) { //Nested Angular controls obscure the TermsAndConditionsCheckbox. Need JS - _TermsAndConditionsPage.TermsAndConditionsCheckBox.ExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); + _TermsAndConditionsPage.TermsAndConditionsCheckBox.JSExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); _TermsAndConditionsPage.ContinueButton.Click(); } } @@ -144,7 +144,7 @@ public void WhenEnteringTheOptionalHostEmailAddress() public void TheSystemShouldPresentAListOfAvailablePlatformOption() { _DelistingWarningPage.PlatformReceipientDropdown.WaitFor(); - _DelistingWarningPage.PlatformReceipientDropdown.ExecuteJavaScript(@"document.querySelector(""#platformId_0"").click()"); + _DelistingWarningPage.PlatformReceipientDropdown.JSExecuteJavaScript(@"document.querySelector(""#platformId_0"").click()"); ClassicAssert.IsTrue(_DelistingWarningPage.PlatformReceipientDropdown.Text.ToUpper().Contains("TEST AIRBNB")); } diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendTakeDownRequestWithoutADSSListing.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendTakeDownRequestWithoutADSSListing.cs index a0f574b7..9c443423 100644 --- a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendTakeDownRequestWithoutADSSListing.cs +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/SendTakeDownRequestWithoutADSSListing.cs @@ -53,7 +53,7 @@ public void GivenIAmAauthenticatedLGStaffMemberUser(string UserName, string Expe AuthHelper authHelper = new AuthHelper(_Driver); //Authenticate user using IDir or BCID depending on the user - authHelper.Authenticate(_TestUserName, UserTypeEnum.LOCALGOVERNMENT); + authHelper.Authenticate(_TestUserName, _TestPassword, UserTypeEnum.LOCALGOVERNMENT); IWebElement TOC = null; @@ -70,7 +70,7 @@ public void GivenIAmAauthenticatedLGStaffMemberUser(string UserName, string Expe if ((null != TOC) && (TOC.Displayed)) { //Nested Angular controls obscure the TermsAndConditionsCheckbox. Need JS - _TermsAndConditionsPage.TermsAndConditionsCheckBox.ExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); + _TermsAndConditionsPage.TermsAndConditionsCheckBox.JSExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); _TermsAndConditionsPage.ContinueButton.Click(); } } @@ -152,7 +152,7 @@ public void TheSystemShouldValidateTheURLFormat() public void WhenSelectingThePlatform() { _DelistingRequestPage.PlatformReceipientDropdown.Click(); - _DelistingRequestPage.PlatformReceipientDropdown.ExecuteJavaScript(@"document.querySelector(""#platformId_0"").click()"); + _DelistingRequestPage.PlatformReceipientDropdown.JSExecuteJavaScript(@"document.querySelector(""#platformId_0"").click()"); ClassicAssert.IsTrue(_DelistingRequestPage.PlatformReceipientDropdown.Text.ToUpper().Contains("TEST AIRBNB")); } diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/TermsAndConditions.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/TermsAndConditions.cs index 124b2849..fc5fa1b8 100644 --- a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/TermsAndConditions.cs +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/TermsAndConditions.cs @@ -1,6 +1,7 @@ using Configuration; using DataBase.Entities; using Microsoft.EntityFrameworkCore; +using NUnit.Framework; using NUnit.Framework.Legacy; using OpenQA.Selenium; using OpenQA.Selenium.DevTools.V118.Debugger; @@ -27,10 +28,13 @@ public sealed class TermsAndConditions private string _TestEmail; private string _TestUserType; private SFEnums.UserTypeEnum _UserType; - private SFEnums.LogonTypeEnum _LogonType; + private SFEnums.LogonTypeEnum? _LogonType; private bool _ExpectedResult = false; private AppSettings _AppSettings; private DssDbContext _DssDBContext; + private DssUserIdentity _UserIdentity; + private DssUserIdentity _OriginalUserIdentity; + private SFEnums.Environment _Environment = SFEnums.Environment.LOCAL; public TermsAndConditions(SeleniumDriver Driver) { @@ -42,31 +46,36 @@ public TermsAndConditions(SeleniumDriver Driver) _AppSettings = new AppSettings(); } + [BeforeScenario] + public void TestSetUp() + { + string dbConnectionString = _AppSettings.GetConnectionString(_Environment.ToString().ToLower()) ?? string.Empty; + DbContextOptions dbContextOptions = new DbContextOptions(); + + _DssDBContext = new DssDbContext(dbContextOptions, dbConnectionString); + } + [Given(@"User ""(.*)"" is enabled, approved, has the correct roles ""(.*)"", but has not accepted TOC")] - public void TestSetup(string UserEmail, string UserType) + public void UserIsEnabledApprovedAndHasCorrectRoles(string UserEmail, string UserType) { _TestEmail = UserEmail; _TestUserType = UserType; - - DbContextOptions dbContextOptions = new DbContextOptions(); - _DssDBContext = new DssDbContext(dbContextOptions); - // Retrieve the role DssUserRole userRole = _DssDBContext.DssUserRoles.FirstOrDefault(p => p.UserRoleCd == _TestUserType); // Retrieve the user identity - var identity = _DssDBContext.DssUserIdentities.FirstOrDefault(p => p.EmailAddressDsc == _TestEmail); + _UserIdentity = _DssDBContext.DssUserIdentities.FirstOrDefault(p => p.EmailAddressDsc == _TestEmail); // Update properties of the identity - identity.AccessRequestStatusCd = "Approved"; - identity.IsEnabled = true; - identity.TermsAcceptanceDtm = null; - identity.RepresentedByOrganizationId = 1; + _UserIdentity.AccessRequestStatusCd = "Approved"; + _UserIdentity.IsEnabled = true; + _UserIdentity.TermsAcceptanceDtm = null; + _UserIdentity.RepresentedByOrganizationId = 1; _DssDBContext.SaveChanges(); - userRole.UserIdentities.Add(identity); + userRole.UserIdentities.Add(_UserIdentity); // Add the identity to the CEU Admin role try @@ -84,7 +93,7 @@ public void TestSetup(string UserEmail, string UserType) //User Authentication //[Given(@"that I am an authenticated user ""(.*)"" and the expected result is ""(.*)""")] [Given(@"that I am an authenticated User ""(.*)"" and the expected result is ""(.*)"" and I am a ""(.*)"" user")] - public void GivenIAmAauthenticatedGovernmentUser(string UserName, string ExpectedResult, string UserType) + public void GivenIAmAauthenticatedGovernmentUser(string UserName, string ExpectedResult, string RoleName) { _TestUserName = UserName; _TestPassword = _AppSettings.GetUser(_TestUserName) ?? string.Empty; @@ -92,7 +101,7 @@ public void GivenIAmAauthenticatedGovernmentUser(string UserName, string Expecte UserHelper userHelper = new UserHelper(); - _UserType = userHelper.SetUserType(UserType); + _UserType = userHelper.SetUserType(RoleName); } @@ -105,7 +114,8 @@ public void ILogInOrAccessTheSystem() AuthHelper authHelper = new AuthHelper(_Driver); //Authenticate user using IDir or BCID depending on the user - _LogonType = authHelper.Authenticate(_TestUserName, _UserType); + _LogonType = authHelper.Authenticate(_TestUserName, _TestPassword, _UserType); + ClassicAssert.IsNotNull(_LogonType, "Logon FAILED"); //TODO: Validate that the login was sucessfull } @@ -133,7 +143,7 @@ public void ThenIShouldBePromptedToAcceptTheTermsAndConditions() if ((null != TOC) && (TOC.Displayed)) { //Nested Angular controls obscure the TermsAndConditionsCheckbox. Need JS - _TermsAndConditionsPage.TermsAndConditionsCheckBox.ExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); + _TermsAndConditionsPage.TermsAndConditionsCheckBox.JSExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); _TermsAndConditionsPage.ContinueButton.Click(); } } @@ -239,5 +249,15 @@ public void TOCFlagWillBeSetToTrue() public void IWillNotHaveToAcceptTheTOC() { } + + [TearDown] + public void TestTearDown() + { + //restore original User Identity + + _UserIdentity = _OriginalUserIdentity; + + _DssDBContext.SaveChanges(); + } } } diff --git a/Test/UITest/SpecFlowProjectBDD/StepDefinitions/UploadListingDataPlatformUser.cs b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/UploadListingDataPlatformUser.cs new file mode 100644 index 00000000..4b49ad82 --- /dev/null +++ b/Test/UITest/SpecFlowProjectBDD/StepDefinitions/UploadListingDataPlatformUser.cs @@ -0,0 +1,293 @@ +using Configuration; +using NUnit.Framework.Legacy; +using OpenQA.Selenium; +using SpecFlowProjectBDD.Helpers; +using DataBase.Entities; +using TestFrameWork.Models; +using UITest.PageObjects; +using UITest.TestDriver; +using TestFrameWork.WindowsAutomation.Controls; +using static SpecFlowProjectBDD.SFEnums; +using Microsoft.EntityFrameworkCore; +using System.Text.RegularExpressions; +using System.Data; +using Npgsql; +using DataBase.UnitOfWork; + +namespace SpecFlowProjectBDD.StepDefinitions +{ + [Binding] + public class UploadListingDataPlatformUser + { + private IDriver _Driver; + private LandingPage _LandingPage; + private TermsAndConditionsPage _TermsAndConditionsPage; + private PathFinderPage _PathFinderPage; + private IDirLoginPage _IDRLoginPage; + private UploadListingsPage _UploadListingsPage; + private string _TestUserName; + private string _TestPassword; + private string _listingFile; + private bool _ExpectedResult = false; + private AppSettings _AppSettings; + private SFEnums.UserTypeEnum _UserType; + private BCIDPage _BCIDPage; + private DssDbContext _DssDBContext; + private DssUploadDelivery _DssUploadDelivery; + private DateTime _updateTime; + private IUnitOfWork _UnitOfWork; + private SFEnums.Environment _Environment = SFEnums.Environment.LOCAL; + + public UploadListingDataPlatformUser(SeleniumDriver Driver) + { + _Driver = Driver; + _LandingPage = new LandingPage(_Driver); + _TermsAndConditionsPage = new TermsAndConditionsPage(Driver); + _PathFinderPage = new PathFinderPage(_Driver); + _IDRLoginPage = new IDirLoginPage(_Driver); + _BCIDPage = new BCIDPage(_Driver); + _UploadListingsPage = new UploadListingsPage(_Driver); + _AppSettings = new AppSettings(); + DbContextOptions dbContextOptions = new DbContextOptions(); + _DssDBContext = new DssDbContext(dbContextOptions); + + string dbConnectionString = _AppSettings.GetConnectionString(_Environment.ToString().ToLower()) ?? string.Empty; + + _DssDBContext = new DssDbContext(dbContextOptions, dbConnectionString); + _UnitOfWork = new UnitOfWork(_DssDBContext); + } + + [Given(@"I am an authenticated platform representative ""([^""]*)"" with the necessary permissions and the expected result is ""([^""]*)"" and I am a ""([^""]*)"" user")] + public void GivenIAmAnAuthenticatedPlatformRepresentativeWithTheNecessaryPermissionsAndTheExpectedResultIsAndIAmAUser(string UserName, string ExpectedResult, string UserType) + { + _TestUserName = UserName; + _TestPassword = _AppSettings.GetUser(_TestUserName) ?? string.Empty; + _ExpectedResult = ExpectedResult.ToUpper() == "PASS" ? true : false; + + _listingFile = _AppSettings.GetListingFile("File1"); + + _Driver.Url = _AppSettings.GetServer("default"); + _Driver.Navigate(); + + AuthHelper authHelper = new AuthHelper(_Driver); + UserHelper userHelper = new UserHelper(); + + _UserType = userHelper.SetUserType(UserType); + //Authenticate user using IDir or BCID depending on the user + authHelper.Authenticate(_TestUserName, _TestPassword, _UserType); + } + + [When(@"I access the Data Sharing System")] + public void WhenIAccessTheDataSharingSystem() + { + IWebElement TOC = null; + + try + { + TOC = _LandingPage.Driver.FindElement(Enums.FINDBY.CSSSELECTOR, TermsAndConditionsModel.TermsAndCondititionsCheckBox); + } + catch (NoSuchElementException ex) + { + //no Terms and Conditions. Continue + } + + + if ((null != TOC) && (TOC.Displayed)) + { + //Nested Angular controls obscure the TermsAndConditionsCheckbox. Need JS + _TermsAndConditionsPage.TermsAndConditionsCheckBox.JSExecuteJavaScript(@"document.querySelector(""body > app-root > app-layout > div.content > app-terms-and-conditions > p-card > div > div.p-card-body > div > div > div.checkbox-container > p-checkbox > div > div.p-checkbox-box"").click()"); + _TermsAndConditionsPage.ContinueButton.Click(); + } + } + + [Then("I should have the option to upload short-term listing data")] + public void IShouldHaveTheOptionToUploadShorttermlistingData() + { + if (_UserType == UserTypeEnum.SHORTTERMRENTALPLATFORM) + { + ClassicAssert.True(_LandingPage.Upload_ListingsButton.IsEnabled()); + } + } + + [When(@"I opt to upload short-term listing data")] + public void WhenIOptToUploadShort_TermListingData() + { + ////throw new PendingStepException(); + } + + [Then(@"the upload data interface should load")] + public void ThenTheUploadDataInterfaceShouldLoad() + { + _LandingPage.Upload_ListingsButton.Click(); + } + + + [Given(@"I am on the upload data interface")] + public void GivenIAmOnTheUploadDataInterface() + { + //throw new PendingStepException(); + } + + [When(@"I select a CSV file containing short-term listing data ""([^""]*)""")] + public void WhenISelectACSVFileContainingShort_TermListingData(string UploadFile) + { + _UploadListingsPage.SelectFileButton.Click(); + FileDialog fileDialog = new FileDialog(); + fileDialog.FindAndSet(UploadFile, "Short-Term Rental Data Portal - Google Chrome", "Chrome_WidgetWin_1"); + + _listingFile = UploadFile; + // Define a regular expression to match the year and month in the filename + string pattern = @"listing-valid-(\d{4})-(\d{2})\.csv"; + Regex regex = new Regex(pattern); + + // Match the regular expression with the filename + Match match = regex.Match(_listingFile); + + string yearMonth = string.Empty; + + if (match.Success) + { + // Extract the year and month from the match groups + string year = match.Groups[1].Value; + string month = match.Groups[2].Value; + yearMonth = $"{year}-{month}"; + } + else + { + throw new FormatException("The filename does not match the expected pattern."); + } + + var dt = DateOnly.Parse(yearMonth); + //var DSSUploadDeliverys = _DssDBContext.DssUploadDeliveries.Where(p => p.ReportPeriodYm == dt).ToList(); + var DSSUploadDeliverys = _UnitOfWork.DssUploadDeliveryRepository.Get(p => p.ReportPeriodYm == dt).ToList(); ; + + + foreach (var DSSLoadDelivery in DSSUploadDeliverys) + { + try + { + long id = DSSLoadDelivery.UploadDeliveryId; + _UnitOfWork.DssUploadDeliveryRepository.Delete(DSSLoadDelivery); + var DSSUploadDeliveryLines = _UnitOfWork.DssUploadLineRepository.Get(p => p.IncludingUploadDeliveryId == id); + foreach (var dSSDeliveryLine in DSSUploadDeliveryLines) + { + _UnitOfWork.DssUploadLineRepository.Delete(dSSDeliveryLine.UploadLineId); + } + _UnitOfWork.Save(); + } + + catch(NpgsqlOperationInProgressException ex) + { + //should not happen, but continue if it does for now + } + } + } + + [When(@"I select which month the STR listing data is for ""([^""]*)""")] + public void WhenISelectWhichMonthTheSTRListingDataIsFor(string Month) + { + _UploadListingsPage.ReportingMonthDropDown.Click(); + + string listboxItems = _UploadListingsPage.ReportingMonthDropDown.JSExecuteJavaScript(@"document.querySelector(""#month_list"").children.length").ToString(); + + int count = 0; + + if (int.TryParse(listboxItems, out count) == false) + { + throw new ArgumentException("Value returned for ListBox Item count is not an int"); + } + + int index = 0; + string script = string.Empty; + + for (int i = 0; i < count; i++) + { + //script = $@"document.querySelector(""#month_{i} > span"");"; + script = "document.querySelector('#month_" + i + "');"; + + string result = _UploadListingsPage.ReportingMonthDropDown.JSExecuteJavaScript(script) == null ? string.Empty: _UploadListingsPage.ReportingMonthDropDown.JSExecuteJavaScript(script).ToString(); + + if (result.ToUpper().Contains(Month.ToUpper())) + { + index = i; + break; + } + } + + //_UploadListingsPage.ReportingMonthDropDown.ExecuteJavaScript(@"document.querySelector(""#month_0 > span"").click()"); + //script = $@"document.querySelector(""#month_{index}"").click();"; + script = "document.querySelector('#month_1').click();"; + _UploadListingsPage.ReportingMonthDropDown.JSExecuteJavaScript(script); + + } + + [When(@"I initiate the upload")] + public void WhenInitiateTheUpload() + { + _updateTime = DateTime.UtcNow; + _UploadListingsPage.UploadButton.Click(); + } + + [Then(@"the Data Sharing System should import the STR listing data")] + public void ThenTheDataSharingSystemShouldImportTheSTRListingData() + { + //throw new PendingStepException(); + } + + [When(@"the data import is successful")] + public void WhenTheDataImportIsSuccessful() + { + //throw new PendingStepException(); + } + + [Then(@"I should see a success message")] + public void ThenIShouldSeeASuccessMessage() + { + //throw new PendingStepException(); + } + + [Then(@"a new entry on an upload log with a timestamp, username, and the number of records created\.")] + public void ThenANewEntryOnAnUploadLogWithATimestampUsernameAndTheNumberOfRecordsCreated_() + { + var updateTime = _UnitOfWork.DssUploadDeliveryRepository.Get(p => p.UpdDtm >= _updateTime); + ClassicAssert.IsNotNull(updateTime); + } + + [When(@"the data import is not successful")] + public void WhenTheDataImportIsNotSuccessful() + { + //throw new PendingStepException(); + } + + [Then(@"I should see a confirmation message indicating the issue\.")] + public void ThenIShouldSeeAConfirmationMessageIndicatingTheIssue_() + { + //throw new PendingStepException(); + } + + [Then(@"a new entry on an import log with a timestamp, username, and information about the unsuccessful import, such as error details\.")] + public void ThenANewEntryOnAnImportLogWithATimestampUsernameAndInformationAboutTheUnsuccessfulImportSuchAsErrorDetails_() + { + //throw new PendingStepException(); + } + + [When(@"the data import is complete")] + public void WhenTheDataImportIsComplete() + { + //throw new PendingStepException(); + } + + [Then(@"i should receive an email confirming the status of my upload: Template: Platform Upload Error Notification")] + public void ThenIShouldReceiveAnEmailConfirmingTheStatusOfMyUploadTemplatePlatformUploadErrorNotification() + { + //throw new PendingStepException(); + } + + [Then(@"a report of any error codes that need to be addressed")] + public void ThenAReportOfAnyErrorCodesThatNeedToBeAddressed() + { + //throw new PendingStepException(); + } + + } +} diff --git a/Test/UITest/TestData/listing files/listing-valid-2024-02.csv b/Test/UITest/TestData/listing files/listing-valid-2024-02.csv new file mode 100644 index 00000000..f232d082 --- /dev/null +++ b/Test/UITest/TestData/listing files/listing-valid-2024-02.csv @@ -0,0 +1,7 @@ +rpt_period,org_cd,listing_id,listing_url,rental_address,bus_lic_no,bc_reg_no,is_entire_unit,bedrooms_qty,nights_booked_qty,reservations_qty,property_host_nm,property_host_email,property_host_phone,property_host_fax,property_host_address,supplier_host_1_nm,supplier_host_1_email,supplier_host_1_phone,supplier_host_1_fax,supplier_host_1_address,supplier_host_1_id,supplier_host_2_nm,supplier_host_2_email,supplier_host_2_phone,supplier_host_2_fax,supplier_host_2_address,supplier_host_2_id,supplier_host_3_nm,supplier_host_3_email,supplier_host_3_phone,supplier_host_3_fax,supplier_host_3_address,supplier_host_3_id,supplier_host_4_nm,supplier_host_4_email,supplier_host_4_phone,supplier_host_4_fax,supplier_host_4_address,supplier_host_4_id,supplier_host_5_nm,supplier_host_5_email,supplier_host_5_phone,supplier_host_5_fax,supplier_host_5_address,supplier_host_5_id +2024-02,PLATFORMTEST,1000001,https://example.com/1000001/,"739 McCallum Rd, Langford, BC V9B 6M1",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"739 McCallum Rd, Langford, BC V9B 6M1",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"23904 Fraser Hwy, Langley Twp, BC V2Z 2K8",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-02,PLATFORMTEST,1000002,https://example.com/1000002/,"125 Atkins Rd, Victoria, BC V9B 6V4",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email ,123-456-7890,,"125 Atkins Rd, Victoria, BC V9B 6V4",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"23668 36a Ave, Langley Twp, BC V4Z 2J6",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-02,PLATFORMTEST,1000003,https://example.com/1000003/,"2180 Ridgedown Pl, Saanichton, BC V8M 2H7",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"2180 Ridgedown Pl, Saanichton, BC V8M 2H7",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"23904 Fraser Hwy, Langley Twp, BC V2Z 2K8",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-02,PLATFORMTEST,1000004,https://example.com/1000004/,"23904 Fraser Hwy, Langley Twp, BC V2Z 2K8",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 5 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"8901 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-02,PLATFORMTEST,1000005,https://example.com/2000005/,"Unit 5 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 6 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"9012 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-02,PLATFORMTEST,1000006,https://example.com/1000006/,"Unit 6 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 7 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"0123 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/Test/UITest/TestData/listing files/listing-valid-2024-03.csv b/Test/UITest/TestData/listing files/listing-valid-2024-03.csv new file mode 100644 index 00000000..c339bf50 --- /dev/null +++ b/Test/UITest/TestData/listing files/listing-valid-2024-03.csv @@ -0,0 +1,7 @@ +rpt_period,org_cd,listing_id,listing_url,rental_address,bus_lic_no,bc_reg_no,is_entire_unit,bedrooms_qty,nights_booked_qty,reservations_qty,property_host_nm,property_host_email,property_host_phone,property_host_fax,property_host_address,supplier_host_1_nm,supplier_host_1_email,supplier_host_1_phone,supplier_host_1_fax,supplier_host_1_address,supplier_host_1_id,supplier_host_2_nm,supplier_host_2_email,supplier_host_2_phone,supplier_host_2_fax,supplier_host_2_address,supplier_host_2_id,supplier_host_3_nm,supplier_host_3_email,supplier_host_3_phone,supplier_host_3_fax,supplier_host_3_address,supplier_host_3_id,supplier_host_4_nm,supplier_host_4_email,supplier_host_4_phone,supplier_host_4_fax,supplier_host_4_address,supplier_host_4_id,supplier_host_5_nm,supplier_host_5_email,supplier_host_5_phone,supplier_host_5_fax,supplier_host_5_address,supplier_host_5_id +2024-03,PLATFORMTEST,1000002,https://example.com/1000002/,"125 Atkins Rd, Victoria, BC V9B 6V4",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email ,123-456-7890,,"125 Atkins Rd, Victoria, BC V9B 6V4",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"23668 36a Ave, Langley Twp, BC V4Z 2J6",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-03,PLATFORMTEST,1000003,https://example.com/1000003/,"2180 Ridgedown Pl, Saanichton, BC V8M 2H7",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"2180 Ridgedown Pl, Saanichton, BC V8M 2H7",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"23904 Fraser Hwy, Langley Twp, BC V2Z 2K8",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-03,PLATFORMTEST,1000004,https://example.com/1000004/,"23904 Fraser Hwy, Langley Twp, BC V2Z 2K8",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 5 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"8901 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-03,PLATFORMTEST,1000005,https://example.com/2000005/,"Unit 5 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 6 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"9012 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-03,PLATFORMTEST,1000006,https://example.com/1000006/,"Unit 6 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 7 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"0123 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-03,PLATFORMTEST,1000007,https://example.com/1000007/,"Unit 7 456 Example St. y City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 8 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"1234 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/Test/UITest/TestData/listing files/listing-valid-2024-04.csv b/Test/UITest/TestData/listing files/listing-valid-2024-04.csv new file mode 100644 index 00000000..28af139b --- /dev/null +++ b/Test/UITest/TestData/listing files/listing-valid-2024-04.csv @@ -0,0 +1,119 @@ +rpt_period,org_cd,listing_id,listing_url,rental_address,bus_lic_no,bc_reg_no,is_entire_unit,bedrooms_qty,nights_booked_qty,reservations_qty,property_host_nm,property_host_email,property_host_phone,property_host_fax,property_host_address,supplier_host_1_nm,supplier_host_1_email,supplier_host_1_phone,supplier_host_1_fax,supplier_host_1_address,supplier_host_1_id,supplier_host_2_nm,supplier_host_2_email,supplier_host_2_phone,supplier_host_2_fax,supplier_host_2_address,supplier_host_2_id,supplier_host_3_nm,supplier_host_3_email,supplier_host_3_phone,supplier_host_3_fax,supplier_host_3_address,supplier_host_3_id,supplier_host_4_nm,supplier_host_4_email,supplier_host_4_phone,supplier_host_4_fax,supplier_host_4_address,supplier_host_4_id,supplier_host_5_nm,supplier_host_5_email,supplier_host_5_phone,supplier_host_5_fax,supplier_host_5_address,supplier_host_5_id +2024-04,PLAT-EXP-VRBO,1000002,https://example.com/1000002/,"125 Atkins Rd, Victoria, BC V9B 6V4",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email ,123-456-7890,,"125 Atkins Rd, Victoria, BC V9B 6V4",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"23668 36a Ave, Langley Twp, BC V4Z 2J6",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000004,https://example.com/1000004/,"23904 Fraser Hwy, Langley Twp, BC V2Z 2K8",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 5 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"8901 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000005,https://example.com/2000005/,"Unit 5 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 6 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"9012 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000006,https://example.com/1000006/,"Unit 6 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 7 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"0123 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000007,https://example.com/1000007/,"Unit 7 456 Example St. y City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 8 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"1234 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000008,https://example.com/1000008/,"Unit 8 456 Example St. My City, BC",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 9 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"2345 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000009,https://example.com/1000009/,"3445 272 St, Aldergrove, BC V4W 3H4",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 10 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"3456 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000010,https://example.com/1000010/,"200 940 Blanshard St, Victoria, BC V8W 3E6",54321,987654,Y,2,24,8,Teresa Homeowner,teresa.homeowner@my.email,123-456-7890,,"Unit 11 456 Example St. My City, BC V0V 0V0",Bob Lister,bob.lister@my.email,987-654-3210,987-654-3211,"4567 Another Way My City, BC V0V 0V0",654987321,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000011,https://example.com/1000011/,"789 Main St, Vancouver, BC V6A 2H7",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"789 Main St, Vancouver, BC V6A 2H7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"1234 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000012,https://example.com/1000012/,"1010 Beach Ave, Vancouver, BC V6E 1T7",67890,123456,Y,1,15,6,John Doe,john.doe@my.email,234-567-8901,,"1010 Beach Ave, Vancouver, BC V6E 1T7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5678 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000013,https://example.com/1000013/,"201 Burrard St, Vancouver, BC V6C 3L6",67890,123456,Y,2,20,10,John Doe,john.doe@my.email,234-567-8901,,"201 Burrard St, Vancouver, BC V6C 3L6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"9101 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000014,https://example.com/1000014/,"305 W Pender St, Vancouver, BC V6B 1T3",67890,123456,Y,1,10,5,John Doe,john.doe@my.email,234-567-8901,,"305 W Pender St, Vancouver, BC V6B 1T3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000015,https://example.com/1000015/,"5000 Kingsway, Burnaby, BC V5H 2E4",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"5000 Kingsway, Burnaby, BC V5H 2E4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000016,https://example.com/1000016/,"700 Hamilton St, Vancouver, BC V6B 2R5",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"700 Hamilton St, Vancouver, BC V6B 2R5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6789 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000017,https://example.com/1000017/,"800 Robson St, Vancouver, BC V6Z 2E7",67890,123456,Y,1,12,4,John Doe,john.doe@my.email,234-567-8901,,"800 Robson St, Vancouver, BC V6Z 2E7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"2341 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000018,https://example.com/1000018/,"1200 W Georgia St, Vancouver, BC V6E 4R2",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"1200 W Georgia St, Vancouver, BC V6E 4R2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3452 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000019,https://example.com/1000019/,"123 Main St, Richmond, BC V6X 1A1",67890,123456,Y,3,25,10,John Doe,john.doe@my.email,234-567-8901,,"123 Main St, Richmond, BC V6X 1A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5673 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000020,https://example.com/1000020/,"7890 Cambie St, Vancouver, BC V6P 3H5",67890,123456,Y,1,8,3,John Doe,john.doe@my.email,234-567-8901,,"7890 Cambie St, Vancouver, BC V6P 3H5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"4321 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000021,https://example.com/1000021/,"2500 Commercial Dr, Vancouver, BC V5N 4B3",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"2500 Commercial Dr, Vancouver, BC V5N 4B3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"9876 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000022,https://example.com/1000022/,"5555 Joyce St, Vancouver, BC V5R 4H1",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"5555 Joyce St, Vancouver, BC V5R 4H1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6543 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000023,https://example.com/1000023/,"2300 Kingsway, Vancouver, BC V5N 2T5",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"2300 Kingsway, Vancouver, BC V5N 2T5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5439 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000024,https://example.com/1000024/,"6000 Main St, Vancouver, BC V5W 2T7",67890,123456,Y,1,14,5,John Doe,john.doe@my.email,234-567-8901,,"6000 Main St, Vancouver, BC V5W 2T7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6578 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000025,https://example.com/1000025/,"8888 Fraser St, Vancouver, BC V5X 3X6",67890,123456,Y,3,32,13,John Doe,john.doe@my.email,234-567-8901,,"8888 Fraser St, Vancouver, BC V5X 3X6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7891 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000026,https://example.com/1000026/,"555 Burrard St, Vancouver, BC V7X 1M8",67890,123456,Y,2,24,10,John Doe,john.doe@my.email,234-567-8901,,"555 Burrard St, Vancouver, BC V7X 1M8",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3210 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000027,https://example.com/1000027/,"700 Seymour St, Vancouver, BC V6B 3K4",67890,123456,Y,1,16,6,John Doe,john.doe@my.email,234-567-8901,,"700 Seymour St, Vancouver, BC V6B 3K4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"1239 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000028,https://example.com/1000028/,"900 Granville St, Vancouver, BC V6Z 1L2",67890,123456,Y,3,29,12,John Doe,john.doe@my.email,234-567-8901,,"900 Granville St, Vancouver, BC V6Z 1L2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3458 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000029,https://example.com/1000029/,"1100 Robson St, Vancouver, BC V6E 1B5",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"1100 Robson St, Vancouver, BC V6E 1B5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7896 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000030,https://example.com/1000030/,"1200 Richards St, Vancouver, BC V6B 3G2",67890,123456,Y,1,11,4,John Doe,john.doe@my.email,234-567-8901,,"1200 Richards St, Vancouver, BC V6B 3G2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"4329 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000031,https://example.com/1000031/,"1300 Homer St, Vancouver, BC V6B 5M9",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"1300 Homer St, Vancouver, BC V6B 5M9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6543 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000032,https://example.com/1000032/,"1400 Richards St, Vancouver, BC V6B 3G6",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"1400 Richards St, Vancouver, BC V6B 3G6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3458 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000033,https://example.com/1000033/,"1500 Nelson St, Vancouver, BC V6G 1M5",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"1500 Nelson St, Vancouver, BC V6G 1M5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"9876 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000034,https://example.com/1000034/,"1600 Robson St, Vancouver, BC V6G 1C7",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"1600 Robson St, Vancouver, BC V6G 1C7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000035,https://example.com/1000035/,"1700 Denman St, Vancouver, BC V6G 2L3",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"1700 Denman St, Vancouver, BC V6G 2L3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7891 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000036,https://example.com/1000036/,"1800 Bute St, Vancouver, BC V6E 2Z2",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"1800 Bute St, Vancouver, BC V6E 2Z2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3210 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000037,https://example.com/1000037/,"1900 Burrard St, Vancouver, BC V6J 3G3",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"1900 Burrard St, Vancouver, BC V6J 3G3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5678 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000038,https://example.com/1000038/,"2000 Granville St, Vancouver, BC V6H 3H7",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"2000 Granville St, Vancouver, BC V6H 3H7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6789 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000039,https://example.com/1000039/,"2100 Cambie St, Vancouver, BC V5Z 4N6",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"2100 Cambie St, Vancouver, BC V5Z 4N6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5439 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000040,https://example.com/1000040/,"2200 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"2200 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000041,https://example.com/1000041/,"2300 Commercial Dr, Vancouver, BC V5N 4B3",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"2300 Commercial Dr, Vancouver, BC V5N 4B3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7896 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000042,https://example.com/1000042/,"2400 Broadway, Vancouver, BC V5N 5M2",67890,123456,Y,1,14,5,John Doe,john.doe@my.email,234-567-8901,,"2400 Broadway, Vancouver, BC V5N 5M2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"9871 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000043,https://example.com/1000043/,"2500 Hastings St, Vancouver, BC V5K 1Z5",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"2500 Hastings St, Vancouver, BC V5K 1Z5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6543 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000044,https://example.com/1000044/,"2600 Victoria Dr, Vancouver, BC V5N 4M9",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"2600 Victoria Dr, Vancouver, BC V5N 4M9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3452 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000045,https://example.com/1000045/,"2700 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"2700 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6782 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000046,https://example.com/1000046/,"2800 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"2800 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8762 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000047,https://example.com/1000047/,"2900 Broadway, Vancouver, BC V5N 5M2",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"2900 Broadway, Vancouver, BC V5N 5M2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000048,https://example.com/1000048/,"3000 Kingsway, Vancouver, BC V5R 5W2",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"3000 Kingsway, Vancouver, BC V5R 5W2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000049,https://example.com/1000049/,"3100 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"3100 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6789 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000050,https://example.com/1000050/,"3200 Main St, Vancouver, BC V5T 3E6",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"3200 Main St, Vancouver, BC V5T 3E6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5439 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000051,https://example.com/1000051/,"3300 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,1,14,5,John Doe,john.doe@my.email,234-567-8901,,"3300 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000052,https://example.com/1000052/,"3400 Broadway, Vancouver, BC V5N 5N2",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"3400 Broadway, Vancouver, BC V5N 5N2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7896 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000053,https://example.com/1000053/,"3500 Kingsway, Vancouver, BC V5R 5X2",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"3500 Kingsway, Vancouver, BC V5R 5X2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"9871 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000054,https://example.com/1000054/,"3600 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"3600 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6543 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000055,https://example.com/1000055/,"3700 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"3700 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"3452 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000056,https://example.com/1000056/,"3800 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"3800 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6782 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000057,https://example.com/1000057/,"3900 Broadway, Vancouver, BC V5N 5M2",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"3900 Broadway, Vancouver, BC V5N 5M2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8762 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000058,https://example.com/1000058/,"4000 Kingsway, Vancouver, BC V5R 5W2",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"4000 Kingsway, Vancouver, BC V5R 5W2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000059,https://example.com/1000059/,"4100 Victoria Dr, Vancouver, BC V5N 4M9",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"4100 Victoria Dr, Vancouver, BC V5N 4M9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000060,https://example.com/1000060/,"4200 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,1,14,5,John Doe,john.doe@my.email,234-567-8901,,"4200 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"6543 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000061,https://example.com/1000061/,"4300 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"4300 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000062,https://example.com/1000062/,"4400 Broadway, Vancouver, BC V5N 5N2",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"4400 Broadway, Vancouver, BC V5N 5N2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000063,https://example.com/1000063/,"4500 Kingsway, Vancouver, BC V5R 5X2",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"4500 Kingsway, Vancouver, BC V5R 5X2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000064,https://example.com/1000064/,"4600 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"4600 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000065,https://example.com/1000065/,"4700 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"4700 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000066,https://example.com/1000066/,"4800 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"4800 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000067,https://example.com/1000067/,"4900 Broadway, Vancouver, BC V5N 5M2",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"4900 Broadway, Vancouver, BC V5N 5M2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000068,https://example.com/1000068/,"5000 Kingsway, Vancouver, BC V5R 5W2",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"5000 Kingsway, Vancouver, BC V5R 5W2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8762 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000069,https://example.com/1000069/,"5100 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"5100 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7891 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000070,https://example.com/1000070/,"5200 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"5200 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000071,https://example.com/1000071/,"5300 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"5300 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000072,https://example.com/1000072/,"5400 Broadway, Vancouver, BC V5N 5N2",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"5400 Broadway, Vancouver, BC V5N 5N2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000073,https://example.com/1000073/,"5500 Kingsway, Vancouver, BC V5R 5X2",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"5500 Kingsway, Vancouver, BC V5R 5X2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000074,https://example.com/1000074/,"5600 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"5600 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000075,https://example.com/1000075/,"5700 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"5700 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000076,https://example.com/1000076/,"5800 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"5800 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000077,https://example.com/1000077/,"5900 Broadway, Vancouver, BC V5N 5M2",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"5900 Broadway, Vancouver, BC V5N 5M2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000078,https://example.com/1000078/,"6000 Kingsway, Vancouver, BC V5R 5W2",67890,123456,Y,1,14,5,John Doe,john.doe@my.email,234-567-8901,,"6000 Kingsway, Vancouver, BC V5R 5W2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000079,https://example.com/1000079/,"6100 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"6100 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000080,https://example.com/1000080/,"6200 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"6200 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000081,https://example.com/1000081/,"6300 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"6300 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000082,https://example.com/1000082/,"6400 Broadway, Vancouver, BC V5N 5N2",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"6400 Broadway, Vancouver, BC V5N 5N2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000083,https://example.com/1000083/,"6500 Kingsway, Vancouver, BC V5R 5X2",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"6500 Kingsway, Vancouver, BC V5R 5X2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000084,https://example.com/1000084/,"6600 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"6600 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000085,https://example.com/1000085/,"6700 Main St, Vancouver, BC V5T 3G1",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"6700 Main St, Vancouver, BC V5T 3G1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000086,https://example.com/1000086/,"6800 Commercial Dr, Vancouver, BC V5N 4A1",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"6800 Commercial Dr, Vancouver, BC V5N 4A1",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000087,https://example.com/1000087/,"6900 Broadway, Vancouver, BC V5N 5M2",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"6900 Broadway, Vancouver, BC V5N 5M2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000088,https://example.com/1000088/,"7000 Kingsway, Vancouver, BC V5R 5W2",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"7000 Kingsway, Vancouver, BC V5R 5W2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000089,https://example.com/1000089/,"7100 Victoria Dr, Vancouver, BC V5N 4L9",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"7100 Victoria Dr, Vancouver, BC V5N 4L9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"7892 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000091,https://example.com/1000091/,"1000 Fort St, Victoria, BC V8V 3K4",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"1000 Fort St, Victoria, BC V8V 3K4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000092,https://example.com/1000092/,"1100 Blanshard St, Victoria, BC V8W 2H5",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"1100 Blanshard St, Victoria, BC V8W 2H5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000093,https://example.com/1000093/,"1200 Government St, Victoria, BC V8W 1Y2",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"1200 Government St, Victoria, BC V8W 1Y2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000094,https://example.com/1000094/,"1300 Douglas St, Victoria, BC V8W 2E7",67890,123456,Y,2,18,7,John Doe,john.doe@my.email,234-567-8901,,"1300 Douglas St, Victoria, BC V8W 2E7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000095,https://example.com/1000095/,"1400 Yates St, Victoria, BC V8V 3K8",67890,123456,Y,3,30,12,John Doe,john.doe@my.email,234-567-8901,,"1400 Yates St, Victoria, BC V8V 3K8",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000096,https://example.com/1000096/,"1500 Vancouver St, Victoria, BC V8V 4C7",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"1500 Vancouver St, Victoria, BC V8V 4C7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000097,https://example.com/1000097/,"1600 Hillside Ave, Victoria, BC V8T 2C3",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"1600 Hillside Ave, Victoria, BC V8T 2C3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000098,https://example.com/1000098/,"1700 Oak Bay Ave, Victoria, BC V8R 1B3",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"1700 Oak Bay Ave, Victoria, BC V8R 1B3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000099,https://example.com/1000099/,"1800 Fairfield Rd, Victoria, BC V8S 1G4",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"1800 Fairfield Rd, Victoria, BC V8S 1G4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000100,https://example.com/1000100/,"1900 Cook St, Victoria, BC V8T 3P4",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"1900 Cook St, Victoria, BC V8T 3P4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000101,https://example.com/1000101/,"2000 Johnson St, Victoria, BC V8T 3H2",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"2000 Johnson St, Victoria, BC V8T 3H2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000102,https://example.com/1000102/,"2100 Bay St, Victoria, BC V8T 1Y3",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"2100 Bay St, Victoria, BC V8T 1Y3",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000103,https://example.com/1000103/,"2200 Foul Bay Rd, Victoria, BC V8R 2C8",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"2200 Foul Bay Rd, Victoria, BC V8R 2C8",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000104,https://example.com/1000104/,"2300 Shelbourne St, Victoria, BC V8R 4N9",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"2300 Shelbourne St, Victoria, BC V8R 4N9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000105,https://example.com/1000105/,"2400 Richmond Rd, Victoria, BC V8R 4V6",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"2400 Richmond Rd, Victoria, BC V8R 4V6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000106,https://example.com/1000106/,"2500 Cedar Hill Rd, Victoria, BC V8P 3Z4",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"2500 Cedar Hill Rd, Victoria, BC V8P 3Z4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000107,https://example.com/1000107/,"2600 Hillside Ave, Victoria, BC V8T 1Z4",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"2600 Hillside Ave, Victoria, BC V8T 1Z4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000108,https://example.com/1000108/,"2700 Cook St, Victoria, BC V8T 3R7",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"2700 Cook St, Victoria, BC V8T 3R7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000109,https://example.com/1000109/,"2800 Quadra St, Victoria, BC V8T 4E2",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"2800 Quadra St, Victoria, BC V8T 4E2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000110,https://example.com/1000110/,"2900 Burnside Rd, Victoria, BC V8T 5B4",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"2900 Burnside Rd, Victoria, BC V8T 5B4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000111,https://example.com/1000111/,"3000 Gorge Rd, Victoria, BC V9A 1M9",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"3000 Gorge Rd, Victoria, BC V9A 1M9",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000112,https://example.com/1000112/,"3100 Tillicum Rd, Victoria, BC V9A 2A5",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"3100 Tillicum Rd, Victoria, BC V9A 2A5",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000113,https://example.com/1000113/,"3200 Admirals Rd, Victoria, BC V9A 2P6",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"3200 Admirals Rd, Victoria, BC V9A 2P6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000114,https://example.com/1000114/,"3300 Harriet Rd, Victoria, BC V8Z 3S8",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"3300 Harriet Rd, Victoria, BC V8Z 3S8",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000115,https://example.com/1000115/,"3400 Burnside Rd, Victoria, BC V8Z 3X2",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"3400 Burnside Rd, Victoria, BC V8Z 3X2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000116,https://example.com/1000116/,"3500 McKenzie Ave, Victoria, BC V8P 2M7",67890,123456,Y,3,28,11,John Doe,john.doe@my.email,234-567-8901,,"3500 McKenzie Ave, Victoria, BC V8P 2M7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000117,https://example.com/1000117/,"3600 Shelbourne St, Victoria, BC V8P 4H2",67890,123456,Y,1,10,4,John Doe,john.doe@my.email,234-567-8901,,"3600 Shelbourne St, Victoria, BC V8P 4H2",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000118,https://example.com/1000118/,"3700 McRae Ave, Victoria, BC V8P 2G7",67890,123456,Y,2,22,9,John Doe,john.doe@my.email,234-567-8901,,"3700 McRae Ave, Victoria, BC V8P 2G7",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000119,https://example.com/1000119/,"3800 Cedar Hill Rd, Victoria, BC V8P 3Z4",67890,123456,Y,3,27,11,John Doe,john.doe@my.email,234-567-8901,,"3800 Cedar Hill Rd, Victoria, BC V8P 3Z4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000120,https://example.com/1000120/,"3900 Richmond Rd, Victoria, BC V8R 4V6",67890,123456,Y,1,12,5,John Doe,john.doe@my.email,234-567-8901,,"3900 Richmond Rd, Victoria, BC V8R 4V6",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"5432 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, +2024-04,PLAT-EXP-VRBO,1000121,https://example.com/1000121/,"4000 Cedar Hill Cross Rd, Victoria, BC V8P 2N4",67890,123456,Y,2,20,8,John Doe,john.doe@my.email,234-567-8901,,"4000 Cedar Hill Cross Rd, Victoria, BC V8P 2N4",Jane Smith,jane.smith@my.email,456-789-0123,234-567-8902,"8765 Park Ave, Burnaby, BC V5H 2E8",123456789,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/Test/UITest/TestFrameWork/Models/ManagingAccessModel.cs b/Test/UITest/TestFrameWork/Models/ManagingAccessModel.cs index 8ee48344..f6c01e93 100644 --- a/Test/UITest/TestFrameWork/Models/ManagingAccessModel.cs +++ b/Test/UITest/TestFrameWork/Models/ManagingAccessModel.cs @@ -2,11 +2,11 @@ { public class ManagingAccessModel { - public static string ManageAccessSection + public static string UserTable { get { - return @"/html/body/app-root/app-layout/div[2]/app-user-management/div[2]"; + return "user-table"; } } diff --git a/Test/UITest/TestFrameWork/Models/UploadListingsModel.cs b/Test/UITest/TestFrameWork/Models/UploadListingsModel.cs new file mode 100644 index 00000000..18a37c67 --- /dev/null +++ b/Test/UITest/TestFrameWork/Models/UploadListingsModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestFrameWork.Models +{ + public class UploadListingsModel + { + + public static string ReportingMonthDropDownList { get => "#month > div > chevrondownicon > svg"; } + + public static string SelectFileButton { get => "fileSelect-btn"; } + public static string UploadButton { get => "upload-btn"; } + } +} diff --git a/Test/UITest/TestFrameWork/PageObjects/ManagingAccessPage.cs b/Test/UITest/TestFrameWork/PageObjects/ManagingAccessPage.cs index 3bc29588..fa42b844 100644 --- a/Test/UITest/TestFrameWork/PageObjects/ManagingAccessPage.cs +++ b/Test/UITest/TestFrameWork/PageObjects/ManagingAccessPage.cs @@ -17,7 +17,7 @@ public class ManagingAccessPage private RowList _RequestList; private Button _BackButton; private Button _ForwardButton; - private WebElement _ManageAccessSection; + private WebElement _UserTable; public string URL { get => _URL; set => _URL = value; } @@ -27,8 +27,7 @@ public class ManagingAccessPage public RowList RequestList { get => _RequestList; set => _RequestList = value; } public Button BackButton { get => _BackButton; } public Button ForwardButton { get => _ForwardButton; } - - public WebElement ManageAccessSection { get => _ManageAccessSection; } + public WebElement UserTable { get => _UserTable; } public IDriver Driver { get => _Driver; } public ManagingAccessPage(IDriver Driver) @@ -40,7 +39,7 @@ public ManagingAccessPage(IDriver Driver) _RequestList = new RowList(Driver, Enums.FINDBY.ID, ManagingAccessModel.RequestList); _BackButton = new Button(Driver, Enums.FINDBY.CSSSELECTOR, ManagingAccessModel.BackButton); _ForwardButton = new Button(Driver, Enums.FINDBY.CSSSELECTOR, ManagingAccessModel.ForwardButton); - _ManageAccessSection = new WebElement(Driver, Enums.FINDBY.CSSSELECTOR, ManagingAccessModel.ManageAccessSection); + _UserTable = new WebElement(Driver, Enums.FINDBY.ID, ManagingAccessModel.UserTable); } } } diff --git a/Test/UITest/TestFrameWork/PageObjects/UploadListingsPage.cs b/Test/UITest/TestFrameWork/PageObjects/UploadListingsPage.cs new file mode 100644 index 00000000..cafe65bb --- /dev/null +++ b/Test/UITest/TestFrameWork/PageObjects/UploadListingsPage.cs @@ -0,0 +1,29 @@ +using TestFrameWork.Models; +using UITest.Models; +using UITest.SeleniumObjects; +using UITest.TestDriver; +using UITest.TestObjectFramework; + +namespace UITest.PageObjects +{ + public class UploadListingsPage + { + private DropDownList _ReportingMonthDropDown; + private Button _SelectFileButton; + private Button _UploadButton; + private IDriver _Driver; + + public DropDownList ReportingMonthDropDown { get => _ReportingMonthDropDown; } + public Button SelectFileButton { get => _SelectFileButton; } + public Button UploadButton { get => _UploadButton; } + public IDriver Driver { get => _Driver; } + + public UploadListingsPage(IDriver Driver) + { + _Driver = Driver; + _ReportingMonthDropDown = new DropDownList(Driver, Enums.FINDBY.CSSSELECTOR, UploadListingsModel.ReportingMonthDropDownList); + _SelectFileButton = new Button(Driver, Enums.FINDBY.ID, UploadListingsModel.SelectFileButton); + _UploadButton = new Button(Driver, Enums.FINDBY.ID, UploadListingsModel.UploadButton); + } + } +} diff --git a/Test/UITest/TestFrameWork/SeleniumObjects/JavaScript.cs b/Test/UITest/TestFrameWork/SeleniumObjects/JavaScript.cs deleted file mode 100644 index 4a412301..00000000 --- a/Test/UITest/TestFrameWork/SeleniumObjects/JavaScript.cs +++ /dev/null @@ -1,18 +0,0 @@ -using UITest.TestDriver; - -namespace UITest.SeleniumObjects -{ - public class JScript : UIElement - { - public JScript(IDriver Driver, Enums.FINDBY LocatorType, string Locator) : base(Driver) - { - base.Locator = Locator; - base.LocatorType = LocatorType; - } - public bool ExecuteJScript() - { - base.ExecuteJavaScript(base.Locator); - return (true); - } - } -} diff --git a/Test/UITest/TestFrameWork/SeleniumObjects/UIElement.cs b/Test/UITest/TestFrameWork/SeleniumObjects/UIElement.cs index 0e93388c..d79d2cbd 100644 --- a/Test/UITest/TestFrameWork/SeleniumObjects/UIElement.cs +++ b/Test/UITest/TestFrameWork/SeleniumObjects/UIElement.cs @@ -69,17 +69,52 @@ public bool FindElement(Enums.FINDBY By, string Locator) return (true); } - public bool ExecuteJavaScript(string JavaScript) + + public bool JSCheckVisability(string Selector) { - if (null == _Driver) - throw new ArgumentNullException("No driver defined"); - else - { - IJavaScriptExecutor js = _Driver.Driver as IJavaScriptExecutor; - js.ExecuteScript(JavaScript); - } + IJavaScriptExecutor js = _Driver.Driver as IJavaScriptExecutor; + var script = @" + try { + var elem = document.querySelector('" + Selector + @"'); + console.log('Element:', elem); + if (elem) { + console.log('Element found'); + if (typeof elem.checkVisibility === 'function') { + var visibilityResult = elem.checkVisibility(); + console.log('checkVisibility result:', visibilityResult); + return visibilityResult; + } else { + console.error('checkVisibility is not a function'); + return false; + } + } else { + console.error('Element not found'); + return false; + } + } catch (e) { + console.error('Error:', e); + return false; + } + "; + bool result = (bool)js.ExecuteScript(script); + return (result); + } - return (true); + public object JSExecuteJavaScript(string Script) + { + IJavaScriptExecutor js = _Driver.Driver as IJavaScriptExecutor; + var script = @" + try { + var result = " + Script + @"; + console.log('Result:', result); + return(result); + } catch (e) { + console.error('Error:', e); + return false; + } + "; + object result = js.ExecuteScript(script); + return (result); } /// diff --git a/Test/UITest/TestFrameWork/TestDriver/SeleniumDriver.cs b/Test/UITest/TestFrameWork/TestDriver/SeleniumDriver.cs index ce44c4d6..3490e5ad 100644 --- a/Test/UITest/TestFrameWork/TestDriver/SeleniumDriver.cs +++ b/Test/UITest/TestFrameWork/TestDriver/SeleniumDriver.cs @@ -49,6 +49,7 @@ public SeleniumDriver(DRIVERTYPE DriverType) options.SetLoggingPreference(LogType.Driver, LogLevel.All); options.AddArgument("--ignore-ssl-errors=yes"); options.AddArgument("--ignore-certificate-errors"); + options.AddArgument("--start-maximized"); //options.AddArgument("--headless"); Driver = new ChromeDriver(assemblyDirectory, options); diff --git a/Test/UITest/WinFormsLibrary1/Controls/FileDialog.cs b/Test/UITest/WinFormsLibrary1/Controls/FileDialog.cs new file mode 100644 index 00000000..ad198cbe --- /dev/null +++ b/Test/UITest/WinFormsLibrary1/Controls/FileDialog.cs @@ -0,0 +1,63 @@ +using Interop.UIAutomationClient; +using Interop.UIAutomationCore; + +namespace TestFrameWork.WindowsAutomation.Controls +{ + public class FileDialog + { + + public void FindAndSet(string FileName, string WindowName, string ClassName) + { + + //WindowName = open, class name = #32770 + var automation = new CUIAutomation(); + IUIAutomationElement desktop = automation.GetRootElement(); + + //Find Chrome Window + IUIAutomationCondition nameCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, WindowName); + IUIAutomationCondition classCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_ClassNamePropertyId, ClassName); + + IUIAutomationCondition combinedCondition = automation.CreateAndCondition(nameCondition, classCondition); + Thread.Sleep(2000); + IUIAutomationElement chromeWindow = desktop.FindFirst(TreeScope.TreeScope_Descendants, combinedCondition); + + //Find FileDialogWindow + IUIAutomationCondition fileDialogNameCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "Open"); + IUIAutomationCondition fileDialogClassCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_ClassNamePropertyId, "#32770"); + + IUIAutomationCondition fileDialogCombinedCondition = automation.CreateAndCondition(fileDialogNameCondition, fileDialogClassCondition); + Thread.Sleep(2000); + IUIAutomationElement fileDialog = chromeWindow.FindFirst(TreeScope.TreeScope_Descendants, fileDialogCombinedCondition); + + if (fileDialog != null) + { + //className = edit, automationID= 1148 + IUIAutomationCondition fileNameCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_ClassNamePropertyId, "Edit"); + Thread.Sleep(2000); + IUIAutomationElement fileNameBox = fileDialog.FindFirst(TreeScope.TreeScope_Descendants, fileNameCondition); + if (fileNameBox != null) + { + var valuePattern = (IUIAutomationValuePattern)fileNameBox.GetCurrentPattern(UIA_PatternIds.UIA_ValuePatternId); + valuePattern.SetValue(FileName); + } + + IUIAutomationCondition openButtonNameCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "Open"); + IUIAutomationCondition openButtonClassCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_ClassNamePropertyId, "Button"); + IUIAutomationCondition automationIDCondition = automation.CreatePropertyCondition(UIA_PropertyIds.UIA_AutomationIdPropertyId, "1"); + IUIAutomationCondition openButtonCombinedCondition = automation.CreateAndCondition(openButtonNameCondition, automationIDCondition); + + Thread.Sleep(2000); + IUIAutomationElement openButton = fileDialog.FindFirst(TreeScope.TreeScope_Descendants, openButtonCombinedCondition); + + openButton.SetFocus(); + + if (openButton != null) + { + Thread.Sleep(2000); + var invokePattern = (IUIAutomationInvokePattern)openButton.GetCurrentPattern(UIA_PatternIds.UIA_InvokePatternId); + invokePattern.Invoke(); + } + } + } + } +} diff --git a/Test/UITest/WinFormsLibrary1/WindowsAutomation.csproj b/Test/UITest/WinFormsLibrary1/WindowsAutomation.csproj new file mode 100644 index 00000000..5505d6f6 --- /dev/null +++ b/Test/UITest/WinFormsLibrary1/WindowsAutomation.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + false + enable + + + + + + + +