Skip to content

Commit 2c430b4

Browse files
radicaleerhardtjoperezr
authored
[tests] Workload tests (dotnet#4168)
This adds `Aspire.Workload.Tests` which are meant to exercise the `aspire` workload. The individual tests create projects from templates just like a user would, and then run, and validate them. It uses the existing infrastructure from `Aspire.EndToEnd.Tests` to install sdk+workload for testing. - Enables tests on Linux, and Windows - Because we don't have docker support on helix/Windows yet, the docker dependent tests are skipped on windows ## Tests Two kinds of tests are being added here: 1. Tests that create+build a `aspire-starter` template project, and then some tests interact with that running app to validate it 2. Individual tests exercise the various templates, for example to create `aspire-starter` with [xunit,nunit,mstest] options - The tests also connect to the dashboard and validate that the expected services show up as expected using `Playwright`. - Some tests also connect to the webapp in `aspire-starter` template to validate some parts of it. Fixes dotnet#47 . Follow up work is tracked in dotnet#4222 Co-authored-by: Eric Erhardt <[email protected]> Co-authored-by: Jose Perez Rodriguez <[email protected]>
1 parent cc501f3 commit 2c430b4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1538
-168
lines changed

Aspire.sln

+7
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrleansClient", "playground
449449
EndProject
450450
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrleansContracts", "playground\orleans\OrleansContracts\OrleansContracts.csproj", "{75760E8A-7025-4F6A-B152-6622688D0E7D}"
451451
EndProject
452+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aspire.Workload.Tests", "tests\Aspire.Workload.Tests\Aspire.Workload.Tests.csproj", "{3ECB176E-3CC8-4BEE-AF48-F439F9742C8B}"
453+
EndProject
452454
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aspire.Seq.Tests", "tests\Aspire.Seq.Tests\Aspire.Seq.Tests.csproj", "{0505F739-6F85-4502-A554-77E0D7325F26}"
453455
EndProject
454456
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Extensions.ServiceDiscovery.Yarp.Tests", "tests\Microsoft.Extensions.ServiceDiscovery.Yarp.Tests\Microsoft.Extensions.ServiceDiscovery.Yarp.Tests.csproj", "{B5D637F3-7E44-4C7D-AE4B-D56D400671CD}"
@@ -1183,6 +1185,10 @@ Global
11831185
{8191109E-130C-47F3-B84E-82070A6CD269}.Debug|Any CPU.Build.0 = Debug|Any CPU
11841186
{8191109E-130C-47F3-B84E-82070A6CD269}.Release|Any CPU.ActiveCfg = Release|Any CPU
11851187
{8191109E-130C-47F3-B84E-82070A6CD269}.Release|Any CPU.Build.0 = Release|Any CPU
1188+
{3ECB176E-3CC8-4BEE-AF48-F439F9742C8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1189+
{3ECB176E-3CC8-4BEE-AF48-F439F9742C8B}.Debug|Any CPU.Build.0 = Debug|Any CPU
1190+
{3ECB176E-3CC8-4BEE-AF48-F439F9742C8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
1191+
{3ECB176E-3CC8-4BEE-AF48-F439F9742C8B}.Release|Any CPU.Build.0 = Release|Any CPU
11861192
{906B5687-31AD-4364-AD9F-B4B26113462D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
11871193
{906B5687-31AD-4364-AD9F-B4B26113462D}.Debug|Any CPU.Build.0 = Debug|Any CPU
11881194
{906B5687-31AD-4364-AD9F-B4B26113462D}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -1423,6 +1429,7 @@ Global
14231429
{E0E1B557-D3CF-4446-B993-E5CE719234FB} = {27381127-6C45-4B4C-8F18-41FF48DFE4B2}
14241430
{A9CFA376-0C90-4231-9152-FBF14065195A} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60}
14251431
{8191109E-130C-47F3-B84E-82070A6CD269} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60}
1432+
{3ECB176E-3CC8-4BEE-AF48-F439F9742C8B} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60}
14261433
{906B5687-31AD-4364-AD9F-B4B26113462D} = {8BAF2119-8370-4E9E-A887-D92506F8C727}
14271434
{75760E8A-7025-4F6A-B152-6622688D0E7D} = {8BAF2119-8370-4E9E-A887-D92506F8C727}
14281435
{0505F739-6F85-4502-A554-77E0D7325F26} = {4981B3A5-4AFD-4191-BF7D-8692D9783D60}

Directory.Packages.props

+1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
<PackageVersion Include="Microsoft.DotNet.XUnitExtensions" Version="$(MicrosoftDotNetXUnitExtensionsPackageVersion)" />
142142
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Testing" Version="$(MicrosoftExtensionsDiagnosticsTestingPackageVersion)" />
143143
<PackageVersion Include="Microsoft.NET.Runtime.WorkloadTesting.Internal" Version="$(MicrosoftNETRuntimeWorkloadTestingInternalVersion)" />
144+
<PackageVersion Include="Microsoft.Playwright" Version="1.42.0" />
144145
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.6.1" />
145146
<PackageVersion Include="Testcontainers.MongoDb" Version="$(TestcontainersPackageVersion)" />
146147
<PackageVersion Include="Testcontainers.MsSql" Version="$(TestcontainersPackageVersion)" />

NuGet.config

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
<!-- Begin: Package sources from dotnet-runtime -->
1313
<!-- End: Package sources from dotnet-runtime -->
1414
<!--End: Package sources managed by Dependency Flow automation. Do not edit the sources above.-->
15-
<!-- TEST_RESTORE_SOURCES_INSERTION_LINE -->
1615
<add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" />
1716
<add key="dotnet-eng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" />
1817
<add key="dotnet8" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json" />

dogfood.sh

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
if [ -z "$ZSH_VERSION" ]; then
2+
source="${BASH_SOURCE[0]}"
3+
# resolve $SOURCE until the file is no longer a symlink
4+
while [[ -h $source ]]; do
5+
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
6+
source="$(readlink "$source")"
7+
8+
# if $source was a relative symlink, we need to resolve it relative to the path where the
9+
# symlink file was located
10+
[[ $source != /* ]] && source="$scriptroot/$source"
11+
done
12+
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
13+
else
14+
# :A will resolve all symlinks, :h will truncate last path component leaving you with a directory name
15+
scriptroot=${0:A:h}
16+
fi
17+
18+
REPO_ROOT=$(cd "${scriptroot}";pwd)
19+
SDK_PATH=$REPO_ROOT/artifacts/bin/dotnet-latest
20+
if [ ! -x "$SDK_PATH/dotnet" ]; then
21+
echo "Error: Could not find dotnet at $SDK_PATH/dotnet"
22+
return
23+
fi
24+
25+
CONFIG=$1
26+
if [ -n "$CONFIG" ]; then
27+
PKG_DIR=$REPO_ROOT/artifacts/packages/$CONFIG/Shipping
28+
if [ ! -d "$PKG_DIR" ]; then
29+
echo "Error: Could not find packages path $PKG_DIR for CONFIG=$CONFIG"
30+
return
31+
fi
32+
else
33+
PKG_DIR=$REPO_ROOT/artifacts/packages/Release/Shipping
34+
if [ ! -d "$PKG_DIR" ]; then
35+
PKG_DIR=$REPO_ROOT/artifacts/packages/Debug/Shipping
36+
fi
37+
if [ ! -d "$PKG_DIR" ]; then
38+
echo "Error: Could not find packages path in $REPO_ROOT/artifacts/packages for Release, or Debug configurations"
39+
return
40+
fi
41+
fi
42+
43+
echo "Adding $SDK_PATH to \$PATH"
44+
export PATH=$SDK_PATH:$PATH
45+
echo Setting BUILT_NUGETS_PATH="$PKG_DIR" to resolve locally built packages
46+
export BUILT_NUGETS_PATH=$PKG_DIR
47+
echo
48+
echo "Use $REPO_ROOT/tests/Aspire.Workload.Tests/data/nuget8.config as your local nuget.config to ensure the packages can be restored."

eng/pipelines/templates/BuildAndTest.yml

+13-29
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,14 @@ parameters:
2121
default: false
2222

2323
steps:
24-
- ${{ if eq(parameters.isWindows, 'true') }}:
25-
- script: ${{ parameters.buildScript }}
26-
-restore -build
27-
-configuration ${{ parameters.buildConfig }}
28-
/p:ArchiveTests=true
29-
/bl:${{ parameters.repoLogPath }}/build.binlog
30-
$(_OfficialBuildIdArgs)
31-
displayName: Build
32-
- ${{ if ne(parameters.isWindows, 'true') }}:
33-
# temporary: Use -pack for linux as it is required for workload testing
34-
# Issue: https://github.com/dotnet/aspire/issues/2687
35-
- script: ${{ parameters.buildScript }}
36-
-restore -build
37-
-pack
38-
-configuration ${{ parameters.buildConfig }}
39-
/p:ArchiveTests=true
40-
/bl:${{ parameters.repoLogPath }}/build.binlog
41-
$(extraBuildArgs)
42-
$(_OfficialBuildIdArgs)
43-
displayName: Build
24+
- script: ${{ parameters.buildScript }}
25+
-restore -build
26+
-pack
27+
-configuration ${{ parameters.buildConfig }}
28+
/p:ArchiveTests=true
29+
/bl:${{ parameters.repoLogPath }}/build.binlog
30+
$(_OfficialBuildIdArgs)
31+
displayName: Build
4432

4533
- ${{ if ne(parameters.skipTests, 'true') }}:
4634
- script: ${{ parameters.dotnetScript }} dotnet-coverage collect
@@ -49,15 +37,11 @@ steps:
4937
"${{ parameters.buildScript }} -testnobuild -test -configuration ${{ parameters.buildConfig }} /bl:${{ parameters.repoLogPath }}/tests.binlog $(_OfficialBuildIdArgs)"
5038
displayName: Run non-helix tests
5139

52-
- ${{ if ne(parameters.isWindows, 'true') }}:
53-
# E2E tests are disabled on windows for now
54-
- script: ${{ parameters.buildScript }}
55-
-p:ContinuousIntegrationBuild=true
56-
-p:Configuration=${{ parameters.buildConfig }}
57-
-p:TriggerInstallWorkloadForTesting=true
58-
-bl:${{ parameters.repoLogPath }}/WorkloadInstallForTesting.binlog
59-
--projects $(Build.SourcesDirectory)/tests/Aspire.EndToEnd.Tests/Aspire.EndToEnd.Tests.csproj
60-
displayName: Install sdk+workload for testing
40+
- script: ${{ parameters.buildScript }}
41+
/p:Configuration=${{ parameters.buildConfig }}
42+
/bl:${{ parameters.repoLogPath }}/WorkloadInstallForTesting.binlog
43+
-projects $(Build.SourcesDirectory)/tests/workloads.proj
44+
displayName: Install sdk+workload for testing
6145

6246
# Helix captures code coverage information and, once tests are complete, the code coverage information is
6347
# downloaded to <repo root>/artifacts/helixresults folder.

tests/Aspire.EndToEnd.Tests/Aspire.EndToEnd.Tests.csproj

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
<TestUsingWorkloads Condition="! ('$(ContinuousIntegrationBuild)' == 'true' and '$(OS)' == 'Windows_NT')">true</TestUsingWorkloads>
1212
<InstallWorkloadForTesting>$(TestUsingWorkloads)</InstallWorkloadForTesting>
1313

14-
<BuiltNuGetsDir>$(ArtifactsShippingPackagesDir)</BuiltNuGetsDir>
15-
<PackageVersionForWorkloadManifests>$(PackageVersion)</PackageVersionForWorkloadManifests>
1614
<TestsRunningOutsideOfRepo Condition="'$(TestsRunningOutsideOfRepo)' == '' and '$(ContinuousIntegrationBuild)' == 'true'">true</TestsRunningOutsideOfRepo>
1715
<DefineConstants Condition="'$(TestsRunningOutsideOfRepo)' == 'true'">TESTS_RUNNING_OUTSIDE_OF_REPO;$(DefineConstants)</DefineConstants>
1816

@@ -23,7 +21,6 @@
2321

2422
<ItemGroup>
2523
<Compile Include="..\testproject\Common\TestResourceNames.cs" />
26-
<Compile Include="..\Shared\WorkloadTesting\*.cs" Link="WorkloadTestingCommon" />
2724

2825
<None Include="..\testproject\**\*" Link="testassets\testproject\%(RecursiveDir)%(FileName)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
2926
<None Include="..\.editorconfig" Link="testassets\%(FileName)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
@@ -33,4 +30,6 @@
3330
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
3431
<PackageReference Include="Microsoft.DotNet.XUnitExtensions" />
3532
</ItemGroup>
33+
34+
<Import Project="..\Shared\WorkloadTesting\Aspire.Shared.WorkloadTesting.targets" />
3635
</Project>

tests/Aspire.EndToEnd.Tests/Directory.Build.props

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<Project>
22
<PropertyGroup>
3+
<!-- This triggers the import of targets needed for workload testing -->
34
<IsWorkloadTestProject>true</IsWorkloadTestProject>
45
</PropertyGroup>
56

tests/Aspire.EndToEnd.Tests/README.md

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Aspire.EndToEnd.Tests
2+
3+
## TL;DR or How do I use this?
4+
5+
### Steps to prepare for `outside-of-repo` runs
6+
7+
1. [Install the sdk+workload](../Aspire.Workload.Tests/README.md#install-the-sdkworkload)
8+
9+
### Using it from VS
10+
11+
- For switching to `outside-of-repo` add `<TestsRunningOutsideOfRepo>true</TestsRunningOutsideOfRepo>` to `tests/Aspire.EndToEnd.Tests/Directory.Build.props` *before* any imports.
12+
- tests cannot be run at this point as they will fail complaining about `artifacts/bin/dotnet-latest` being missing
13+
- Install the sdk+workload following the steps above
14+
- Run/debug the tests normally now, and they will be using the sdk
15+
- Also note that in this case the testproject is run from the bindir for `Aspire.EndToEnd.Tests`, so a path like `artifacts/bin/Aspire.EndToEnd.Tests/Debug/net8.0/testassets/testproject/`
16+
17+
### Using it from command line
18+
19+
- When running the tests you can either:
20+
- set `<TestsRunningOutsideOfRepo>true</TestsRunningOutsideOfRepo>` to `tests/Aspire.EndToEnd.Tests/Directory.props` before any imports
21+
- or set the environment variable `TestsRunningOutsideOfRepo=true`
22+
23+
## (details) What is the goal here?
24+
25+
1. We want to run some EndToEnd tests on CI, which can `dotnet run` an aspire project,
26+
and allow individual tests to interact with the services.
27+
This requires:
28+
29+
- Ability to build, and run an aspire project - IOW, a sdk with the `aspire` workload installed.
30+
- `docker`
31+
32+
2. Also, allow using `TestProject.*` in `tests/testproject`, in two modes:
33+
- `in-repo` test run which directly reference aspire projects, and repo targets
34+
- `outside-of-repo` test runs which uses a SDK+workload based on local build output
35+
36+
## Solution:
37+
38+
### SDK+workload
39+
40+
[Sdk+workload](../Aspire.Workload.Tests/README.md#solution-sdkworkload)
41+
42+
### TestProject
43+
44+
- This can switch between the two test run modes using the msbuild property `$(TestsRunningOutsideOfRepo)`
45+
- when running `in-repo` the test project directly references hosting targets, and aspire projects via `ProjectReference`
46+
- when running `outside-of-repo` the `ProjectReferences` and imports are replaced with `PackageReferences` to the Aspire nugets
47+
- Default is to run `in-repo`
48+
49+
### Helix
50+
51+
- The tests are built on the build machine
52+
- The testproject, and the sdk+workload is sent to helix
53+
- where the tests run using `dotnet` from the sdk+workload path
54+
- Since `docker` is needed to helix, this is enabled only for `Linux` in this PR. Blocked on https://github.com/dotnet/dnceng/issues/2067 for windows support.
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RunSettings>
3+
<RunConfiguration>
4+
<!-- Timeout in ms, 20 minutes -->
5+
<TestSessionTimeout>1200000</TestSessionTimeout>
6+
<!-- Filter out failing (wrong framework, platform, runtime or activeissue) tests -->
7+
<TestCaseFilter>category!=failing</TestCaseFilter>
8+
</RunConfiguration>
9+
<LoggerRunSettings>
10+
<Loggers>
11+
<Logger friendlyName="trx">
12+
<Configuration>
13+
<LogFileName>TestResults.trx</LogFileName>
14+
</Configuration>
15+
</Logger>
16+
<Logger friendlyName="console">
17+
<Configuration>
18+
<Verbosity>normal</Verbosity>
19+
</Configuration>
20+
</Logger>
21+
</Loggers>
22+
</LoggerRunSettings>
23+
</RunSettings>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>$(NetCurrent)</TargetFramework>
5+
6+
<RunTestsOnHelix>true</RunTestsOnHelix>
7+
<TestUsingWorkloads>true</TestUsingWorkloads>
8+
<InstallWorkloadForTesting>true</InstallWorkloadForTesting>
9+
10+
<XunitRunnerJson>xunit.runner.json</XunitRunnerJson>
11+
<RunSettingsFilePath>$(MSBuildThisFileDirectory).runsettings</RunSettingsFilePath>
12+
<TestArchiveTestsDir>$(TestArchiveTestsDirForWorkloadTests)</TestArchiveTestsDir>
13+
14+
<InstallChromeForPlaywright Condition="'$(InstallChromeForPlaywright)' == '' and '$(CODESPACES)' == 'true'">true</InstallChromeForPlaywright>
15+
<InstallChromeForPlaywright Condition="'$(InstallChromeForPlaywright)' == '' and '$(ArchiveTests)' == 'true' and '$(ContinuousIntegrationBuild)' == 'true'">true</InstallChromeForPlaywright>
16+
17+
<ExtractTestClassNamesForHelix Condition="'$(ContinuousIntegrationBuild)' == 'true' or '$(ArchiveTests)' == 'true'">true</ExtractTestClassNamesForHelix>
18+
</PropertyGroup>
19+
20+
<Import Project="..\Shared\provisioning.targets" />
21+
<Import Project="..\Shared\WorkloadTesting\Aspire.Shared.WorkloadTesting.targets" />
22+
23+
<ItemGroup>
24+
<Compile Include="$(RepoRoot)src\Aspire.Hosting.Redis\RedisContainerImageTags.cs" />
25+
26+
<None Include="data\**\*" CopyToOutputDirectory="PreserveNewest" />
27+
<None Include="$(RepoRoot)eng\helix\runtests.*" CopyToOutputDirectory="PreserveNewest" />
28+
29+
<PackageReference Include="Microsoft.DotNet.XUnitExtensions" />
30+
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
31+
</ItemGroup>
32+
33+
<!-- Used for running one helix job per test class -->
34+
<Target Name="_ExtractTestClassNames"
35+
Condition="'$(ExtractTestClassNamesForHelix)' == 'true'"
36+
BeforeTargets="ZipTestArchive">
37+
38+
<Exec Command="&quot;$(DotNetTool)&quot; test --no-build -c $(Configuration) -s $(RunSettingsFilePath) --list-tests --nologo -v:q -p:VsTestUseMSBuildOutput=false" ConsoleToMSBuild="true">
39+
<Output TaskParameter="ConsoleOutput" ItemName="_ListOfTestsLines" />
40+
</Exec>
41+
42+
<PropertyGroup>
43+
<_Regex>^\s*(Aspire.Workload.Tests[^\($]+)</_Regex>
44+
</PropertyGroup>
45+
<ItemGroup>
46+
<_TestLines0 Include="$([System.Text.RegularExpressions.Regex]::Match('%(_ListOfTestsLines.Identity)', '$(_Regex)'))" />
47+
<TestClassName Include="$([System.IO.Path]::GetFileNameWithoutExtension('%(_TestLines0.Identity)'))" />
48+
</ItemGroup>
49+
50+
<Error Text="No Aspire.Workload.Tests test classes found!" Condition="'@(TestClassName)' == ''" />
51+
52+
<WriteLinesToFile File="$(TestArchiveTestsDir)$(MSBuildProjectName).tests.list"
53+
Lines="@(TestClassName->Distinct())"
54+
Overwrite="true" />
55+
</Target>
56+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project>
2+
<PropertyGroup>
3+
<!-- This triggers the import of targets needed for workload testing -->
4+
<IsWorkloadTestProject>true</IsWorkloadTestProject>
5+
</PropertyGroup>
6+
7+
<Import Project="..\Directory.Build.props" />
8+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Xunit.Abstractions;
5+
6+
namespace Aspire.Workload.Tests;
7+
8+
/// <summary>
9+
/// This fixture ensures the TestProject.AppHost application is started before a test is executed.
10+
///
11+
/// Represents the the IntegrationServiceA project in the test application used to send HTTP requests
12+
/// to the project's endpoints.
13+
/// </summary>
14+
public sealed class EmptyTemplateRunFixture : TemplateAppFixture
15+
{
16+
public EmptyTemplateRunFixture(IMessageSink diagnosticMessageSink)
17+
: base(diagnosticMessageSink, "aspire")
18+
{
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Xunit;
5+
using Xunit.Abstractions;
6+
7+
namespace Aspire.Workload.Tests;
8+
9+
public class EmptyTemplateRunTests : WorkloadTestsBase, IClassFixture<EmptyTemplateRunFixture>
10+
{
11+
private readonly EmptyTemplateRunFixture _testFixture;
12+
13+
public EmptyTemplateRunTests(EmptyTemplateRunFixture fixture, ITestOutputHelper testOutput)
14+
: base(testOutput)
15+
{
16+
_testFixture = fixture;
17+
}
18+
19+
[Fact]
20+
public async Task ResourcesShowUpOnDashboad()
21+
{
22+
await using var context = await CreateNewBrowserContextAsync();
23+
await CheckDashboardHasResourcesAsync(
24+
await _testFixture.Project!.OpenDashboardPageAsync(context),
25+
[],
26+
timeoutSecs: 1_000);
27+
}
28+
}

0 commit comments

Comments
 (0)