|
42 | 42 | BearerAuthenticator, |
43 | 43 | LegacySessionTokenAuthenticator, |
44 | 44 | ) |
45 | | -from airbyte_cdk.sources.declarative.auth.token_provider import SessionTokenProvider |
| 45 | +from airbyte_cdk.sources.declarative.auth.token_provider import ( |
| 46 | + InterpolatedSessionTokenProvider, |
| 47 | + SessionTokenProvider, |
| 48 | +) |
46 | 49 | from airbyte_cdk.sources.declarative.checks import CheckStream |
47 | 50 | from airbyte_cdk.sources.declarative.concurrency_level import ConcurrencyLevel |
48 | 51 | from airbyte_cdk.sources.declarative.datetime.min_max_datetime import MinMaxDatetime |
@@ -1841,20 +1844,78 @@ def test_create_request_with_session_authenticator(): |
1841 | 1844 | ) |
1842 | 1845 |
|
1843 | 1846 | assert isinstance(selector.authenticator, ApiKeyAuthenticator) |
1844 | | - assert isinstance(selector.authenticator.token_provider, SessionTokenProvider) |
1845 | | - assert selector.authenticator.token_provider.session_token_path == ["id"] |
1846 | | - assert isinstance(selector.authenticator.token_provider.login_requester, HttpRequester) |
1847 | | - assert selector.authenticator.token_provider.session_token_path == ["id"] |
| 1847 | + # Default behavior wraps with InterpolatedSessionTokenProvider using "{{ session_token }}" |
| 1848 | + assert isinstance(selector.authenticator.token_provider, InterpolatedSessionTokenProvider) |
| 1849 | + assert selector.authenticator.token_provider.api_token == "{{ session_token }}" |
| 1850 | + session_token_provider = selector.authenticator.token_provider.session_token_provider |
| 1851 | + assert isinstance(session_token_provider, SessionTokenProvider) |
| 1852 | + assert session_token_provider.session_token_path == ["id"] |
| 1853 | + assert isinstance(session_token_provider.login_requester, HttpRequester) |
1848 | 1854 | assert ( |
1849 | | - selector.authenticator.token_provider.login_requester._url_base.eval(input_config) |
| 1855 | + session_token_provider.login_requester._url_base.eval(input_config) |
1850 | 1856 | == "https://api.sendgrid.com" |
1851 | 1857 | ) |
1852 | | - assert selector.authenticator.token_provider.login_requester.get_request_body_json() == { |
| 1858 | + assert session_token_provider.login_requester.get_request_body_json() == { |
1853 | 1859 | "username": "lists", |
1854 | 1860 | "password": "verysecrettoken", |
1855 | 1861 | } |
1856 | 1862 |
|
1857 | 1863 |
|
| 1864 | +def test_create_request_with_session_authenticator_with_api_token_template(): |
| 1865 | + """Test that api_token wraps the token provider with InterpolatedSessionTokenProvider.""" |
| 1866 | + content = """ |
| 1867 | +requester: |
| 1868 | + type: HttpRequester |
| 1869 | + path: "/v3/marketing/lists" |
| 1870 | + $parameters: |
| 1871 | + name: 'lists' |
| 1872 | + url_base: "https://api.sendgrid.com" |
| 1873 | + authenticator: |
| 1874 | + type: SessionTokenAuthenticator |
| 1875 | + decoder: |
| 1876 | + type: JsonDecoder |
| 1877 | + expiration_duration: P10D |
| 1878 | + login_requester: |
| 1879 | + path: /session |
| 1880 | + type: HttpRequester |
| 1881 | + url_base: 'https://api.sendgrid.com' |
| 1882 | + http_method: POST |
| 1883 | + request_body_json: |
| 1884 | + password: '{{ config.apikey }}' |
| 1885 | + username: '{{ parameters.name }}' |
| 1886 | + session_token_path: |
| 1887 | + - id |
| 1888 | + request_authentication: |
| 1889 | + type: ApiKey |
| 1890 | + inject_into: |
| 1891 | + type: RequestOption |
| 1892 | + field_name: Authorization |
| 1893 | + inject_into: header |
| 1894 | + api_token: "Token {{ session_token }}" |
| 1895 | + """ |
| 1896 | + name = "name" |
| 1897 | + parsed_manifest = YamlDeclarativeSource._parse(content) |
| 1898 | + resolved_manifest = resolver.preprocess_manifest(parsed_manifest) |
| 1899 | + requester_manifest = transformer.propagate_types_and_parameters( |
| 1900 | + "", resolved_manifest["requester"], {} |
| 1901 | + ) |
| 1902 | + |
| 1903 | + selector = factory.create_component( |
| 1904 | + model_type=HttpRequesterModel, |
| 1905 | + component_definition=requester_manifest, |
| 1906 | + config=input_config, |
| 1907 | + name=name, |
| 1908 | + decoder=None, |
| 1909 | + ) |
| 1910 | + |
| 1911 | + assert isinstance(selector.authenticator, ApiKeyAuthenticator) |
| 1912 | + assert isinstance(selector.authenticator.token_provider, InterpolatedSessionTokenProvider) |
| 1913 | + assert selector.authenticator.token_provider.api_token == "Token {{ session_token }}" |
| 1914 | + assert isinstance( |
| 1915 | + selector.authenticator.token_provider.session_token_provider, SessionTokenProvider |
| 1916 | + ) |
| 1917 | + |
| 1918 | + |
1858 | 1919 | def test_given_composite_error_handler_does_not_match_response_then_fallback_on_default_error_handler( |
1859 | 1920 | requests_mock, |
1860 | 1921 | ): |
|
0 commit comments