Skip to content

Commit 88b79b5

Browse files
refactor(test): refactor authentication tests (#126)
1 parent 9e2c02a commit 88b79b5

19 files changed

+65
-47
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ The full API of this library can be found in [api.md](https://www.github.com/Fin
2424
from finch import Finch
2525

2626
client = Finch(
27-
access_token="my access token",
27+
access_token="My Access Token",
2828
)
2929

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

4444
client = AsyncFinch(
45-
access_token="my access token",
45+
access_token="My Access Token",
4646
)
4747

4848

src/finch/_base_client.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,10 @@ def close(self) -> None:
811811
812812
The client will *not* be usable after this.
813813
"""
814-
self._client.close()
814+
# If an error is thrown while constructing a client, self._client
815+
# may not be present
816+
if hasattr(self, "_client"):
817+
self._client.close()
815818

816819
def __enter__(self: _T) -> _T:
817820
return self

src/finch/_client.py

+18-24
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ class Finch(SyncAPIClient):
6262
def __init__(
6363
self,
6464
*,
65-
client_id: str | None = None,
66-
client_secret: str | None = None,
67-
webhook_secret: str | None = None,
65+
access_token: str | None = None,
66+
client_id: str | None = os.environ.get("FINCH_CLIENT_ID", None),
67+
client_secret: str | None = os.environ.get("FINCH_CLIENT_SECRET", None),
68+
webhook_secret: str | None = os.environ.get("FINCH_WEBHOOK_SECRET", None),
6869
base_url: Optional[str] = None,
69-
access_token: Optional[str] = None,
7070
timeout: Union[float, Timeout, None, NotGiven] = NOT_GIVEN,
7171
max_retries: int = DEFAULT_MAX_RETRIES,
7272
default_headers: Mapping[str, str] | None = None,
@@ -98,14 +98,11 @@ def __init__(
9898
"""
9999
self.access_token = access_token
100100

101-
client_id_envvar = os.environ.get("FINCH_CLIENT_ID", None)
102-
self.client_id = client_id or client_id_envvar or None
101+
self.client_id = client_id
103102

104-
client_secret_envvar = os.environ.get("FINCH_CLIENT_SECRET", None)
105-
self.client_secret = client_secret or client_secret_envvar or None
103+
self.client_secret = client_secret
106104

107-
webhook_secret_envvar = os.environ.get("FINCH_WEBHOOK_SECRET", None)
108-
self.webhook_secret = webhook_secret or webhook_secret_envvar or None
105+
self.webhook_secret = webhook_secret
109106

110107
if base_url is None:
111108
base_url = f"https://api.tryfinch.com"
@@ -162,10 +159,10 @@ def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
162159
def copy(
163160
self,
164161
*,
162+
access_token: str | None = None,
165163
client_id: str | None = None,
166164
client_secret: str | None = None,
167165
webhook_secret: str | None = None,
168-
access_token: str | None = None,
169166
base_url: str | None = None,
170167
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
171168
http_client: httpx.Client | None = None,
@@ -219,11 +216,11 @@ def copy(
219216
http_client = http_client or self._client
220217

221218
return self.__class__(
219+
access_token=access_token or self.access_token,
222220
client_id=client_id or self.client_id,
223221
client_secret=client_secret or self.client_secret,
224222
webhook_secret=webhook_secret or self.webhook_secret,
225223
base_url=base_url or str(self.base_url),
226-
access_token=access_token or self.access_token,
227224
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
228225
http_client=http_client,
229226
connection_pool_limits=connection_pool_limits,
@@ -354,11 +351,11 @@ class AsyncFinch(AsyncAPIClient):
354351
def __init__(
355352
self,
356353
*,
357-
client_id: str | None = None,
358-
client_secret: str | None = None,
359-
webhook_secret: str | None = None,
354+
access_token: str | None = None,
355+
client_id: str | None = os.environ.get("FINCH_CLIENT_ID", None),
356+
client_secret: str | None = os.environ.get("FINCH_CLIENT_SECRET", None),
357+
webhook_secret: str | None = os.environ.get("FINCH_WEBHOOK_SECRET", None),
360358
base_url: Optional[str] = None,
361-
access_token: Optional[str] = None,
362359
timeout: Union[float, Timeout, None, NotGiven] = NOT_GIVEN,
363360
max_retries: int = DEFAULT_MAX_RETRIES,
364361
default_headers: Mapping[str, str] | None = None,
@@ -390,14 +387,11 @@ def __init__(
390387
"""
391388
self.access_token = access_token
392389

393-
client_id_envvar = os.environ.get("FINCH_CLIENT_ID", None)
394-
self.client_id = client_id or client_id_envvar or None
390+
self.client_id = client_id
395391

396-
client_secret_envvar = os.environ.get("FINCH_CLIENT_SECRET", None)
397-
self.client_secret = client_secret or client_secret_envvar or None
392+
self.client_secret = client_secret
398393

399-
webhook_secret_envvar = os.environ.get("FINCH_WEBHOOK_SECRET", None)
400-
self.webhook_secret = webhook_secret or webhook_secret_envvar or None
394+
self.webhook_secret = webhook_secret
401395

402396
if base_url is None:
403397
base_url = f"https://api.tryfinch.com"
@@ -454,10 +448,10 @@ def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
454448
def copy(
455449
self,
456450
*,
451+
access_token: str | None = None,
457452
client_id: str | None = None,
458453
client_secret: str | None = None,
459454
webhook_secret: str | None = None,
460-
access_token: str | None = None,
461455
base_url: str | None = None,
462456
timeout: float | Timeout | None | NotGiven = NOT_GIVEN,
463457
http_client: httpx.AsyncClient | None = None,
@@ -511,11 +505,11 @@ def copy(
511505
http_client = http_client or self._client
512506

513507
return self.__class__(
508+
access_token=access_token or self.access_token,
514509
client_id=client_id or self.client_id,
515510
client_secret=client_secret or self.client_secret,
516511
webhook_secret=webhook_secret or self.webhook_secret,
517512
base_url=base_url or str(self.base_url),
518-
access_token=access_token or self.access_token,
519513
timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
520514
http_client=http_client,
521515
connection_pool_limits=connection_pool_limits,

src/finch/_utils/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
from ._utils import extract_type_arg as extract_type_arg
2222
from ._utils import is_required_type as is_required_type
2323
from ._utils import is_annotated_type as is_annotated_type
24+
from ._utils import maybe_coerce_float as maybe_coerce_float
25+
from ._utils import maybe_coerce_boolean as maybe_coerce_boolean
26+
from ._utils import maybe_coerce_integer as maybe_coerce_integer
2427
from ._utils import strip_annotated_type as strip_annotated_type
2528
from ._transform import PropertyInfo as PropertyInfo
2629
from ._transform import transform as transform

src/finch/_utils/_utils.py

+18
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,24 @@ def coerce_boolean(val: str) -> bool:
309309
return val == "true" or val == "1" or val == "on"
310310

311311

312+
def maybe_coerce_integer(val: str | None) -> int | None:
313+
if val is None:
314+
return None
315+
return coerce_integer(val)
316+
317+
318+
def maybe_coerce_float(val: str | None) -> float | None:
319+
if val is None:
320+
return None
321+
return coerce_float(val)
322+
323+
324+
def maybe_coerce_boolean(val: str | None) -> bool | None:
325+
if val is None:
326+
return None
327+
return coerce_boolean(val)
328+
329+
312330
def removeprefix(string: str, prefix: str) -> str:
313331
"""Remove a prefix from a string.
314332

tests/api_resources/hris/benefits/test_individuals.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818

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

2222

2323
class TestIndividuals:

tests/api_resources/hris/test_benefits.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818

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

2222

2323
class TestBenefits:

tests/api_resources/hris/test_company.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from finch.types.hris import Company
1212

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

1616

1717
class TestCompany:

tests/api_resources/hris/test_directory.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from finch.types.hris import IndividualInDirectory
1313

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

1717

1818
class TestDirectory:

tests/api_resources/hris/test_employments.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from finch.types.hris import EmploymentDataResponse
1313

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

1717

1818
class TestEmployments:

tests/api_resources/hris/test_individuals.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from finch.types.hris import IndividualResponse
1313

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

1717

1818
class TestIndividuals:

tests/api_resources/hris/test_pay_statements.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from finch.types.hris import PayStatementResponse
1313

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

1717

1818
class TestPayStatements:

tests/api_resources/hris/test_payments.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from finch.types.hris import Payment
1414

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

1818

1919
class TestPayments:

tests/api_resources/test_account.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from tests.utils import assert_matches_type
1212

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

1616

1717
class TestAccount:

tests/api_resources/test_providers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from finch.pagination import SyncSinglePage, AsyncSinglePage
1313

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

1717

1818
class TestProviders:

tests/api_resources/test_request_forwarding.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from tests.utils import assert_matches_type
1212

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

1616

1717
class TestRequestForwarding:

tests/api_resources/test_top_level.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from finch import Finch, AsyncFinch
1010

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

1414

1515
class TestTopLevel:

tests/api_resources/test_webhooks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from finch import Finch, AsyncFinch
1414

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

1818

1919
class TestWebhooks:

tests/test_client.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
)
2727

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

3131

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

54-
copied = self.client.copy(access_token="my new access token")
55-
assert copied.access_token == "my new access token"
56-
assert self.client.access_token == access_token
54+
copied = self.client.copy(access_token="another My Access Token")
55+
assert copied.access_token == "another My Access Token"
56+
assert self.client.access_token == "My Access Token"
5757

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

683-
copied = self.client.copy(access_token="my new access token")
684-
assert copied.access_token == "my new access token"
685-
assert self.client.access_token == access_token
683+
copied = self.client.copy(access_token="another My Access Token")
684+
assert copied.access_token == "another My Access Token"
685+
assert self.client.access_token == "My Access Token"
686686

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

0 commit comments

Comments
 (0)