Bug: [FEAT] Set up CI to support mock server for alpha connectors



flow should be:

- build hyperswitch router
- upload it to artifact

- download artifact
- start the server
- run mandatory tests

- download artifact
- start mock server with node
- start server
- run optional mock server tests
diff --git a/crates/common_enums/src/connector_enums.rs b/crates/common_enums/src/connector_enums.rs
index c3741e0f5ea..39178d15eb9 100644
--- a/crates/common_enums/src/connector_enums.rs
+++ b/crates/common_enums/src/connector_enums.rs
@@ -145,6 +145,7 @@ pub enum RoutableConnectors {
     Santander,
     Shift4,
     Signifyd,
+    Silverflow,
     Square,
     Stax,
     Stripe,
@@ -315,6 +316,7 @@ pub enum Connector {
     Redsys,
     Santander,
     Shift4,
+    Silverflow,
     Square,
     Stax,
     Stripe,
@@ -495,6 +497,7 @@ impl Connector {
             | Self::Redsys
             | Self::Santander
             | Self::Shift4
+            | Self::Silverflow
             | Self::Square
             | Self::Stax
             | Self::Stripebilling
@@ -668,6 +671,7 @@ impl From<RoutableConnectors> for Connector {
             RoutableConnectors::Santander => Self::Santander,
             RoutableConnectors::Shift4 => Self::Shift4,
             RoutableConnectors::Signifyd => Self::Signifyd,
+            RoutableConnectors::Silverflow => Self::Silverflow,
             RoutableConnectors::Square => Self::Square,
             RoutableConnectors::Stax => Self::Stax,
             RoutableConnectors::Stripe => Self::Stripe,
@@ -795,6 +799,7 @@ impl TryFrom<Connector> for RoutableConnectors {
             Connector::Santander => Ok(Self::Santander),
             Connector::Shift4 => Ok(Self::Shift4),
             Connector::Signifyd => Ok(Self::Signifyd),
+            Connector::Silverflow => Ok(Self::Silverflow),
             Connector::Square => Ok(Self::Square),
             Connector::Stax => Ok(Self::Stax),
             Connector::Stripe => Ok(Self::Stripe),
diff --git a/crates/connector_configs/src/connector.rs b/crates/connector_configs/src/connector.rs
index 84e7398f61c..4ee90a17469 100644
--- a/crates/connector_configs/src/connector.rs
+++ b/crates/connector_configs/src/connector.rs
@@ -465,6 +465,7 @@ impl ConnectorConfig {
             Connector::Santander => Ok(connector_data.santander),
             Connector::Shift4 => Ok(connector_data.shift4),
             Connector::Signifyd => Ok(connector_data.signifyd),
+            Connector::Silverflow => Ok(connector_data.silverflow),
             Connector::Square => Ok(connector_data.square),
             Connector::Stax => Ok(connector_data.stax),
             Connector::Stripe => Ok(connector_data.stripe),
diff --git a/crates/hyperswitch_connectors/src/connectors/silverflow/transformers.rs b/crates/hyperswitch_connectors/src/connectors/silverflow/transformers.rs
index 87a99417dd6..2d56fa4e61c 100644
--- a/crates/hyperswitch_connectors/src/connectors/silverflow/transformers.rs
+++ b/crates/hyperswitch_connectors/src/connectors/silverflow/transformers.rs
@@ -17,7 +17,7 @@ use serde::{Deserialize, Serialize};
 
 use crate::{
     types::{RefundsResponseRouterData, ResponseRouterData},
-    utils::CardData,
+    utils::{self, CardData},
 };
 
 //TODO: Fill the struct with respective fields
@@ -67,6 +67,7 @@ pub struct SilverflowPaymentsRequest {
     amount: Amount,
     #[serde(rename = "type")]
     payment_type: PaymentType,
+    clearing_mode: String,
 }
 
 #[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
@@ -82,6 +83,17 @@ impl TryFrom<&SilverflowRouterData<&PaymentsAuthorizeRouterData>> for Silverflow
     fn try_from(
         item: &SilverflowRouterData<&PaymentsAuthorizeRouterData>,
     ) -> Result<Self, Self::Error> {
+        // Check if 3DS is being requested - Silverflow doesn't support 3DS
+        if matches!(
+            item.router_data.auth_type,
+            enums::AuthenticationType::ThreeDs
+        ) {
+            return Err(errors::ConnectorError::NotImplemented(
+                utils::get_unimplemented_payment_method_error_message("silverflow"),
+            )
+            .into());
+        }
+
         match item.router_data.request.payment_method_data.clone() {
             PaymentMethodData::Card(req_card) => {
                 // Extract merchant acceptor key from connector auth
@@ -95,6 +107,21 @@ impl TryFrom<&SilverflowRouterData<&PaymentsAuthorizeRouterData>> for Silverflow
                     holder_name: req_card.get_cardholder_name().ok(),
                 };
 
+                // Determine clearing mode based on capture method
+                let clearing_mode = match item.router_data.request.capture_method {
+                    Some(enums::CaptureMethod::Manual) => "manual".to_string(),
+                    Some(enums::CaptureMethod::Automatic) | None => "auto".to_string(),
+                    Some(enums::CaptureMethod::ManualMultiple)
+                    | Some(enums::CaptureMethod::Scheduled)
+                    | Some(enums::CaptureMethod::SequentialAutomatic) => {
+                        return Err(errors::ConnectorError::NotSupported {
+                            message: "Capture method not supported by Silverflow".to_string(),
+                            connector: "Silverflow",
+                        }
+                        .into());
+                    }
+                };
+
                 Ok(Self {
                     merchant_acceptor_resolver: MerchantAcceptorResolver {
                         merchant_acceptor_key: auth.merchant_acceptor_key.expose(),
@@ -109,9 +136,13 @@ impl TryFrom<&SilverflowRouterData<&PaymentsAuthorizeRouterData>> for Silverflow
                         card_entry: "e-commerce".to_string(),
                         order: "checkout".to_string(),
                     },
+                    clearing_mode,
                 })
             }
-            _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()),
+            _ => Err(errors::ConnectorError::NotImplemented(
+                utils::get_unimplemented_payment_method_error_message("silverflow"),
+            )
+            .into()),
         }
     }
 }
@@ -636,7 +667,10 @@ impl TryFrom<&PaymentsAuthorizeRouterData> for SilverflowTokenizationRequest {
                     card_data,
                 })
             }
-            _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()),
+            _ => Err(errors::ConnectorError::NotImplemented(
+                utils::get_unimplemented_payment_method_error_message("silverflow"),
+            )
+            .into()),
         }
     }
 }
@@ -677,7 +711,10 @@ impl
                     card_data,
                 })
             }
-            _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()),
+            _ => Err(errors::ConnectorError::NotImplemented(
+                utils::get_unimplemented_payment_method_error_message("silverflow"),
+            )
+            .into()),
         }
     }
 }
diff --git a/crates/payment_methods/src/configs/payment_connector_required_fields.rs b/crates/payment_methods/src/configs/payment_connector_required_fields.rs
index 469b27baf8c..70e5fa7c13b 100644
--- a/crates/payment_methods/src/configs/payment_connector_required_fields.rs
+++ b/crates/payment_methods/src/configs/payment_connector_required_fields.rs
@@ -1492,6 +1492,7 @@ fn get_cards_required_fields() -> HashMap<Connector, RequiredFieldFinal> {
         (Connector::Rapyd, fields(vec![], card_with_name(), vec![])),
         (Connector::Redsys, fields(vec![], card_basic(), vec![])),
         (Connector::Shift4, fields(vec![], card_basic(), vec![])),
+        (Connector::Silverflow, fields(vec![], vec![], card_basic())),
         (Connector::Square, fields(vec![], vec![], card_basic())),
         (Connector::Stax, fields(vec![], card_with_name(), vec![])),
         (Connector::Stripe, fields(vec![], vec![], card_basic())),
diff --git a/crates/router/src/core/connector_validation.rs b/crates/router/src/core/connector_validation.rs
index 99b873af1dc..8bd9cf6fc9c 100644
--- a/crates/router/src/core/connector_validation.rs
+++ b/crates/router/src/core/connector_validation.rs
@@ -431,6 +431,10 @@ impl ConnectorAuthTypeAndMetadataValidation<'_> {
                 shift4::transformers::Shift4AuthType::try_from(self.auth_type)?;
                 Ok(())
             }
+            api_enums::Connector::Silverflow => {
+                silverflow::transformers::SilverflowAuthType::try_from(self.auth_type)?;
+                Ok(())
+            }
             api_enums::Connector::Square => {
                 square::transformers::SquareAuthType::try_from(self.auth_type)?;
                 Ok(())
diff --git a/crates/router/src/types/api/connector_mapping.rs b/crates/router/src/types/api/connector_mapping.rs
index c4a1f187dd9..75ff6bc10ce 100644
--- a/crates/router/src/types/api/connector_mapping.rs
+++ b/crates/router/src/types/api/connector_mapping.rs
@@ -364,6 +364,9 @@ impl ConnectorData {
                 enums::Connector::Shift4 => {
                     Ok(ConnectorEnum::Old(Box::new(connector::Shift4::new())))
                 }
+                enums::Connector::Silverflow => {
+                    Ok(ConnectorEnum::Old(Box::new(connector::Silverflow::new())))
+                }
                 enums::Connector::Square => Ok(ConnectorEnum::Old(Box::new(&connector::Square))),
                 enums::Connector::Stax => Ok(ConnectorEnum::Old(Box::new(&connector::Stax))),
                 enums::Connector::Stripe => {
diff --git a/crates/router/src/types/connector_transformers.rs b/crates/router/src/types/connector_transformers.rs
index 2563f87191c..ea84e3cbd7f 100644
--- a/crates/router/src/types/connector_transformers.rs
+++ b/crates/router/src/types/connector_transformers.rs
@@ -120,6 +120,7 @@ impl ForeignTryFrom<api_enums::Connector> for common_enums::RoutableConnectors {
             api_enums::Connector::Redsys => Self::Redsys,
             api_enums::Connector::Santander => Self::Santander,
             api_enums::Connector::Shift4 => Self::Shift4,
+            api_enums::Connector::Silverflow => Self::Silverflow,
             api_enums::Connector::Signifyd => {
                 Err(common_utils::errors::ValidationError::InvalidValue {
                     message: "signifyd is not a routable connector".to_string(),

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [x] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [x] CI/CD

## Description
<!-- Describe your changes in detail -->

This PR adds support for running tests against mock server for alpha connectors.

### Additional Changes

- [ ] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->

The goal is to make sure that the implementation works.
closes https://github.com/juspay/hyperswitch/issues/8798

## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->

CI should pass / work.

## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `just clippy && just clippy_v2`
- [x] I reviewed the submitted code
- [x] I added unit tests for my changes where possible
