* Connector files * Add test files * Add integration test config files * Multiple changes to make it on Airbyte standards * Cleaning up * More clean ups * More clean ups * Removed max pages * Remove unused variable * Correctly separating Full refresh and incremental * Removed unused variables * Fix full_refresh class * Better code for creating stream classes * Fixing review comments * Update docs and Enum class * Update type conversion function * Fix enum class and update docs * Update discover * Implemented some unit tests * Update discover * Update test_source * Increase discovery test timeout * Update configured_catalog * Fix default_cursor_field * Adding final unit tests * Update spec: set client_id and tenant_id as secrets * Update discover to deal with Lookup and Picklist types * Fix Lookup data type conversion * add microsoft dataverse to source def * run format * auto-bump connector version Co-authored-by: Marcelo Pio de Castro <marcelopiocastro@gmail.com> Co-authored-by: daniloss99 <danilosiqueira99@gmail.com> Co-authored-by: Marcos Marx <marcosmarxm@users.noreply.github.com> Co-authored-by: marcosmarxm <marcosmarxm@gmail.com> Co-authored-by: Octavia Squidington III <octavia-squidington-iii@users.noreply.github.com>
145 lines
4.9 KiB
Python
145 lines
4.9 KiB
Python
#
|
|
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
|
#
|
|
|
|
import json
|
|
from unittest import mock
|
|
from unittest.mock import MagicMock
|
|
|
|
from airbyte_cdk.models import SyncMode
|
|
from source_microsoft_dataverse.dataverse import AirbyteType
|
|
from source_microsoft_dataverse.source import SourceMicrosoftDataverse
|
|
from source_microsoft_dataverse.streams import IncrementalMicrosoftDataverseStream, MicrosoftDataverseStream
|
|
|
|
|
|
@mock.patch("source_microsoft_dataverse.source.do_request")
|
|
def test_check_connection(mock_request):
|
|
mock_request.return_value.raise_for_status = lambda: ()
|
|
source = SourceMicrosoftDataverse()
|
|
logger_mock, config_mock = MagicMock(), MagicMock()
|
|
assert source.check_connection(logger_mock, config_mock) == (True, None)
|
|
|
|
|
|
@mock.patch("source_microsoft_dataverse.source.get_auth")
|
|
@mock.patch("source_microsoft_dataverse.source.do_request")
|
|
def test_streams_incremental(mock_get_auth, mock_request):
|
|
streams = MagicMock()
|
|
streams.sync_mode = SyncMode.incremental
|
|
streams.stream.name = "test"
|
|
|
|
catalog = MagicMock()
|
|
|
|
catalog.streams = [streams]
|
|
|
|
config_mock = MagicMock()
|
|
source = SourceMicrosoftDataverse()
|
|
source.catalogs = catalog
|
|
|
|
streams = source.streams(config_mock)
|
|
|
|
expected_streams_number = 1
|
|
assert len(streams) == expected_streams_number
|
|
assert isinstance(streams[0], IncrementalMicrosoftDataverseStream)
|
|
assert streams[0].name == "test"
|
|
|
|
|
|
@mock.patch("source_microsoft_dataverse.source.get_auth")
|
|
@mock.patch("source_microsoft_dataverse.source.do_request")
|
|
def test_streams_full_refresh(mock_get_auth, mock_request):
|
|
streams = MagicMock()
|
|
streams.sync_mode = SyncMode.full_refresh
|
|
streams.stream.name = "test"
|
|
|
|
catalog = MagicMock()
|
|
|
|
catalog.streams = [streams]
|
|
|
|
config_mock = MagicMock()
|
|
source = SourceMicrosoftDataverse()
|
|
source.catalogs = catalog
|
|
|
|
streams = source.streams(config_mock)
|
|
|
|
expected_streams_number = 1
|
|
assert len(streams) == expected_streams_number
|
|
assert isinstance(streams[0], MicrosoftDataverseStream)
|
|
assert streams[0].name == "test"
|
|
|
|
|
|
@mock.patch("source_microsoft_dataverse.source.do_request")
|
|
def test_discover_incremental(mock_request):
|
|
result_json = json.loads('''
|
|
{
|
|
"value": [
|
|
{
|
|
"LogicalName": "stream",
|
|
"PrimaryIdAttribute": "primary",
|
|
"ChangeTrackingEnabled": true,
|
|
"CanChangeTrackingBeEnabled": {
|
|
"Value": true
|
|
},
|
|
"Attributes": [
|
|
{
|
|
"LogicalName": "test",
|
|
"AttributeType": "String"
|
|
},
|
|
{
|
|
"LogicalName": "modifiedon",
|
|
"AttributeType": "DateTime"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
''')
|
|
|
|
mock_request.return_value.status.return_value = 200
|
|
mock_request.return_value.json.return_value = result_json
|
|
|
|
source = SourceMicrosoftDataverse()
|
|
logger_mock, config_mock = MagicMock(), MagicMock()
|
|
|
|
catalog = source.discover(logger_mock, config_mock)
|
|
|
|
assert not {'modifiedon'} ^ set(catalog.streams[0].default_cursor_field)
|
|
assert not {SyncMode.full_refresh, SyncMode.incremental} ^ set(catalog.streams[0].supported_sync_modes)
|
|
assert not {'primary'} ^ set(catalog.streams[0].source_defined_primary_key[0])
|
|
assert catalog.streams[0].json_schema["properties"]["test"] == AirbyteType.String.value
|
|
|
|
|
|
@mock.patch("source_microsoft_dataverse.source.do_request")
|
|
def test_discover_full_refresh(mock_request):
|
|
result_json = json.loads('''
|
|
{
|
|
"value": [
|
|
{
|
|
"LogicalName": "stream",
|
|
"PrimaryIdAttribute": "primary",
|
|
"ChangeTrackingEnabled": false,
|
|
"CanChangeTrackingBeEnabled": {
|
|
"Value": false
|
|
},
|
|
"Attributes": [
|
|
{
|
|
"LogicalName": "test",
|
|
"AttributeType": "String"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
''')
|
|
|
|
mock_request.return_value.status.return_value = 200
|
|
mock_request.return_value.json.return_value = result_json
|
|
|
|
source = SourceMicrosoftDataverse()
|
|
logger_mock, config_mock = MagicMock(), MagicMock()
|
|
|
|
catalog = source.discover(logger_mock, config_mock)
|
|
|
|
assert catalog.streams[0].default_cursor_field is None or len(catalog.streams[0].default_cursor_field) == 0
|
|
assert not {SyncMode.full_refresh} ^ set(catalog.streams[0].supported_sync_modes)
|
|
assert not {'primary'} ^ set(catalog.streams[0].source_defined_primary_key[0])
|
|
assert catalog.streams[0].json_schema["properties"]["test"] == AirbyteType.String.value
|