Skip to content

refactor(test): refactor authentication tests #126

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ The full API of this library can be found in [api.md](https://www.github.com/Fin
from finch import Finch

client = Finch(
access_token="my access token",
access_token="My Access Token",
)

page = client.hris.directory.list(
Expand All @@ -42,7 +42,7 @@ Simply import `AsyncFinch` instead of `Finch` and use `await` with each API call
from finch import AsyncFinch

client = AsyncFinch(
access_token="my access token",
access_token="My Access Token",
)


Expand Down
5 changes: 4 additions & 1 deletion src/finch/_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -811,7 +811,10 @@ def close(self) -> None:

The client will *not* be usable after this.
"""
self._client.close()
# If an error is thrown while constructing a client, self._client
# may not be present
if hasattr(self, "_client"):
self._client.close()

def __enter__(self: _T) -> _T:
return self
Expand Down
42 changes: 18 additions & 24 deletions src/finch/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,11 @@ class Finch(SyncAPIClient):
def __init__(
self,
*,
client_id: str | None = None,
client_secret: str | None = None,
webhook_secret: str | None = None,
access_token: str | None = None,
client_id: str | None = os.environ.get("FINCH_CLIENT_ID", None),
client_secret: str | None = os.environ.get("FINCH_CLIENT_SECRET", None),
webhook_secret: str | None = os.environ.get("FINCH_WEBHOOK_SECRET", None),
base_url: Optional[str] = None,
access_token: Optional[str] = None,
timeout: Union[float, Timeout, None, NotGiven] = NOT_GIVEN,
max_retries: int = DEFAULT_MAX_RETRIES,
default_headers: Mapping[str, str] | None = None,
Expand Down Expand Up @@ -98,14 +98,11 @@ def __init__(
"""
self.access_token = access_token

client_id_envvar = os.environ.get("FINCH_CLIENT_ID", None)
self.client_id = client_id or client_id_envvar or None
self.client_id = client_id

client_secret_envvar = os.environ.get("FINCH_CLIENT_SECRET", None)
self.client_secret = client_secret or client_secret_envvar or None
self.client_secret = client_secret

webhook_secret_envvar = os.environ.get("FINCH_WEBHOOK_SECRET", None)
self.webhook_secret = webhook_secret or webhook_secret_envvar or None
self.webhook_secret = webhook_secret

if base_url is None:
base_url = f"https://api.tryfinch.com"
Expand Down Expand Up @@ -162,10 +159,10 @@ def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
def copy(
self,
*,
access_token: str | None = None,
client_id: str | None = None,
client_secret: str | None = None,
webhook_secret: str | None = None,
access_token: str | None = None,
base_url: str | None = None,
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
http_client: httpx.Client | None = None,
Expand Down Expand Up @@ -219,11 +216,11 @@ def copy(
http_client = http_client or self._client

return self.__class__(
access_token=access_token or self.access_token,
client_id=client_id or self.client_id,
client_secret=client_secret or self.client_secret,
webhook_secret=webhook_secret or self.webhook_secret,
base_url=base_url or str(self.base_url),
access_token=access_token or self.access_token,
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
http_client=http_client,
connection_pool_limits=connection_pool_limits,
Expand Down Expand Up @@ -354,11 +351,11 @@ class AsyncFinch(AsyncAPIClient):
def __init__(
self,
*,
client_id: str | None = None,
client_secret: str | None = None,
webhook_secret: str | None = None,
access_token: str | None = None,
client_id: str | None = os.environ.get("FINCH_CLIENT_ID", None),
client_secret: str | None = os.environ.get("FINCH_CLIENT_SECRET", None),
webhook_secret: str | None = os.environ.get("FINCH_WEBHOOK_SECRET", None),
base_url: Optional[str] = None,
access_token: Optional[str] = None,
timeout: Union[float, Timeout, None, NotGiven] = NOT_GIVEN,
max_retries: int = DEFAULT_MAX_RETRIES,
default_headers: Mapping[str, str] | None = None,
Expand Down Expand Up @@ -390,14 +387,11 @@ def __init__(
"""
self.access_token = access_token

client_id_envvar = os.environ.get("FINCH_CLIENT_ID", None)
self.client_id = client_id or client_id_envvar or None
self.client_id = client_id

client_secret_envvar = os.environ.get("FINCH_CLIENT_SECRET", None)
self.client_secret = client_secret or client_secret_envvar or None
self.client_secret = client_secret

webhook_secret_envvar = os.environ.get("FINCH_WEBHOOK_SECRET", None)
self.webhook_secret = webhook_secret or webhook_secret_envvar or None
self.webhook_secret = webhook_secret

if base_url is None:
base_url = f"https://api.tryfinch.com"
Expand Down Expand Up @@ -454,10 +448,10 @@ def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
def copy(
self,
*,
access_token: str | None = None,
client_id: str | None = None,
client_secret: str | None = None,
webhook_secret: str | None = None,
access_token: str | None = None,
base_url: str | None = None,
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
http_client: httpx.AsyncClient | None = None,
Expand Down Expand Up @@ -511,11 +505,11 @@ def copy(
http_client = http_client or self._client

return self.__class__(
access_token=access_token or self.access_token,
client_id=client_id or self.client_id,
client_secret=client_secret or self.client_secret,
webhook_secret=webhook_secret or self.webhook_secret,
base_url=base_url or str(self.base_url),
access_token=access_token or self.access_token,
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
http_client=http_client,
connection_pool_limits=connection_pool_limits,
Expand Down
3 changes: 3 additions & 0 deletions src/finch/_utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
from ._utils import extract_type_arg as extract_type_arg
from ._utils import is_required_type as is_required_type
from ._utils import is_annotated_type as is_annotated_type
from ._utils import maybe_coerce_float as maybe_coerce_float
from ._utils import maybe_coerce_boolean as maybe_coerce_boolean
from ._utils import maybe_coerce_integer as maybe_coerce_integer
from ._utils import strip_annotated_type as strip_annotated_type
from ._transform import PropertyInfo as PropertyInfo
from ._transform import transform as transform
Expand Down
18 changes: 18 additions & 0 deletions src/finch/_utils/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,24 @@ def coerce_boolean(val: str) -> bool:
return val == "true" or val == "1" or val == "on"


def maybe_coerce_integer(val: str | None) -> int | None:
if val is None:
return None
return coerce_integer(val)


def maybe_coerce_float(val: str | None) -> float | None:
if val is None:
return None
return coerce_float(val)


def maybe_coerce_boolean(val: str | None) -> bool | None:
if val is None:
return None
return coerce_boolean(val)


def removeprefix(string: str, prefix: str) -> str:
"""Remove a prefix from a string.

Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/benefits/test_individuals.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
)

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestIndividuals:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_benefits.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
)

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestBenefits:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_company.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from finch.types.hris import Company

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestCompany:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from finch.types.hris import IndividualInDirectory

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestDirectory:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_employments.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from finch.types.hris import EmploymentDataResponse

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestEmployments:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_individuals.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from finch.types.hris import IndividualResponse

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestIndividuals:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_pay_statements.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from finch.types.hris import PayStatementResponse

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestPayStatements:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/hris/test_payments.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from finch.types.hris import Payment

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestPayments:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/test_account.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from tests.utils import assert_matches_type

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestAccount:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/test_providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from finch.pagination import SyncSinglePage, AsyncSinglePage

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestProviders:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/test_request_forwarding.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from tests.utils import assert_matches_type

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestRequestForwarding:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/test_top_level.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from finch import Finch, AsyncFinch

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestTopLevel:
Expand Down
2 changes: 1 addition & 1 deletion tests/api_resources/test_webhooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from finch import Finch, AsyncFinch

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


class TestWebhooks:
Expand Down
14 changes: 7 additions & 7 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
)

base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
access_token = os.environ.get("API_KEY", "something1234")
access_token = "My Access Token"


def _get_params(client: BaseClient) -> dict[str, str]:
Expand All @@ -51,9 +51,9 @@ def test_copy(self) -> None:
copied = self.client.copy()
assert id(copied) != id(self.client)

copied = self.client.copy(access_token="my new access token")
assert copied.access_token == "my new access token"
assert self.client.access_token == access_token
copied = self.client.copy(access_token="another My Access Token")
assert copied.access_token == "another My Access Token"
assert self.client.access_token == "My Access Token"

def test_copy_default_options(self) -> None:
# options that have a default are overridden correctly
Expand Down Expand Up @@ -680,9 +680,9 @@ def test_copy(self) -> None:
copied = self.client.copy()
assert id(copied) != id(self.client)

copied = self.client.copy(access_token="my new access token")
assert copied.access_token == "my new access token"
assert self.client.access_token == access_token
copied = self.client.copy(access_token="another My Access Token")
assert copied.access_token == "another My Access Token"
assert self.client.access_token == "My Access Token"

def test_copy_default_options(self) -> None:
# options that have a default are overridden correctly
Expand Down