Skip to content

Commit d280a99

Browse files
committed
fix tests
1 parent 1c9afee commit d280a99

File tree

19 files changed

+68
-73
lines changed

19 files changed

+68
-73
lines changed

CS/OutlookInspired.Module/DatabaseUpdate/Updater.cs

+18-11
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,24 @@ public override void UpdateDatabaseBeforeUpdateSchema(){
2020
}
2121

2222
private void SynchronizeDatesWithToday(){
23-
new[]{
24-
(table: nameof(OutlookInspiredEFCoreDbContext.Orders), column: nameof(Order.OrderDate)),
25-
(table: nameof(OutlookInspiredEFCoreDbContext.Quotes), column: nameof(Quote.Date))
26-
}
27-
.Do(t => CreateCommand($@"
28-
DECLARE @MostRecentDate DATE = (SELECT MAX({t.column}) FROM {t.table});
29-
DECLARE @DaysDifference INT = DATEDIFF(DAY, @MostRecentDate, GETDATE());
30-
31-
UPDATE {t.table}
32-
SET {t.column} = DATEADD(DAY, @DaysDifference, {t.column});
33-
").ExecuteNonQuery()).Enumerate();
23+
using var updateCommand = CreateCommand($@"
24+
WITH ProductOrderDates AS (
25+
SELECT
26+
oi.{nameof(OrderItem.ProductID)},
27+
MAX(o.{nameof(Order.OrderDate)}) AS MostRecentOrderDate
28+
FROM
29+
{nameof(OutlookInspiredEFCoreDbContext.OrderItems)} oi
30+
INNER JOIN {nameof(OutlookInspiredEFCoreDbContext.Orders)} o ON oi.{nameof(OrderItem.OrderID)} = o.Id
31+
GROUP BY
32+
oi.{nameof(OrderItem.ProductID)}
33+
)
34+
UPDATE o
35+
SET o.{nameof(Order.OrderDate)} = DATEADD(DAY, DATEDIFF(DAY, pod.MostRecentOrderDate, GETDATE()), o.{nameof(Order.OrderDate)})
36+
FROM {nameof(OutlookInspiredEFCoreDbContext.Orders)} o
37+
INNER JOIN {nameof(OutlookInspiredEFCoreDbContext.OrderItems)} oi ON o.Id = oi.{nameof(OrderItem.OrderID)}
38+
INNER JOIN ProductOrderDates pod ON oi.{nameof(OrderItem.ProductID)} = pod.{nameof(OrderItem.ProductID)}");
39+
updateCommand.ExecuteNonQuery();
40+
3441
}
3542

3643
public override void UpdateDatabaseAfterUpdateSchema() {

CS/OutlookInspired.Module/ModelUpdaters/NavigationItemsModelUpdater.cs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class NavigationItemsModelUpdater:ModelNodesGeneratorUpdater<NavigationIt
1111
public const string WelcomeDetailView = "Welcome_DetailView";
1212
public const string ReportDataV2ListView = "ReportDataV2_ListView";
1313
public const string UserListView = "ApplicationUser_ListView";
14+
public const string UserDetailView = "ApplicationUser_DetailView";
1415
public const string RoleListView = "PermissionPolicyRole_ListView";
1516
public const string RichTextMailMergeDataListView = "RichTextMailMergeData_ListView";
1617

CS/OutlookInspired.Module/Module.cs

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using DevExpress.ExpressApp.Updating;
66
using DevExpress.ExpressApp.ReportsV2;
77
using DevExpress.Persistent.BaseImpl.EF;
8+
using DevExpress.Persistent.BaseImpl.EF.MultiTenancy;
89
using OutlookInspired.Module.BusinessObjects;
910
using OutlookInspired.Module.Controllers;
1011
using OutlookInspired.Module.Features;
@@ -30,6 +31,7 @@ public OutlookInspiredModule() {
3031
AdditionalExportedTypes.Add(typeof(DevExpress.Persistent.BaseImpl.EF.PermissionPolicy.PermissionPolicyRole));
3132
AdditionalExportedTypes.Add(typeof(ModelDifference));
3233
AdditionalExportedTypes.Add(typeof(ModelDifferenceAspect));
34+
AdditionalExportedTypes.Add(typeof(Tenant));
3335
RequiredModuleTypes.Add(typeof(DevExpress.ExpressApp.SystemModule.SystemModule));
3436
RequiredModuleTypes.Add(typeof(DevExpress.ExpressApp.Security.SecurityModule));
3537
RequiredModuleTypes.Add(typeof(DevExpress.ExpressApp.Objects.BusinessClassLibraryCustomizationModule));

CS/OutlookInspired.Win/Features/Maps/WinMapsViewController.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ public abstract class WinMapsViewController<T>:ObjectViewController<DetailView,T
1414
protected MapsViewController MapsViewController;
1515
private ImageLayer _imageLayer;
1616

17-
static WinMapsViewController(){
18-
var _ = typeof(MapControl);
19-
}
17+
static WinMapsViewController() => _ = typeof(MapControl);
2018

2119
protected override void OnDeactivated(){
2220
base.OnActivated();

CS/Tests/OutlookInspired.Tests/OutlookInspired.Tests.csproj

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
1515
<PackageReference Include="Shouldly" Version="4.2.1" />
1616
</ItemGroup>
17+
<PropertyGroup Condition=" '$(Configuration)' == 'TEST' "><DefineConstants>TEST</DefineConstants></PropertyGroup>
1718
<ItemGroup>
1819

1920
<ProjectReference Include="..\..\OutlookInspired.Module\OutlookInspired.Module.csproj" />

CS/Tests/OutlookInspired.Tests/Services/EmployeeExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public static string[] NavigationViews(this ApplicationUser user)
6161
EmployeeDepartment.Engineering => new[]{ WelcomeDetailView, EmployeeListView, CustomerListView },
6262
EmployeeDepartment.Management => new[]{ WelcomeDetailView, EmployeeListView,EvaluationListView, CustomerListView },
6363
_ => new[]{ CustomerListView, EmployeeListView, Opportunities, OrderListView, ProductListView,
64-
WelcomeDetailView, UserListView, EvaluationListView,RoleListView,ModelDifferenceListView,RichTextMailMergeDataListView}
64+
WelcomeDetailView, UserListView,UserDetailView, EvaluationListView,RoleListView,ModelDifferenceListView,RichTextMailMergeDataListView}
6565
}).OrderBy(view => view).ToArray();
6666
}
6767
}

CS/Tests/OutlookInspired.Tests/Services/ProductExtensions.cs

+3-19
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,8 @@ public static IObservable<Unit> AssertProductListView(this XafApplication applic
1616
},application.CanNavigate(view).ToUnit())
1717
.FilterListViews(application);
1818

19-
// public static IObservable<Frame> AssertProductListView(this XafApplication application, string navigationView, string viewVariant)
20-
// => application.AssertNavigationItems((action, item) => action.NavigationItems(item))
21-
// .If(action => action.CanNavigate(navigationView), action => action.AssertProductListView( navigationView, viewVariant));
22-
23-
// private static IObservable<Frame> AssertProductListView(this SingleChoiceAction action, string navigationView, string viewVariant){
24-
// var productTabControl = action.Application.AssertTabbedGroup(typeof(Product), 2);
25-
// return action.Application.AssertDashboardMasterDetail(navigationView, viewVariant,
26-
// existingObjectDetailview: frame => productTabControl.AssertProductDetailView(frame).ToUnit())
27-
// .Merge(productTabControl.IgnoreElements().To<Frame>()).ReplayFirstTake()
28-
// .AssertDashboardViewReportsAction(ReportController.ReportActionId, reportsCount: singleChoiceAction => singleChoiceAction.AssertReportActionItems())
29-
// .AssertMapItAction(typeof(Product), frame => frame.AssertNestedListView(typeof(MapItem), assert: _ => AssertAction.HasObject))
30-
// .AssertFilterAction(filtersCount: 9)
31-
// .FilterListViews(action.Application);
32-
// }
33-
34-
internal static IObservable<Frame> AssertProductDetailView(this IObservable<ITabControlProvider> productTabControl,Frame frame){
35-
36-
return productTabControl.AssertNestedOrderItems(frame).ReplayFirstTake();
37-
}
19+
20+
internal static IObservable<Frame> AssertProductDetailView(this IObservable<ITabControlProvider> productTabControl,Frame frame)
21+
=> productTabControl.AssertNestedOrderItems(frame).ReplayFirstTake();
3822
}
3923
}

CS/Tests/OutlookInspired.Tests/Services/SecurityExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private static int AdminNavigationItems(this ChoiceActionItem item)
7575
=> item switch{
7676
null => 3,
7777
{ Caption: "Admin Portal" } => 3,
78-
{ Caption: "Default" } => 7,
78+
{ Caption: "Default" } => 8,
7979
{ Caption: "Reports" } => 1,
8080
_ => throw new NotImplementedException(item.Caption)
8181
};

CS/Tests/OutlookInspired.Win.Tests/Common/TestBase.cs

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using OutlookInspired.Win.Services;
1010
using XAF.Testing;
1111
using XAF.Testing.Win.XAF;
12+
using XAF.Testing.XAF;
1213
using Tracing = XAF.Testing.XAF.Tracing;
1314

1415
namespace OutlookInspired.Win.Tests.Common{
@@ -33,6 +34,7 @@ protected IObservable<WinApplication> WinApplication(Action<IWinApplicationBuild
3334
var application = WinApplication(ConnectionString,configureBuilder);
3435
application.ConnectionString = ConnectionString;
3536
application.SplashScreen = null;
37+
application.DropDb();
3638
return application;
3739
});
3840

CS/Tests/OutlookInspired.Win.Tests/OutlookInspired.Win.Tests.csproj

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@
2626
<EmbeddedResource Include="Import\devav.sqlite3" />
2727
<EmbeddedResource Remove="Import\**" />
2828
</ItemGroup>
29-
<!-- uncomment to see/use the importing tests, make the DevExpress.DevAV.v23.2.Data.dll version matches the DevExpress version used. You can find the assembly in your C:\Program Files\DevExpress 23.2\Components\Bin\Framework\-->
30-
<!--<PropertyGroup><DefineConstants>TRACE;Import</DefineConstants></PropertyGroup>-->
31-
<ItemGroup Condition=" $(DefineConstants.Contains('Import'))">
29+
30+
<PropertyGroup><DefineConstants>TRACE;Import</DefineConstants></PropertyGroup>
31+
<ItemGroup Condition=" '$(Configuration)' == 'TEST' ">
3232
<Reference Include="DevExpress.DevAV.v23.2.Data">
3333
<HintPath>..\DevExpress.DevAV.v23.2.Data.dll</HintPath>
3434
</Reference>
3535
</ItemGroup>
36-
<ItemGroup Condition=" !$(DefineConstants.Contains('Import')) ">
36+
<ItemGroup Condition=" '$(Configuration)' != 'TEST' ">
3737
<Compile Remove="Import\**" />
3838
</ItemGroup>
3939
<ItemGroup>

CS/Tests/SelfHostedAgents/Functions.ps1

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ param(
9090
New-VM -Name $newVMName -MemoryStartupBytes "$($vmMemory)MB" -Generation 2 -NoVHD -SwitchName $vmSwitch
9191

9292
# Set-VMMemory -VMName $newVMName -DynamicMemoryEnabled $true -MinimumBytes "$($vmMemory/2)MB" -StartupBytes "$($vmMemory/2)MB" -MaximumBytes "$($vmMemory)MB"
93-
Set-VMMemory -VMName $newVMName -StartupBytes "$($vmMemory)MB"
93+
Set-VMMemory -VMName $newVMName -StartupBytes "$($vmMemory)MB" -DynamicMemoryEnabled $false
9494

9595
Set-VMProcessor -VMName $newVmName -Count $proccessor
9696
$parentVHDPath = $templateVHDPath

CS/Tests/SelfHostedAgents/Setup.ps1

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ param(
7272
$vmMemory = 4096,
7373
$proccessor = 2,
7474
$vmSwitch = "Default Switch",
75-
$user = "Admin",
75+
$user = $env:AgentUser,
7676
$downloadUrl = "https://vstsagentpackage.azureedge.net/agent/3.230.0/vsts-agent-win-x64-3.230.0.zip",
7777
$organization = "eXpandDevOps",
7878
$token = $env:AzureToken,

CS/Tests/XAF.Testing.Blazor/WebExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static IObservable<TMemberValue> WhenCallback<TObject,TMemberValue>(this
3434
public static IObservable<Process> Start(this Uri uri,string browser=null)
3535
=> new ProcessStartInfo{
3636
FileName = browser??"chrome",
37-
Arguments = $"--user-data-dir={CreateTempProfilePath(browser)} {uri}",
37+
Arguments = $"--user-data-dir={CreateTempProfilePath(browser)} --no-first-run --no-default-browser-check {uri}",
3838
UseShellExecute = true
3939
}.Start().Observe().Delay(TimeSpan.FromSeconds(2));
4040

CS/Tests/XAF.Testing.Blazor/XAF/TestExtensions.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ public static IObservable<Unit> StartTest<TStartup, TDBContext>(this IHostBuilde
3434
WindowPosition inactiveWindowBrowserPosition = WindowPosition.None,LogContext logContext=default,WindowPosition inactiveWindowLogContextPosition=WindowPosition.None)
3535
where TStartup : class where TDBContext : DbContext
3636
=> builder.ConfigureWebHostDefaults<TStartup>( url, contentRoot,configure).Build()
37-
.Observe().SelectMany(host => Application.EnsureMultiTenantMainDatabase()
37+
.Observe().SelectMany(host => Application
38+
.DoOnFirst(application => application.DropDb(application.GetRequiredService<IConfiguration>().GetConnectionString("ConnectionString")))
39+
.EnsureMultiTenantMainDatabase()
3840
.DeleteModelDiffs<TDBContext>(application => application.GetRequiredService<IConfiguration>().GetConnectionString("ConnectionString"),user).Cast<BlazorApplication>()
3941
.TakeUntil(host.Services.WhenApplicationStopping())
4042
.SelectMany(application => application.WhenLoggedOn(user).IgnoreElements()

CS/Tests/XAF.Testing/ReactiveExtensions.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,15 @@ public static IObservable<T> ObserveOnContext<T>(this IObservable<T> source) {
231231
var synchronizationContext = SynchronizationContext.Current;
232232
return synchronizationContext != null ? source.ObserveOn(synchronizationContext) : source;
233233
}
234-
234+
public static IObservable<TSource> DoOnFirst<TSource>(this IObservable<TSource> source, Action<TSource> action)
235+
=> source.DoWhen((i, _) => i == 0, action);
236+
public static IObservable<TSource> DoWhen<TSource>(this IObservable<TSource> source, Func<int,TSource, bool> predicate, Action<TSource> action)
237+
=> source.Select((source1, i) => {
238+
if (predicate(i,source1)) {
239+
action(source1);
240+
}
241+
return source1;
242+
});
235243
public static IObservable<TSource> DoWhen<TSource>(this IObservable<TSource> source, Func<TSource, bool> predicate, Action<TSource> action,Action<TSource> actionElse=null)
236244
=> source.Do(source1 => {
237245
if (predicate(source1)) {

CS/Tests/XAF.Testing/XAF/AssertExtensions.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,10 @@ public static IObservable<Frame> AssertNestedListView(this IObservable<ITabContr
2828
=> source.AssertNestedListView(frame, objectType, group => group.SelectTab(selectedTabPageIndex),existingObjectDetailview,assert,inlineEdit,caller);
2929

3030
public static IObservable<Frame> AssertNestedListView(this IObservable<ITabControlProvider> source, Frame frame, Type objectType, Action<ITabControlProvider> tabGroupAction,
31-
Func<Frame, IObservable<Unit>> existingObjectDetailview = null, Func<Frame,AssertAction> assert = null,bool inlineEdit=false,[CallerMemberName]string caller=""){
32-
return frame.AssertNestedListView(objectType, existingObjectDetailview, assert, inlineEdit, caller)
31+
Func<Frame, IObservable<Unit>> existingObjectDetailview = null, Func<Frame,AssertAction> assert = null,bool inlineEdit=false,[CallerMemberName]string caller="")
32+
=> frame.AssertNestedListView(objectType, existingObjectDetailview, assert, inlineEdit, caller)
3333
.Merge(source.DelayOnContext().Do(tabGroupAction).DelayOnContext().IgnoreElements().To<Frame>())
3434
.ReplayFirstTake();
35-
}
3635

3736
public static void ClearFilter(this Frame frame){
3837
if (frame.View is not ListView listView) return;

CS/Tests/XAF.Testing/XAF/XafApplicationExtensions.cs

+17-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using DevExpress.ExpressApp.Layout;
99
using DevExpress.ExpressApp.Security;
1010
using DevExpress.ExpressApp.SystemModule;
11+
using Microsoft.Extensions.Configuration;
1112
using Microsoft.Extensions.DependencyInjection;
1213

1314
namespace XAF.Testing.XAF{
@@ -78,6 +79,7 @@ public static IObservable<Frame> Navigate(this XafApplication application,string
7879

7980
public static bool TenantsExist(this XafApplication application,string connectionString=null,int recordCount=2){
8081
connectionString ??= application.ConnectionString;
82+
if (!application.DbExist(connectionString)) return false;
8183
using var sqlConnection = new SqlConnection(connectionString);
8284
var cmdText = @"
8385
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'Tenant')
@@ -95,8 +97,21 @@ IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AN
9597
var result = command.ExecuteScalar()!;
9698
sqlConnection.Close();
9799
return result == (object)1;
100+
98101
}
99-
102+
103+
public static void DropDb(this XafApplication application, string connectionString=null){
104+
if (!application.DbExist(connectionString)) return;
105+
var builder = new SqlConnectionStringBuilder(connectionString??application.ConnectionString);
106+
var initialCatalog = "Initial catalog";
107+
var databaseName = builder[initialCatalog].ToString();
108+
builder.Remove(initialCatalog);
109+
using SqlConnection connection = new SqlConnection(builder.ConnectionString);
110+
connection.Open();
111+
using SqlCommand cmd = new SqlCommand($"USE master; ALTER DATABASE [{databaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [{databaseName}];", connection);
112+
cmd.ExecuteNonQuery();
113+
}
114+
100115
public static bool DbExist(this XafApplication application,string connectionString=null) {
101116
var builder = new SqlConnectionStringBuilder(connectionString??application.ConnectionString);
102117
var initialCatalog = "Initial catalog";
@@ -152,8 +167,7 @@ public static IObservable<Window> WhenWindowCreated(this XafApplication applicat
152167
}
153168

154169
private static IObservable<Window> WhenMainWindowAvailable(this IObservable<Window> windowCreated)
155-
=> windowCreated.When(TemplateContext.ApplicationWindow).Select(window => window).TemplateChanged().Cast<Window>().Take(1)
156-
.Select(window => window);
170+
=> windowCreated.When(TemplateContext.ApplicationWindow).TemplateChanged().Cast<Window>().Take(1);
157171

158172
public static IObservable<Frame> Navigate(this Window window,string viewId, IObservable<Frame> afterNavigation,Func<Window,IObservable<Unit>> navigate=null){
159173
navigate ??= _ => Unit.Default.Observe();

azure-pipelines.yml

-10
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,6 @@ jobs:
2020
script: |
2121
& sqllocaldb start mssqllocaldb
2222
dotnet nuget add source $(dxFeedVar) --name DX
23-
24-
$projectPath='$(defaultWorkingDir)\Tests\OutlookInspired.Win.Tests\OutlookInspired.Win.Tests.csproj'
25-
[xml]$xmlDoc = Get-Content $projectPath
26-
$newPropertyGroup = $xmlDoc.CreateElement("PropertyGroup")
27-
$defineConstants = $xmlDoc.CreateElement("DefineConstants")
28-
$defineConstants.InnerText = "TRACE;Import"
29-
$newPropertyGroup.AppendChild($defineConstants)
30-
$xmlDoc.Project.AppendChild($newPropertyGroup)
31-
$xmlDoc.Save($projectPath)
32-
3323
cd "$(defaultWorkingDir)"
3424
dotnet build --configuration TEST
3525
Get-ChildItem -Path "$(testsFolderPath)" -Recurse -Directory -Include "ref", "refint", "obj" | ForEach-Object { Remove-Item $_.FullName -Recurse -Force }

job-template.yml

-13
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,4 @@ jobs:
5656
codeCoverageEnabled: true
5757
uiTests: true
5858
runSettingsFile: $(runSettingsPath)
59-
otherConsoleOptions: '/Diag:vstestlog.txt'
60-
- task: CopyFiles@2
61-
displayName: Copy vstestlog logs to staging
62-
inputs:
63-
contents: '**/*vstestlog*.txt'
64-
targetFolder: $(Build.ArtifactStagingDirectory)/vstestlog
65-
condition: always()
66-
- task: PublishPipelineArtifact@1
67-
displayName: Publish vstestlog log
68-
inputs:
69-
targetPath: $(Build.ArtifactStagingDirectory)/vstestlog
70-
artifactName: vstestlog-$(Agent.JobName)-$(Build.BuildId)
71-
condition: always()
7259

0 commit comments

Comments
 (0)