diff --git a/.github/workflows/android_e2e_tests.yml b/.github/workflows/android_e2e_tests.yml index 7db2d2e34..974378f29 100644 --- a/.github/workflows/android_e2e_tests.yml +++ b/.github/workflows/android_e2e_tests.yml @@ -12,11 +12,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - name: Set up .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '9.0.x' - - name: Set up JDK uses: actions/setup-java@v3 with: @@ -48,7 +43,7 @@ jobs: # Accept licenses and install required components yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses # Install Android API level 35 and necessary system images - $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-35" "system-images;android-35;google_apis;x86_64" + $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-36" "system-images;android-36;google_apis;x86_64" # Export paths for future steps echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV @@ -59,11 +54,11 @@ jobs: uses: actions/cache@v3 with: path: ~/.android/avd - key: android-emulator-x86-${{ runner.os }}-android-35 + key: android-emulator-x86-${{ runner.os }}-android-36 - name: Create Android Emulator (x86) run: | - echo "no" | avdmanager create avd -n test_emulator -k "system-images;android-35;google_apis;x86_64" --device "pixel_4" + echo "no" | avdmanager create avd -n test_emulator -k "system-images;android-36;google_apis;x86_64" --device "pixel_4" - name: List AVDs run: avdmanager list avd @@ -124,7 +119,7 @@ jobs: - name: Install Android Build Tools run: | echo "Installing Android Build Tools..." - sdkmanager "build-tools;35.0.0" # Updated to use Android 34 build tools + sdkmanager "build-tools;36.0.0" # Updated to use Android 34 build tools sdkmanager --update - name: Install MAUI workloads @@ -157,7 +152,7 @@ jobs: run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - name: Build Code - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-android -c Release --no-restore + 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 diff --git a/.github/workflows/android_navigation_tests.yml b/.github/workflows/android_navigation_tests.yml index a2777d248..cdf470f3a 100644 --- a/.github/workflows/android_navigation_tests.yml +++ b/.github/workflows/android_navigation_tests.yml @@ -12,11 +12,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - name: Set up .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '9.0.x' - - name: Set up JDK uses: actions/setup-java@v3 with: @@ -48,7 +43,7 @@ jobs: # Accept licenses and install required components yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses # Install Android API level 35 and necessary system images - $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-35" "system-images;android-35;google_apis;x86_64" + $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-36" "system-images;android-36;google_apis;x86_64" # Export paths for future steps echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV @@ -59,11 +54,11 @@ jobs: uses: actions/cache@v3 with: path: ~/.android/avd - key: android-emulator-x86-${{ runner.os }}-android-35 + key: android-emulator-x86-${{ runner.os }}-android-36 - name: Create Android Emulator (x86) run: | - echo "no" | avdmanager create avd -n test_emulator -k "system-images;android-35;google_apis;x86_64" --device "pixel_4" + echo "no" | avdmanager create avd -n test_emulator -k "system-images;android-36;google_apis;x86_64" --device "pixel_4" - name: List AVDs run: avdmanager list avd @@ -124,7 +119,7 @@ jobs: - name: Install Android Build Tools run: | echo "Installing Android Build Tools..." - sdkmanager "build-tools;35.0.0" # Updated to use Android 35 build tools + sdkmanager "build-tools;36.0.0" # Updated to use Android 35 build tools sdkmanager --update - name: Install MAUI workloads @@ -144,7 +139,7 @@ jobs: run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - name: Build Code - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-android -c Release --no-restore + 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 @@ -162,11 +157,6 @@ jobs: - name: Checkout repository uses: actions/checkout@v2 - - name: Set up .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '9.0.x' - - name: Set up JDK uses: actions/setup-java@v3 with: @@ -198,7 +188,7 @@ jobs: # Accept licenses and install required components yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses # Install Android API level 35 and necessary system images - $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-35" "system-images;android-35;google_apis;x86_64" + $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-36" "system-images;android-36;google_apis;x86_64" # Export paths for future steps echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV @@ -209,11 +199,11 @@ jobs: uses: actions/cache@v3 with: path: ~/.android/avd - key: android-emulator-x86-${{ runner.os }}-android-35 + key: android-emulator-x86-${{ runner.os }}-android-36 - name: Create Android Emulator (x86) run: | - echo "no" | avdmanager create avd -n test_emulator -k "system-images;android-35;google_apis;x86_64" --device "pixel_4" + echo "no" | avdmanager create avd -n test_emulator -k "system-images;android-36;google_apis;x86_64" --device "pixel_4" - name: List AVDs run: avdmanager list avd @@ -274,7 +264,7 @@ jobs: - name: Install Android Build Tools run: | echo "Installing Android Build Tools..." - sdkmanager "build-tools;35.0.0" # Updated to use Android 35 build tools + sdkmanager "build-tools;36.0.0" # Updated to use Android 35 build tools sdkmanager --update - name: Install MAUI workloads @@ -294,7 +284,7 @@ jobs: run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - name: Build Code - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-android -c Release --no-restore + 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 diff --git a/.github/workflows/ios_e2e_tests - selfhosted.yml b/.github/workflows/ios_e2e_tests - selfhosted.yml deleted file mode 100644 index 87e606156..000000000 --- a/.github/workflows/ios_e2e_tests - selfhosted.yml +++ /dev/null @@ -1,207 +0,0 @@ -name: Build and Run iOS Navigation Tests - Self Hosted - -on: - pull_request: - branches: - - main - -jobs: - software_navigation_tests_self_hosted: - runs-on: [self-hosted, macOS] - #env: - # PLATFORM_VERSION: "18.5" - # DEVICE_NAME: "iPhone 16" - # APP_PATH: "./MyTestApp.app" - - steps: - - name: 🧾 Checkout repo - uses: actions/checkout@v4 - - #- name: 🔧 Set up Node.js - # uses: actions/setup-node@v4 - # with: - # node-version: '20' - - #- name: 🔧 Set up .NET - # uses: actions/setup-dotnet@v4 - # with: - # dotnet-version: '9.0.x' - - #- name: 📦 Install Appium + XCUITest driver - # run: | - # npm install -g appium - # appium driver install xcuitest - - #- name: 🧹 Clean DerivedData and WDA cache - # run: | - # rm -rf ~/Library/Developer/Xcode/DerivedData - # rm -rf ~/.appium/node_modules/appium-webdriveragent/Build - - #- name: 📱 Create iOS Simulator (if needed) - # run: | - # SIMULATOR_NAME="ci-sim-$RANDOM" - # xcrun simctl create "$SIMULATOR_NAME" "$DEVICE_NAME" "com.apple.CoreSimulator.SimRuntime.iOS-${PLATFORM_VERSION//./-}" - # echo "SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV - - # - name: 🚀 Boot simulator - # run: | - # xcrun simctl boot "iPhone 16" - # SIMULATOR_ID=$(xcrun simctl list | grep 'Booted' | awk -F '[()]' '{print $2}') - # echo "SIMULATOR_ID=$SIMULATOR_ID" - # echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV - - # # Open the simulator UI so Appium doesn’t force-restart it later - # open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app - - # # Wait a bit to ensure the UI is up - # sleep 5 - - name: 🚀 Boot simulator - run: | - SIMULATOR_NAME="iPhone 16" - - # Check if the simulator is already booted - BOOTED_ID=$(xcrun simctl list devices | grep "$SIMULATOR_NAME" | grep 'Booted' | awk -F '[()]' '{print $2}') - - if [ -n "$BOOTED_ID" ]; then - echo "Simulator '$SIMULATOR_NAME' is already booted with ID: $BOOTED_ID" - SIMULATOR_ID="$BOOTED_ID" - else - echo "Booting simulator '$SIMULATOR_NAME'..." - SIMULATOR_ID=$(xcrun simctl list devices | grep "$SIMULATOR_NAME" | head -n 1 | awk -F '[()]' '{print $2}' | xargs) - xcrun simctl boot "$SIMULATOR_ID" - fi - - echo "SIMULATOR_ID=$SIMULATOR_ID" - echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV - - - #- name: List available simulators - # run: | - # xcrun simctl list | grep $SIMULATOR_ID - - #- name: Build, verify, and deploy WebDriverAgent - # run: | - # set -euo pipefail - - # # Set up vars - # WDA_DIR="/tmp/WebDriverAgent" - # DERIVED_DATA="/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" - # #SIMULATOR_UDID="${{ env.UDID }}" - # echo "Using simulator $SIMULATOR_ID" - - # # Clone WDA - # echo "Cloning WebDriverAgent..." - # git clone https://github.com/appium/WebDriverAgent.git "$WDA_DIR" - - # # Build WDA using xcodebuild without signing (safe for CI) - # echo "Building WebDriverAgentRunner..." - # xcodebuild -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" \ - # CODE_SIGNING_ALLOWED=NO \ - # build-for-testing - - # # Verify build output - # echo "Looking for WDA build output..." - # WDA_APP=$(find "$DERIVED_DATA" -type d -name "WebDriverAgentRunner-Runner.app" | head -n 1) - # if [ -z "$WDA_APP" ]; then - # echo "::error ::Failed to locate built WebDriverAgentRunner-Runner.app" - # exit 1 - # fi - # echo "Found built WDA app at: $WDA_APP" - - # # Launch WDA via xcodebuild test-without-building (required for XCTest runners) - # echo "Launching WebDriverAgent test runner on simulator..." - # xcodebuild test-without-building \ - # -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "$DERIVED_DATA" \ - # IPHONEOS_DEPLOYMENT_TARGET=18.0 \ - # GCC_TREAT_WARNINGS_AS_ERRORS=0 \ - # COMPILER_INDEX_STORE_ENABLE=NO \ - # > /tmp/wda-launch.log 2>&1 & - - # # Wait for WDA to be ready - # echo "Waiting for WDA to be available on http://127.0.0.1:8100/status..." - - # for i in {1..30}; do - # if curl --silent --fail http://127.0.0.1:8100/status | grep -q "state"; then - # echo "✅ WDA is up and running." - # exit 0 - # fi - # echo "Waiting... ($i)" - # sleep 2 - # done - - # echo "::error::WDA failed to start within timeout." - # exit 1 - - # echo "✅ WDA built, verified, installed, and launched successfully." - - - name: 🧪 Start Appium Server - run: | - nohup appium --log appium.log & - - #- name: Install MAUI Workloads - # run: | - # dotnet workload install ios --ignore-failed-sources - # dotnet workload install maui --ignore-failed-sources - - - name: Restore MAUI App for iOS - run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - - #- name: Select Xcode 16.4 - # run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer - - #- name: Confirm Xcode version - # run: xcodebuild -version - - #- name: Accept Xcode license - # run: sudo xcodebuild -license accept - - - name: Build Code - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-ios -c Release --no-restore - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 /p:EnableAssemblyILStripping=false /p:EnableSymbolStrip=false /p:LinkMode=None - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 #/p:LinkMode=SdkOnly /p:EnableAssemblyILStripping=true /p:EnableSymbolStrip=true /p:Codesign=false /p:DebugSymbols=false /p:UseInterpreter=true - - # - name: List all files with full path - # run: | - # find /Users/runner/work/TransactionMobile/TransactionMobile/TransactionProcessor.Mobile/bin -type f - - - name: Run iOS Navigation Tests - run: | - #dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Debug --no-restore - dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "Category=iOSPRTest" --no-restore - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - # nunit3-console TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "(cat == PRNavTest && cat == iOS)" - - # - name: Run iOS Navigation Tests - # run: | - # # Install NUnit Console Runner tool - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - - # # Ensure the tool path is available in this step - # export PATH="$PATH:$HOME/.dotnet/tools" - - # # Optional: clean + build test project if not already built - # dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Release --no-restore - - # # Run the tests filtered by categories - # nunit TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "cat == PRNavTest && cat == iOS" --labels=All --result=TestResult-iOS.xml - - - name: Upload Appium Logs on Failure - if: always() - uses: actions/upload-artifact@v4 - with: - name: ios-software_navigation_tests_appium - path: appium.log - - # - name: Upload NUnit Test Results - # uses: actions/upload-artifact@v4 - # with: - # name: iOS-Test-Results - # path: TestResult-iOS.xml - - diff --git a/.github/workflows/ios_e2e_tests.yml b/.github/workflows/ios_e2e_tests.yml deleted file mode 100644 index ca314f0e7..000000000 --- a/.github/workflows/ios_e2e_tests.yml +++ /dev/null @@ -1,189 +0,0 @@ -name: Build and Run iOS End to End Tests - -on: - pull_request: - branches: - - main - -jobs: - end_to_end_tests: - runs-on: macos-15 - env: - PLATFORM_VERSION: "18.5" - DEVICE_NAME: "iPhone 16" - APP_PATH: "./MyTestApp.app" - - steps: - - name: 🧾 Checkout repo - uses: actions/checkout@v4 - - - name: 🔧 Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: 🔧 Set up .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '9.0.x' - - - name: 📦 Install Appium + XCUITest driver - run: | - npm install -g appium - appium driver install xcuitest - - #- name: 🧹 Clean DerivedData and WDA cache - # run: | - # rm -rf ~/Library/Developer/Xcode/DerivedData - # rm -rf ~/.appium/node_modules/appium-webdriveragent/Build - - - name: 📱 Create iOS Simulator (if needed) - run: | - SIMULATOR_NAME="ci-sim-$RANDOM" - xcrun simctl create "$SIMULATOR_NAME" "$DEVICE_NAME" "com.apple.CoreSimulator.SimRuntime.iOS-${PLATFORM_VERSION//./-}" - echo "SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV - - - name: 🚀 Boot simulator - run: | - xcrun simctl boot "$SIMULATOR_NAME" - SIMULATOR_ID=$(xcrun simctl list | grep 'Booted' | awk -F '[()]' '{print $2}') - echo "SIMULATOR_ID=$SIMULATOR_ID" - echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV - - # Open the simulator UI so Appium doesn’t force-restart it later - open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app - - # Wait a bit to ensure the UI is up - sleep 5 - - - - name: List available simulators - run: | - xcrun simctl list | grep $SIMULATOR_ID - - #- name: Build, verify, and deploy WebDriverAgent - # run: | - # set -euo pipefail - - # # Set up vars - # WDA_DIR="/tmp/WebDriverAgent" - # DERIVED_DATA="/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" - # #SIMULATOR_UDID="${{ env.UDID }}" - # echo "Using simulator $SIMULATOR_ID" - - # # Clone WDA - # echo "Cloning WebDriverAgent..." - # git clone https://github.com/appium/WebDriverAgent.git "$WDA_DIR" - - # # Build WDA using xcodebuild without signing (safe for CI) - # echo "Building WebDriverAgentRunner..." - # xcodebuild -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" \ - # CODE_SIGNING_ALLOWED=NO \ - # build-for-testing - - # # Verify build output - # echo "Looking for WDA build output..." - # WDA_APP=$(find "$DERIVED_DATA" -type d -name "WebDriverAgentRunner-Runner.app" | head -n 1) - # if [ -z "$WDA_APP" ]; then - # echo "::error ::Failed to locate built WebDriverAgentRunner-Runner.app" - # exit 1 - # fi - # echo "Found built WDA app at: $WDA_APP" - - # # Launch WDA via xcodebuild test-without-building (required for XCTest runners) - # echo "Launching WebDriverAgent test runner on simulator..." - # xcodebuild test-without-building \ - # -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "$DERIVED_DATA" \ - # IPHONEOS_DEPLOYMENT_TARGET=18.0 \ - # GCC_TREAT_WARNINGS_AS_ERRORS=0 \ - # COMPILER_INDEX_STORE_ENABLE=NO \ - # > /tmp/wda-launch.log 2>&1 & - - # # Wait for WDA to be ready - # echo "Waiting for WDA to be available on http://127.0.0.1:8100/status..." - - # for i in {1..30}; do - # if curl --silent --fail http://127.0.0.1:8100/status | grep -q "state"; then - # echo "✅ WDA is up and running." - # exit 0 - # fi - # echo "Waiting... ($i)" - # sleep 2 - # done - - # echo "::error::WDA failed to start within timeout." - # exit 1 - - # echo "✅ WDA built, verified, installed, and launched successfully." - - - name: 🧪 Start Appium Server - run: | - nohup appium --log appium.log & - - - name: Install MAUI Workloads - run: | - dotnet workload install ios --ignore-failed-sources - dotnet workload install maui --ignore-failed-sources - - - name: Restore MAUI App for iOS - run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - - - name: Select Xcode 16.4 - run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer - - - name: Confirm Xcode version - run: xcodebuild -version - - - name: Accept Xcode license - run: sudo xcodebuild -license accept - - - name: Build Code - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-ios -c Release --no-restore - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 /p:EnableAssemblyILStripping=false /p:EnableSymbolStrip=false /p:LinkMode=None - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 #/p:LinkMode=SdkOnly /p:EnableAssemblyILStripping=true /p:EnableSymbolStrip=true /p:Codesign=false /p:DebugSymbols=false /p:UseInterpreter=true - - # - name: List all files with full path - # run: | - # find /Users/runner/work/TransactionMobile/TransactionMobile/TransactionProcessor.Mobile/bin -type f - - - name: Run iOS Navigation Tests - run: | - #dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Debug --no-restore - dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "Category=iOSPRTest" --no-restore - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - # nunit3-console TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "(cat == PRNavTest && cat == iOS)" - - # - name: Run iOS Navigation Tests - # run: | - # # Install NUnit Console Runner tool - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - - # # Ensure the tool path is available in this step - # export PATH="$PATH:$HOME/.dotnet/tools" - - # # Optional: clean + build test project if not already built - # dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Release --no-restore - - # # Run the tests filtered by categories - # nunit TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "cat == PRNavTest && cat == iOS" --labels=All --result=TestResult-iOS.xml - - - name: Upload Appium Logs on Failure - if: always() - uses: actions/upload-artifact@v4 - with: - name: ios-e2e_tests_appium - path: appium.log - - # - name: Upload NUnit Test Results - # uses: actions/upload-artifact@v4 - # with: - # name: iOS-Test-Results - # path: TestResult-iOS.xml - - diff --git a/.github/workflows/ios_navigation_tests - selfhosted.yml b/.github/workflows/ios_navigation_tests - selfhosted.yml deleted file mode 100644 index 14bec459e..000000000 --- a/.github/workflows/ios_navigation_tests - selfhosted.yml +++ /dev/null @@ -1,207 +0,0 @@ -name: Build and Run iOS Navigation Tests - Self Hosted - -on: - pull_request: - branches: - - main - -jobs: - software_navigation_tests_self_hosted: - runs-on: [self-hosted, macOS] - #env: - # PLATFORM_VERSION: "18.5" - # DEVICE_NAME: "iPhone 16" - # APP_PATH: "./MyTestApp.app" - - steps: - - name: 🧾 Checkout repo - uses: actions/checkout@v4 - - #- name: 🔧 Set up Node.js - # uses: actions/setup-node@v4 - # with: - # node-version: '20' - - #- name: 🔧 Set up .NET - # uses: actions/setup-dotnet@v4 - # with: - # dotnet-version: '9.0.x' - - #- name: 📦 Install Appium + XCUITest driver - # run: | - # npm install -g appium - # appium driver install xcuitest - - #- name: 🧹 Clean DerivedData and WDA cache - # run: | - # rm -rf ~/Library/Developer/Xcode/DerivedData - # rm -rf ~/.appium/node_modules/appium-webdriveragent/Build - - #- name: 📱 Create iOS Simulator (if needed) - # run: | - # SIMULATOR_NAME="ci-sim-$RANDOM" - # xcrun simctl create "$SIMULATOR_NAME" "$DEVICE_NAME" "com.apple.CoreSimulator.SimRuntime.iOS-${PLATFORM_VERSION//./-}" - # echo "SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV - - # - name: 🚀 Boot simulator - # run: | - # xcrun simctl boot "iPhone 16" - # SIMULATOR_ID=$(xcrun simctl list | grep 'Booted' | awk -F '[()]' '{print $2}') - # echo "SIMULATOR_ID=$SIMULATOR_ID" - # echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV - - # # Open the simulator UI so Appium doesn’t force-restart it later - # open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app - - # # Wait a bit to ensure the UI is up - # sleep 5 - - name: 🚀 Boot simulator - run: | - SIMULATOR_NAME="iPhone 16" - - # Check if the simulator is already booted - BOOTED_ID=$(xcrun simctl list devices | grep "$SIMULATOR_NAME" | grep 'Booted' | awk -F '[()]' '{print $2}') - - if [ -n "$BOOTED_ID" ]; then - echo "Simulator '$SIMULATOR_NAME' is already booted with ID: $BOOTED_ID" - SIMULATOR_ID="$BOOTED_ID" - else - echo "Booting simulator '$SIMULATOR_NAME'..." - SIMULATOR_ID=$(xcrun simctl list devices | grep "$SIMULATOR_NAME" | head -n 1 | awk -F '[()]' '{print $2}' | xargs) - xcrun simctl boot "$SIMULATOR_ID" - fi - - echo "SIMULATOR_ID=$SIMULATOR_ID" - echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV - - - #- name: List available simulators - # run: | - # xcrun simctl list | grep $SIMULATOR_ID - - #- name: Build, verify, and deploy WebDriverAgent - # run: | - # set -euo pipefail - - # # Set up vars - # WDA_DIR="/tmp/WebDriverAgent" - # DERIVED_DATA="/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" - # #SIMULATOR_UDID="${{ env.UDID }}" - # echo "Using simulator $SIMULATOR_ID" - - # # Clone WDA - # echo "Cloning WebDriverAgent..." - # git clone https://github.com/appium/WebDriverAgent.git "$WDA_DIR" - - # # Build WDA using xcodebuild without signing (safe for CI) - # echo "Building WebDriverAgentRunner..." - # xcodebuild -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" \ - # CODE_SIGNING_ALLOWED=NO \ - # build-for-testing - - # # Verify build output - # echo "Looking for WDA build output..." - # WDA_APP=$(find "$DERIVED_DATA" -type d -name "WebDriverAgentRunner-Runner.app" | head -n 1) - # if [ -z "$WDA_APP" ]; then - # echo "::error ::Failed to locate built WebDriverAgentRunner-Runner.app" - # exit 1 - # fi - # echo "Found built WDA app at: $WDA_APP" - - # # Launch WDA via xcodebuild test-without-building (required for XCTest runners) - # echo "Launching WebDriverAgent test runner on simulator..." - # xcodebuild test-without-building \ - # -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "$DERIVED_DATA" \ - # IPHONEOS_DEPLOYMENT_TARGET=18.0 \ - # GCC_TREAT_WARNINGS_AS_ERRORS=0 \ - # COMPILER_INDEX_STORE_ENABLE=NO \ - # > /tmp/wda-launch.log 2>&1 & - - # # Wait for WDA to be ready - # echo "Waiting for WDA to be available on http://127.0.0.1:8100/status..." - - # for i in {1..30}; do - # if curl --silent --fail http://127.0.0.1:8100/status | grep -q "state"; then - # echo "✅ WDA is up and running." - # exit 0 - # fi - # echo "Waiting... ($i)" - # sleep 2 - # done - - # echo "::error::WDA failed to start within timeout." - # exit 1 - - # echo "✅ WDA built, verified, installed, and launched successfully." - - - name: 🧪 Start Appium Server - run: | - nohup appium --log appium.log & - - #- name: Install MAUI Workloads - # run: | - # dotnet workload install ios --ignore-failed-sources - # dotnet workload install maui --ignore-failed-sources - - - name: Restore MAUI App for iOS - run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - - #- name: Select Xcode 16.4 - # run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer - - #- name: Confirm Xcode version - # run: xcodebuild -version - - #- name: Accept Xcode license - # run: sudo xcodebuild -license accept - - - name: Build Code - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-ios -c Release --no-restore - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 /p:EnableAssemblyILStripping=false /p:EnableSymbolStrip=false /p:LinkMode=None - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 #/p:LinkMode=SdkOnly /p:EnableAssemblyILStripping=true /p:EnableSymbolStrip=true /p:Codesign=false /p:DebugSymbols=false /p:UseInterpreter=true - - # - name: List all files with full path - # run: | - # find /Users/runner/work/TransactionMobile/TransactionMobile/TransactionProcessor.Mobile/bin -type f - - - name: Run iOS Navigation Tests - run: | - #dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Debug --no-restore - dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "Category=PRNavTest" --no-restore - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - # nunit3-console TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "(cat == PRNavTest && cat == iOS)" - - # - name: Run iOS Navigation Tests - # run: | - # # Install NUnit Console Runner tool - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - - # # Ensure the tool path is available in this step - # export PATH="$PATH:$HOME/.dotnet/tools" - - # # Optional: clean + build test project if not already built - # dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Release --no-restore - - # # Run the tests filtered by categories - # nunit TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "cat == PRNavTest && cat == iOS" --labels=All --result=TestResult-iOS.xml - - - name: Upload Appium Logs on Failure - if: always() - uses: actions/upload-artifact@v4 - with: - name: ios-software_navigation_tests_appium - path: appium.log - - # - name: Upload NUnit Test Results - # uses: actions/upload-artifact@v4 - # with: - # name: iOS-Test-Results - # path: TestResult-iOS.xml - - diff --git a/.github/workflows/ios_navigation_tests.yml b/.github/workflows/ios_navigation_tests.yml deleted file mode 100644 index c2fddbf4e..000000000 --- a/.github/workflows/ios_navigation_tests.yml +++ /dev/null @@ -1,189 +0,0 @@ -name: Build and Run iOS Navigation Tests - -on: - pull_request: - branches: - - main - -jobs: - software_navigation_tests: - runs-on: macos-15 - env: - PLATFORM_VERSION: "18.5" - DEVICE_NAME: "iPhone 16" - APP_PATH: "./MyTestApp.app" - - steps: - - name: 🧾 Checkout repo - uses: actions/checkout@v4 - - - name: 🔧 Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: 🔧 Set up .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: '9.0.x' - - - name: 📦 Install Appium + XCUITest driver - run: | - npm install -g appium - appium driver install xcuitest - - #- name: 🧹 Clean DerivedData and WDA cache - # run: | - # rm -rf ~/Library/Developer/Xcode/DerivedData - # rm -rf ~/.appium/node_modules/appium-webdriveragent/Build - - - name: 📱 Create iOS Simulator (if needed) - run: | - SIMULATOR_NAME="ci-sim-$RANDOM" - xcrun simctl create "$SIMULATOR_NAME" "$DEVICE_NAME" "com.apple.CoreSimulator.SimRuntime.iOS-${PLATFORM_VERSION//./-}" - echo "SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV - - - name: 🚀 Boot simulator - run: | - xcrun simctl boot "$SIMULATOR_NAME" - SIMULATOR_ID=$(xcrun simctl list | grep 'Booted' | awk -F '[()]' '{print $2}') - echo "SIMULATOR_ID=$SIMULATOR_ID" - echo "SIMULATOR_ID=$SIMULATOR_ID" >> $GITHUB_ENV - - # Open the simulator UI so Appium doesn’t force-restart it later - open -Fn /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app - - # Wait a bit to ensure the UI is up - sleep 5 - - - - name: List available simulators - run: | - xcrun simctl list | grep $SIMULATOR_ID - - #- name: Build, verify, and deploy WebDriverAgent - # run: | - # set -euo pipefail - - # # Set up vars - # WDA_DIR="/tmp/WebDriverAgent" - # DERIVED_DATA="/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" - # #SIMULATOR_UDID="${{ env.UDID }}" - # echo "Using simulator $SIMULATOR_ID" - - # # Clone WDA - # echo "Cloning WebDriverAgent..." - # git clone https://github.com/appium/WebDriverAgent.git "$WDA_DIR" - - # # Build WDA using xcodebuild without signing (safe for CI) - # echo "Building WebDriverAgentRunner..." - # xcodebuild -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "/Users/runner/Library/Developer/Xcode/DerivedData/WebDriverAgent" \ - # CODE_SIGNING_ALLOWED=NO \ - # build-for-testing - - # # Verify build output - # echo "Looking for WDA build output..." - # WDA_APP=$(find "$DERIVED_DATA" -type d -name "WebDriverAgentRunner-Runner.app" | head -n 1) - # if [ -z "$WDA_APP" ]; then - # echo "::error ::Failed to locate built WebDriverAgentRunner-Runner.app" - # exit 1 - # fi - # echo "Found built WDA app at: $WDA_APP" - - # # Launch WDA via xcodebuild test-without-building (required for XCTest runners) - # echo "Launching WebDriverAgent test runner on simulator..." - # xcodebuild test-without-building \ - # -project "$WDA_DIR/WebDriverAgent.xcodeproj" \ - # -scheme WebDriverAgentRunner \ - # -destination "id=$SIMULATOR_ID" \ - # -derivedDataPath "$DERIVED_DATA" \ - # IPHONEOS_DEPLOYMENT_TARGET=18.0 \ - # GCC_TREAT_WARNINGS_AS_ERRORS=0 \ - # COMPILER_INDEX_STORE_ENABLE=NO \ - # > /tmp/wda-launch.log 2>&1 & - - # # Wait for WDA to be ready - # echo "Waiting for WDA to be available on http://127.0.0.1:8100/status..." - - # for i in {1..30}; do - # if curl --silent --fail http://127.0.0.1:8100/status | grep -q "state"; then - # echo "✅ WDA is up and running." - # exit 0 - # fi - # echo "Waiting... ($i)" - # sleep 2 - # done - - # echo "::error::WDA failed to start within timeout." - # exit 1 - - # echo "✅ WDA built, verified, installed, and launched successfully." - - - name: 🧪 Start Appium Server - run: | - nohup appium --log appium.log & - - - name: Install MAUI Workloads - run: | - dotnet workload install ios --ignore-failed-sources - dotnet workload install maui --ignore-failed-sources - - - name: Restore MAUI App for iOS - run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - - - name: Select Xcode 16.4 - run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer - - - name: Confirm Xcode version - run: xcodebuild -version - - - name: Accept Xcode license - run: sudo xcodebuild -license accept - - - name: Build Code - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-ios -c Release --no-restore - #run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 /p:EnableAssemblyILStripping=false /p:EnableSymbolStrip=false /p:LinkMode=None - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-ios -r iossimulator-arm64 #/p:LinkMode=SdkOnly /p:EnableAssemblyILStripping=true /p:EnableSymbolStrip=true /p:Codesign=false /p:DebugSymbols=false /p:UseInterpreter=true - - # - name: List all files with full path - # run: | - # find /Users/runner/work/TransactionMobile/TransactionMobile/TransactionProcessor.Mobile/bin -type f - - - name: Run iOS Navigation Tests - run: | - #dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Debug --no-restore - dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "Category=PRNavTest" --no-restore - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - # nunit3-console TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "(cat == PRNavTest && cat == iOS)" - - # - name: Run iOS Navigation Tests - # run: | - # # Install NUnit Console Runner tool - # dotnet tool install --global NUnit.ConsoleRunner.NetCore - - # # Ensure the tool path is available in this step - # export PATH="$PATH:$HOME/.dotnet/tools" - - # # Optional: clean + build test project if not already built - # dotnet build TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj -c Release --no-restore - - # # Run the tests filtered by categories - # nunit TransactionProcessor.Mobile.UiTests/bin/Release/net9.0/TransactionProcessor.Mobile.UiTests.dll --where "cat == PRNavTest && cat == iOS" --labels=All --result=TestResult-iOS.xml - - - name: Upload Appium Logs on Failure - if: always() - uses: actions/upload-artifact@v4 - with: - name: ios-software_navigation_tests_appium - path: appium.log - - # - name: Upload NUnit Test Results - # uses: actions/upload-artifact@v4 - # with: - # name: iOS-Test-Results - # path: TestResult-iOS.xml - - diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 70a9a0cba..71f8463e8 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -11,12 +11,7 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v2 - - - name: Set up .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '9.0.x' - + - name: Install KVM and Android SDK (x86) run: | # Set up environment variables @@ -36,7 +31,7 @@ jobs: # Accept licenses and install required components yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses # Install Android API level 35 and necessary system images - $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-35" "system-images;android-35;google_apis;x86_64" + $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "platform-tools" "emulator" "platforms;android-36" "system-images;android-36;google_apis;x86_64" # Export paths for future steps echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" >> $GITHUB_ENV @@ -46,7 +41,7 @@ jobs: - name: Install Android Build Tools run: | echo "Installing Android Build Tools..." - sdkmanager "build-tools;35.0.0" # Updated to use Android 34 build tools + sdkmanager "build-tools;36.0.0" # Updated to use Android 34 build tools sdkmanager --update - name: Install MAUI workloads @@ -54,7 +49,7 @@ jobs: dotnet workload install maui-android - name: Build Code - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json -f net9.0-android -c Release #--no-restore + run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json -f net10.0-android -c Release #--no-restore - name: Run unit tests run: dotnet test TransactionProcessor.Mobile.BusinessLogic.Tests/TransactionProcessor.Mobile.BusinessLogic.Tests.csproj --configuration Release diff --git a/.github/workflows/windows_e2e_tests.yml b/.github/workflows/windows_e2e_tests.yml index c8a100df1..947ebdb73 100644 --- a/.github/workflows/windows_e2e_tests.yml +++ b/.github/workflows/windows_e2e_tests.yml @@ -15,12 +15,7 @@ jobs: - name: Setup MSBuild uses: microsoft/setup-msbuild@v1.1 with: - vs-prerelease: true - - - name: Set up .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '9.0.x' + vs-prerelease: true - name: Install MAUI workloads run: | @@ -39,7 +34,7 @@ jobs: run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - name: Build Code - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-android -c Release --no-restore + run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net10.0-android -c Release --no-restore - name: Decrypt PFX File run: | @@ -51,16 +46,17 @@ jobs: - name: Publish App run: | - dotnet publish TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-windows10.0.19041.0 /p:AppxPackageSigningEnabled=true /p:PackageCertificateThumbprint="${{ secrets.WINDOWSSIGNINGCERTTHUMBPRINT }}" + dotnet publish TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net10.0-windows10.0.19041.0 /p:AppxPackageSigningEnabled=true /p:PackageCertificateThumbprint="${{ secrets.WINDOWSSIGNINGCERTTHUMBPRINT }}" - name: Install App shell: powershell run: | Import-Module Appx - .\TransactionProcessor.Mobile/bin/Release\net9.0-windows10.0.19041.0\win10-x64\AppPackages\TransactionProcessor.Mobile_1.0.0.1_Test\Install.ps1 -Force + .\TransactionProcessor.Mobile/bin/Release\net10.0-windows10.0.19041.0\win-x64\AppPackages\TransactionProcessor.Mobile_1.0.0.1_Test\Install.ps1 -Force - 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 "Category=PRTest&Category=Windows" --no-restore + #run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --list-tests -v:d - name: Upload Logs on Failure if: always() diff --git a/.github/workflows/windows_navigation_tests.yml b/.github/workflows/windows_navigation_tests.yml index e97e7336a..ec29481f8 100644 --- a/.github/workflows/windows_navigation_tests.yml +++ b/.github/workflows/windows_navigation_tests.yml @@ -16,11 +16,6 @@ jobs: uses: microsoft/setup-msbuild@v1.1 with: vs-prerelease: true - - - name: Set up .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '9.0.x' - name: Install MAUI workloads run: | @@ -39,7 +34,7 @@ jobs: run: dotnet restore TransactionProcessor.Mobile.sln --source ${{ secrets.PUBLICFEEDURL }} --source ${{ secrets.PRIVATEFEED_URL }} --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json - name: Build Code - run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net9.0-android -c Release --no-restore + run: dotnet build TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -f net10.0-android -c Release --no-restore - name: Decrypt PFX File run: | @@ -51,13 +46,13 @@ jobs: - name: Publish App run: | - dotnet publish TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net9.0-windows10.0.19041.0 /p:AppxPackageSigningEnabled=true /p:PackageCertificateThumbprint="${{ secrets.WINDOWSSIGNINGCERTTHUMBPRINT }}" + dotnet publish TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj -c Release -f net10.0-windows10.0.19041.0 /p:AppxPackageSigningEnabled=true /p:PackageCertificateThumbprint="${{ secrets.WINDOWSSIGNINGCERTTHUMBPRINT }}" - name: Install App shell: powershell run: | Import-Module Appx - .\TransactionProcessor.Mobile/bin/Release\net9.0-windows10.0.19041.0\win10-x64\AppPackages\TransactionProcessor.Mobile_1.0.0.1_Test\Install.ps1 -Force + .\TransactionProcessor.Mobile/bin/Release\net10.0-windows10.0.19041.0\win-x64\AppPackages\TransactionProcessor.Mobile_1.0.0.1_Test\Install.ps1 -Force - name: Run Windows Navigation Tests run: dotnet test TransactionProcessor.Mobile.UiTests/TransactionProcessor.Mobile.UiTests.csproj --filter "(Category=PRNavTest)&(Category=Windows)" --no-restore diff --git a/TestCategoryLister/TestCategoryLister.csproj b/TestCategoryLister/TestCategoryLister.csproj index 85e2ff3cd..5b62cc77a 100644 --- a/TestCategoryLister/TestCategoryLister.csproj +++ b/TestCategoryLister/TestCategoryLister.csproj @@ -1,9 +1,9 @@  Exe - net9.0 + net10.0 - + \ No newline at end of file diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/CommonTests/ExtensionsTests.cs b/TransactionProcessor.Mobile.BusinessLogic.Tests/CommonTests/ExtensionsTests.cs index 11fa96f48..17429eea9 100644 --- a/TransactionProcessor.Mobile.BusinessLogic.Tests/CommonTests/ExtensionsTests.cs +++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/CommonTests/ExtensionsTests.cs @@ -316,12 +316,12 @@ public void PerformVoucherIssueRequestModel_ToSaleTransactionRequest_SaleTransac request.CustomerEmailAddress.ShouldBe(model.CustomerEmailAddress); request.ContractId.ShouldBe(model.ContractId); request.ProductId.ShouldBe(model.ProductId); - request.AdditionalRequestMetaData.ContainsKey("Amount").ShouldBeTrue(); - request.AdditionalRequestMetaData["Amount"].ShouldBe(model.VoucherAmount.ToString()); - request.AdditionalRequestMetaData.ContainsKey("RecipientEmail").ShouldBeTrue(); - request.AdditionalRequestMetaData["RecipientEmail"].ShouldBe(model.RecipientEmailAddress); - request.AdditionalRequestMetaData.ContainsKey("RecipientMobile").ShouldBeTrue(); - request.AdditionalRequestMetaData["RecipientMobile"].ShouldBe(model.RecipientMobileNumber); + request.AdditionalRequestMetadata.ContainsKey("Amount").ShouldBeTrue(); + request.AdditionalRequestMetadata["Amount"].ShouldBe(model.VoucherAmount.ToString()); + request.AdditionalRequestMetadata.ContainsKey("RecipientEmail").ShouldBeTrue(); + request.AdditionalRequestMetadata["RecipientEmail"].ShouldBe(model.RecipientEmailAddress); + request.AdditionalRequestMetadata.ContainsKey("RecipientMobile").ShouldBeTrue(); + request.AdditionalRequestMetadata["RecipientMobile"].ShouldBe(model.RecipientMobileNumber); } [Fact] @@ -348,8 +348,8 @@ public void PerformMobileTopupRequestModel_ToSaleTransactionRequest_SaleTransact request.CustomerEmailAddress.ShouldBe(model.CustomerEmailAddress); request.ContractId.ShouldBe(model.ContractId); request.ProductId.ShouldBe(model.ProductId); - request.AdditionalRequestMetaData.ContainsKey("Amount").ShouldBeTrue(); - request.AdditionalRequestMetaData["Amount"].ShouldBe(model.TopupAmount.ToString()); + request.AdditionalRequestMetadata.ContainsKey("Amount").ShouldBeTrue(); + request.AdditionalRequestMetadata["Amount"].ShouldBe(model.TopupAmount.ToString()); } [Fact] @@ -374,10 +374,10 @@ public void PerformBillPaymentGetAccountModel_ToSaleTransactionRequest_SaleTrans request.OperatorId.ShouldBe(model.OperatorId); request.ContractId.ShouldBe(model.ContractId); request.ProductId.ShouldBe(model.ProductId); - request.AdditionalRequestMetaData.ContainsKey("CustomerAccountNumber").ShouldBeTrue(); - request.AdditionalRequestMetaData["CustomerAccountNumber"].ShouldBe(model.CustomerAccountNumber); - request.AdditionalRequestMetaData.ContainsKey("PataPawaPostPaidMessageType").ShouldBeTrue(); - request.AdditionalRequestMetaData["PataPawaPostPaidMessageType"].ShouldBe("VerifyAccount"); + request.AdditionalRequestMetadata.ContainsKey("CustomerAccountNumber").ShouldBeTrue(); + request.AdditionalRequestMetadata["CustomerAccountNumber"].ShouldBe(model.CustomerAccountNumber); + request.AdditionalRequestMetadata.ContainsKey("PataPawaPostPaidMessageType").ShouldBeTrue(); + request.AdditionalRequestMetadata["PataPawaPostPaidMessageType"].ShouldBe("VerifyAccount"); } [Fact] @@ -402,10 +402,10 @@ public void PerformBillPaymentGetMeterModel_ToSaleTransactionRequest_SaleTransac request.OperatorId.ShouldBe(model.OperatorId); request.ContractId.ShouldBe(model.ContractId); request.ProductId.ShouldBe(model.ProductId); - request.AdditionalRequestMetaData.ContainsKey("MeterNumber").ShouldBeTrue(); - request.AdditionalRequestMetaData["MeterNumber"].ShouldBe(model.MeterNumber); - request.AdditionalRequestMetaData.ContainsKey("PataPawaPrePayMessageType").ShouldBeTrue(); - request.AdditionalRequestMetaData["PataPawaPrePayMessageType"].ShouldBe("meter"); + request.AdditionalRequestMetadata.ContainsKey("MeterNumber").ShouldBeTrue(); + request.AdditionalRequestMetadata["MeterNumber"].ShouldBe(model.MeterNumber); + request.AdditionalRequestMetadata.ContainsKey("PataPawaPrePayMessageType").ShouldBeTrue(); + request.AdditionalRequestMetadata["PataPawaPrePayMessageType"].ShouldBe("meter"); } [Fact] @@ -434,16 +434,16 @@ public void PerformBillPaymentMakePaymentModel_PrePayment_ToSaleTransactionReque request.ContractId.ShouldBe(model.ContractId); request.ProductId.ShouldBe(model.ProductId); - request.AdditionalRequestMetaData.ContainsKey("MeterNumber").ShouldBeTrue(); - request.AdditionalRequestMetaData["MeterNumber"].ShouldBe(model.CustomerAccountNumber); - request.AdditionalRequestMetaData.ContainsKey("CustomerName").ShouldBeTrue(); - request.AdditionalRequestMetaData["CustomerName"].ShouldBe(model.CustomerAccountName); - request.AdditionalRequestMetaData.ContainsKey("MeterNumber").ShouldBeTrue(); - request.AdditionalRequestMetaData["MeterNumber"].ShouldBe(model.CustomerAccountNumber); - request.AdditionalRequestMetaData.ContainsKey("Amount").ShouldBeTrue(); - request.AdditionalRequestMetaData["Amount"].ShouldBe(model.PaymentAmount.ToString()); - request.AdditionalRequestMetaData.ContainsKey("PataPawaPrePayMessageType").ShouldBeTrue(); - request.AdditionalRequestMetaData["PataPawaPrePayMessageType"].ShouldBe("vend"); + request.AdditionalRequestMetadata.ContainsKey("MeterNumber").ShouldBeTrue(); + request.AdditionalRequestMetadata["MeterNumber"].ShouldBe(model.CustomerAccountNumber); + request.AdditionalRequestMetadata.ContainsKey("CustomerName").ShouldBeTrue(); + request.AdditionalRequestMetadata["CustomerName"].ShouldBe(model.CustomerAccountName); + request.AdditionalRequestMetadata.ContainsKey("MeterNumber").ShouldBeTrue(); + request.AdditionalRequestMetadata["MeterNumber"].ShouldBe(model.CustomerAccountNumber); + request.AdditionalRequestMetadata.ContainsKey("Amount").ShouldBeTrue(); + request.AdditionalRequestMetadata["Amount"].ShouldBe(model.PaymentAmount.ToString()); + request.AdditionalRequestMetadata.ContainsKey("PataPawaPrePayMessageType").ShouldBeTrue(); + request.AdditionalRequestMetadata["PataPawaPrePayMessageType"].ShouldBe("vend"); } [Fact] @@ -473,16 +473,16 @@ public void PerformBillPaymentMakePaymentModel_PostPayment_ToSaleTransactionRequ request.ContractId.ShouldBe(model.ContractId); request.ProductId.ShouldBe(model.ProductId); - request.AdditionalRequestMetaData.ContainsKey("CustomerAccountNumber").ShouldBeTrue(); - request.AdditionalRequestMetaData["CustomerAccountNumber"].ShouldBe(model.CustomerAccountNumber); - request.AdditionalRequestMetaData.ContainsKey("CustomerName").ShouldBeTrue(); - request.AdditionalRequestMetaData["CustomerName"].ShouldBe(model.CustomerAccountName); - request.AdditionalRequestMetaData.ContainsKey("MobileNumber").ShouldBeTrue(); - request.AdditionalRequestMetaData["MobileNumber"].ShouldBe(model.CustomerMobileNumber); - request.AdditionalRequestMetaData.ContainsKey("Amount").ShouldBeTrue(); - request.AdditionalRequestMetaData["Amount"].ShouldBe(model.PaymentAmount.ToString()); - request.AdditionalRequestMetaData.ContainsKey("PataPawaPostPaidMessageType").ShouldBeTrue(); - request.AdditionalRequestMetaData["PataPawaPostPaidMessageType"].ShouldBe("ProcessBill"); + request.AdditionalRequestMetadata.ContainsKey("CustomerAccountNumber").ShouldBeTrue(); + request.AdditionalRequestMetadata["CustomerAccountNumber"].ShouldBe(model.CustomerAccountNumber); + request.AdditionalRequestMetadata.ContainsKey("CustomerName").ShouldBeTrue(); + request.AdditionalRequestMetadata["CustomerName"].ShouldBe(model.CustomerAccountName); + request.AdditionalRequestMetadata.ContainsKey("MobileNumber").ShouldBeTrue(); + request.AdditionalRequestMetadata["MobileNumber"].ShouldBe(model.CustomerMobileNumber); + request.AdditionalRequestMetadata.ContainsKey("Amount").ShouldBeTrue(); + request.AdditionalRequestMetadata["Amount"].ShouldBe(model.PaymentAmount.ToString()); + request.AdditionalRequestMetadata.ContainsKey("PataPawaPostPaidMessageType").ShouldBeTrue(); + request.AdditionalRequestMetadata["PataPawaPostPaidMessageType"].ShouldBe("ProcessBill"); } [Theory] diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/MerchantServiceTests.cs b/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/MerchantServiceTests.cs index 31397d815..8ed82fc58 100644 --- a/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/MerchantServiceTests.cs +++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/MerchantServiceTests.cs @@ -65,7 +65,7 @@ public async Task MerchantService_GetContractProducts_ContractProductsAreReturne this.MockHttpMessageHandler.When($"http://localhost/api/merchants/contracts?application_version=1.0.0") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(contracts))); // Respond with JSON + .Respond("application/json", JsonConvert.SerializeObject(contracts)); // Respond with JSON var result = await this.MerchantService.GetContractProducts(CancellationToken.None); result.IsSuccess.ShouldBeTrue(); @@ -110,7 +110,7 @@ public async Task MerchantService_GetMerchantDetails_MerchantDetailsReturned(){ }; this.MockHttpMessageHandler.When($"http://localhost/api/merchants?application_version=1.0.0") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(merchantResponse))); // Respond with JSON + .Respond("application/json", JsonConvert.SerializeObject(merchantResponse)); // Respond with JSON Result merchantDetails = await this.MerchantService.GetMerchantDetails(CancellationToken.None); merchantDetails.IsSuccess.ShouldBeTrue(); diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs b/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs index 7574ce862..fa03be7b8 100644 --- a/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs +++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs @@ -48,11 +48,11 @@ public async Task TransactionService_PerformLogon_LogonPerformed(){ MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = new Dictionary() + AdditionalResponseMetadata = new Dictionary() }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/logontransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performLogonResult = await this.TransactionService.PerformLogon(requestModel, CancellationToken.None); @@ -107,11 +107,11 @@ public async Task TransactionService_PerformMobileTopup_MobileTopupPerformed(){ MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = new Dictionary() + AdditionalResponseMetadata = new Dictionary() }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/saletransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performMobileTopupResult = await this.TransactionService.PerformMobileTopup(requestModel, CancellationToken.None); @@ -170,11 +170,11 @@ public async Task TransactionService_PerformVoucherIssue_VoucherIssuePerformed() MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = new Dictionary() + AdditionalResponseMetadata = new Dictionary() }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/saletransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performVoucherIssueResult = await this.TransactionService.PerformVoucherIssue(requestModel, CancellationToken.None); @@ -231,7 +231,7 @@ public async Task TransactionService_PerformBillPaymentGetAccount_GetAccountPerf MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = new Dictionary(){ + AdditionalResponseMetadata = new Dictionary(){ { "customerAccountName", TestData.BillDetails.AccountName }, { "customerAccountNumber", TestData.BillDetails.AccountNumber }, { "customerBillBalance", TestData.BillDetails.Balance }, @@ -239,8 +239,8 @@ public async Task TransactionService_PerformBillPaymentGetAccount_GetAccountPerf } }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/saletransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performBillPaymentGetAccountResult = await this.TransactionService.PerformBillPaymentGetAccount(requestModel, CancellationToken.None); performBillPaymentGetAccountResult.ShouldNotBeNull(); @@ -296,13 +296,13 @@ public async Task TransactionService_PerformBillPaymentGetMeter_GetMeterPerforme MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = new Dictionary(){ + AdditionalResponseMetadata = new Dictionary(){ { "pataPawaPrePaidCustomerName", TestData.BillDetails.AccountName } } }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/saletransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentGetMeter(requestModel, CancellationToken.None); @@ -333,11 +333,11 @@ public async Task TransactionService_PerformBillPaymentGetMeter_NoAdditionalResp MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = null + AdditionalResponseMetadata = null }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/saletransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentGetMeter(requestModel, CancellationToken.None); @@ -395,8 +395,8 @@ public async Task TransactionService_PerformBillPaymentMakePayment_MakePaymentPe TransactionId = TestData.TransactionId }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/saletransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentMakePayment(requestModel, CancellationToken.None); @@ -459,11 +459,11 @@ public async Task TransactionService_PerformReconciliation_ReconciliationPerform MerchantId = TestData.MerchantId, ResponseCode = TestData.ResponseCode_Success, TransactionId = TestData.TransactionId, - AdditionalResponseMetaData = null + AdditionalResponseMetadata = null }; - this.MockHttpMessageHandler.When($"http://localhost/api/transactions") - .Respond("application/json", JsonConvert.SerializeObject(Result.Success(expectedResponse))); // Respond with JSON + this.MockHttpMessageHandler.When($"http://localhost/api/reconciliationtransactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON Result performReconciliationResult = await this.TransactionService.PerformReconciliation(requestModel, CancellationToken.None); diff --git a/TransactionProcessor.Mobile.BusinessLogic.Tests/TransactionProcessor.Mobile.BusinessLogic.Tests.csproj b/TransactionProcessor.Mobile.BusinessLogic.Tests/TransactionProcessor.Mobile.BusinessLogic.Tests.csproj index 11fe4cdac..e9d5f5258 100644 --- a/TransactionProcessor.Mobile.BusinessLogic.Tests/TransactionProcessor.Mobile.BusinessLogic.Tests.csproj +++ b/TransactionProcessor.Mobile.BusinessLogic.Tests/TransactionProcessor.Mobile.BusinessLogic.Tests.csproj @@ -1,22 +1,22 @@  - net9.0 + net10.0 enable enable false - - - + + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/TransactionProcessor.Mobile.BusinessLogic/Common/Extensions.cs b/TransactionProcessor.Mobile.BusinessLogic/Common/Extensions.cs index 5f9ba8935..cd324e6e7 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/Common/Extensions.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/Common/Extensions.cs @@ -218,9 +218,9 @@ public static SaleTransactionRequestMessage ToSaleTransactionRequest(this Perfor CustomerEmailAddress = model.CustomerEmailAddress, TransactionNumber = model.TransactionNumber }; - + // Add the additional request data - saleTransactionRequest.AdditionalRequestMetaData = new Dictionary { + saleTransactionRequest.AdditionalRequestMetadata = new Dictionary { {"Amount", model.VoucherAmount.ToString()}, {"RecipientEmail", model.RecipientEmailAddress}, {"RecipientMobile", model.RecipientMobileNumber} @@ -244,7 +244,7 @@ public static SaleTransactionRequestMessage ToSaleTransactionRequest(this Perfor }; // Add the additional request data - saleTransactionRequest.AdditionalRequestMetaData = new Dictionary { + saleTransactionRequest.AdditionalRequestMetadata = new Dictionary { {"Amount", model.TopupAmount.ToString()}, {"CustomerAccountNumber", model.CustomerAccountNumber} }; @@ -264,7 +264,7 @@ public static SaleTransactionRequestMessage ToSaleTransactionRequest(this Perfor TransactionNumber = model.TransactionNumber }; // Add the additional request data - saleTransactionRequest.AdditionalRequestMetaData = new Dictionary { + saleTransactionRequest.AdditionalRequestMetadata = new Dictionary { {"CustomerAccountNumber", model.CustomerAccountNumber}, {"PataPawaPostPaidMessageType", "VerifyAccount"} }; @@ -286,7 +286,7 @@ public static SaleTransactionRequestMessage ToSaleTransactionRequest(this Perfor }; if (model.PostPayment){ // Add the additional request data - saleTransactionRequest.AdditionalRequestMetaData = new Dictionary{ + saleTransactionRequest.AdditionalRequestMetadata = new Dictionary{ { "CustomerAccountNumber", model.CustomerAccountNumber }, { "CustomerName", model.CustomerAccountName }, { "MobileNumber", model.CustomerMobileNumber }, @@ -295,7 +295,7 @@ public static SaleTransactionRequestMessage ToSaleTransactionRequest(this Perfor }; } else{ - saleTransactionRequest.AdditionalRequestMetaData = new Dictionary{ + saleTransactionRequest.AdditionalRequestMetadata = new Dictionary{ { "MeterNumber", model.CustomerAccountNumber }, { "CustomerName", model.CustomerAccountName }, { "PataPawaPrePayMessageType", "vend" }, @@ -319,7 +319,7 @@ public static SaleTransactionRequestMessage ToSaleTransactionRequest(this Perfor TransactionNumber = model.TransactionNumber }; // Add the additional request data - saleTransactionRequest.AdditionalRequestMetaData = new Dictionary { + saleTransactionRequest.AdditionalRequestMetadata = new Dictionary { {"MeterNumber", model.MeterNumber.ToString()}, {"PataPawaPrePayMessageType", "meter"} }; diff --git a/TransactionProcessor.Mobile.BusinessLogic/Services/MerchantService.cs b/TransactionProcessor.Mobile.BusinessLogic/Services/MerchantService.cs index 1e0fd75e3..05b6bd69c 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/Services/MerchantService.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/Services/MerchantService.cs @@ -84,12 +84,12 @@ public async Task>> GetContractProducts(Cancel Logger.LogDebug($"Transaction Response details: Status {httpResponse.StatusCode} Payload {content.Data}"); - ResponseData> responseData = this.HandleResponseContent>(content.Data); + List? responseData = JsonConvert.DeserializeObject>(content.Data); - Logger.LogInformation($"{responseData.Data.Count} for merchant requested successfully"); - Logger.LogDebug($"Merchant Contract Response: [{JsonConvert.SerializeObject(responseData.Data)}]"); + Logger.LogInformation($"{responseData.Count} for merchant requested successfully"); + Logger.LogDebug($"Merchant Contract Response: [{JsonConvert.SerializeObject(responseData)}]"); - foreach (ContractResponse contractResponse in responseData.Data) { + foreach (ContractResponse contractResponse in responseData) { foreach (ContractProduct contractResponseProduct in contractResponse.Products) { var productType = GetProductType(contractResponse.OperatorName); @@ -165,31 +165,31 @@ public async Task> GetMerchantDetails(CancellationT Logger.LogDebug($"Transaction Response details: Status {httpResponse.StatusCode} Payload {content.Data}"); - ResponseData responseData = this.HandleResponseContent(content.Data); - + //ResponseData responseData = this.HandleResponseContent(content.Data); + MerchantResponse responseData = JsonConvert.DeserializeObject(content.Data); Logger.LogInformation("Merchant details requested successfully"); - Logger.LogDebug($"Merchant Details Response: [{JsonConvert.SerializeObject(responseData.Data)}]"); + Logger.LogDebug($"Merchant Details Response: [{JsonConvert.SerializeObject(responseData)}]"); MerchantDetailsModel model = new MerchantDetailsModel { - MerchantName = responseData.Data.MerchantName, - NextStatementDate = responseData.Data.NextStatementDate, + MerchantName = responseData.MerchantName, + NextStatementDate = responseData.NextStatementDate, LastStatementDate = new DateTime(), - SettlementSchedule = responseData.Data.SettlementSchedule.ToString(), + SettlementSchedule = responseData.SettlementSchedule.ToString(), //AvailableBalance = merchantResponse.AvailableBalance, //Balance = merchantResponse.Balance, Contact = new ContactModel { - Name = responseData.Data.Contacts.First().ContactName, - EmailAddress = responseData.Data.Contacts.First().ContactEmailAddress, - MobileNumber = responseData.Data.Contacts.First().ContactPhoneNumber + Name = responseData.Contacts.First().ContactName, + EmailAddress = responseData.Contacts.First().ContactEmailAddress, + MobileNumber = responseData.Contacts.First().ContactPhoneNumber }, Address = new AddressModel { - AddressLine3 = responseData.Data.Addresses.First().AddressLine3, - Town = responseData.Data.Addresses.First().Town, - AddressLine4 = responseData.Data.Addresses.First().AddressLine4, - PostalCode = responseData.Data.Addresses.First().PostalCode, - Region = responseData.Data.Addresses.First().Region, - AddressLine1 = responseData.Data.Addresses.First().AddressLine1, - AddressLine2 = responseData.Data.Addresses.First().AddressLine2 + AddressLine3 = responseData.Addresses.First().AddressLine3, + Town = responseData.Addresses.First().Town, + AddressLine4 = responseData.Addresses.First().AddressLine4, + PostalCode = responseData.Addresses.First().PostalCode, + Region = responseData.Addresses.First().Region, + AddressLine1 = responseData.Addresses.First().AddressLine1, + AddressLine2 = responseData.Addresses.First().AddressLine2 } }; diff --git a/TransactionProcessor.Mobile.BusinessLogic/Services/TransactionService.cs b/TransactionProcessor.Mobile.BusinessLogic/Services/TransactionService.cs index 9e4b468be..e6037844e 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/Services/TransactionService.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/Services/TransactionService.cs @@ -64,7 +64,7 @@ public async Task> PerformBill CancellationToken cancellationToken) { Logger.LogInformation("About to perform bill payment get account transaction"); - Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), cancellationToken); + Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), "api/saletransactions", cancellationToken); if (result.IsSuccess == false) { @@ -74,7 +74,7 @@ public async Task> PerformBill PerformBillPaymentGetAccountResponseModel responseModel = new() { - BillDetails = result.Data.AdditionalResponseMetaData.ToBillDetails() + BillDetails = result.Data.AdditionalResponseMetadata.ToBillDetails() }; Logger.LogInformation("Bill payment - get account transaction performed successfully"); @@ -86,7 +86,7 @@ public async Task> PerformBil CancellationToken cancellationToken) { Logger.LogInformation("About to perform bill payment make payment transaction"); - Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), cancellationToken); + Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(),"api/saletransactions", cancellationToken); if (result.IsSuccess == false) { @@ -112,7 +112,7 @@ public async Task> PerformBil public async Task> PerformBillPaymentGetMeter(PerformBillPaymentGetMeterModel model, CancellationToken cancellationToken){ Logger.LogInformation("About to perform bill payment get meter transaction"); - Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), cancellationToken); + Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), "api/saletransactions", cancellationToken); if (result.IsSuccess == false) { @@ -121,9 +121,9 @@ public async Task> PerformBillPa } - MeterDetails meterDetails = result.Data.AdditionalResponseMetaData switch{ + MeterDetails meterDetails = result.Data.AdditionalResponseMetadata switch{ null => null, - _ => result.Data.AdditionalResponseMetaData.ToMeterDetails(model.MeterNumber) + _ => result.Data.AdditionalResponseMetadata.ToMeterDetails(model.MeterNumber) }; PerformBillPaymentGetMeterResponseModel responseModel = new() @@ -140,7 +140,7 @@ public async Task> PerformLogon(PerformLogonRe CancellationToken cancellationToken) { Logger.LogInformation("About to perform logon transaction"); - Result result = await this.SendTransactionRequest(model.ToLogonTransactionRequest(), cancellationToken); + Result result = await this.SendTransactionRequest(model.ToLogonTransactionRequest(), "api/logontransactions", cancellationToken); if (result.IsSuccess == false) { @@ -167,7 +167,7 @@ public async Task> PerformMobileTopup(Pe Logger.LogInformation("About to perform mobile top-up transaction"); Result result = - await this.SendTransactionRequest(model.ToSaleTransactionRequest(), cancellationToken); + await this.SendTransactionRequest(model.ToSaleTransactionRequest(), "api/saletransactions", cancellationToken); if (result.IsSuccess == false) { Logger.LogWarning("Error performing Mobile top-up transaction"); @@ -192,7 +192,7 @@ public async Task> PerformReconciliat CancellationToken cancellationToken) { Logger.LogInformation("About to perform reconciliation transaction"); - Result result = await this.SendTransactionRequest(model.ToReconciliationRequest(), cancellationToken); + Result result = await this.SendTransactionRequest(model.ToReconciliationRequest(), "api/reconciliationtransactions", cancellationToken); if (result.IsSuccess == false) { @@ -220,7 +220,7 @@ public async Task> PerformVoucherIssue( CancellationToken cancellationToken) { Logger.LogInformation("About to perform voucher transaction"); - Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), cancellationToken); + Result result = await this.SendTransactionRequest(model.ToSaleTransactionRequest(), "api/saletransactions", cancellationToken); if (result.IsSuccess == false) { @@ -253,14 +253,15 @@ protected override async Task> HandleResponseX(HttpResponseMessag private String BuildRequestUrl(String route) { String baseAddress = this.BaseAddressResolver("TransactionProcessorACL"); - String requestUri = $"{baseAddress}{route}"; + String requestUri = $"{baseAddress}/{route}"; return requestUri; } private async Task> SendTransactionRequest(TRequest request, + String route, CancellationToken cancellationToken) { - String requestUri = this.BuildRequestUrl("/api/transactions"); + String requestUri = this.BuildRequestUrl(route); try { String requestSerialised = JsonConvert.SerializeObject(request, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); @@ -286,9 +287,9 @@ private async Task> SendTransactionRequest responseData = this.HandleResponseContent(result.Data); + var responseData = JsonConvert.DeserializeObject(result.Data); - return Result.Success(responseData.Data); + return Result.Success(responseData); } catch (Exception ex) { // An exception has occurred, add some additional information to the message diff --git a/TransactionProcessor.Mobile.BusinessLogic/TransactionProcessor.Mobile.BusinessLogic.csproj b/TransactionProcessor.Mobile.BusinessLogic/TransactionProcessor.Mobile.BusinessLogic.csproj index 694fc5110..7d324aaa4 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/TransactionProcessor.Mobile.BusinessLogic.csproj +++ b/TransactionProcessor.Mobile.BusinessLogic/TransactionProcessor.Mobile.BusinessLogic.csproj @@ -1,22 +1,22 @@  - net9.0 + net10.0 enable enable - - - + + + - - + + - - - + + + diff --git a/TransactionProcessor.Mobile.BusinessLogic/UIServices/IDeviceService.cs b/TransactionProcessor.Mobile.BusinessLogic/UIServices/IDeviceService.cs index 8d95081a7..1b9d2412e 100644 --- a/TransactionProcessor.Mobile.BusinessLogic/UIServices/IDeviceService.cs +++ b/TransactionProcessor.Mobile.BusinessLogic/UIServices/IDeviceService.cs @@ -7,9 +7,7 @@ public interface IDeviceService String GetModel(); String GetPlatform(); - - Boolean IsIOS(); - + String GetManufacturer(); void SetOrientation(Orientation displayOrientation); diff --git a/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs b/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs index c8f6c0dd4..bff23fd3e 100644 --- a/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs +++ b/TransactionProcessor.Mobile.UITests/Common/DockerHelper.cs @@ -1,13 +1,14 @@ using System.Net; using System.Net.Sockets; -using Ductus.FluentDocker.Builders; -using Ductus.FluentDocker.Common; -using Ductus.FluentDocker.Services; -using Ductus.FluentDocker.Services.Extensions; +using System.Runtime.InteropServices; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Containers; +using DotNet.Testcontainers.Networks; using EventStore.Client; using Reqnroll; using SecurityService.Client; using Shared.IntegrationTesting; +using Shared.IntegrationTesting.TestContainers; using Shared.Logger; using Shouldly; using TransactionProcessor.Client; @@ -17,7 +18,7 @@ namespace TransactionProcessor.Mobile.UITests.Common { - public class DockerHelper : global::Shared.IntegrationTesting.DockerHelper + public class DockerHelper : global::Shared.IntegrationTesting.TestContainers.DockerHelper { #region Fields @@ -86,11 +87,10 @@ public string GetLocalIPAddress() public String LocalIPAddress { get; private set; } public override ContainerBuilder SetupTransactionProcessorAclContainer(){ - this.AdditionalVariables.Add(ContainerType.TransactionProcessorAcl, new List()); - this.SetAdditionalVariables(ContainerType.TransactionProcessorAcl, - new List{ - "AppSettings:SkipVersionCheck=true" - }); + this.AdditionalVariables.Add(ContainerType.TransactionProcessorAcl, new Dictionary { + {"AppSettings:SkipVersionCheck", "true"} + }); + return base.SetupTransactionProcessorAclContainer(); } @@ -113,19 +113,19 @@ public override async Task CreateSubscriptions() /// Name of the scenario. public override async Task StartContainersForScenarioRun(String scenarioName, DockerServices dockerServices) { - DockerEnginePlatform engineType = BaseDockerHelper.GetDockerEnginePlatform(); - if (engineType == DockerEnginePlatform.Windows){ + var engineType = await BaseDockerHelper.GetDockerEnginePlatform(); + + if (engineType.Data == DockerEnginePlatform.Windows){ this.SetImageDetails(ContainerType.EventStore, ("stuartferguson/eventstore_windows", true)); } - - //this.SetImageDetails(ContainerType.TransactionProcessorAcl, ("transactionprocessoracl", false)); - + // Get the address of the host this.LocalIPAddress = this.GetLocalIPAddress(); this.Trace(this.LocalIPAddress); await base.StartContainersForScenarioRun(scenarioName, dockerServices); - await this.SetupConfigHostContainer(this.TestNetworks); + var c = await this.StartContainer2(this.SetupConfigHostContainer,this.TestNetworks, (DockerServices)512); + this.ConfigHostPort = c.GetMappedPublicPort(ConfigHostDockerPort); // Setup the base address resolvers @@ -159,33 +159,6 @@ public override async Task StartContainersForScenarioRun(String scenarioName, Do public String SecurityServiceBaseAddressResolver(String api) => $"https://127.0.0.1:{this.SecurityServicePort}"; - private async Task RemoveEstateReadModel() - { - List estateIdList = this.TestingContext.GetAllEstateIds(); - - foreach (Guid estateId in estateIdList) - { - String databaseName = $"EstateReportingReadModel{estateId}"; - - // Build the connection string (to master) - String connectionString = Setup.GetLocalConnectionString(databaseName); - await Retry.For(async () => - { - //EstateReportingSqlServerContext context = new EstateReportingSqlServerContext(connectionString); - //await context.Database.EnsureDeletedAsync(CancellationToken.None); - }, retryFor: TimeSpan.FromMinutes(2), retryInterval: TimeSpan.FromSeconds(30)); - } - } - - /// - /// Stops the containers for scenario run. - /// - public override async Task StopContainersForScenarioRun(DockerServices sharedDockerServices) { - await this.RemoveEstateReadModel().ConfigureAwait(false); - - await base.StopContainersForScenarioRun(sharedDockerServices); - } - public const int ConfigHostDockerPort = 9200; public String ConfigHostContainerName; @@ -193,55 +166,41 @@ public override async Task StopContainersForScenarioRun(DockerServices sharedDoc public HttpClient TestHostHttpClient; - public async Task SetupConfigHostContainer(List networkServices) + public ContainerBuilder SetupConfigHostContainer() { this.Trace("About to Start Config Host Container"); - List environmentVariables = new List(); - environmentVariables.Add("AppSettings:InMemoryDatabase=true"); + Dictionary environmentVariables = new(); + environmentVariables.Add("AppSettings:InMemoryDatabase","true"); + this.ConfigHostContainerName = $"mobileconfighost{this.TestId:N}"; String imageName = "stuartferguson/mobileconfiguration:master"; - - if (FdOs.IsWindows() && Shared.IntegrationTesting.DockerHelper.GetDockerEnginePlatform() == DockerEnginePlatform.Windows){ + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && this.DockerPlatform == DockerEnginePlatform.Windows){ imageName = "stuartferguson/mobileconfigurationwindows:master"; } - ContainerBuilder configHostContainer = new Builder().UseContainer().WithName(this.ConfigHostContainerName) - .WithEnvironment(environmentVariables.ToArray()) - .UseImageDetails((imageName, true)) - .ExposePort(ConfigHostDockerPort) - .MountHostFolder(this.DockerPlatform, this.HostTraceFolder) - .SetDockerCredentials(this.DockerCredentials); - - // Now build and return the container - IContainerService builtContainer = configHostContainer.Build().Start().WaitForPort($"{ConfigHostDockerPort}/tcp", 30000); + ContainerBuilder configHostContainer = new ContainerBuilder().WithName(this.ConfigHostContainerName) + .WithImage(imageName) + .WithEnvironment(environmentVariables) + .MountHostFolder(this.DockerPlatform, this.HostTraceFolder) + .WithPortBinding(ConfigHostDockerPort, true); - foreach (INetworkService networkService in networkServices) - { - networkService.Attach(builtContainer, false); - } - - this.Trace("Config Host Container Started"); - this.Containers.Add((DockerServices.TestHost, builtContainer)); - - // Do a health check here - this.ConfigHostPort = builtContainer.ToHostExposedEndpoint($"{ConfigHostDockerPort}/tcp").Port; - - //await this.DoHealthCheck(ContainerType.CallbackHandler); - return builtContainer; + return configHostContainer; } - public override ContainerBuilder SetupTransactionProcessorContainer() - { - List variables = new List(); - variables.Add($"OperatorConfiguration:PataPawaPrePay:Url=http://{this.TestHostContainerName}:{DockerPorts.TestHostPort}/api/patapawaprepay"); + //public override ContainerBuilder SetupTransactionProcessorContainer() + //{ + // //List variables = new List(); + // //variables.Add($"OperatorConfiguration:PataPawaPrePay:Url=http://{this.TestHostContainerName}:{DockerPorts.TestHostPort}/api/patapawaprepay"); - this.AdditionalVariables.Add(ContainerType.FileProcessor, variables); - //this.SetAdditionalVariables(ContainerType.FileProcessor, variables); - - return base.SetupTransactionProcessorContainer(); - } + // //this.AdditionalVariables.Add(ContainerType.FileProcessor, variables); + // this.AdditionalVariables.Add(ContainerType.TransactionProcessor, new Dictionary { + // {"OperatorConfiguration:PataPawaPrePay:Url", $"http://{this.TestHostContainerName}:{DockerPorts.TestHostPort}/api/patapawaprepay"} + // }); + + // return base.SetupTransactionProcessorContainer(); + //} #endregion } diff --git a/TransactionProcessor.Mobile.UITests/Common/GenericSteps.cs b/TransactionProcessor.Mobile.UITests/Common/GenericSteps.cs index 63fe40941..bce0dce10 100644 --- a/TransactionProcessor.Mobile.UITests/Common/GenericSteps.cs +++ b/TransactionProcessor.Mobile.UITests/Common/GenericSteps.cs @@ -23,8 +23,7 @@ public GenericSteps(ScenarioContext scenarioContext, [BeforeScenario(Order = 0)] public async Task StartSystem(){ if (this.ScenarioContext.ScenarioInfo.Tags.Contains("PRNavTest") || - this.ScenarioContext.ScenarioInfo.Tags.Contains("PRHWNavTest") || - this.ScenarioContext.ScenarioInfo.Tags.Contains("iOSPRTest")) + this.ScenarioContext.ScenarioInfo.Tags.Contains("PRHWNavTest")) { // Initialise a logger String scenarioName = this.ScenarioContext.ScenarioInfo.Title.Replace(" ", ""); @@ -37,7 +36,9 @@ public async Task StartSystem(){ DockerServices dockerServices = DockerServices.EventStore | DockerServices.MessagingService | DockerServices.SecurityService | DockerServices.TestHost | DockerServices.SqlServer | DockerServices.TransactionProcessor | - DockerServices.TransactionProcessorAcl; + DockerServices.TransactionProcessorAcl | (DockerServices)512; + + //dockerServices = DockerServices.EventStore | DockerServices.SqlServer | (DockerServices)512; // Initialise a logger String scenarioName = this.ScenarioContext.ScenarioInfo.Title.Replace(" ", ""); @@ -62,8 +63,6 @@ public async Task StartSystem(){ await Setup.GlobalSetup(this.TestingContext.DockerHelper); - this.TestingContext.DockerHelper.SqlServerContainer = Setup.DatabaseServerContainer; - this.TestingContext.DockerHelper.SqlServerNetwork = Setup.DatabaseServerNetwork; this.TestingContext.DockerHelper.DockerCredentials = Setup.DockerCredentials; this.TestingContext.DockerHelper.SqlCredentials = Setup.SqlCredentials; this.TestingContext.DockerHelper.SqlServerContainerName = "sharedsqlserver"; @@ -80,11 +79,10 @@ public async Task StartSystem(){ [AfterScenario(Order = 0)] public async Task StopSystem() { - if (this.ScenarioContext.ScenarioInfo.Tags.Contains("PRNavTest") == false && this.ScenarioContext.ScenarioInfo.Tags.Contains("PRHWNavTest") == false - && this.ScenarioContext.ScenarioInfo.Tags.Contains("iOSPRTest") == false) + if (this.ScenarioContext.ScenarioInfo.Tags.Contains("PRNavTest") == false && this.ScenarioContext.ScenarioInfo.Tags.Contains("PRHWNavTest") == false) { this.TestingContext.Logger.LogInformation("About to Stop Containers for Scenario Run"); - await this.TestingContext.DockerHelper.StopContainersForScenarioRun(DockerServices.SqlServer).ConfigureAwait(false); + await this.TestingContext.DockerHelper.StopContainersForScenarioRun(DockerServices.None).ConfigureAwait(false); this.TestingContext.Logger.LogInformation("Containers for Scenario Run Stopped"); } } diff --git a/TransactionProcessor.Mobile.UITests/Common/Setup.cs b/TransactionProcessor.Mobile.UITests/Common/Setup.cs index e62f3ee0c..c31d00a7a 100644 --- a/TransactionProcessor.Mobile.UITests/Common/Setup.cs +++ b/TransactionProcessor.Mobile.UITests/Common/Setup.cs @@ -8,33 +8,12 @@ namespace TransactionProcessor.Mobile.UITests.Common [Binding] [Scope(Tag = "base")] public class Setup{ - public static IContainerService DatabaseServerContainer; - public static INetworkService DatabaseServerNetwork; public static (String usename, String password) SqlCredentials = ("sa", "thisisalongpassword123!"); public static (String url, String username, String password) DockerCredentials = ("https://www.docker.com", "stuartferguson", "Sc0tland"); //[BeforeTestRun] public static async Task GlobalSetup(DockerHelper dockerHelper) { ShouldlyConfiguration.DefaultTaskTimeout = TimeSpan.FromMinutes(1); - dockerHelper.SqlCredentials = Setup.SqlCredentials; - dockerHelper.DockerCredentials = Setup.DockerCredentials; - dockerHelper.SqlServerContainerName = "sharedsqlserver"; - - Setup.DatabaseServerNetwork = dockerHelper.SetupTestNetwork("sharednetwork", true); - Setup.DatabaseServerContainer = await dockerHelper.SetupSqlServerContainer(Setup.DatabaseServerNetwork); } - - public static String GetConnectionString(String databaseName) - { - return $"server={Setup.DatabaseServerContainer.Name};database={databaseName};user id={Setup.SqlCredentials.usename};password={Setup.SqlCredentials.password}"; - } - - public static String GetLocalConnectionString(String databaseName) - { - Int32 databaseHostPort = Setup.DatabaseServerContainer.ToHostExposedEndpoint("1433/tcp").Port; - - return $"server=localhost,{databaseHostPort};database={databaseName};user id={Setup.SqlCredentials.usename};password={Setup.SqlCredentials.password}"; - } - } } diff --git a/TransactionProcessor.Mobile.UITests/Drivers/AppiumDriver.cs b/TransactionProcessor.Mobile.UITests/Drivers/AppiumDriver.cs index eb139e65f..51ade1ef8 100644 --- a/TransactionProcessor.Mobile.UITests/Drivers/AppiumDriver.cs +++ b/TransactionProcessor.Mobile.UITests/Drivers/AppiumDriver.cs @@ -11,10 +11,8 @@ namespace TransactionProcessor.Mobile.UITests.Drivers { public enum MobileTestPlatform { - iOS, Android, Windows, - MacCatalyst } public class AppiumDriverWrapper @@ -40,10 +38,6 @@ public void StartApp() { AppiumDriverWrapper.SetupAndroidDriver(appiumService); } - else if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.iOS) - { - AppiumDriverWrapper.SetupiOSDriverNew(appiumService); - } else if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.Windows) { AppiumDriverWrapper.SetupWindowsDriver(appiumService); @@ -64,90 +58,14 @@ private static void SetupWindowsDriver(AppiumLocalService appiumService) driverOptions.App = "TransactionMobile_zct748q4xfh0m!App"; AppiumDriverWrapper.Driver = new WindowsDriver(appiumService, driverOptions, TimeSpan.FromMinutes(10)); } - - //public static void SetupiOSDriverX() - //{ - // //String assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - // //String binariesFolder = Path.Combine(assemblyFolder, "..", "..", "..", "..", @"TransactionProcessor.Mobile/bin/Release/net9.0-ios/iossimulator-arm64/"); - // //var appPath = Path.Combine(binariesFolder, "TransactionProcessor.Mobile.app"); - // var appPath = "/Users/user272907/Documents/Projects/TransactionMobile/TransactionProcessor.Mobile/bin/Release/net9.0-ios/iossimulator-arm64/TransactionProcessor.Mobile.app"; - // var exists = Directory.Exists(appPath); - // var options = new AppiumOptions(); - // options.PlatformName = "iOS"; - // options.PlatformVersion = "18.3"; - // options.AutomationName = "XCUITest"; - // options.DeviceName = "iPhone 16"; - // options.App = appPath; // Only if you want Appium to install the app - - // //var simulatorId = Environment.GetEnvironmentVariable("SIMULATOR_ID")?.Trim(); - // //if (string.IsNullOrWhiteSpace(simulatorId)) - // // throw new InvalidOperationException("SIMULATOR_ID environment variable is not set."); - // //options.AddAdditionalAppiumOption("udid", simulatorId); - - // //options.AddAdditionalAppiumOption("usePrebuiltWDA", true); - // //options.AddAdditionalAppiumOption("noReset", true); - // //options.AddAdditionalAppiumOption("fullReset", false); - // options.AddAdditionalAppiumOption("usePrebuiltWDA", true); - // options.AddAdditionalAppiumOption("derivedDataPath", "~/Library/Developer/Xcode/DerivedData/WebDriverAgent-hjlcwhatzxfnnggzdecgbewgjzil"); - // options.AddAdditionalAppiumOption("wdaStartupRetries", 2); - // options.AddAdditionalAppiumOption("wdaStartupRetryInterval", 10000); - // options.AddAdditionalAppiumOption("showXcodeLog", true); - // AppiumDriverWrapper.Driver = new OpenQA.Selenium.Appium.iOS.IOSDriver( - // new Uri("http://127.0.0.1:4723"), options, TimeSpan.FromMinutes(2)); - //} - - private static void SetupiOSDriverNew(AppiumLocalService appiumService) - { - String assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - String binariesFolder = Path.Combine(assemblyFolder, "..", "..", "..", "..", @"TransactionProcessor.Mobile/bin/Release/net9.0-ios/iossimulator-arm64/"); - var appPath = Path.Combine(binariesFolder, "TransactionProcessor.Mobile.app"); - - var options = new AppiumOptions(); - options.PlatformName = "iOS"; - options.DeviceName = ""; - //options.AddAdditionalAppiumOption("udid", "0A7AD110-C0C0-45BC-BCBC-8091AC55FF18"); - var simulatorId = Environment.GetEnvironmentVariable("SIMULATOR_ID")?.Trim(); - options.AddAdditionalAppiumOption("udid", simulatorId); - options.App = appPath; - //options.AddAdditionalAppiumOption("bundleId", "com.apple.Preferences"); - options.AutomationName = "XCUITest"; - options.AddAdditionalAppiumOption("useNewWDA", true); - options.AddAdditionalAppiumOption("autoAcceptAlerts", true); - options.AddAdditionalAppiumOption("wdaStartupRetries", 3); - options.AddAdditionalAppiumOption("wdaStartupRetryInterval", 5000); - options.AddAdditionalAppiumOption("showXcodeLog", true); - options.AddAdditionalAppiumOption("waitForIdleTimeout", 100); - AppiumDriverWrapper.Driver = new OpenQA.Selenium.Appium.iOS.IOSDriver(appiumService, options); - } - - //private static void SetupiOSDriver(AppiumLocalService appiumService) - //{ - // String assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - // String binariesFolder = Path.Combine(assemblyFolder, "..", "..", "..", "..", @"TransactionProcessor.Mobile/bin/Release/net9.0-ios/iossimulator-arm64/"); - // var appPath = Path.Combine(binariesFolder, "TransactionProcessor.Mobile.app"); - - // var options = new AppiumOptions(); - // options.PlatformName = "iOS"; - // options.PlatformVersion = "18.3"; - // options.AutomationName = "XCUITest"; - // options.DeviceName = "iPhone 16"; - // options.App = appPath; // Only if you want Appium to install the app - // //options.AddAdditionalAppiumOption("useNewWDA", true); // Rebuild WDA - // options.AddAdditionalAppiumOption("usePrebuiltWDA", true); - // options.AddAdditionalAppiumOption("derivedDataPath", "~/Library/Developer/Xcode/DerivedData/WebDriverAgent-hjlcwhatzxfnnggzdecgbewgjziloption"); - // options.AddAdditionalAppiumOption("wdaStartupRetries", 2); - // options.AddAdditionalAppiumOption("wdaStartupRetryInterval", 10000); - - // AppiumDriverWrapper.Driver = new OpenQA.Selenium.Appium.iOS.IOSDriver(appiumService, options, TimeSpan.FromMinutes(2)); - //} - + private static void SetupAndroidDriver(AppiumLocalService appiumService) { var driverOptions = new AppiumOptions(); driverOptions.AddAdditionalAppiumOption("adbExecTimeout", TimeSpan.FromMinutes(5).TotalMilliseconds); driverOptions.AutomationName = "UIAutomator2"; driverOptions.PlatformName = "Android"; - driverOptions.PlatformVersion = "15.0"; + driverOptions.PlatformVersion = "16.0"; driverOptions.DeviceName = "emulator-5554"; driverOptions.AddAdditionalAppiumOption(MobileCapabilityType.FullReset, true); @@ -157,7 +75,7 @@ private static void SetupAndroidDriver(AppiumLocalService appiumService) driverOptions.AddAdditionalAppiumOption(MobileCapabilityType.NewCommandTimeout, 6000); String assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - String binariesFolder = Path.Combine(assemblyFolder, "..", "..", "..", "..", @"TransactionProcessor.Mobile/bin/Release/net9.0-android/"); + String binariesFolder = Path.Combine(assemblyFolder, "..", "..", "..", "..", @"TransactionProcessor.Mobile/bin/Release/net10.0-android/"); var apkPath = Path.Combine(binariesFolder, "com.transactionprocessor.mobile-Signed.apk"); var fileinfo = new FileInfo(apkPath); diff --git a/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature b/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature index 6e43abdfe..2924feab9 100644 --- a/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature +++ b/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature @@ -111,8 +111,6 @@ Background: | Reference | Amount | DateTime | MerchantName | EstateName | | Deposit1 | 100.00 | Today | Test Merchant 1 | Test Estate 1 | - #Given I have created a config for my application - Given I have created a config for my device @PRTest diff --git a/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature.cs b/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature.cs index 08fecec13..5f7d2e2ad 100644 --- a/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature.cs +++ b/TransactionProcessor.Mobile.UITests/Features/EndToEndTests.feature.cs @@ -1,8 +1,8 @@ // ------------------------------------------------------------------------------ // -// This code was generated by Reqnroll (https://www.reqnroll.net/). -// Reqnroll Version:2.0.0.0 -// Reqnroll Generator Version:2.0.0.0 +// This code was generated by Reqnroll (https://reqnroll.net/). +// Reqnroll Version:3.0.0.0 +// Reqnroll Generator Version:3.0.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -15,19 +15,19 @@ namespace TransactionProcessor.Mobile.UITests.Features { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "2.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "3.0.0.0")] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [NUnit.Framework.TestFixtureAttribute()] - [NUnit.Framework.DescriptionAttribute("EndToEndTests")] - [NUnit.Framework.FixtureLifeCycleAttribute(NUnit.Framework.LifeCycle.InstancePerTestCase)] - [NUnit.Framework.CategoryAttribute("background")] - [NUnit.Framework.CategoryAttribute("login")] - [NUnit.Framework.CategoryAttribute("toolbar")] - [NUnit.Framework.CategoryAttribute("profile")] - [NUnit.Framework.CategoryAttribute("base")] - [NUnit.Framework.CategoryAttribute("sharedapp")] - [NUnit.Framework.CategoryAttribute("shared")] - [NUnit.Framework.CategoryAttribute("transactions")] + [global::NUnit.Framework.TestFixtureAttribute()] + [global::NUnit.Framework.DescriptionAttribute("EndToEndTests")] + [global::NUnit.Framework.FixtureLifeCycleAttribute(global::NUnit.Framework.LifeCycle.InstancePerTestCase)] + [global::NUnit.Framework.CategoryAttribute("background")] + [global::NUnit.Framework.CategoryAttribute("login")] + [global::NUnit.Framework.CategoryAttribute("toolbar")] + [global::NUnit.Framework.CategoryAttribute("profile")] + [global::NUnit.Framework.CategoryAttribute("base")] + [global::NUnit.Framework.CategoryAttribute("sharedapp")] + [global::NUnit.Framework.CategoryAttribute("shared")] + [global::NUnit.Framework.CategoryAttribute("transactions")] public partial class EndToEndTestsFeature { @@ -43,22 +43,23 @@ public partial class EndToEndTestsFeature "shared", "transactions"}; - private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "EndToEndTests", null, global::Reqnroll.ProgrammingLanguage.CSharp, featureTags); + private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "EndToEndTests", null, global::Reqnroll.ProgrammingLanguage.CSharp, featureTags, InitializeCucumberMessages()); #line 1 "EndToEndTests.feature" #line hidden - [NUnit.Framework.OneTimeSetUpAttribute()] + [global::NUnit.Framework.OneTimeSetUpAttribute()] public static async global::System.Threading.Tasks.Task FeatureSetupAsync() { } - [NUnit.Framework.OneTimeTearDownAttribute()] + [global::NUnit.Framework.OneTimeTearDownAttribute()] public static async global::System.Threading.Tasks.Task FeatureTearDownAsync() { + await global::Reqnroll.TestRunnerManager.ReleaseFeatureAsync(featureInfo); } - [NUnit.Framework.SetUpAttribute()] + [global::NUnit.Framework.SetUpAttribute()] public async global::System.Threading.Tasks.Task TestInitializeAsync() { testRunner = global::Reqnroll.TestRunnerManager.GetTestRunnerForAssembly(featureHint: featureInfo); @@ -84,7 +85,7 @@ public partial class EndToEndTestsFeature } } - [NUnit.Framework.TearDownAttribute()] + [global::NUnit.Framework.TearDownAttribute()] public async global::System.Threading.Tasks.Task TestTearDownAsync() { if ((testRunner == null)) @@ -102,10 +103,10 @@ public partial class EndToEndTestsFeature } } - public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) + public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, global::Reqnroll.RuleInfo ruleInfo) { - testRunner.OnScenarioInitialize(scenarioInfo); - testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(NUnit.Framework.TestContext.CurrentContext); + testRunner.OnScenarioInitialize(scenarioInfo, ruleInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(global::NUnit.Framework.TestContext.CurrentContext); } public async global::System.Threading.Tasks.Task ScenarioStartAsync() @@ -519,26 +520,34 @@ await testRunner.GivenAsync("I have a token to access the estate management and #line 110 await testRunner.GivenAsync("I make the following manual merchant deposits", ((string)(null)), table20, "Given "); #line hidden -#line 116 +#line 114 await testRunner.GivenAsync("I have created a config for my device", ((string)(null)), ((global::Reqnroll.Table)(null)), "Given "); #line hidden } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("EndToEnd")] - [NUnit.Framework.CategoryAttribute("PRTest")] + private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() + { + return new global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages("Features/EndToEndTests.feature.ndjson", 3); + } + + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("EndToEnd")] + [global::NUnit.Framework.CategoryAttribute("PRTest")] public async global::System.Threading.Tasks.Task EndToEnd() { string[] tagsOfScenario = new string[] { "PRTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("EndToEnd", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 119 -this.ScenarioInitialize(scenarioInfo); + string pickleIndex = "0"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("EndToEnd", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; +#line 117 +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -546,34 +555,34 @@ await testRunner.GivenAsync("I have a token to access the estate management and #line 4 await this.FeatureBackgroundAsync(); #line hidden -#line 120 +#line 118 await testRunner.GivenAsync("I am on the Login Screen", ((string)(null)), ((global::Reqnroll.Table)(null)), "Given "); #line hidden -#line 121 +#line 119 await testRunner.AndAsync("my device is registered", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 122 +#line 120 await testRunner.WhenAsync("I enter \'user1\' as the Email Address", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 123 +#line 121 await testRunner.AndAsync("I enter \'123456\' as the Password", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 124 +#line 122 await testRunner.AndAsync("I tap on Login", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 125 +#line 123 await testRunner.ThenAsync("the Merchant Home Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 126 +#line 124 await testRunner.WhenAsync("I tap on Profile", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 127 +#line 125 await testRunner.ThenAsync("the My Profile Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 128 +#line 126 await testRunner.WhenAsync("I tap on the Addresses button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 129 +#line 127 await testRunner.ThenAsync("the Address List Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden global::Reqnroll.Table table21 = new global::Reqnroll.Table(new string[] { @@ -582,19 +591,19 @@ await testRunner.GivenAsync("I have a token to access the estate management and table21.AddRow(new string[] { "test address line 1", "TestTown"}); -#line 130 +#line 128 await testRunner.AndAsync("the Primary Address is displayed", ((string)(null)), table21, "And "); #line hidden -#line 133 +#line 131 await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 134 +#line 132 await testRunner.ThenAsync("the My Profile Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 135 +#line 133 await testRunner.WhenAsync("I tap on the Account Info button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 136 +#line 134 await testRunner.ThenAsync("the Account Info Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden global::Reqnroll.Table table22 = new global::Reqnroll.Table(new string[] { @@ -605,121 +614,121 @@ await testRunner.GivenAsync("I have a token to access the estate management and "Test Merchant 1", "0", "0"}); -#line 137 +#line 135 await testRunner.AndAsync("the Account Info is displayed", ((string)(null)), table22, "And "); #line hidden -#line 140 +#line 138 await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 141 +#line 139 await testRunner.ThenAsync("the My Profile Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 142 +#line 140 await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 143 +#line 141 await testRunner.ThenAsync("the Merchant Home Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 144 +#line 142 await testRunner.WhenAsync("I tap on Transactions", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 145 +#line 143 await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 146 +#line 144 await testRunner.WhenAsync("I tap on the Mobile Topup button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 147 +#line 145 await testRunner.ThenAsync("the Transaction Select Mobile Topup Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 148 +#line 146 await testRunner.WhenAsync("I tap on the \'Safaricom\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 149 +#line 147 await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 150 +#line 148 await testRunner.WhenAsync("I tap on the \'Custom\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 151 +#line 149 await testRunner.ThenAsync("the Enter Topup Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 152 +#line 150 await testRunner.WhenAsync("I enter \'07777777775\' as the Customer Mobile Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 153 +#line 151 await testRunner.AndAsync("I enter 10.00 as the Topup Amount", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 154 +#line 152 await testRunner.AndAsync("I tap on Perform Topup", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 155 +#line 153 await testRunner.ThenAsync("the Mobile Topup Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 156 +#line 154 await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 157 +#line 155 await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 158 +#line 156 await testRunner.WhenAsync("I tap on the Voucher button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 159 +#line 157 await testRunner.ThenAsync("the Transaction Select Voucher Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 160 +#line 158 await testRunner.WhenAsync("I tap on the \'Hospital 1 Contract\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 161 +#line 159 await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 162 +#line 160 await testRunner.WhenAsync("I tap on the \'10 KES\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 163 +#line 161 await testRunner.ThenAsync("the Enter Voucher Issue Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 164 +#line 162 await testRunner.WhenAsync("I enter \'07777777775\' as the Recipient Mobile Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 165 +#line 163 await testRunner.AndAsync("I tap on Issue Voucher", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 166 +#line 164 await testRunner.ThenAsync("the Voucher Issue Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 167 +#line 165 await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 168 +#line 166 await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 169 +#line 167 await testRunner.WhenAsync("I tap on the Bill Payment button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 170 +#line 168 await testRunner.ThenAsync("the Transaction Select Bill Payment Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 171 +#line 169 await testRunner.WhenAsync("I tap on the \'PataPawa PostPay\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 172 +#line 170 await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 173 +#line 171 await testRunner.WhenAsync("I tap on the \'Bill Pay (Post)\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 174 +#line 172 await testRunner.ThenAsync("the Enter Account Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 175 +#line 173 await testRunner.WhenAsync("I enter \'12345678\' as the Account Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 176 +#line 174 await testRunner.AndAsync("I tap on the Get Account Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 177 +#line 175 await testRunner.ThenAsync("the Make Bill Payment page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden global::Reqnroll.Table table23 = new global::Reqnroll.Table(new string[] { @@ -732,92 +741,92 @@ await testRunner.GivenAsync("I have a token to access the estate management and "Test Account 1", "Today", "100.00"}); -#line 178 +#line 176 await testRunner.AndAsync("the following Bill Details are displayed", ((string)(null)), table23, "And "); #line hidden -#line 181 +#line 179 await testRunner.WhenAsync("I enter \'07777777775\' as the Customer Mobile Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 182 +#line 180 await testRunner.AndAsync("I enter 10.00 as the Payment Amount", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 183 +#line 181 await testRunner.AndAsync("I tap on the Make Payment Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 184 +#line 182 await testRunner.ThenAsync("the Bill Payment Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 185 +#line 183 await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 186 +#line 184 await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 187 +#line 185 await testRunner.WhenAsync("I tap on the Bill Payment button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 188 +#line 186 await testRunner.ThenAsync("the Transaction Select Bill Payment Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 189 +#line 187 await testRunner.WhenAsync("I tap on the \'PataPawa PrePay\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 190 +#line 188 await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 191 +#line 189 await testRunner.WhenAsync("I tap on the \'Bill Pay (Pre)\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 192 +#line 190 await testRunner.ThenAsync("the Enter Meter Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 193 +#line 191 await testRunner.WhenAsync("I enter \'00000001\' as the Meter Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 194 +#line 192 await testRunner.AndAsync("I tap on the Get Meter Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 195 +#line 193 await testRunner.ThenAsync("the Make Bill Payment page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden global::Reqnroll.Table table24 = new global::Reqnroll.Table(new string[] { "MeterNumber"}); table24.AddRow(new string[] { "00000001"}); -#line 196 +#line 194 await testRunner.AndAsync("the following Meter Details are displayed", ((string)(null)), table24, "And "); #line hidden -#line 199 +#line 197 await testRunner.WhenAsync("I enter 10.00 as the Payment Amount", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 200 +#line 198 await testRunner.AndAsync("I tap on the Make Payment Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 201 +#line 199 await testRunner.ThenAsync("the Bill Payment Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 202 +#line 200 await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); #line hidden -#line 203 +#line 201 await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 204 +#line 202 await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 205 +#line 203 await testRunner.ThenAsync("the Merchant Home Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 206 +#line 204 await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 207 +#line 205 await testRunner.ThenAsync("A message is displayed confirming I want to log out", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden -#line 208 +#line 206 await testRunner.WhenAsync("I click yes", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); #line hidden -#line 209 +#line 207 await testRunner.ThenAsync("the Login Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); #line hidden } diff --git a/TransactionProcessor.Mobile.UITests/Features/EndToEndTestsFeature.cs b/TransactionProcessor.Mobile.UITests/Features/EndToEndTestsFeature.cs index 12a2c56c7..da6b892e7 100644 --- a/TransactionProcessor.Mobile.UITests/Features/EndToEndTestsFeature.cs +++ b/TransactionProcessor.Mobile.UITests/Features/EndToEndTestsFeature.cs @@ -4,7 +4,6 @@ namespace TransactionProcessor.Mobile.UITests.Features { [TestFixture(MobileTestPlatform.Android, Category = "Android")] - //[TestFixture(MobileTestPlatform.iOS, Category = "iOS")] [TestFixture(MobileTestPlatform.Windows, Category = "Windows")] [NonParallelizable] public partial class EndToEndTestsFeature : BaseTestFixture diff --git a/TransactionProcessor.Mobile.UITests/Features/HardwarePageNavigation.feature.cs b/TransactionProcessor.Mobile.UITests/Features/HardwarePageNavigation.feature.cs index 87f356e86..da2b9f772 100644 --- a/TransactionProcessor.Mobile.UITests/Features/HardwarePageNavigation.feature.cs +++ b/TransactionProcessor.Mobile.UITests/Features/HardwarePageNavigation.feature.cs @@ -1,8 +1,8 @@ // ------------------------------------------------------------------------------ // -// This code was generated by Reqnroll (https://www.reqnroll.net/). -// Reqnroll Version:2.0.0.0 -// Reqnroll Generator Version:2.0.0.0 +// This code was generated by Reqnroll (https://reqnroll.net/). +// Reqnroll Version:3.0.0.0 +// Reqnroll Generator Version:3.0.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -15,20 +15,20 @@ namespace TransactionProcessor.Mobile.UITests.Features { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "2.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "3.0.0.0")] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [NUnit.Framework.TestFixtureAttribute()] - [NUnit.Framework.DescriptionAttribute("HardwarePageNavigation")] - [NUnit.Framework.FixtureLifeCycleAttribute(NUnit.Framework.LifeCycle.InstancePerTestCase)] - [NUnit.Framework.CategoryAttribute("background")] - [NUnit.Framework.CategoryAttribute("login")] - [NUnit.Framework.CategoryAttribute("toolbar")] - [NUnit.Framework.CategoryAttribute("profile")] - [NUnit.Framework.CategoryAttribute("shared")] - [NUnit.Framework.CategoryAttribute("transactions")] - [NUnit.Framework.CategoryAttribute("sharedapp")] - [NUnit.Framework.CategoryAttribute("base")] - [NUnit.Framework.CategoryAttribute("reports")] + [global::NUnit.Framework.TestFixtureAttribute()] + [global::NUnit.Framework.DescriptionAttribute("HardwarePageNavigation")] + [global::NUnit.Framework.FixtureLifeCycleAttribute(global::NUnit.Framework.LifeCycle.InstancePerTestCase)] + [global::NUnit.Framework.CategoryAttribute("background")] + [global::NUnit.Framework.CategoryAttribute("login")] + [global::NUnit.Framework.CategoryAttribute("toolbar")] + [global::NUnit.Framework.CategoryAttribute("profile")] + [global::NUnit.Framework.CategoryAttribute("shared")] + [global::NUnit.Framework.CategoryAttribute("transactions")] + [global::NUnit.Framework.CategoryAttribute("sharedapp")] + [global::NUnit.Framework.CategoryAttribute("base")] + [global::NUnit.Framework.CategoryAttribute("reports")] public partial class HardwarePageNavigationFeature { @@ -45,22 +45,23 @@ public partial class HardwarePageNavigationFeature "base", "reports"}; - private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "HardwarePageNavigation", null, global::Reqnroll.ProgrammingLanguage.CSharp, featureTags); + private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "HardwarePageNavigation", "", global::Reqnroll.ProgrammingLanguage.CSharp, featureTags, InitializeCucumberMessages()); #line 1 "HardwarePageNavigation.feature" #line hidden - [NUnit.Framework.OneTimeSetUpAttribute()] + [global::NUnit.Framework.OneTimeSetUpAttribute()] public static async global::System.Threading.Tasks.Task FeatureSetupAsync() { } - [NUnit.Framework.OneTimeTearDownAttribute()] + [global::NUnit.Framework.OneTimeTearDownAttribute()] public static async global::System.Threading.Tasks.Task FeatureTearDownAsync() { + await global::Reqnroll.TestRunnerManager.ReleaseFeatureAsync(featureInfo); } - [NUnit.Framework.SetUpAttribute()] + [global::NUnit.Framework.SetUpAttribute()] public async global::System.Threading.Tasks.Task TestInitializeAsync() { testRunner = global::Reqnroll.TestRunnerManager.GetTestRunnerForAssembly(featureHint: featureInfo); @@ -86,7 +87,7 @@ public partial class HardwarePageNavigationFeature } } - [NUnit.Framework.TearDownAttribute()] + [global::NUnit.Framework.TearDownAttribute()] public async global::System.Threading.Tasks.Task TestTearDownAsync() { if ((testRunner == null)) @@ -104,10 +105,10 @@ public partial class HardwarePageNavigationFeature } } - public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) + public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, global::Reqnroll.RuleInfo ruleInfo) { - testRunner.OnScenarioInitialize(scenarioInfo); - testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(NUnit.Framework.TestContext.CurrentContext); + testRunner.OnScenarioInitialize(scenarioInfo, ruleInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(global::NUnit.Framework.TestContext.CurrentContext); } public async global::System.Threading.Tasks.Task ScenarioStartAsync() @@ -120,21 +121,29 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await testRunner.CollectScenarioErrorsAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Device Back Button from Home Page Screen")] - [NUnit.Framework.CategoryAttribute("PRHWNavTest")] + private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() + { + return new global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages("Features/HardwarePageNavigation.feature.ndjson", 5); + } + + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Device Back Button from Home Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRHWNavTest")] public async global::System.Threading.Tasks.Task DeviceBackButtonFromHomePageScreen() { string[] tagsOfScenario = new string[] { "PRHWNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Device Back Button from Home Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "0"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Device Back Button from Home Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 6 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -185,21 +194,24 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Transaction Page Screen")] - [NUnit.Framework.CategoryAttribute("PRHWNavTest")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Transaction Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRHWNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromTransactionPageScreen() { string[] tagsOfScenario = new string[] { "PRHWNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Transaction Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "1"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Transaction Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 24 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -250,21 +262,24 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Reports Page Screen")] - [NUnit.Framework.CategoryAttribute("PRHWNavTest")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Reports Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRHWNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromReportsPageScreen() { string[] tagsOfScenario = new string[] { "PRHWNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Reports Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "2"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Reports Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 42 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { diff --git a/TransactionProcessor.Mobile.UITests/Features/IOSEndToEndTestsFeature.cs b/TransactionProcessor.Mobile.UITests/Features/IOSEndToEndTestsFeature.cs deleted file mode 100644 index 09e20834d..000000000 --- a/TransactionProcessor.Mobile.UITests/Features/IOSEndToEndTestsFeature.cs +++ /dev/null @@ -1,19 +0,0 @@ -using TransactionProcessor.Mobile.UITests.Common; -using TransactionProcessor.Mobile.UITests.Drivers; - -namespace TransactionProcessor.Mobile.UITests.Features; - -[TestFixture(MobileTestPlatform.Android, Category = "Android")] -[TestFixture(MobileTestPlatform.iOS, Category = "iOS")] -//[TestFixture(MobileTestPlatform.Windows, Category = "Windows")] -[NonParallelizable] -public partial class IOSEndToEndTestsFeature : BaseTestFixture -{ - #region Constructors - - public IOSEndToEndTestsFeature(MobileTestPlatform mobileTestPlatform) : base(mobileTestPlatform) - { - } - - #endregion -} \ No newline at end of file diff --git a/TransactionProcessor.Mobile.UITests/Features/PageNavigation.feature.cs b/TransactionProcessor.Mobile.UITests/Features/PageNavigation.feature.cs index b86f91281..5d44407d0 100644 --- a/TransactionProcessor.Mobile.UITests/Features/PageNavigation.feature.cs +++ b/TransactionProcessor.Mobile.UITests/Features/PageNavigation.feature.cs @@ -1,8 +1,8 @@ // ------------------------------------------------------------------------------ // -// This code was generated by Reqnroll (https://www.reqnroll.net/). -// Reqnroll Version:2.0.0.0 -// Reqnroll Generator Version:2.0.0.0 +// This code was generated by Reqnroll (https://reqnroll.net/). +// Reqnroll Version:3.0.0.0 +// Reqnroll Generator Version:3.0.0.0 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -15,21 +15,21 @@ namespace TransactionProcessor.Mobile.UITests.Features { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "2.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "3.0.0.0")] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [NUnit.Framework.TestFixtureAttribute()] - [NUnit.Framework.DescriptionAttribute("PageNavigation")] - [NUnit.Framework.FixtureLifeCycleAttribute(NUnit.Framework.LifeCycle.InstancePerTestCase)] - [NUnit.Framework.CategoryAttribute("background")] - [NUnit.Framework.CategoryAttribute("login")] - [NUnit.Framework.CategoryAttribute("toolbar")] - [NUnit.Framework.CategoryAttribute("profile")] - [NUnit.Framework.CategoryAttribute("shared")] - [NUnit.Framework.CategoryAttribute("transactions")] - [NUnit.Framework.CategoryAttribute("sharedapp")] - [NUnit.Framework.CategoryAttribute("base")] - [NUnit.Framework.CategoryAttribute("reports")] - [NUnit.Framework.CategoryAttribute("support")] + [global::NUnit.Framework.TestFixtureAttribute()] + [global::NUnit.Framework.DescriptionAttribute("PageNavigation")] + [global::NUnit.Framework.FixtureLifeCycleAttribute(global::NUnit.Framework.LifeCycle.InstancePerTestCase)] + [global::NUnit.Framework.CategoryAttribute("background")] + [global::NUnit.Framework.CategoryAttribute("login")] + [global::NUnit.Framework.CategoryAttribute("toolbar")] + [global::NUnit.Framework.CategoryAttribute("profile")] + [global::NUnit.Framework.CategoryAttribute("shared")] + [global::NUnit.Framework.CategoryAttribute("transactions")] + [global::NUnit.Framework.CategoryAttribute("sharedapp")] + [global::NUnit.Framework.CategoryAttribute("base")] + [global::NUnit.Framework.CategoryAttribute("reports")] + [global::NUnit.Framework.CategoryAttribute("support")] public partial class PageNavigationFeature { @@ -47,22 +47,23 @@ public partial class PageNavigationFeature "reports", "support"}; - private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "PageNavigation", null, global::Reqnroll.ProgrammingLanguage.CSharp, featureTags); + private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "PageNavigation", null, global::Reqnroll.ProgrammingLanguage.CSharp, featureTags, InitializeCucumberMessages()); #line 1 "PageNavigation.feature" #line hidden - [NUnit.Framework.OneTimeSetUpAttribute()] + [global::NUnit.Framework.OneTimeSetUpAttribute()] public static async global::System.Threading.Tasks.Task FeatureSetupAsync() { } - [NUnit.Framework.OneTimeTearDownAttribute()] + [global::NUnit.Framework.OneTimeTearDownAttribute()] public static async global::System.Threading.Tasks.Task FeatureTearDownAsync() { + await global::Reqnroll.TestRunnerManager.ReleaseFeatureAsync(featureInfo); } - [NUnit.Framework.SetUpAttribute()] + [global::NUnit.Framework.SetUpAttribute()] public async global::System.Threading.Tasks.Task TestInitializeAsync() { testRunner = global::Reqnroll.TestRunnerManager.GetTestRunnerForAssembly(featureHint: featureInfo); @@ -88,7 +89,7 @@ public partial class PageNavigationFeature } } - [NUnit.Framework.TearDownAttribute()] + [global::NUnit.Framework.TearDownAttribute()] public async global::System.Threading.Tasks.Task TestTearDownAsync() { if ((testRunner == null)) @@ -106,10 +107,10 @@ public partial class PageNavigationFeature } } - public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) + public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo, global::Reqnroll.RuleInfo ruleInfo) { - testRunner.OnScenarioInitialize(scenarioInfo); - testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(NUnit.Framework.TestContext.CurrentContext); + testRunner.OnScenarioInitialize(scenarioInfo, ruleInfo); + testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(global::NUnit.Framework.TestContext.CurrentContext); } public async global::System.Threading.Tasks.Task ScenarioStartAsync() @@ -122,21 +123,29 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await testRunner.CollectScenarioErrorsAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Login Screen")] - [NUnit.Framework.CategoryAttribute("PRNavTest")] + private static global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages InitializeCucumberMessages() + { + return new global::Reqnroll.Formatters.RuntimeSupport.FeatureLevelCucumberMessages("Features/PageNavigation.feature.ndjson", 8); + } + + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Login Screen")] + [global::NUnit.Framework.CategoryAttribute("PRNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromLoginScreen() { string[] tagsOfScenario = new string[] { "PRNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Login Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "0"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Login Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 5 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -154,19 +163,22 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Home Page Screen")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Home Page Screen")] public async global::System.Threading.Tasks.Task BackButtonFromHomePageScreen() { string[] tagsOfScenario = ((string[])(null)); global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Home Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "1"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Home Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 12 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -217,21 +229,24 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Transaction Page Screen")] - [NUnit.Framework.CategoryAttribute("PRNavTest")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Transaction Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromTransactionPageScreen() { string[] tagsOfScenario = new string[] { "PRNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Transaction Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "2"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Transaction Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 30 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -282,21 +297,24 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Reports Page Screen")] - [NUnit.Framework.CategoryAttribute("PRNavTest")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Reports Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromReportsPageScreen() { string[] tagsOfScenario = new string[] { "PRNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Reports Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "3"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Reports Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 48 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -347,21 +365,24 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Profile Page Screen")] - [NUnit.Framework.CategoryAttribute("PRNavTest")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Profile Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromProfilePageScreen() { string[] tagsOfScenario = new string[] { "PRNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Profile Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "4"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Profile Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 66 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { @@ -436,21 +457,24 @@ public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) await this.ScenarioCleanupAsync(); } - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("Back Button from Support Page Screen")] - [NUnit.Framework.CategoryAttribute("PRNavTest")] + [global::NUnit.Framework.TestAttribute()] + [global::NUnit.Framework.DescriptionAttribute("Back Button from Support Page Screen")] + [global::NUnit.Framework.CategoryAttribute("PRNavTest")] public async global::System.Threading.Tasks.Task BackButtonFromSupportPageScreen() { string[] tagsOfScenario = new string[] { "PRNavTest"}; global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Support Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags); + string pickleIndex = "5"; + global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("Back Button from Support Page Screen", null, tagsOfScenario, argumentsOfScenario, featureTags, pickleIndex); + string[] tagsOfRule = ((string[])(null)); + global::Reqnroll.RuleInfo ruleInfo = null; #line 92 -this.ScenarioInitialize(scenarioInfo); +this.ScenarioInitialize(scenarioInfo, ruleInfo); #line hidden if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) { - testRunner.SkipScenario(); + await testRunner.SkipScenarioAsync(); } else { diff --git a/TransactionProcessor.Mobile.UITests/Features/PageNavigationFeature.cs b/TransactionProcessor.Mobile.UITests/Features/PageNavigationFeature.cs index e4ebff43c..aaa5ce06b 100644 --- a/TransactionProcessor.Mobile.UITests/Features/PageNavigationFeature.cs +++ b/TransactionProcessor.Mobile.UITests/Features/PageNavigationFeature.cs @@ -4,7 +4,6 @@ namespace TransactionProcessor.Mobile.UITests.Features; [TestFixture(MobileTestPlatform.Android, Category = "Android")] -[TestFixture(MobileTestPlatform.iOS, Category = "iOS")] [TestFixture(MobileTestPlatform.Windows, Category = "Windows")] [NonParallelizable] public partial class PageNavigationFeature : BaseTestFixture diff --git a/TransactionProcessor.Mobile.UITests/Features/iOSEndToEndTests.feature b/TransactionProcessor.Mobile.UITests/Features/iOSEndToEndTests.feature deleted file mode 100644 index b4e6492a5..000000000 --- a/TransactionProcessor.Mobile.UITests/Features/iOSEndToEndTests.feature +++ /dev/null @@ -1,99 +0,0 @@ -@background @login @toolbar @profile @base @sharedapp @shared @transactions -Feature: iOSEndToEndTests - -Background: - - - -@iOSPRTest -Scenario: EndToEnd Training Mode - Given I am on the Login Screen - And the application is in training mode - When I enter 'user1' as the Email Address - And I enter '123456' as the Password - And I tap on Login - Then the Merchant Home Page is displayed - When I tap on Profile - Then the My Profile Page is displayed - When I tap on the Addresses button - Then the Address List Page is displayed - And the Primary Address is displayed - | AddressLine1 | AddressTown | - | test address line 1 | Town | - When I click on the back button - Then the My Profile Page is displayed - When I tap on the Account Info button - Then the Account Info Page is displayed - And the Account Info is displayed - | Name | Balance | AvailableBalance | - | Dummy Merchant | 99 | 100 | - When I click on the back button - Then the My Profile Page is displayed - When I click on the back button - Then the Merchant Home Page is displayed - When I tap on Transactions - Then the Transaction Page is displayed - When I tap on the Mobile Topup button - Then the Transaction Select Mobile Topup Operator Page is displayed - When I tap on the 'Safaricom' button - Then the Select Product Page is displayed - When I tap on the 'Custom' product button - Then the Enter Topup Details Page is displayed - When I enter '07777777775' as the Customer Mobile Number - And I enter 10.00 as the Topup Amount - And I tap on Perform Topup - Then the Mobile Topup Successful Page is displayed - And I tap on Complete - Then the Transaction Page is displayed - When I tap on the Voucher button - Then the Transaction Select Voucher Operator Page is displayed - When I tap on the 'Hospital 1 Contract' button - Then the Select Product Page is displayed - When I tap on the '10 KES' product button - Then the Enter Voucher Issue Details Page is displayed - When I enter '07777777775' as the Recipient Mobile Number - And I tap on Issue Voucher - Then the Voucher Issue Successful Page is displayed - And I tap on Complete - Then the Transaction Page is displayed - When I tap on the Bill Payment button - Then the Transaction Select Bill Payment Operator Page is displayed - When I tap on the 'Pata Pawa PostPay' button - Then the Select Product Page is displayed - When I tap on the 'Bill Pay (Post)' product button - Then the Enter Account Details Page is displayed - When I enter '12345678' as the Account Number - And I tap on the Get Account Button - Then the Make Bill Payment page is displayed - And the following Bill Details are displayed - | AccountNumber | AccountHolder | DueDate | Balance | - | 12345678 | Mr Test Customer | 2025-04-17 | 100.00 | - When I enter '07777777775' as the Customer Mobile Number - And I enter 10.00 as the Payment Amount - And I tap on the Make Payment Button - Then the Bill Payment Successful Page is displayed - And I tap on Complete - Then the Transaction Page is displayed - When I tap on the Bill Payment button - Then the Transaction Select Bill Payment Operator Page is displayed - When I tap on the 'Pata Pawa PrePay' button - Then the Select Product Page is displayed - When I tap on the 'Bill Pay (Pre)' product button - Then the Enter Meter Details Page is displayed - When I enter '00000001' as the Meter Number - And I tap on the Get Meter Button - Then the Make Bill Payment page is displayed - And the following Meter Details are displayed - | MeterNumber | - | 00000001 | - When I enter 10.00 as the Payment Amount - And I tap on the Make Payment Button - Then the Bill Payment Successful Page is displayed - And I tap on Complete - Then the Transaction Page is displayed - When I click on the back button - Then the Merchant Home Page is displayed - #When I click on the back button - #Then A message is displayed confirming I want to log out - #When I click yes - #Then the Login Page is displayed \ No newline at end of file diff --git a/TransactionProcessor.Mobile.UITests/Features/iOSEndToEndTests.feature.cs b/TransactionProcessor.Mobile.UITests/Features/iOSEndToEndTests.feature.cs deleted file mode 100644 index d10d0eb1a..000000000 --- a/TransactionProcessor.Mobile.UITests/Features/iOSEndToEndTests.feature.cs +++ /dev/null @@ -1,417 +0,0 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated by Reqnroll (https://www.reqnroll.net/). -// Reqnroll Version:2.0.0.0 -// Reqnroll Generator Version:2.0.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 -using Reqnroll; -namespace TransactionProcessor.Mobile.UITests.Features -{ - - - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Reqnroll", "2.0.0.0")] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [NUnit.Framework.TestFixtureAttribute()] - [NUnit.Framework.DescriptionAttribute("iOSEndToEndTests")] - [NUnit.Framework.FixtureLifeCycleAttribute(NUnit.Framework.LifeCycle.InstancePerTestCase)] - [NUnit.Framework.CategoryAttribute("background")] - [NUnit.Framework.CategoryAttribute("login")] - [NUnit.Framework.CategoryAttribute("toolbar")] - [NUnit.Framework.CategoryAttribute("profile")] - [NUnit.Framework.CategoryAttribute("base")] - [NUnit.Framework.CategoryAttribute("sharedapp")] - [NUnit.Framework.CategoryAttribute("shared")] - [NUnit.Framework.CategoryAttribute("transactions")] - public partial class IOSEndToEndTestsFeature - { - - private global::Reqnroll.ITestRunner testRunner; - - private static string[] featureTags = new string[] { - "background", - "login", - "toolbar", - "profile", - "base", - "sharedapp", - "shared", - "transactions"}; - - private static global::Reqnroll.FeatureInfo featureInfo = new global::Reqnroll.FeatureInfo(new global::System.Globalization.CultureInfo("en-US"), "Features", "iOSEndToEndTests", null, global::Reqnroll.ProgrammingLanguage.CSharp, featureTags); - -#line 1 "iOSEndToEndTests.feature" -#line hidden - - [NUnit.Framework.OneTimeSetUpAttribute()] - public static async global::System.Threading.Tasks.Task FeatureSetupAsync() - { - } - - [NUnit.Framework.OneTimeTearDownAttribute()] - public static async global::System.Threading.Tasks.Task FeatureTearDownAsync() - { - } - - [NUnit.Framework.SetUpAttribute()] - public async global::System.Threading.Tasks.Task TestInitializeAsync() - { - testRunner = global::Reqnroll.TestRunnerManager.GetTestRunnerForAssembly(featureHint: featureInfo); - try - { - if (((testRunner.FeatureContext != null) - && (testRunner.FeatureContext.FeatureInfo.Equals(featureInfo) == false))) - { - await testRunner.OnFeatureEndAsync(); - } - } - finally - { - if (((testRunner.FeatureContext != null) - && testRunner.FeatureContext.BeforeFeatureHookFailed)) - { - throw new global::Reqnroll.ReqnrollException("Scenario skipped because of previous before feature hook error"); - } - if ((testRunner.FeatureContext == null)) - { - await testRunner.OnFeatureStartAsync(featureInfo); - } - } - } - - [NUnit.Framework.TearDownAttribute()] - public async global::System.Threading.Tasks.Task TestTearDownAsync() - { - if ((testRunner == null)) - { - return; - } - try - { - await testRunner.OnScenarioEndAsync(); - } - finally - { - global::Reqnroll.TestRunnerManager.ReleaseTestRunner(testRunner); - testRunner = null; - } - } - - public void ScenarioInitialize(global::Reqnroll.ScenarioInfo scenarioInfo) - { - testRunner.OnScenarioInitialize(scenarioInfo); - testRunner.ScenarioContext.ScenarioContainer.RegisterInstanceAs(NUnit.Framework.TestContext.CurrentContext); - } - - public async global::System.Threading.Tasks.Task ScenarioStartAsync() - { - await testRunner.OnScenarioStartAsync(); - } - - public async global::System.Threading.Tasks.Task ScenarioCleanupAsync() - { - await testRunner.CollectScenarioErrorsAsync(); - } - - public virtual async global::System.Threading.Tasks.Task FeatureBackgroundAsync() - { -#line 4 -#line hidden - } - - [NUnit.Framework.TestAttribute()] - [NUnit.Framework.DescriptionAttribute("EndToEnd Training Mode")] - [NUnit.Framework.CategoryAttribute("iOSPRTest")] - public async global::System.Threading.Tasks.Task EndToEndTrainingMode() - { - string[] tagsOfScenario = new string[] { - "iOSPRTest"}; - global::System.Collections.Specialized.OrderedDictionary argumentsOfScenario = new global::System.Collections.Specialized.OrderedDictionary(); - global::Reqnroll.ScenarioInfo scenarioInfo = new global::Reqnroll.ScenarioInfo("EndToEnd Training Mode", null, tagsOfScenario, argumentsOfScenario, featureTags); -#line 9 -this.ScenarioInitialize(scenarioInfo); -#line hidden - if ((global::Reqnroll.TagHelper.ContainsIgnoreTag(scenarioInfo.CombinedTags) || global::Reqnroll.TagHelper.ContainsIgnoreTag(featureTags))) - { - testRunner.SkipScenario(); - } - else - { - await this.ScenarioStartAsync(); -#line 4 -await this.FeatureBackgroundAsync(); -#line hidden -#line 10 - await testRunner.GivenAsync("I am on the Login Screen", ((string)(null)), ((global::Reqnroll.Table)(null)), "Given "); -#line hidden -#line 11 - await testRunner.AndAsync("the application is in training mode", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 12 - await testRunner.WhenAsync("I enter \'user1\' as the Email Address", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 13 - await testRunner.AndAsync("I enter \'123456\' as the Password", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 14 - await testRunner.AndAsync("I tap on Login", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 15 - await testRunner.ThenAsync("the Merchant Home Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 16 - await testRunner.WhenAsync("I tap on Profile", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 17 - await testRunner.ThenAsync("the My Profile Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 18 - await testRunner.WhenAsync("I tap on the Addresses button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 19 - await testRunner.ThenAsync("the Address List Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden - global::Reqnroll.Table table25 = new global::Reqnroll.Table(new string[] { - "AddressLine1", - "AddressTown"}); - table25.AddRow(new string[] { - "test address line 1", - "Town"}); -#line 20 - await testRunner.AndAsync("the Primary Address is displayed", ((string)(null)), table25, "And "); -#line hidden -#line 23 - await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 24 - await testRunner.ThenAsync("the My Profile Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 25 - await testRunner.WhenAsync("I tap on the Account Info button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 26 - await testRunner.ThenAsync("the Account Info Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden - global::Reqnroll.Table table26 = new global::Reqnroll.Table(new string[] { - "Name", - "Balance", - "AvailableBalance"}); - table26.AddRow(new string[] { - "Dummy Merchant", - "99", - "100"}); -#line 27 - await testRunner.AndAsync("the Account Info is displayed", ((string)(null)), table26, "And "); -#line hidden -#line 30 - await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 31 - await testRunner.ThenAsync("the My Profile Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 32 - await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 33 - await testRunner.ThenAsync("the Merchant Home Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 34 - await testRunner.WhenAsync("I tap on Transactions", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 35 - await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 36 - await testRunner.WhenAsync("I tap on the Mobile Topup button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 37 - await testRunner.ThenAsync("the Transaction Select Mobile Topup Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 38 - await testRunner.WhenAsync("I tap on the \'Safaricom\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 39 - await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 40 - await testRunner.WhenAsync("I tap on the \'Custom\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 41 - await testRunner.ThenAsync("the Enter Topup Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 42 - await testRunner.WhenAsync("I enter \'07777777775\' as the Customer Mobile Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 43 - await testRunner.AndAsync("I enter 10.00 as the Topup Amount", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 44 - await testRunner.AndAsync("I tap on Perform Topup", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 45 - await testRunner.ThenAsync("the Mobile Topup Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 46 - await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 47 - await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 48 - await testRunner.WhenAsync("I tap on the Voucher button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 49 - await testRunner.ThenAsync("the Transaction Select Voucher Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 50 - await testRunner.WhenAsync("I tap on the \'Hospital 1 Contract\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 51 - await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 52 - await testRunner.WhenAsync("I tap on the \'10 KES\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 53 - await testRunner.ThenAsync("the Enter Voucher Issue Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 54 - await testRunner.WhenAsync("I enter \'07777777775\' as the Recipient Mobile Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 55 - await testRunner.AndAsync("I tap on Issue Voucher", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 56 - await testRunner.ThenAsync("the Voucher Issue Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 57 - await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 58 - await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 59 - await testRunner.WhenAsync("I tap on the Bill Payment button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 60 - await testRunner.ThenAsync("the Transaction Select Bill Payment Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 61 - await testRunner.WhenAsync("I tap on the \'Pata Pawa PostPay\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 62 - await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 63 - await testRunner.WhenAsync("I tap on the \'Bill Pay (Post)\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 64 - await testRunner.ThenAsync("the Enter Account Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 65 - await testRunner.WhenAsync("I enter \'12345678\' as the Account Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 66 - await testRunner.AndAsync("I tap on the Get Account Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 67 - await testRunner.ThenAsync("the Make Bill Payment page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden - global::Reqnroll.Table table27 = new global::Reqnroll.Table(new string[] { - "AccountNumber", - "AccountHolder", - "DueDate", - "Balance"}); - table27.AddRow(new string[] { - "12345678", - "Mr Test Customer", - "2025-04-17", - "100.00"}); -#line 68 - await testRunner.AndAsync("the following Bill Details are displayed", ((string)(null)), table27, "And "); -#line hidden -#line 71 - await testRunner.WhenAsync("I enter \'07777777775\' as the Customer Mobile Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 72 - await testRunner.AndAsync("I enter 10.00 as the Payment Amount", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 73 - await testRunner.AndAsync("I tap on the Make Payment Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 74 - await testRunner.ThenAsync("the Bill Payment Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 75 - await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 76 - await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 77 - await testRunner.WhenAsync("I tap on the Bill Payment button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 78 - await testRunner.ThenAsync("the Transaction Select Bill Payment Operator Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 79 - await testRunner.WhenAsync("I tap on the \'Pata Pawa PrePay\' button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 80 - await testRunner.ThenAsync("the Select Product Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 81 - await testRunner.WhenAsync("I tap on the \'Bill Pay (Pre)\' product button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 82 - await testRunner.ThenAsync("the Enter Meter Details Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 83 - await testRunner.WhenAsync("I enter \'00000001\' as the Meter Number", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 84 - await testRunner.AndAsync("I tap on the Get Meter Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 85 - await testRunner.ThenAsync("the Make Bill Payment page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden - global::Reqnroll.Table table28 = new global::Reqnroll.Table(new string[] { - "MeterNumber"}); - table28.AddRow(new string[] { - "00000001"}); -#line 86 - await testRunner.AndAsync("the following Meter Details are displayed", ((string)(null)), table28, "And "); -#line hidden -#line 89 - await testRunner.WhenAsync("I enter 10.00 as the Payment Amount", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 90 - await testRunner.AndAsync("I tap on the Make Payment Button", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 91 - await testRunner.ThenAsync("the Bill Payment Successful Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 92 - await testRunner.AndAsync("I tap on Complete", ((string)(null)), ((global::Reqnroll.Table)(null)), "And "); -#line hidden -#line 93 - await testRunner.ThenAsync("the Transaction Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden -#line 94 - await testRunner.WhenAsync("I click on the back button", ((string)(null)), ((global::Reqnroll.Table)(null)), "When "); -#line hidden -#line 95 - await testRunner.ThenAsync("the Merchant Home Page is displayed", ((string)(null)), ((global::Reqnroll.Table)(null)), "Then "); -#line hidden - } - await this.ScenarioCleanupAsync(); - } - } -} -#pragma warning restore -#endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/BasePage.cs b/TransactionProcessor.Mobile.UITests/Pages/BasePage.cs index f88bb6837..9620f2c80 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/BasePage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/BasePage.cs @@ -44,10 +44,6 @@ public void HideKeyboard() { AppiumDriverWrapper.Driver.HideKeyboard(); } - else if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.iOS) - { - AppiumDriverWrapper.Driver.FindElement(By.Name("Done")).Click(); - } } public async Task AcceptAlert() @@ -110,123 +106,4 @@ internal async Task WaitForElementByAccessibilityId(String accessib //} } - - //public abstract class BasePage - //{ - // protected readonly TestingContext TestingContext; - - // protected abstract String Trait { get; } - - // public BasePage(TestingContext testingContext){ - // this.TestingContext = testingContext; - // } - - // public async Task AssertOnPage(TimeSpan? timeout = null){ - // var retryFor = timeout switch{ - // null => TimeSpan.FromMinutes(3), - // _ => timeout.Value - // }; - - // await Retry.For(async () => - // { - // String message = $"Unable to verify on page: {this.GetType().Name} with trait {this.Trait} {Environment.NewLine} Source: {AppiumDriverWrapper.Driver.PageSource}"; - - // Should.NotThrow(() => this.WaitForElementByAccessibilityId(this.Trait), message); - // }, - // retryFor, - // TimeSpan.FromSeconds(60)).ConfigureAwait(false); - // } - - // /// - // /// Verifies that the trait is no longer present. Defaults to a 5 second wait. - // /// - // /// Time to wait before the assertion fails - // public async Task WaitForPageToLeave(TimeSpan? timeout = null) - // { - // var retryFor = timeout switch - // { - // null => TimeSpan.FromSeconds(60), - // _ => timeout.Value - // }; - - // String message = "Unable to verify *not* on page: " + this.GetType().Name; - // await Retry.For(async () => { Should.NotThrow(() => this.WaitForNoElementByAccessibilityId(this.Trait), message); }, retryFor); - // } - - // public async Task WaitForElementByAccessibilityId(String accessibilityId, TimeSpan? timeout = null, Int32 i = 0) { - // return await AppiumDriverWrapper.Driver.WaitForElementByAccessibilityId(accessibilityId, timeout,i); - // } - - // public async Task GetPageSource() - // { - // return await AppiumDriverWrapper.Driver.GetPageSource(); - // } - - // public async Task WaitForNoElementByAccessibilityId(String accessibilityId) - // { - // await AppiumDriverWrapper.Driver.WaitForNoElementByAccessibilityId(accessibilityId); - // } - - // public async Task WaitForToastMessage(String toastMessage) - // { - // await AppiumDriverWrapper.Driver.WaitForToastMessage(AppiumDriverWrapper.MobileTestPlatform, toastMessage); - // } - - // public void HideKeyboard() - // { - // if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.Android) - // { - // AppiumDriverWrapper.Driver.HideKeyboard(); - // } - // else if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.iOS) - // { - // AppiumDriverWrapper.Driver.FindElement(By.Name("Done")).Click(); - // } - // } - - // public async Task AcceptAlert(){ - // if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.Windows) - // { - // IWebElement acceptButton = await AppiumDriverWrapper.Driver.WaitForElementByAccessibilityId("PrimaryButton"); - // acceptButton.Click(); - // } - // else{ - // IAlert a = await this.SwitchToAlert(); - // a.Accept(); - // } - // } - - // public async Task DismissAlert() - // { - // if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.Windows) - // { - // IWebElement acceptButton = await AppiumDriverWrapper.Driver.WaitForElementByAccessibilityId("SecondaryButton"); - // acceptButton.Click(); - // } - // else{ - // IAlert a = await this.SwitchToAlert(); - // a.Dismiss(); - // } - // } - - // public async Task SwitchToAlert(){ - // IAlert alert = null; - // await Retry.For(async () => { - // alert = AppiumDriverWrapper.Driver.SwitchTo().Alert(); - // alert.ShouldNotBeNull(); - // }); - // return alert; - // } - - // public void NavigateBack() - // { - // AppiumDriverWrapper.Driver.Navigate().Back(); - // } - - // public async Task GetLabelValue(String labelAutomationId) - // { - // IWebElement element = await this.WaitForElementByAccessibilityId(labelAutomationId); - // return element.Text; - // } - //} } diff --git a/TransactionProcessor.Mobile.UITests/Pages/Extenstions.cs b/TransactionProcessor.Mobile.UITests/Pages/Extenstions.cs index ce5ace7e9..189db81df 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/Extenstions.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/Extenstions.cs @@ -200,27 +200,6 @@ await Retry.For(async () => }); } - else if (platform == MobileTestPlatform.iOS) - { - Boolean isDisplayed = false; - int count = 0; - do - { - if (driver.PageSource.Contains(expectedToast)) - { - Console.WriteLine(driver.PageSource); - isDisplayed = true; - break; - } - - Thread.Sleep(200); //Add your custom wait if exists - count++; - - } while (count < 10); - - Console.WriteLine(driver.PageSource); - isDisplayed.ShouldBeTrue(); - } } public static async Task GetPageSource(this AppiumDriver driver) { diff --git a/TransactionProcessor.Mobile.UITests/Pages/LoginPage.cs b/TransactionProcessor.Mobile.UITests/Pages/LoginPage.cs index aabea8f81..bc77fe223 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/LoginPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/LoginPage.cs @@ -5,12 +5,8 @@ namespace TransactionProcessor.Mobile.UITests.Pages; -public class LoginPage : BasePage2 -{ - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch { - MobileTestPlatform.iOS => "LoginLabel", - _ => "LoginLabel" - }; +public class LoginPage : BasePage2 { + protected override String Trait => "LoginLabel"; private readonly String UserNameEntry; private readonly String PasswordEntry; @@ -52,14 +48,6 @@ public async Task IsTrainingModeOn() return true; } - if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.iOS) { - String? text = element.GetAttribute("value"); - if (text == "0") { - return false; - } - - return true; - } if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.Windows){ return false; diff --git a/TransactionProcessor.Mobile.UITests/Pages/ProfileAccountInfoPage.cs b/TransactionProcessor.Mobile.UITests/Pages/ProfileAccountInfoPage.cs index 083fbbb1b..ae72bf251 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/ProfileAccountInfoPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/ProfileAccountInfoPage.cs @@ -36,11 +36,7 @@ public ProfileAccountInfoPage(TestingContext testingContext) : base(testingConte #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "My Details", - _ => "MyDetails" - }; + protected override String Trait => "MyDetails"; #endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/ProfileAddressesPage.cs b/TransactionProcessor.Mobile.UITests/Pages/ProfileAddressesPage.cs index 2755d896d..7f54d3410 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/ProfileAddressesPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/ProfileAddressesPage.cs @@ -43,11 +43,7 @@ public ProfileAddressesPage(TestingContext testingContext) : base(testingContext #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "My Addresses", - _ => "MyAddresses" - }; + protected override String Trait => "MyAddresses"; #endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/ProfileContactsPage.cs b/TransactionProcessor.Mobile.UITests/Pages/ProfileContactsPage.cs index 3789c9cfd..2cbb8c3f5 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/ProfileContactsPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/ProfileContactsPage.cs @@ -32,11 +32,7 @@ public ProfileContactsPage(TestingContext testingContext) : base(testingContext) #region Properties //protected override String Trait => "MyContacts"; - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "My Contacts", - _ => "MyContacts" - }; + protected override String Trait => "MyContacts"; #endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/SalesAnalysisPage.cs b/TransactionProcessor.Mobile.UITests/Pages/SalesAnalysisPage.cs index 9c31238d4..a1dc02cfc 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/SalesAnalysisPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/SalesAnalysisPage.cs @@ -5,11 +5,7 @@ namespace TransactionProcessor.Mobile.UITests.Pages; public class SalesAnalysisPage : BasePage2 { - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Sales Analysis", - _ => "SalesAnalysis" - }; + protected override String Trait => "SalesAnalysis"; public SalesAnalysisPage(TestingContext testingContext) : base(testingContext) { diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsBillPaymentSelectOperatorPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsBillPaymentSelectOperatorPage.cs index 6786547b4..3564fefa7 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsBillPaymentSelectOperatorPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsBillPaymentSelectOperatorPage.cs @@ -14,11 +14,7 @@ public TransactionsBillPaymentSelectOperatorPage(TestingContext testingContext) #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Select an Operator", - _ => "SelectanOperator" - }; + protected override String Trait => "SelectanOperator"; #endregion @@ -54,11 +50,7 @@ public TransactionsBillPaymentEnterAccountDetailsPage(TestingContext testingCont this.GetAccountButton = "GetAccountButton"; } - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Get Customer Account", - _ => "GetCustomerAccount" - }; + protected override String Trait => "GetCustomerAccount"; public async Task EnterCustomerAccountNumber(String customerAccountNumber) { @@ -89,11 +81,7 @@ public TransactionsBillPaymentEnterMeterDetailsPage(TestingContext testingContex this.GetMeterButton = "GetMeterButton"; } - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Get Meter", - _ => "GetMeter" - }; + protected override String Trait => "GetMeter"; public async Task EnterMeterNumber(String meterNumber) { @@ -135,11 +123,7 @@ public TransactionsBillPaymentMakeAPaymentPage(TestingContext testingContext) : } - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Make Bill Payment", - _ => "MakeBillPayment" - }; + protected override String Trait => "MakeBillPayment"; public async Task EnterCustomerMobileNumber(String customerMobileNumber) { @@ -212,11 +196,7 @@ public TransactionsBillPaymentSuccessfulPaymentPage(TestingContext testingContex #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Bill Payment Successful", - _ => "BillPaymentSuccessful" - }; + protected override String Trait => "BillPaymentSuccessful"; public async Task ClickCompleteButton() { diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupEnterTopupDetailsPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupEnterTopupDetailsPage.cs index 4c0a9d991..19e332a33 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupEnterTopupDetailsPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupEnterTopupDetailsPage.cs @@ -21,11 +21,7 @@ public TransactionsMobileTopupEnterTopupDetailsPage(TestingContext testingContex #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Enter Topup Details", - _ => "EnterTopupDetails" - }; + protected override String Trait => "EnterTopupDetails"; public async Task EnterCustomerMobileNumber(String customerMobileNumber) { IWebElement element = await this.WaitForElementByAccessibilityId(this.CustomerMobileNumberEntry); diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectOperatorPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectOperatorPage.cs index d0cbf5079..4a846671b 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectOperatorPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectOperatorPage.cs @@ -12,11 +12,7 @@ public TransactionsMobileTopupSelectOperatorPage(TestingContext testingContext) } #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Select an Operator", - _ => "SelectanOperator" - }; + protected override String Trait => "SelectanOperator"; #endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectProductPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectProductPage.cs index d5cc43add..2dbf8e908 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectProductPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSelectProductPage.cs @@ -11,11 +11,7 @@ public TransactionsMobileTopupSelectProductPage(TestingContext testingContext) : #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Select a Product", - _ => "SelectaProduct" - }; + protected override String Trait => "SelectaProduct"; #endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSuccessfulTopupPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSuccessfulTopupPage.cs index 44b7ee833..5b7583555 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSuccessfulTopupPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsMobileTopupSuccessfulTopupPage.cs @@ -15,11 +15,7 @@ public TransactionsMobileTopupSuccessfulTopupPage(TestingContext testingContext) #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Mobile Topup Successful", - _ => "MobileTopupSuccessful" - }; + protected override String Trait => "MobileTopupSuccessful"; public async Task ClickCompleteButton() { await Retry.For(async () => { diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherEnterVoucherIssueDetailsPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherEnterVoucherIssueDetailsPage.cs index 27cf0b4be..62eebaf89 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherEnterVoucherIssueDetailsPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherEnterVoucherIssueDetailsPage.cs @@ -25,11 +25,7 @@ public TransactionsVoucherEnterVoucherIssueDetailsPage(TestingContext testingCon #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Enter Voucher Issue Details", - _ => "EnterVoucherIssueDetails" - }; + protected override String Trait => "EnterVoucherIssueDetails"; public async Task EnterRecipientMobileNumber(String recipientMobileNumber) { diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherIssueSuccessfulTopupPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherIssueSuccessfulTopupPage.cs index 5c6aa1093..db3842533 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherIssueSuccessfulTopupPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherIssueSuccessfulTopupPage.cs @@ -17,11 +17,7 @@ public TransactionsVoucherIssueSuccessfulTopupPage(TestingContext testingContext #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Voucher Issue Successful", - _ => "VoucherIssueSuccessful" - }; + protected override String Trait => "VoucherIssueSuccessful"; public async Task ClickCompleteButton() { diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectOperatorPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectOperatorPage.cs index 8bdffdaa5..7ee98a834 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectOperatorPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectOperatorPage.cs @@ -12,11 +12,7 @@ public TransactionsVoucherSelectOperatorPage(TestingContext testingContext) : ba } #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Select an Operator", - _ => "SelectanOperator" - }; + protected override String Trait => "SelectanOperator"; #endregion public async Task ClickOperatorButton(String operatorName) diff --git a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectProductPage.cs b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectProductPage.cs index e4ed8e5ea..b5f00bed6 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectProductPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/TransactionsVoucherSelectProductPage.cs @@ -13,11 +13,7 @@ public TransactionsVoucherSelectProductPage(TestingContext testingContext) : bas #region Properties - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "Select a Product", - _ => "SelectaProduct" - }; + protected override String Trait => "SelectaProduct"; #endregion diff --git a/TransactionProcessor.Mobile.UITests/Pages/ViewLogsPage.cs b/TransactionProcessor.Mobile.UITests/Pages/ViewLogsPage.cs index 867a88e63..615a09552 100644 --- a/TransactionProcessor.Mobile.UITests/Pages/ViewLogsPage.cs +++ b/TransactionProcessor.Mobile.UITests/Pages/ViewLogsPage.cs @@ -8,9 +8,5 @@ public ViewLogsPage(TestingContext testingContext) : base(testingContext){ } - protected override String Trait => AppiumDriverWrapper.MobileTestPlatform switch - { - MobileTestPlatform.iOS => "View Logs", - _ => "ViewLogs" - }; + protected override String Trait => "ViewLogs"; } \ No newline at end of file diff --git a/TransactionProcessor.Mobile.UITests/Steps/SharedAppSteps.cs b/TransactionProcessor.Mobile.UITests/Steps/SharedAppSteps.cs index 3458082d1..1ae1fa126 100644 --- a/TransactionProcessor.Mobile.UITests/Steps/SharedAppSteps.cs +++ b/TransactionProcessor.Mobile.UITests/Steps/SharedAppSteps.cs @@ -1,4 +1,5 @@ -using OpenQA.Selenium.Appium.Enums; +using OpenQA.Selenium.Appium.Android; +using OpenQA.Selenium.Appium.Enums; using Reqnroll; using Shouldly; using TransactionProcessor.Mobile.UITests.Common; @@ -30,8 +31,9 @@ public async Task WhenIClickOnTheBackButton() { [Then(@"The application closes")] public void ThenTheApplicationCloses() { - if (AppiumDriverWrapper.MobileTestPlatform != MobileTestPlatform.iOS) { - AppState state = AppiumDriverWrapper.Driver.GetAppState("com.transactionprocessor.mobile"); + if (AppiumDriverWrapper.MobileTestPlatform == MobileTestPlatform.Android) { + var driver = AppiumDriverWrapper.Driver as AndroidDriver; + AppState state = driver.GetAppState("com.transactionprocessor.mobile"); state.ShouldBe(AppState.NotRunning); } } diff --git a/TransactionProcessor.Mobile.UITests/Steps/SharedSteps.cs b/TransactionProcessor.Mobile.UITests/Steps/SharedSteps.cs index 076812500..f11892f1c 100644 --- a/TransactionProcessor.Mobile.UITests/Steps/SharedSteps.cs +++ b/TransactionProcessor.Mobile.UITests/Steps/SharedSteps.cs @@ -196,7 +196,8 @@ public async Task GivenIHaveAssignedTheFollowingOperatorToTheMerchants(DataTable public async Task GivenIHaveCreatedAConfigForMyDevice() { var deviceSerial = await this.loginPage.GetDeviceSerial(); - var clientDetails = this.TestingContext.GetClientDetails("mobileAppClient"); + ClientDetails clientDetails = this.TestingContext.GetClientDetails("mobileAppClient"); + //ClientDetails clientDetails = ClientDetails.Create("clientId-mobileAppClient", "secret-mobile", new List()); var configRequest = new { clientId = clientDetails.ClientId, clientSecret = clientDetails.ClientSecret, @@ -234,8 +235,10 @@ public async Task GivenIHaveCreatedAConfigForMyDevice() { HttpClient httpClient = new HttpClient(clientHandler); var response = await httpClient.SendAsync(request, CancellationToken.None); - response.StatusCode.ShouldBe(HttpStatusCode.OK); - + var req = JsonConvert.SerializeObject(configRequest); + var content = await response.Content.ReadAsStringAsync(); + response.StatusCode.ShouldBe(HttpStatusCode.OK, $"Request [{req}] Response [{content}]"); + this.TestingContext.Logger.LogInformation($"Config Created for serial {deviceSerial}"); } @@ -246,7 +249,6 @@ public async Task GivenIHaveCreatedAConfigForMyApplication() { applicationId = "transactionMobilePOS", androidkey = "android", - ioskey = "ios", macoskey = "macos", windowskey = "windows", }; diff --git a/TransactionProcessor.Mobile.UITests/Steps/TransactionsSteps.cs b/TransactionProcessor.Mobile.UITests/Steps/TransactionsSteps.cs index 977bc863a..514992d42 100644 --- a/TransactionProcessor.Mobile.UITests/Steps/TransactionsSteps.cs +++ b/TransactionProcessor.Mobile.UITests/Steps/TransactionsSteps.cs @@ -130,10 +130,7 @@ public async Task ThenTheTransactionSelectBillPaymentOperatorPageIsDisplayed(){ [When(@"I tap on the '([^']*)' button")] public async Task WhenITapOnTheButton(String operatorName) { - if (AppiumDriverWrapper.MobileTestPlatform != MobileTestPlatform.iOS) { - operatorName = operatorName.Replace(" ", ""); - } - + operatorName = operatorName.Replace(" ", ""); Task t = this.operatorType switch{ OperatorType.MobileTopup => this.transactionsMobileTopupSelectOperatorPage.ClickOperatorButton(operatorName), OperatorType.Voucher => this.transactionsVoucherSelectOperatorPage.ClickOperatorButton(operatorName), @@ -150,9 +147,7 @@ public async Task ThenTheSelectProductPageIsDisplayed() { [When(@"I tap on the '([^']*)' product button")] public async Task WhenITapOnTheProductButton(String productText){ - if (AppiumDriverWrapper.MobileTestPlatform != MobileTestPlatform.iOS) { - productText = productText.Replace(" ", ""); - } + productText = productText.Replace(" ", ""); Task t = this.operatorType switch{ OperatorType.MobileTopup => this.transactionsMobileTopupSelectProductPage.ClickProductButton(productText), diff --git a/TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj b/TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj index e4e7b5472..17cced275 100644 --- a/TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj +++ b/TransactionProcessor.Mobile.UITests/TransactionProcessor.Mobile.UITests.csproj @@ -1,7 +1,7 @@  - net9.0 + net10.0 latest enable enable @@ -13,26 +13,26 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - - - + + + + - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - + + + + + + + + diff --git a/TransactionProcessor.Mobile/Extensions/MauiAppBuilderExtensions.cs b/TransactionProcessor.Mobile/Extensions/MauiAppBuilderExtensions.cs index d81e28658..83e669132 100644 --- a/TransactionProcessor.Mobile/Extensions/MauiAppBuilderExtensions.cs +++ b/TransactionProcessor.Mobile/Extensions/MauiAppBuilderExtensions.cs @@ -216,6 +216,9 @@ public static MauiAppBuilder ConfigureUIServices(this MauiAppBuilder builder) { } public static MauiAppBuilder ConfigureRequestHandlers(this MauiAppBuilder builder) { + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton>, LoginRequestHandler>(); builder.Services.AddSingleton>, LoginRequestHandler>(); diff --git a/TransactionProcessor.Mobile/Platforms/MacCatalyst/AppDelegate.cs b/TransactionProcessor.Mobile/Platforms/MacCatalyst/AppDelegate.cs deleted file mode 100644 index 1992a91a3..000000000 --- a/TransactionProcessor.Mobile/Platforms/MacCatalyst/AppDelegate.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Foundation; - -namespace TransactionProcessor.Mobile -{ - [Register("AppDelegate")] - public class AppDelegate : MauiUIApplicationDelegate - { - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); - } -} diff --git a/TransactionProcessor.Mobile/Platforms/MacCatalyst/Entitlements.plist b/TransactionProcessor.Mobile/Platforms/MacCatalyst/Entitlements.plist deleted file mode 100644 index de4adc94a..000000000 --- a/TransactionProcessor.Mobile/Platforms/MacCatalyst/Entitlements.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - com.apple.security.app-sandbox - - - com.apple.security.network.client - - - - diff --git a/TransactionProcessor.Mobile/Platforms/MacCatalyst/Info.plist b/TransactionProcessor.Mobile/Platforms/MacCatalyst/Info.plist deleted file mode 100644 index 726897715..000000000 --- a/TransactionProcessor.Mobile/Platforms/MacCatalyst/Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - UIDeviceFamily - - 2 - - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - XSAppIconAssets - Assets.xcassets/appicon.appiconset - - diff --git a/TransactionProcessor.Mobile/Platforms/MacCatalyst/Program.cs b/TransactionProcessor.Mobile/Platforms/MacCatalyst/Program.cs deleted file mode 100644 index 84d612856..000000000 --- a/TransactionProcessor.Mobile/Platforms/MacCatalyst/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ObjCRuntime; -using UIKit; - -namespace TransactionProcessor.Mobile -{ - public class Program - { - // This is the main entry point of the application. - static void Main(string[] args) - { - // if you want to use a different Application Delegate class from "AppDelegate" - // you can specify it here. - UIApplication.Main(args, null, typeof(AppDelegate)); - } - } -} diff --git a/TransactionProcessor.Mobile/Platforms/Tizen/Main.cs b/TransactionProcessor.Mobile/Platforms/Tizen/Main.cs deleted file mode 100644 index b371e287b..000000000 --- a/TransactionProcessor.Mobile/Platforms/Tizen/Main.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Microsoft.Maui; -using Microsoft.Maui.Hosting; - -namespace TransactionProcessor.Mobile -{ - internal class Program : MauiApplication - { - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); - - static void Main(string[] args) - { - var app = new Program(); - app.Run(args); - } - } -} diff --git a/TransactionProcessor.Mobile/Platforms/Tizen/tizen-manifest.xml b/TransactionProcessor.Mobile/Platforms/Tizen/tizen-manifest.xml deleted file mode 100644 index a4ec146d7..000000000 --- a/TransactionProcessor.Mobile/Platforms/Tizen/tizen-manifest.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - maui-appicon-placeholder - - - - - http://tizen.org/privilege/internet - - - - \ No newline at end of file diff --git a/TransactionProcessor.Mobile/Platforms/iOS/AppDelegate.cs b/TransactionProcessor.Mobile/Platforms/iOS/AppDelegate.cs deleted file mode 100644 index 1992a91a3..000000000 --- a/TransactionProcessor.Mobile/Platforms/iOS/AppDelegate.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Foundation; - -namespace TransactionProcessor.Mobile -{ - [Register("AppDelegate")] - public class AppDelegate : MauiUIApplicationDelegate - { - protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); - } -} diff --git a/TransactionProcessor.Mobile/Platforms/iOS/DeviceInformationService.cs b/TransactionProcessor.Mobile/Platforms/iOS/DeviceInformationService.cs deleted file mode 100644 index e253c1653..000000000 --- a/TransactionProcessor.Mobile/Platforms/iOS/DeviceInformationService.cs +++ /dev/null @@ -1,299 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TransactionProcessor.Mobile.BusinessLogic.UIServices -{ - using System.Runtime.InteropServices; - using Foundation; - using UIKit; - - public static partial class DeviceInformationService - { - // based on code from https://github.com/dannycabrera/Get-iOS-Model - - private const string HardwareProperty = "hw.machine"; - - [DllImport(ObjCRuntime.Constants.SystemLibrary)] - private static extern int sysctlbyname([MarshalAs(UnmanagedType.LPStr)] string property, - IntPtr output, - IntPtr oldLen, - IntPtr newp, - uint newlen); - - public static partial String Model() - { - string version = FindVersion(); - if (version == "i386" || version == "x86_64") - { - return GetModel(NSProcessInfo.ProcessInfo.Environment["SIMULATOR_MODEL_IDENTIFIER"].ToString()) + " Simulator"; - } - return GetModel(version); - } - - public static partial String Platform() => $"{DeviceInfo.Platform} {UIDevice.CurrentDevice.SystemVersion}"; - - private static string FindVersion() - { - try - { - // get the length of the string that will be returned - var pLen = Marshal.AllocHGlobal(sizeof(int)); - _ = sysctlbyname(HardwareProperty, IntPtr.Zero, pLen, IntPtr.Zero, 0); - - var length = Marshal.ReadInt32(pLen); - - // check to see if we got a length - if (length == 0) - { - Marshal.FreeHGlobal(pLen); - return "Unknown"; - } - - // get the hardware string - var pStr = Marshal.AllocHGlobal(length); - _ = sysctlbyname(HardwareProperty, pStr, pLen, IntPtr.Zero, 0); - - // convert the native string into a C# string - var hardwareStr = Marshal.PtrToStringAnsi(pStr); - - // cleanup - Marshal.FreeHGlobal(pLen); - Marshal.FreeHGlobal(pStr); - - return hardwareStr; - } - catch (Exception ex) - { - Console.WriteLine("DeviceHardware.Version Ex: " + ex.Message); - } - - return "Unknown"; - } - - private static string GetModel(string version) - { - if (version.StartsWith("iPhone")) - { - switch (version) - { - case "iPhone14,2": - return "iPhone 13 Pro"; - case "iPhone14,3": - return "iPhone 13 Pro Max"; - case "iPhone14,4": - return "iPhone 13 mini"; - case "iPhone14,5": - return "iPhone 13"; - case "iPhone13,1": - return "iPhone 12 mini"; - case "iPhone13,2": - return "iPhone 12"; - case "iPhone13,3": - return "iPhone 12 Pro"; - case "iPhone13,4": - return "iPhone 12 Pro Max"; - case "iPhone12,8": - return "iPhone SE (2nd generation)"; - case "iPhone12,5": - return "iPhone 11 Pro Max"; - case "iPhone12,3": - return "iPhone 11 Pro"; - case "iPhone12,1": - return "iPhone 11"; - case "iPhone11,2": - return "iPhone XS"; - case "iPhone11,4": - case "iPhone11,6": - return "iPhone XS Max"; - case "iPhone11,8": - return "iPhone XR"; - case "iPhone10,3": - case "iPhone10,6": - return "iPhone X"; - case "iPhone10,2": - case "iPhone10,5": - return "iPhone 8 Plus"; - case "iPhone10,1": - case "iPhone10,4": - return "iPhone 8"; - case "iPhone9,2": - case "iPhone9,4": - return "iPhone 7 Plus"; - case "iPhone9,1": - case "iPhone9,3": - return "iPhone 7"; - case "iPhone8,4": - return "iPhone SE"; - case "iPhone8,2": - return "iPhone 6S Plus"; - case "iPhone8,1": - return "iPhone 6S"; - case "iPhone7,1": - return "iPhone 6 Plus"; - case "iPhone7,2": - return "iPhone 6"; - case "iPhone6,2": - return "iPhone 5S Global"; - case "iPhone6,1": - return "iPhone 5S GSM"; - case "iPhone5,4": - return "iPhone 5C Global"; - case "iPhone5,3": - return "iPhone 5C GSM"; - case "iPhone5,2": - return "iPhone 5 Global"; - case "iPhone5,1": - return "iPhone 5 GSM"; - default: - return version; - } - } - - if (version.StartsWith("iPod")) - { - switch (version) - { - case "iPod9,1": - return "iPod touch 7G"; - case "iPod7,1": - return "iPod touch 6G"; - default: - return version; - } - } - - if (version.StartsWith("iPad")) - { - switch (version) - { - case "iPad14,2": - return "iPad mini (6th generation) Wi-FI + Cellular"; - case "iPad14,1": - return "iPad mini (6th generation) Wi-FI"; - case "iPad13,11": - case "iPad13,10": - return "iPad Pro (12.9-inch) (5th generation) Wi-Fi + Cellular"; - case "iPad13,9": - case "iPad13,8": - return "iPad Pro (12.9-inch) (5th generation) Wi-Fi"; - case "iPad13,7": - case "iPad13,6": - return "iPad Pro (11-inch) (3rd generation) Wi-Fi + Cellular"; - case "iPad13,5": - case "iPad13,4": - return "iPad Pro (11-inch) (3rd generation) Wi-Fi"; - case "iPad13,2": - return "iPad Air (4th generation) Wi-Fi + Cellular"; - case "iPad13,1": - return "iPad Air (4th generation) Wi-Fi"; - case "iPad12,2": - return "iPad (9th Generation) Wi-Fi + Cellular"; - case "iPad12,1": - return "iPad (9th generation) Wi-Fi"; - case "iPad11,7": - return "iPad (8th Generation) Wi-Fi + Cellular"; - case "iPad11,6": - return "iPad (8th Generation) Wi-Fi"; - case "iPad11,4": - return "iPad Air (3rd generation) Wi-Fi + Cellular"; - case "iPad11,3": - return "iPad Air (3rd generation) Wi-Fi"; - case "iPad11,2": - return "iPad mini (5th generation) Wi-Fi + Cellular"; - case "iPad11,1": - return "iPad mini (5th generation) Wi-Fi"; - case "iPad8,12": - return "iPad Pro (12.9-inch) (4th generation) Wi-Fi + Cellular"; - case "iPad8,11": - return "iPad Pro (12.9-inch) (4th generation) Wi-Fi"; - case "iPad8,10": - return "iPad Pro (11-inch) (2nd generation) Wi-Fi + Cellular"; - case "iPad8,9": - return "iPad Pro (11-inch) (2nd generation) Wi-Fi"; - case "iPad8,8": - return "iPad Pro 12.9-inch (3rd Generation)"; - case "iPad8,7": - return "iPad Pro 12.9-inch (3rd generation) Wi-Fi + Cellular"; - case "iPad8,6": - case "iPad8,5": - return "iPad Pro 12.9-inch (3rd Generation)"; - case "iPad8,4": - return "iPad Pro 11-inch"; - case "iPad8,3": - return "iPad Pro 11-inch Wi-Fi + Cellular"; - case "iPad8,2": - return "iPad Pro 11-inch"; - case "iPad8,1": - return "iPad Pro 11-inch Wi-Fi"; - case "iPad7,12": - return "iPad (7th generation) Wi-Fi + Cellular"; - case "iPad7,11": - return "iPad (7th generation) Wi-Fi"; - case "iPad7,6": - return "iPad (6th generation) Wi-Fi + Cellular"; - case "iPad7,5": - return "iPad (6th generation) Wi-Fi"; - case "iPad7,4": - return "iPad Pro (10.5-inch) Wi-Fi + Cellular"; - case "iPad7,3": - return "iPad Pro (10.5-inch) Wi-Fi"; - case "iPad7,2": - return "iPad Pro 12.9-inch (2nd generation) Wi-Fi + Cellular"; - case "iPad7,1": - return "iPad Pro 12.9-inch (2nd generation) Wi-Fi"; - case "iPad6,12": - return "iPad (5th generation) Wi-Fi + Cellular"; - case "iPad6,11": - return "iPad (5th generation) Wi-Fi"; - case "iPad6,8": - return "iPad Pro 12.9-inch Wi-Fi + Cellular"; - case "iPad6,7": - return "iPad Pro 12.9-inch Wi-Fi"; - case "iPad6,4": - return "iPad Pro (9.7-inch) Wi-Fi + Cellular"; - case "iPad6,3": - return "iPad Pro (9.7-inch) Wi-Fi"; - case "iPad5,4": - return "iPad Air 2 Wi-Fi + Cellular"; - case "iPad5,3": - return "iPad Air 2 Wi-Fi"; - case "iPad5,2": - return "iPad mini 4 Wi-Fi + Cellular"; - case "iPad5,1": - return "iPad mini 4 Wi-Fi"; - case "iPad4,9": - return "iPad mini 3 Wi-Fi + Cellular (TD-LTE)"; - case "iPad4,8": - return "iPad mini 3 Wi-Fi + Cellular"; - case "iPad4,7": - return "iPad mini 3 Wi-Fi"; - case "iPad4,6": - return "iPad mini 2 Wi-Fi + Cellular (TD-LTE)"; - case "iPad4,5": - return "iPad mini 2 Wi-Fi + Cellular"; - case "iPad4,4": - return "iPad mini 2 Wi-Fi"; - case "iPad4,3": - return "iPad Air Wi-Fi + Cellular (TD-LTE)"; - case "iPad4,2": - return "iPad Air Wi-Fi + Cellular"; - case "iPad4,1": - return "iPad Air Wi-Fi"; - case "iPad3,6": - return "iPad (4th generation) Wi-Fi + Cellular (MM)"; - case "iPad3,5": - return "iPad (4th generation) Wi-Fi + Cellular"; - case "iPad3,4": - return "iPad (4th generation) Wi-Fi"; - default: - return version; - } - } - - return string.IsNullOrWhiteSpace(version) ? "Unknown" : version; - } - } -} diff --git a/TransactionProcessor.Mobile/Platforms/iOS/DeviceOrientationService.cs b/TransactionProcessor.Mobile/Platforms/iOS/DeviceOrientationService.cs deleted file mode 100644 index e42e865ab..000000000 --- a/TransactionProcessor.Mobile/Platforms/iOS/DeviceOrientationService.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TransactionProcessor.Mobile.BusinessLogic.UIServices -{ - using Foundation; - using Microsoft.Maui.Devices; - using UIKit; - - public static partial class DeviceOrientationService - { - private static readonly IReadOnlyDictionary UIInterfaceOrientationMapping = - new Dictionary - { - [DisplayOrientation.Landscape] = UIInterfaceOrientation.LandscapeLeft, - [DisplayOrientation.Portrait] = UIInterfaceOrientation.Portrait, - }; - - private static readonly IReadOnlyDictionary UIInterfaceOrientationMaskMapping = - new Dictionary - { - [DisplayOrientation.Landscape] = UIInterfaceOrientationMask.Landscape, - [DisplayOrientation.Portrait] = UIInterfaceOrientationMask.Portrait, - }; - - public static partial void SetDeviceOrientation(DisplayOrientation displayOrientation){ - - if (UIDevice.CurrentDevice.CheckSystemVersion(16, 0)){ - - var scene = (UIApplication.SharedApplication.ConnectedScenes.ToArray()[0] as UIWindowScene); - if (scene != null) - { - var test = UIApplication.SharedApplication.KeyWindow?.RootViewController; - if (test != null) - { - test.SetNeedsUpdateOfSupportedInterfaceOrientations(); - UIInterfaceOrientationMask mappingValue = DeviceOrientationService.UIInterfaceOrientationMaskMapping.Single(m => m.Key == displayOrientation).Value; - scene.RequestGeometryUpdate( - new UIWindowSceneGeometryPreferencesIOS(mappingValue), - error => { }); - } - } - } - else{ - UIInterfaceOrientation mappingValue = DeviceOrientationService.UIInterfaceOrientationMapping.Single(m => m.Key == displayOrientation).Value; - UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)mappingValue), new NSString("orientation")); - } - } - } -} diff --git a/TransactionProcessor.Mobile/Platforms/iOS/Info.plist b/TransactionProcessor.Mobile/Platforms/iOS/Info.plist deleted file mode 100644 index 0004a4fde..000000000 --- a/TransactionProcessor.Mobile/Platforms/iOS/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - LSRequiresIPhoneOS - - UIDeviceFamily - - 1 - 2 - - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - XSAppIconAssets - Assets.xcassets/appicon.appiconset - - diff --git a/TransactionProcessor.Mobile/Platforms/iOS/Program.cs b/TransactionProcessor.Mobile/Platforms/iOS/Program.cs deleted file mode 100644 index 84d612856..000000000 --- a/TransactionProcessor.Mobile/Platforms/iOS/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ObjCRuntime; -using UIKit; - -namespace TransactionProcessor.Mobile -{ - public class Program - { - // This is the main entry point of the application. - static void Main(string[] args) - { - // if you want to use a different Application Delegate class from "AppDelegate" - // you can specify it here. - UIApplication.Main(args, null, typeof(AppDelegate)); - } - } -} diff --git a/TransactionProcessor.Mobile/Platforms/iOS/Resources/PrivacyInfo.xcprivacy b/TransactionProcessor.Mobile/Platforms/iOS/Resources/PrivacyInfo.xcprivacy deleted file mode 100644 index 24ab3b433..000000000 --- a/TransactionProcessor.Mobile/Platforms/iOS/Resources/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - NSPrivacyAccessedAPITypes - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryFileTimestamp - NSPrivacyAccessedAPITypeReasons - - C617.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategorySystemBootTime - NSPrivacyAccessedAPITypeReasons - - 35F9.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryDiskSpace - NSPrivacyAccessedAPITypeReasons - - E174.1 - - - - - - diff --git a/TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj b/TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj index 6aba58b31..bbe3218a6 100644 --- a/TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj +++ b/TransactionProcessor.Mobile/TransactionProcessor.Mobile.csproj @@ -1,35 +1,13 @@  - - - - - - - net9.0-android + net10.0-android - net9.0-android;net9.0-windows10.0.19041.0 - - - - - net9.0-android;net9.0-ios;net9.0-maccatalyst + net10.0-android;net10.0-windows10.0.19041.0 - - - + Exe TransactionProcessor.Mobile @@ -51,12 +29,9 @@ MSIX - 15.0 - 15.0 21.0 10.0.17763.0 10.0.17763.0 - 6.5 @@ -171,28 +146,40 @@ - + - - - + + + - + - - + + - + ANDROID - + apk + + + true + + + true + true + + + true + + diff --git a/TransactionProcessor.Mobile/UIServices/DeviceService.cs b/TransactionProcessor.Mobile/UIServices/DeviceService.cs index ab2512e36..092752fcc 100644 --- a/TransactionProcessor.Mobile/UIServices/DeviceService.cs +++ b/TransactionProcessor.Mobile/UIServices/DeviceService.cs @@ -33,8 +33,6 @@ public String GetPlatform() { return DeviceInformationService.Platform(); } - - public Boolean IsIOS() => DeviceInfo.Platform == DevicePlatform.iOS; public String GetManufacturer(){ return DeviceInfo.Manufacturer;