Skip to content

Commit

Permalink
🎨 Rename Salesforce class
Browse files Browse the repository at this point in the history
  • Loading branch information
Maciej Gardzinski committed Sep 25, 2024
1 parent 8873242 commit 85978d4
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 42 deletions.
8 changes: 4 additions & 4 deletions src/viadot/orchestration/prefect/flows/salesforce_to_adls.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Download data from SalesForce API to Azure Data Lake Storage."""
"""Download data from Salesforce API to Azure Data Lake Storage."""

from prefect import flow
from prefect.task_runners import ConcurrentTaskRunner
Expand All @@ -7,8 +7,8 @@


@flow(
name="SalesForce extraction to ADLS",
description="Extract data from SalesForce and load "
name="Salesforce extraction to ADLS",
description="Extract data from Salesforce and load "
+ "it into Azure Data Lake Storage.",
retries=1,
retry_delay_seconds=60,
Expand All @@ -28,7 +28,7 @@ def salesforce_to_adls(
adls_path: str | None = None,
adls_path_overwrite: bool = False,
) -> None:
"""Flow to download data from SalesForce API to Azure Data Lake.
"""Flow to download data from Salesforce API to Azure Data Lake.
Args:
config_key (str, optional): The key in the viadot config holding relevant
Expand Down
6 changes: 3 additions & 3 deletions src/viadot/orchestration/prefect/tasks/salesforce.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Task to download data from SalesForce API into a Pandas DataFrame."""
"""Task to download data from Salesforce API into a Pandas DataFrame."""

import pandas as pd
from prefect import task

from viadot.orchestration.prefect.exceptions import MissingSourceCredentialsError
from viadot.orchestration.prefect.utils import get_credentials
from viadot.sources import SalesForce
from viadot.sources import Salesforce


@task(retries=3, log_prints=True, retry_delay_seconds=10, timeout_seconds=60 * 60)
Expand Down Expand Up @@ -49,7 +49,7 @@ def salesforce_to_df(
if not config_key:
credentials = get_credentials(azure_key_vault_secret)

salesforce = SalesForce(
salesforce = Salesforce(
credentials=credentials,
config_key=config_key,
env=env,
Expand Down
4 changes: 2 additions & 2 deletions src/viadot/sources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from .hubspot import Hubspot
from .mindful import Mindful
from .outlook import Outlook
from .salesforce import SalesForce
from .salesforce import Salesforce
from .sharepoint import Sharepoint
from .sql_server import SQLServer
from .trino import Trino
Expand All @@ -22,7 +22,7 @@
"ExchangeRates",
"Genesys",
"Outlook",
"SalesForce",
"Salesforce",
"Hubspot",
"Mindful",
"Sharepoint",
Expand Down
14 changes: 7 additions & 7 deletions src/viadot/sources/salesforce.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

import pandas as pd
from pydantic import BaseModel
from simple_salesforce import Salesforce
from simple_salesforce import Salesforce as SimpleSalesforce

from viadot.config import get_source_credentials
from viadot.exceptions import CredentialError
from viadot.sources.base import Source
from viadot.utils import add_viadot_metadata_columns


class SalesForceCredentials(BaseModel):
class SalesforceCredentials(BaseModel):
"""Checking for values in Salesforce credentials dictionary.
Two key values are held in the Salesforce connector:
Expand All @@ -30,7 +30,7 @@ class SalesForceCredentials(BaseModel):
token: str


class SalesForce(Source):
class Salesforce(Source):
"""Class implementing the Salesforce API.
Documentation for this API is available at:
Expand All @@ -40,7 +40,7 @@ class SalesForce(Source):
def __init__(
self,
*args,
credentials: SalesForceCredentials | None = None,
credentials: SalesforceCredentials | None = None,
config_key: str = "salesforce",
env: Literal["DEV", "QA", "PROD"] = "DEV",
domain: str = "test",
Expand Down Expand Up @@ -73,11 +73,11 @@ def __init__(
message = "'username', 'password' and 'token' credentials are required."
raise CredentialError(message)

validated_creds = dict(SalesForceCredentials(**credentials))
validated_creds = dict(SalesforceCredentials(**credentials))
super().__init__(*args, credentials=validated_creds, **kwargs)

if env.upper() == "DEV" or env.upper() == "QA":
self.salesforce = Salesforce(
self.salesforce = SimpleSalesforce(
username=self.credentials["username"],
password=self.credentials["password"],
security_token=self.credentials["token"],
Expand All @@ -86,7 +86,7 @@ def __init__(
)

elif env.upper() == "PROD":
self.salesforce = Salesforce(
self.salesforce = SimpleSalesforce(
username=self.credentials["username"],
password=self.credentials["password"],
security_token=self.credentials["token"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


def test_salesforce_to_adls(azure_key_vault_secret, adls_azure_key_vault_secret):
"""Test SalesForce prefect flow."""
"""Test Salesforce prefect flow."""
state = salesforce_to_adls(
azure_key_vault_secret=azure_key_vault_secret,
env="dev",
Expand Down
50 changes: 25 additions & 25 deletions tests/unit/test_salesforce.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""'test_salesforce.py'."""

import pytest
from simple_salesforce import Salesforce
from simple_salesforce import Salesforce as SimpleSalesforce

from viadot.exceptions import CredentialError
from viadot.sources import SalesForce
from viadot.sources.salesforce import SalesForceCredentials
from viadot.sources import Salesforce
from viadot.sources.salesforce import SalesforceCredentials

variables = {
"credentials": {
Expand Down Expand Up @@ -42,21 +42,21 @@

@pytest.mark.basic()
def test_salesforce_init_dev_env(mocker):
"""Test SalesForce, starting in dev mode."""
"""Test Salesforce, starting in dev mode."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
sf_instance = SalesForce(credentials=variables["credentials"], env="DEV")
sf_instance = Salesforce(credentials=variables["credentials"], env="DEV")

assert sf_instance.salesforce == mock_sf_instance


class TestSalesForceCredentials:
"""Test SalesForce Credentials Class."""
class TestSalesforceCredentials:
"""Test Salesforce Credentials Class."""

@pytest.mark.basic()
def test_salesforce_credentials(self):
"""Test SalesForce credentials."""
SalesForceCredentials(
"""Test Salesforce credentials."""
SalesforceCredentials(
username="test_user",
password="test_password",
token="test_token",
Expand All @@ -65,37 +65,37 @@ def test_salesforce_credentials(self):

@pytest.mark.basic()
def test_salesforce_init_prod_env(mocker):
"""Test SalesForce, starting in prod mode."""
"""Test Salesforce, starting in prod mode."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
sf_instance = SalesForce(credentials=variables["credentials"], env="PROD")
sf_instance = Salesforce(credentials=variables["credentials"], env="PROD")

assert sf_instance.salesforce == mock_sf_instance


@pytest.mark.basic()
def test_salesforce_invalid_env():
"""Test SalesForce, invalid `env` parameter."""
"""Test Salesforce, invalid `env` parameter."""
with pytest.raises(
ValueError, match="The only available environments are DEV, QA, and PROD."
):
SalesForce(credentials=variables["credentials"], env="INVALID")
Salesforce(credentials=variables["credentials"], env="INVALID")


@pytest.mark.basic()
def test_salesforce_missing_credentials():
"""Test SalesForce missing credentials."""
"""Test Salesforce missing credentials."""
incomplete_creds = {"username": "user", "password": "pass"}
with pytest.raises(CredentialError):
SalesForce(credentials=incomplete_creds)
Salesforce(credentials=incomplete_creds)


@pytest.mark.connect()
def test_salesforce_api_connection(mocker):
"""Test SalesForce `api_connection` method with a query."""
"""Test Salesforce `api_connection` method with a query."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
salesforce_instance = SalesForce(credentials=variables["credentials"])
salesforce_instance = Salesforce(credentials=variables["credentials"])

mock_sf_instance.query.return_value = {"records": variables["records_1"]}

Expand All @@ -107,10 +107,10 @@ def test_salesforce_api_connection(mocker):

@pytest.mark.connect()
def test_salesforce_api_connection_with_columns(mocker):
"""Test SalesForce `api_connection` method with columns."""
"""Test Salesforce `api_connection` method with columns."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
salesforce_instance = SalesForce(credentials=variables["credentials"])
salesforce_instance = Salesforce(credentials=variables["credentials"])

mock_sf_instance.query.return_value = {"records": variables["records_2"]}

Expand All @@ -122,10 +122,10 @@ def test_salesforce_api_connection_with_columns(mocker):

@pytest.mark.functions()
def test_salesforce_to_df(mocker):
"""Test SalesForce `to_df` method."""
"""Test Salesforce `to_df` method."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
salesforce_instance = SalesForce(credentials=variables["credentials"])
salesforce_instance = Salesforce(credentials=variables["credentials"])
salesforce_instance.data = variables["data"]

df = salesforce_instance.to_df()
Expand All @@ -143,10 +143,10 @@ def test_salesforce_to_df(mocker):

@pytest.mark.functions()
def test_salesforce_to_df_empty_data(mocker):
"""Test SalesForce `to_df` method with empty df."""
"""Test Salesforce `to_df` method with empty df."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
salesforce_instance = SalesForce(credentials=variables["credentials"])
salesforce_instance = Salesforce(credentials=variables["credentials"])
salesforce_instance.data = []

with pytest.raises(ValueError, match="The response does not contain any data."):
Expand All @@ -155,10 +155,10 @@ def test_salesforce_to_df_empty_data(mocker):

@pytest.mark.functions()
def test_salesforce_to_df_warn_empty_data(mocker):
"""Test SalesForce `to_df` method with empty df, warn."""
"""Test Salesforce `to_df` method with empty df, warn."""
mock_sf_instance = mocker.MagicMock(spec=Salesforce)
mocker.patch("viadot.sources.salesforce.Salesforce", return_value=mock_sf_instance)
salesforce_instance = SalesForce(credentials=variables["credentials"])
salesforce_instance = Salesforce(credentials=variables["credentials"])
salesforce_instance.data = []

df = salesforce_instance.to_df(if_empty="warn")
Expand Down

0 comments on commit 85978d4

Please sign in to comment.