Skip to content

Commit 4a32034

Browse files
committed
Added selenium tests project and made the deploy run those tests
1 parent 5080dfd commit 4a32034

File tree

8 files changed

+144
-11
lines changed

8 files changed

+144
-11
lines changed

.github/workflows/update-conf-2024-deploy.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ jobs:
4242
PULUMI_PATH: ${{ github.workspace }}/update-conference-prague-2024/demo-code-feedback-system/infra
4343
PULUMI_ACCESS_TOKEN: ${{ secrets.pulumi_access_token }}
4444
PULUMI_PROJECT_FILE_PATH: ${{ github.workspace }}/update-conference-prague-2024/demo-code-feedback-system/infra/PulumiInfra.csproj
45+
PLAYWRIGHT_TESTS_PATH: ${{ github.workspace }}/update-conference-prague-2024/demo-code-feedback-system/src/UiTests
4546

4647
steps:
4748
- uses: actions/checkout@v2
@@ -75,4 +76,4 @@ jobs:
7576
uses: pulumi/setup-pulumi@v2
7677

7778
- name: Cake Frosting - Deploy
78-
run: dotnet run --project ${{ env.ROOT_DIRECTORY_PATH }}/deploy/deploy/Deploy.csproj -- --configuration=${{ env.CONFIGURATION }} --PulumiStackName=${{ inputs.pulumi_stack_name }} --ReleaseVersion=${{ inputs.release_tag_id }} --WorkspacePath=${{ github.workspace }} --ReleaseArtifactsDownloadDir=${{ env.ARTIFACT_DOWNLOAD_PATH }} --PulumiPath=${{ env.PULUMI_PATH }}
79+
run: dotnet run --project ${{ env.ROOT_DIRECTORY_PATH }}/deploy/deploy/Deploy.csproj -- --configuration=${{ env.CONFIGURATION }} --PulumiStackName=${{ inputs.pulumi_stack_name }} --ReleaseVersion=${{ inputs.release_tag_id }} --WorkspacePath=${{ github.workspace }} --ReleaseArtifactsDownloadDir=${{ env.ARTIFACT_DOWNLOAD_PATH }} --PulumiPath=${{ env.PULUMI_PATH }} --PlaywrightTestsPath=${{ env.PLAYWRIGHT_TESTS_PATH }}

update-conference-prague-2024/demo-code-feedback-system/deploy/deploy/Program.cs

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.IO;
34
using System.IO.Compression;
5+
using System.Linq;
46
using System.Threading.Tasks;
7+
using System.Xml.Linq;
58

9+
using Cake.Common.Tools.DotNet;
10+
using Cake.Common.Tools.DotNet.Restore;
11+
using Cake.Common.Tools.DotNet.Test;
612
using Cake.Core;
713
using Cake.Core.Diagnostics;
814
using Cake.Frosting;
@@ -24,6 +30,7 @@ public class BuildContext : FrostingContext
2430
public string WorkspacePath { get; }
2531
public string PulumiPath { get; }
2632
public string PulumiStackName { get; }
33+
public string PlaywrightTestsPath { get; }
2734
public string ReleaseVersion { get; }
2835
public string ReleaseArtifactsDownloadDir { get; }
2936
public string UnzippedArtifactsDir { get; }
@@ -34,8 +41,9 @@ public BuildContext(ICakeContext context)
3441
WorkspacePath = LoadParameter(context, nameof(WorkspacePath));
3542
PulumiStackName = LoadParameter(context, nameof(PulumiStackName));
3643
ReleaseVersion = LoadParameter(context, nameof(ReleaseVersion));
37-
3844
PulumiPath = LoadParameter(context, nameof(PulumiPath));
45+
PlaywrightTestsPath = LoadParameter(context, nameof(PlaywrightTestsPath));
46+
3947
ReleaseArtifactsDownloadDir = LoadParameter(context, nameof(ReleaseArtifactsDownloadDir));
4048
UnzippedArtifactsDir = WorkspacePath + "/unzipped_artifacts";
4149
}
@@ -137,8 +145,59 @@ public override async Task RunAsync(BuildContext context)
137145
}
138146
}
139147

140-
[TaskName("Default")]
141148
[IsDependentOn(typeof(PulumiDeployTask))]
149+
[TaskName(nameof(RunSeleniumTestsTask))]
150+
public sealed class RunSeleniumTestsTask : AsyncFrostingTask<BuildContext>
151+
{
152+
public override async Task RunAsync(BuildContext context)
153+
{
154+
await WriteConfigAsync(context);
155+
await RunTestsAsync(context);
156+
}
157+
158+
private async Task RunTestsAsync(BuildContext context)
159+
{
160+
var testSettings = new DotNetTestSettings()
161+
{
162+
Configuration = "Debug",
163+
NoBuild = false,
164+
NoRestore = false,
165+
ArgumentCustomization = (args) => args.Append("/p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --logger trx")
166+
};
167+
168+
var projectPath = $"{context.PlaywrightTestsPath}/UiTests.csproj";
169+
context.DotNetTest(projectPath, testSettings);
170+
171+
await Task.CompletedTask;
172+
}
173+
174+
private async ValueTask WriteConfigAsync(BuildContext context)
175+
{
176+
var fullStackName = $"ProgrammerAL/{context.PulumiStackName}";
177+
178+
context.Log.Information($"Loading stack {fullStackName} from path '{context.PulumiPath}' to get outputs");
179+
180+
var stackArgs = new LocalProgramArgs(fullStackName, context.PulumiPath);
181+
var pulumiStack = await LocalWorkspace.SelectStackAsync(stackArgs);
182+
var stackOutputs = await pulumiStack.GetOutputsAsync();
183+
var staticSiteEndpoint = stackOutputs["StaticSiteHttpsEndpoint"].Value.ToString() ?? throw new Exception($"Pulumi output 'StaticSiteHttpsEndpoint' is null for stack '{fullStackName}'");
184+
185+
186+
// Write the config file
187+
var filePath = $"{context.PlaywrightTestsPath}/.runsettings";
188+
var runsettingsXml = XElement.Load(filePath);
189+
var baseUrlElement = runsettingsXml.Element("RunSettings")
190+
!.Element("TestRunParameters")
191+
!.Elements("Parameter")
192+
.Single(x => x.Attribute("baseUrl") != null);
193+
baseUrlElement.Value = staticSiteEndpoint;
194+
195+
File.WriteAllText(filePath, runsettingsXml.ToString());
196+
}
197+
}
198+
199+
[TaskName("Default")]
200+
[IsDependentOn(typeof(RunSeleniumTestsTask))]
142201
public class DefaultTask : FrostingTask
143202
{
144203
}

update-conference-prague-2024/demo-code-feedback-system/src/FeedbackApp.sln

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FeedbackFunctionsApp", "Fee
77
EndProject
88
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FeedbackWebApp", "FeedbackWebApp\FeedbackWebApp.csproj", "{20617955-1BDA-4561-AA45-15BC612BDA28}"
99
EndProject
10-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "UnitTests\UnitTests.csproj", "{55D0AED2-CEA1-4629-BA5D-9A968D7A0C93}"
10+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests", "UnitTests\UnitTests.csproj", "{55D0AED2-CEA1-4629-BA5D-9A968D7A0C93}"
11+
EndProject
12+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UiTests", "UiTests\UiTests.csproj", "{57195017-45F2-45C4-82C1-DED66E487E17}"
13+
EndProject
14+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{C1DEE17B-1AB8-418E-B53A-8656BCA40866}"
1115
EndProject
1216
Global
1317
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,10 +31,18 @@ Global
2731
{55D0AED2-CEA1-4629-BA5D-9A968D7A0C93}.Debug|Any CPU.Build.0 = Debug|Any CPU
2832
{55D0AED2-CEA1-4629-BA5D-9A968D7A0C93}.Release|Any CPU.ActiveCfg = Release|Any CPU
2933
{55D0AED2-CEA1-4629-BA5D-9A968D7A0C93}.Release|Any CPU.Build.0 = Release|Any CPU
34+
{57195017-45F2-45C4-82C1-DED66E487E17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
35+
{57195017-45F2-45C4-82C1-DED66E487E17}.Debug|Any CPU.Build.0 = Debug|Any CPU
36+
{57195017-45F2-45C4-82C1-DED66E487E17}.Release|Any CPU.ActiveCfg = Release|Any CPU
37+
{57195017-45F2-45C4-82C1-DED66E487E17}.Release|Any CPU.Build.0 = Release|Any CPU
3038
EndGlobalSection
3139
GlobalSection(SolutionProperties) = preSolution
3240
HideSolutionNode = FALSE
3341
EndGlobalSection
42+
GlobalSection(NestedProjects) = preSolution
43+
{55D0AED2-CEA1-4629-BA5D-9A968D7A0C93} = {C1DEE17B-1AB8-418E-B53A-8656BCA40866}
44+
{57195017-45F2-45C4-82C1-DED66E487E17} = {C1DEE17B-1AB8-418E-B53A-8656BCA40866}
45+
EndGlobalSection
3446
GlobalSection(ExtensibilityGlobals) = postSolution
3547
SolutionGuid = {A58B1C52-AE2E-415E-8C29-086593326274}
3648
EndGlobalSection

update-conference-prague-2024/demo-code-feedback-system/src/FeedbackWebApp/Pages/Comments.razor

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,24 @@
88
<div class="row">
99
<p>Enter Comments:</p>
1010
<textarea @bind=@FeedbackText
11-
cols="40"
12-
rows="5"
13-
disabled="@(PageState == PageStateType.Submitting)"></textarea>
11+
id="comments-area"
12+
cols="40"
13+
rows="5"
14+
disabled="@(PageState == PageStateType.Submitting)"></textarea>
1415
</div>
1516
<div class="row p-2">
1617
@if (PageState == PageStateType.Submitting)
1718
{
1819
<p>Submitting...</p>
1920
}
20-
else
21+
else if(PageState == PageStateType.Initial)
2122
{
2223
<button @onclick="SubmitFeedbackAsync" class="btn-primary">Submit</button>
2324
}
25+
else if(PageState == PageStateType.Submitted)
26+
{
27+
<p id="comment-confirmation">Comment submitted</p>
28+
}
2429
</div>
2530

2631
@if (!string.IsNullOrWhiteSpace(ErrorResult))
@@ -41,14 +46,15 @@
4146
{
4247
await UpdatePageStateAsync(PageStateType.Submitting);
4348
var result = await FeedbackHttpClient.SubmitCommentsAsync(FeedbackText);
44-
await UpdatePageStateAsync(PageStateType.Initial);
4549

4650
if (result.IsSuccessStatusCode)
4751
{
52+
await UpdatePageStateAsync(PageStateType.Submitted);
4853
FeedbackText = "";
4954
}
5055
else
5156
{
57+
await UpdatePageStateAsync(PageStateType.Initial);
5258
ErrorResult = await result.Content.ReadAsStringAsync();
5359
}
5460
}
@@ -63,6 +69,7 @@
6369
public enum PageStateType
6470
{
6571
Initial,
66-
Submitting
72+
Submitting,
73+
Submitted
6774
}
6875
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"ApiConfig": {
3-
"FeedbackEndpoint": "https://functions-appe23034f2.azurewebsites.net/api"
3+
"FeedbackEndpoint": " http://localhost:7025/api"
44
}
55
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RunSettings>
3+
4+
<TestRunParameters>
5+
<Parameter name="baseUrl" value="http://localhost:1234" />
6+
</TestRunParameters>
7+
8+
</RunSettings>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Microsoft.Playwright.MSTest;
2+
3+
namespace UiTests;
4+
5+
[TestClass]
6+
public class FeedbackTests : PageTest
7+
{
8+
[TestMethod]
9+
public async Task WhenCommentsProvided_SubmitSuccessful()
10+
{
11+
var url = $"{TestContext.Properties["baseUrl"]}/comments";
12+
await Page.GotoAsync(url);
13+
14+
await Page.GetByTestId("comments-area").First.FillAsync($"Comment from WhenCommentsProvided_SubmitSuccessful - {DateTime.UtcNow}");
15+
await Page.ClickAsync("Submit");
16+
17+
await Expect(Page.GetByTestId("comment-confirmation")).ToBeVisibleAsync();
18+
}
19+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
<IsTestProject>true</IsTestProject>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="coverlet.collector" Version="6.0.2">
14+
<PrivateAssets>all</PrivateAssets>
15+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
16+
</PackageReference>
17+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
18+
<PackageReference Include="Microsoft.Playwright.MSTest" Version="1.48.0" />
19+
<PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
20+
<PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
21+
</ItemGroup>
22+
23+
<ItemGroup>
24+
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
25+
</ItemGroup>
26+
27+
</Project>

0 commit comments

Comments
 (0)