diff --git a/.github/workflows/android_e2e_tests.yml b/.github/workflows/android_e2e_tests.yml
index 7c7327dde..22de3114d 100644
--- a/.github/workflows/android_e2e_tests.yml
+++ b/.github/workflows/android_e2e_tests.yml
@@ -155,7 +155,7 @@ jobs:
run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net10.0-android -c Release --no-restore
- name: Run Android Navigation Tests
- run: dotnet test TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj --filter "(Category=PRTest)&(Category=Android)" --no-restore
+ run: dotnet test TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj --filter "FullyQualifiedName~EndToEndTestsFeature&Category=Android|FullyQualifiedName~ReportingFeature" --no-restore
- name: Upload Logs on Failure
if: always()
diff --git a/.github/workflows/android_navigation_tests.yml b/.github/workflows/android_navigation_tests.yml
index cdf470f3a..82be6004b 100644
--- a/.github/workflows/android_navigation_tests.yml
+++ b/.github/workflows/android_navigation_tests.yml
@@ -142,7 +142,7 @@ jobs:
run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net10.0-android -c Release --no-restore
- name: Run Android Navigation Tests
- run: dotnet test TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj --filter "(Category=PRNavTest)&(Category=Android)" --no-restore
+ run: dotnet test TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj --filter "FullyQualifiedName~PageNavigationFeature&Category=Android" --no-restore
- name: Upload Appium Logs on Failure
if: always()
@@ -287,7 +287,7 @@ jobs:
run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net10.0-android -c Release --no-restore
- name: Run Android Navigation Tests
- run: dotnet test TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj --filter "(Category=PRHWNavTest)&(Category=Android)" --no-restore
+ run: dotnet test TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj --filter "FullyQualifiedName~HardwarePageNavigationFeature&Category=Android" --no-restore
- name: Upload Appium Logs on Failure
if: always()
diff --git a/.github/workflows/windows_e2e_tests.yml b/.github/workflows/windows_e2e_tests.yml
index 44379f3e1..06f95d514 100644
--- a/.github/workflows/windows_e2e_tests.yml
+++ b/.github/workflows/windows_e2e_tests.yml
@@ -72,7 +72,7 @@ jobs:
}
- name: Run Windows End To End Tests
- run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "Category=PRTest&Category=Windows" --no-restore
+ run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "FullyQualifiedName~EndToEndTestsFeature&Category=Windows|FullyQualifiedName~ReportingFeature" --no-restore
#run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --list-tests -v:d
- name: Upload Logs on Failure
diff --git a/.github/workflows/windows_navigation_tests.yml b/.github/workflows/windows_navigation_tests.yml
index eece68666..653971551 100644
--- a/.github/workflows/windows_navigation_tests.yml
+++ b/.github/workflows/windows_navigation_tests.yml
@@ -87,7 +87,7 @@ jobs:
}
- name: Run Windows Navigation Tests
- run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "(Category=PRNavTest)&(Category=Windows)" --no-restore
+ run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "FullyQualifiedName~PageNavigationFeature&Category=Windows" --no-restore
- name: Upload Appium Logs on Failure
if: always()
diff --git a/Directory.Packages.props b/Directory.Packages.props
index fc5b05730..3d599a954 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -3,23 +3,23 @@
true
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -28,24 +28,24 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/ModelTests/AutomationIdHelperTests.cs b/TransactionProcessor.Mobile.BusinessLogic.Tests/ModelTests/AutomationIdHelperTests.cs
new file mode 100644
index 000000000..3f98f612a
--- /dev/null
+++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/ModelTests/AutomationIdHelperTests.cs
@@ -0,0 +1,28 @@
+using Shouldly;
+using TransactionProcessor.Mobile.BusinessLogic.Models;
+
+namespace TransactionProcessor.Mobile.BusinessLogic.Tests.ModelTests;
+
+public class AutomationIdHelperTests
+{
+ [Fact]
+ public void Create_ReplacesUnsupportedCharactersWithUnderscores()
+ {
+ AutomationIdHelper.Create("RecentActivityResult", "TXN-10001")
+ .ShouldBe("RecentActivityResult_TXN_10001");
+ }
+
+ [Fact]
+ public void Create_TrimsAndCollapsesSeparators()
+ {
+ AutomationIdHelper.Create("TransactionMixItem", " bill-pay-post ")
+ .ShouldBe("TransactionMixItem_bill_pay_post");
+ }
+
+ [Fact]
+ public void Create_ReturnsPrefixForEmptyValues()
+ {
+ AutomationIdHelper.Create("TransactionMixItem", " ")
+ .ShouldBe("TransactionMixItem");
+ }
+}
diff --git a/TransactionProcessor.Mobile.BusinessLogic/Models/AutomationIdHelper.cs b/TransactionProcessor.Mobile.BusinessLogic/Models/AutomationIdHelper.cs
new file mode 100644
index 000000000..17da49f47
--- /dev/null
+++ b/TransactionProcessor.Mobile.BusinessLogic/Models/AutomationIdHelper.cs
@@ -0,0 +1,53 @@
+namespace TransactionProcessor.Mobile.BusinessLogic.Models;
+
+public static class AutomationIdHelper
+{
+ public static string Create(string prefix, string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return prefix;
+ }
+
+ var builder = new System.Text.StringBuilder(prefix.Length + value.Length + 1);
+ builder.Append(prefix);
+ builder.Append('_');
+
+ bool appendedCharacter = false;
+ bool lastWasSeparator = false;
+
+ foreach (char character in value.Trim())
+ {
+ char sanitized = char.IsLetterOrDigit(character) ? character : '_';
+
+ if (sanitized == '_')
+ {
+ if (lastWasSeparator)
+ {
+ continue;
+ }
+
+ lastWasSeparator = true;
+ }
+ else
+ {
+ lastWasSeparator = false;
+ }
+
+ builder.Append(sanitized);
+ appendedCharacter = true;
+ }
+
+ if (appendedCharacter == false)
+ {
+ return prefix;
+ }
+
+ if (builder.Length > 0 && builder[^1] == '_')
+ {
+ builder.Length--;
+ }
+
+ return builder.ToString();
+ }
+}
diff --git a/TransactionProcessor.Mobile.BusinessLogic/Models/RecentActivityReceiptReportModel.cs b/TransactionProcessor.Mobile.BusinessLogic/Models/RecentActivityReceiptReportModel.cs
index 324d7fe4d..ebe6cb5ed 100644
--- a/TransactionProcessor.Mobile.BusinessLogic/Models/RecentActivityReceiptReportModel.cs
+++ b/TransactionProcessor.Mobile.BusinessLogic/Models/RecentActivityReceiptReportModel.cs
@@ -69,6 +69,8 @@ public sealed record RecentActivityReceiptItemModel(string Reference,
DateTime TransactionDateTime,
string ReceiptReference)
{
+ public string AutomationId => AutomationIdHelper.Create("RecentActivityResult", this.Reference);
+
public bool Matches(string searchText)
{
return this.Reference.Contains(searchText, StringComparison.OrdinalIgnoreCase)
diff --git a/TransactionProcessor.Mobile.BusinessLogic/Models/TransactionMixSummaryModel.cs b/TransactionProcessor.Mobile.BusinessLogic/Models/TransactionMixSummaryModel.cs
index 769e10256..31ff2ef97 100644
--- a/TransactionProcessor.Mobile.BusinessLogic/Models/TransactionMixSummaryModel.cs
+++ b/TransactionProcessor.Mobile.BusinessLogic/Models/TransactionMixSummaryModel.cs
@@ -75,7 +75,10 @@ public static TransactionMixSummaryModel CreateMock(int merchantReportingId,
public sealed record TransactionMixSummaryItemModel(string Key,
string Label,
decimal Count,
- decimal Value);
+ decimal Value)
+{
+ public string AutomationId => AutomationIdHelper.Create("TransactionMixItem", this.Key);
+}
public sealed record TransactionMixDrillDownTransactionModel(string Reference,
string TransactionType,
diff --git a/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs b/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs
index 1143277cc..112ccaaf7 100644
--- a/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs
+++ b/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs
@@ -12,6 +12,7 @@
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
+using TestHosts.Clients;
using TransactionProcessor.Client;
using TransactionProcessor.DataTransferObjects.Responses.Contract;
using TransactionProcessor.IntegrationTesting.Helpers;
@@ -42,6 +43,8 @@ public class DockerHelper : global::Shared.IntegrationTesting.TestContainers.Doc
private readonly TestingContext TestingContext;
+ public IAgencyBankingClient AgencyBankingClient;
+
#endregion
public EventStoreProjectionManagementClient ProjectionManagementClient;
@@ -119,6 +122,16 @@ Object Deserialise(String arg, Type type)
return StringSerialiser.DeserializeObject